on master help sign in
Add an No Api Flickr Engine

It uses the webpage json infos to build the results Let the user choose the engine in setting.yml. Noapi active by default + little corrections on Flickr engine

commit930f724ec639c167d870d716240ac5d4512beba2 authorCqoicebordel <Cqoicebordel@users.noreply.github.com> dateTue 16 Dec 2014, 20:40 (12 years ago) parent0059d08
3 files changed+110−8
searx/engines/flickr-noapi.py+102 searx/engines/flickr.py+1−4 searx/settings.yml+7−4
searx/engines/flickr-noapi.pynew file+102
@@ -0,0 +1,102 @@
1+#!/usr/bin/env python
2+
3+## Flickr (Images)
4+#
5+# @website https://www.flickr.com
6+# @provide-api yes (https://secure.flickr.com/services/api/flickr.photos.search.html)
7+#
8+# @using-api no
9+# @results HTML
10+# @stable no
11+# @parse url, title, thumbnail, img_src
12+
13+from urllib import urlencode
14+from json import loads
15+from urlparse import urljoin
16+from lxml import html
17+import re
18+
19+categories = ['images']
20+
21+url = 'https://secure.flickr.com/'
22+search_url = url+'search/?{query}&page={page}'
23+photo_url = 'https://www.flickr.com/photos/{userid}/{photoid}'
24+regex = re.compile(r"\"search-photos-models\",\"photos\":(.*}),\"totalItems\":", re.DOTALL)
25+
26+paging = True
27+
28+def build_flickr_url(user_id, photo_id):
29+ return photo_url.format(userid=user_id,photoid=photo_id)
30+
31+
32+def request(query, params):
33+ params['url'] = search_url.format(query=urlencode({'text': query}),
34+ page=params['pageno'])
35+ return params
36+
37+
38+def response(resp):
39+ results = []
40+
41+ matches = regex.search(resp.text)
42+
43+ if matches == None:
44+ return results
45+
46+ match = matches.group(1)
47+ search_results = loads(match)
48+
49+ if not '_data' in search_results:
50+ return []
51+
52+ photos = search_results['_data']
53+
54+ for photo in photos:
55+
56+ # In paged configuration, the first pages' photos are represented by a None object
57+ if photo == None:
58+ continue
59+
60+ # From the biggest to the lowest format
61+ if 'o' in photo['sizes']:
62+ img_src = photo['sizes']['o']['displayUrl']
63+ elif 'k' in photo['sizes']:
64+ img_src = photo['sizes']['k']['displayUrl']
65+ elif 'h' in photo['sizes']:
66+ img_src = photo['sizes']['h']['displayUrl']
67+ elif 'b' in photo['sizes']:
68+ img_src = photo['sizes']['b']['displayUrl']
69+ elif 'c' in photo['sizes']:
70+ img_src = photo['sizes']['c']['displayUrl']
71+ elif 'z' in photo['sizes']:
72+ img_src = photo['sizes']['z']['displayUrl']
73+ elif 'n' in photo['sizes']:
74+ img_src = photo['sizes']['n']['displayUrl']
75+ elif 'm' in photo['sizes']:
76+ img_src = photo['sizes']['m']['displayUrl']
77+ elif 't' in photo['sizes']:
78+ img_src = photo['sizes']['to']['displayUrl']
79+ elif 'q' in photo['sizes']:
80+ img_src = photo['sizes']['q']['displayUrl']
81+ elif 's' in photo['sizes']:
82+ img_src = photo['sizes']['s']['displayUrl']
83+ else:
84+ continue
85+
86+ url = build_flickr_url(photo['owner']['id'], photo['id'])
87+
88+ title = photo['title']
89+
90+ content = '<span class="photo-author">'+ photo['owner']['username'] +'</span><br />'
91+
92+ if 'description' in photo:
93+ content = content + '<span class="description">' + photo['description'] + '</span>'
94+
95+ # append result
96+ results.append({'url': url,
97+ 'title': title,
98+ 'img_src': img_src,
99+ 'content': content,
100+ 'template': 'images.html'})
101+
102+ return results
searx/engines/flickr.py+1−4
@@ -13,9 +13,6 @@
1313
1414from urllib import urlencode
1515from json import loads
16−from urlparse import urljoin
17−from lxml import html
18−from time import time
1916
2017categories = ['images']
2118
@@ -70,7 +67,7 @@ def response(resp):
7067
7168 content = '<span class="photo-author">'+ photo['ownername'] +'</span><br />'
7269
73− content = content + ' <span class="description">' + photo['description']['_content'] + '</span>'
70+ content = content + '<span class="description">' + photo['description']['_content'] + '</span>'
7471
7572 # append result
7673 results.append({'url': url,
searx/settings.yml+7−4
@@ -65,12 +65,15 @@ engines:
6565# categories : files
6666# shortcut : fc
6767
68−# api-key required: https://www.flickr.com/services/apps/create/
69−# - name : flickr
68+ - name : flickr
69+ categories : images
70+ shortcut : fl
71+# You can use the engine using the official stable API, but you need an API key
72+# See : https://www.flickr.com/services/apps/create/
7073# engine : flickr
71−# categories : images
72−# shortcut : fl
7374# api_key: 'apikey' # required!
75+# Or you can use the html non-stable engine, activated by default
76+ engine : flickr-noapi
7477
7578 - name : general-file
7679 engine : generalfile