commit: 0059d08f13b1bf64b3f36ab2cbe89d5fec5d727c
parent e047d22046e9f4b5cff80c9ec9ee321b209641cb
Author: Cqoicebordel <Cqoicebordel@users.noreply.github.com>
Date: Mon, 15 Dec 2014 03:21:25 +0100
Rework Flickr Engine
Everything was redone to use the API. It needs an API key, but it's worth it.
Everything works. Title, Image, Content, URL
The API allow lots of things. Thumbnails and date will be easy to add when it will be implemented in Searx.
Fix asciimoo/searx#126
Diffstat:
2 files changed, 61 insertions(+), 31 deletions(-)
diff --git a/searx/engines/flickr.py b/searx/engines/flickr.py
@@ -1,54 +1,83 @@
#!/usr/bin/env python
+## Flickr (Images)
+#
+# @website https://www.flickr.com
+# @provide-api yes (https://secure.flickr.com/services/api/flickr.photos.search.html)
+#
+# @using-api yes
+# @results JSON
+# @stable yes
+# @parse url, title, thumbnail, img_src
+#More info on api-key : https://www.flickr.com/services/apps/create/
+
from urllib import urlencode
-#from json import loads
+from json import loads
from urlparse import urljoin
from lxml import html
from time import time
categories = ['images']
-url = 'https://secure.flickr.com/'
-search_url = url+'search/?{query}&page={page}'
-results_xpath = '//div[@class="view display-item-tile"]/figure/div'
+nb_per_page = 15
+paging = True
+api_key= None
+
+
+url = 'https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key={api_key}&{text}&sort=relevance&extras=description%2C+owner_name%2C+url_o%2C+url_z&per_page={nb_per_page}&format=json&nojsoncallback=1&page={page}'
+photo_url = 'https://www.flickr.com/photos/{userid}/{photoid}'
paging = True
+def build_flickr_url(user_id, photo_id):
+ return photo_url.format(userid=user_id,photoid=photo_id)
+
def request(query, params):
- params['url'] = search_url.format(query=urlencode({'text': query}),
- page=params['pageno'])
- time_string = str(int(time())-3)
- params['cookies']['BX'] = '3oqjr6d9nmpgl&b=3&s=dh'
- params['cookies']['xb'] = '421409'
- params['cookies']['localization'] = 'en-us'
- params['cookies']['flrbp'] = time_string +\
- '-3a8cdb85a427a33efda421fbda347b2eaf765a54'
- params['cookies']['flrbs'] = time_string +\
- '-ed142ae8765ee62c9ec92a9513665e0ee1ba6776'
- params['cookies']['flrb'] = '9'
+ params['url'] = url.format(text=urlencode({'text': query}),
+ api_key=api_key,
+ nb_per_page=nb_per_page,
+ page=params['pageno'])
return params
def response(resp):
results = []
- dom = html.fromstring(resp.text)
- for result in dom.xpath(results_xpath):
- img = result.xpath('.//img')
+
+ search_results = loads(resp.text)
- if not img:
- continue
+ # return empty array if there are no results
+ if not 'photos' in search_results:
+ return []
+
+ if not 'photo' in search_results['photos']:
+ return []
- img = img[0]
- img_src = 'https:'+img.attrib.get('src')
+ photos = search_results['photos']['photo']
- if not img_src:
+ # parse results
+ for photo in photos:
+ if 'url_o' in photo:
+ img_src = photo['url_o']
+ elif 'url_z' in photo:
+ img_src = photo['url_z']
+ else:
continue
- href = urljoin(url, result.xpath('.//a')[0].attrib.get('href'))
- title = img.attrib.get('alt', '')
- results.append({'url': href,
+ url = build_flickr_url(photo['owner'], photo['id'])
+
+ title = photo['title']
+
+ content = '<span class="photo-author">'+ photo['ownername'] +'</span><br />'
+
+ content = content + ' <span class="description">' + photo['description']['_content'] + '</span>'
+
+ # append result
+ results.append({'url': url,
'title': title,
'img_src': img_src,
+ 'content': content,
'template': 'images.html'})
+
+ # return results
return results
diff --git a/searx/settings.yml b/searx/settings.yml
@@ -65,11 +65,12 @@ engines:
# categories : files
# shortcut : fc
- - name : flickr
- engine : flickr
- categories : images
- shortcut : fl
- timeout: 3.0
+# api-key required: https://www.flickr.com/services/apps/create/
+# - name : flickr
+# engine : flickr
+# categories : images
+# shortcut : fl
+# api_key: 'apikey' # required!
- name : general-file
engine : generalfile