mirror of https://github.com/searxng/searxng.git
Add thumbnails in images results
- Modify engines to create/fetch an URL for the thumbnails - Modify themes to show thumbnails instead of full images. In Courgette, the result is not very beautiful. Should we change it ?
This commit is contained in:
parent
edd9d31180
commit
cb4a3fe598
|
@ -14,6 +14,7 @@
|
||||||
from urllib import urlencode
|
from urllib import urlencode
|
||||||
from urlparse import urljoin
|
from urlparse import urljoin
|
||||||
from lxml import html
|
from lxml import html
|
||||||
|
import re
|
||||||
|
|
||||||
# engine dependent config
|
# engine dependent config
|
||||||
categories = ['images']
|
categories = ['images']
|
||||||
|
@ -37,20 +38,25 @@ def response(resp):
|
||||||
results = []
|
results = []
|
||||||
|
|
||||||
dom = html.fromstring(resp.text)
|
dom = html.fromstring(resp.text)
|
||||||
|
regex = re.compile('3\.jpg.*$')
|
||||||
|
|
||||||
# parse results
|
# parse results
|
||||||
for result in dom.xpath('//div[@class="photo"]'):
|
for result in dom.xpath('//div[@class="photo"]'):
|
||||||
link = result.xpath('.//a')[0]
|
link = result.xpath('.//a')[0]
|
||||||
url = urljoin(base_url, link.attrib.get('href'))
|
url = urljoin(base_url, link.attrib.get('href'))
|
||||||
title = result.xpath('.//div[@class="title"]//text()')[0]
|
title = result.xpath('.//div[@class="title"]//text()')[0]
|
||||||
img_src = link.xpath('.//img')[0].attrib['src']
|
thumbnail_src = link.xpath('.//img')[0].attrib['src']
|
||||||
|
# To have a bigger thumbnail, uncomment the next line
|
||||||
|
#thumbnail_src = regex.sub('4.jpg', thumbnail_src)
|
||||||
content = result.xpath('.//div[@class="info"]//text()')[0]
|
content = result.xpath('.//div[@class="info"]//text()')[0]
|
||||||
|
img_src = regex.sub('2048.jpg', thumbnail_src)
|
||||||
|
|
||||||
# append result
|
# append result
|
||||||
results.append({'url': url,
|
results.append({'url': url,
|
||||||
'title': title,
|
'title': title,
|
||||||
'img_src': img_src,
|
'img_src': img_src,
|
||||||
'content': content,
|
'content': content,
|
||||||
|
'thumbnail_src': thumbnail_src,
|
||||||
'template': 'images.html'})
|
'template': 'images.html'})
|
||||||
|
|
||||||
# return results
|
# return results
|
||||||
|
|
|
@ -25,6 +25,7 @@ paging = True
|
||||||
# search-url
|
# search-url
|
||||||
base_url = 'https://www.bing.com/'
|
base_url = 'https://www.bing.com/'
|
||||||
search_string = 'images/search?{query}&count=10&first={offset}'
|
search_string = 'images/search?{query}&count=10&first={offset}'
|
||||||
|
thumb_url = "http://ts1.mm.bing.net/th?id={ihk}"
|
||||||
|
|
||||||
|
|
||||||
# do search-request
|
# do search-request
|
||||||
|
@ -63,6 +64,8 @@ def response(resp):
|
||||||
yaml_data = load(p.sub(r'\1\2: \3', link.attrib.get('m')))
|
yaml_data = load(p.sub(r'\1\2: \3', link.attrib.get('m')))
|
||||||
|
|
||||||
title = link.attrib.get('t1')
|
title = link.attrib.get('t1')
|
||||||
|
ihk = link.attrib.get('ihk')
|
||||||
|
|
||||||
#url = 'http://' + link.attrib.get('t3')
|
#url = 'http://' + link.attrib.get('t3')
|
||||||
url = yaml_data.get('surl')
|
url = yaml_data.get('surl')
|
||||||
img_src = yaml_data.get('imgurl')
|
img_src = yaml_data.get('imgurl')
|
||||||
|
@ -72,6 +75,7 @@ def response(resp):
|
||||||
'url': url,
|
'url': url,
|
||||||
'title': title,
|
'title': title,
|
||||||
'content': '',
|
'content': '',
|
||||||
|
'thumbnail_src': thumb_url.format(ihk=ihk),
|
||||||
'img_src': img_src})
|
'img_src': img_src})
|
||||||
|
|
||||||
# TODO stop parsing if 10 images are found
|
# TODO stop parsing if 10 images are found
|
||||||
|
|
|
@ -6,13 +6,14 @@
|
||||||
# @using-api no (TODO, rewrite to api)
|
# @using-api no (TODO, rewrite to api)
|
||||||
# @results HTML
|
# @results HTML
|
||||||
# @stable no (HTML can change)
|
# @stable no (HTML can change)
|
||||||
# @parse url, title, thumbnail, img_src
|
# @parse url, title, thumbnail_src, img_src
|
||||||
#
|
#
|
||||||
# @todo rewrite to api
|
# @todo rewrite to api
|
||||||
|
|
||||||
from urllib import urlencode
|
from urllib import urlencode
|
||||||
from urlparse import urljoin
|
from urlparse import urljoin
|
||||||
from lxml import html
|
from lxml import html
|
||||||
|
import re
|
||||||
|
|
||||||
# engine dependent config
|
# engine dependent config
|
||||||
categories = ['images']
|
categories = ['images']
|
||||||
|
@ -42,6 +43,8 @@ def response(resp):
|
||||||
return []
|
return []
|
||||||
|
|
||||||
dom = html.fromstring(resp.text)
|
dom = html.fromstring(resp.text)
|
||||||
|
|
||||||
|
regex = re.compile('\/200H\/')
|
||||||
|
|
||||||
# parse results
|
# parse results
|
||||||
for result in dom.xpath('//div[contains(@class, "tt-a tt-fh")]'):
|
for result in dom.xpath('//div[contains(@class, "tt-a tt-fh")]'):
|
||||||
|
@ -49,12 +52,14 @@ def response(resp):
|
||||||
url = urljoin(base_url, link.attrib.get('href'))
|
url = urljoin(base_url, link.attrib.get('href'))
|
||||||
title_links = result.xpath('.//span[@class="details"]//a[contains(@class, "t")]') # noqa
|
title_links = result.xpath('.//span[@class="details"]//a[contains(@class, "t")]') # noqa
|
||||||
title = ''.join(title_links[0].xpath('.//text()'))
|
title = ''.join(title_links[0].xpath('.//text()'))
|
||||||
img_src = link.xpath('.//img')[0].attrib['src']
|
thumbnail_src = link.xpath('.//img')[0].attrib['src']
|
||||||
|
img_src = regex.sub('/', thumbnail_src)
|
||||||
|
|
||||||
# append result
|
# append result
|
||||||
results.append({'url': url,
|
results.append({'url': url,
|
||||||
'title': title,
|
'title': title,
|
||||||
'img_src': img_src,
|
'img_src': img_src,
|
||||||
|
'thumbnail_src': thumbnail_src,
|
||||||
'template': 'images.html'})
|
'template': 'images.html'})
|
||||||
|
|
||||||
# return results
|
# return results
|
||||||
|
|
|
@ -71,6 +71,14 @@ def response(resp):
|
||||||
if 'id' not in photo['owner']:
|
if 'id' not in photo['owner']:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
# For a bigger thumbnail, keep only the url_z, not the url_n
|
||||||
|
if 'n' in photo['sizes']:
|
||||||
|
thumbnail_src = photo['sizes']['n']['displayUrl']
|
||||||
|
elif 'z' in photo['sizes']:
|
||||||
|
thumbnail_src = photo['sizes']['z']['displayUrl']
|
||||||
|
else:
|
||||||
|
thumbnail_src = img_src
|
||||||
|
|
||||||
url = build_flickr_url(photo['owner']['id'], photo['id'])
|
url = build_flickr_url(photo['owner']['id'], photo['id'])
|
||||||
|
|
||||||
title = photo.get('title', '')
|
title = photo.get('title', '')
|
||||||
|
@ -89,6 +97,7 @@ def response(resp):
|
||||||
results.append({'url': url,
|
results.append({'url': url,
|
||||||
'title': title,
|
'title': title,
|
||||||
'img_src': img_src,
|
'img_src': img_src,
|
||||||
|
'thumbnail_src': thumbnail_src,
|
||||||
'content': content,
|
'content': content,
|
||||||
'template': 'images.html'})
|
'template': 'images.html'})
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ api_key = None
|
||||||
|
|
||||||
url = 'https://api.flickr.com/services/rest/?method=flickr.photos.search' +\
|
url = 'https://api.flickr.com/services/rest/?method=flickr.photos.search' +\
|
||||||
'&api_key={api_key}&{text}&sort=relevance' +\
|
'&api_key={api_key}&{text}&sort=relevance' +\
|
||||||
'&extras=description%2C+owner_name%2C+url_o%2C+url_z' +\
|
'&extras=description%2C+owner_name%2C+url_o%2C+url_n%2C+url_z' +\
|
||||||
'&per_page={nb_per_page}&format=json&nojsoncallback=1&page={page}'
|
'&per_page={nb_per_page}&format=json&nojsoncallback=1&page={page}'
|
||||||
photo_url = 'https://www.flickr.com/photos/{userid}/{photoid}'
|
photo_url = 'https://www.flickr.com/photos/{userid}/{photoid}'
|
||||||
|
|
||||||
|
@ -65,6 +65,14 @@ def response(resp):
|
||||||
else:
|
else:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
# For a bigger thumbnail, keep only the url_z, not the url_n
|
||||||
|
if 'url_n' in photo:
|
||||||
|
thumbnail_src = photo['url_n']
|
||||||
|
elif 'url_z' in photo:
|
||||||
|
thumbnail_src = photo['url_z']
|
||||||
|
else:
|
||||||
|
thumbnail_src = img_src
|
||||||
|
|
||||||
url = build_flickr_url(photo['owner'], photo['id'])
|
url = build_flickr_url(photo['owner'], photo['id'])
|
||||||
|
|
||||||
title = photo['title']
|
title = photo['title']
|
||||||
|
@ -80,6 +88,7 @@ def response(resp):
|
||||||
results.append({'url': url,
|
results.append({'url': url,
|
||||||
'title': title,
|
'title': title,
|
||||||
'img_src': img_src,
|
'img_src': img_src,
|
||||||
|
'thumbnail_src': thumbnail_src,
|
||||||
'content': content,
|
'content': content,
|
||||||
'template': 'images.html'})
|
'template': 'images.html'})
|
||||||
|
|
||||||
|
|
|
@ -43,15 +43,18 @@ def response(resp):
|
||||||
|
|
||||||
# parse results
|
# parse results
|
||||||
for result in search_res['responseData']['results']:
|
for result in search_res['responseData']['results']:
|
||||||
|
print result
|
||||||
href = result['originalContextUrl']
|
href = result['originalContextUrl']
|
||||||
title = result['title']
|
title = result['title']
|
||||||
if not result['url']:
|
if not result['url']:
|
||||||
continue
|
continue
|
||||||
|
thumbnail_src = result['tbUrl']
|
||||||
|
|
||||||
# append result
|
# append result
|
||||||
results.append({'url': href,
|
results.append({'url': href,
|
||||||
'title': title,
|
'title': title,
|
||||||
'content': '',
|
'content': '',
|
||||||
|
'thumbnail_src': thumbnail_src,
|
||||||
'img_src': unquote(result['url']),
|
'img_src': unquote(result['url']),
|
||||||
'template': 'images.html'})
|
'template': 'images.html'})
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="image_result">
|
<div class="image_result">
|
||||||
<p>
|
<p>
|
||||||
<a href="{{ result.img_src }}"><img src="{{ image_proxify(result.img_src) }}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}"/></a>
|
<a href="{{ result.img_src }}"><img src="{{ image_proxify(result.thumbnail_src) }}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}"/></a>
|
||||||
<span class="url"><a href="{{ result.url }}" class="small_font">{{ _('original context') }}</a></span>
|
<span class="url"><a href="{{ result.url }}" class="small_font">{{ _('original context') }}</a></span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="image_result">
|
<div class="image_result">
|
||||||
<p>
|
<p>
|
||||||
<a href="{{ result.img_src }}"><img src="{{ image_proxify(result.img_src) }}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}" /></a>
|
<a href="{{ result.img_src }}"><img src="{{ image_proxify(result.thumbnail_src) }}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}" /></a>
|
||||||
<span class="url"><a href="{{ result.url }}" class="small_font">{{ _('original context') }}</a></span>
|
<span class="url"><a href="{{ result.url }}" class="small_font">{{ _('original context') }}</a></span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{% from 'oscar/macros.html' import draw_favicon %}
|
{% from 'oscar/macros.html' import draw_favicon %}
|
||||||
|
|
||||||
<a href="{{ result.img_src }}" data-toggle="modal" data-target="#modal-{{ index }}">
|
<a href="{{ result.img_src }}" data-toggle="modal" data-target="#modal-{{ index }}">
|
||||||
<img src="{{ image_proxify(result.img_src) }}" alt="{{ result.title|striptags }}" title="{{ result.title|striptags }}" class="img-thumbnail">
|
<img src="{{ image_proxify(result.thumbnail_src) }}" alt="{{ result.title|striptags }}" title="{{ result.title|striptags }}" class="img-thumbnail">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<div class="modal fade" id="modal-{{ index }}" tabindex="-1" role="dialog" aria-hidden="true">
|
<div class="modal fade" id="modal-{{ index }}" tabindex="-1" role="dialog" aria-hidden="true">
|
||||||
|
@ -12,7 +12,7 @@
|
||||||
<h4 class="modal-title">{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}{{ result.title|striptags }}</h4>
|
<h4 class="modal-title">{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}{{ result.title|striptags }}</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<img class="img-responsive center-block" src="{{ result.img_src }}" alt="{{ result.title }}">
|
<img class="img-responsive center-block" src="{{ result.thumbnail_src }}" alt="{{ result.title|striptags }}">
|
||||||
{% if result.content %}<p class="result-content">{{ result.content|safe }}</p>{% endif %}
|
{% if result.content %}<p class="result-content">{{ result.content|safe }}</p>{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
|
|
Loading…
Reference in New Issue