Browse Source

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
Cqoicebordel 10 years ago
parent
commit
930f724ec6
3 changed files with 110 additions and 8 deletions
  1. 102
    0
      searx/engines/flickr-noapi.py
  2. 1
    4
      searx/engines/flickr.py
  3. 7
    4
      searx/settings.yml

+ 102
- 0
searx/engines/flickr-noapi.py View File

@@ -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

+ 1
- 4
searx/engines/flickr.py View File

@@ -13,9 +13,6 @@
13 13
 
14 14
 from urllib import urlencode
15 15
 from json import loads
16
-from urlparse import urljoin
17
-from lxml import html
18
-from time import time
19 16
 
20 17
 categories = ['images']
21 18
 
@@ -70,7 +67,7 @@ def response(resp):
70 67
         
71 68
         content = '<span class="photo-author">'+ photo['ownername'] +'</span><br />'
72 69
         
73
-        content = content + ' <span class="description">' + photo['description']['_content'] + '</span>'
70
+        content = content + '<span class="description">' + photo['description']['_content'] + '</span>'
74 71
         
75 72
         # append result
76 73
         results.append({'url': url,

+ 7
- 4
searx/settings.yml View File

@@ -65,12 +65,15 @@ engines:
65 65
 #    categories : files
66 66
 #    shortcut : fc
67 67
 
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/
70 73
 #    engine : flickr
71
-#    categories : images
72
-#    shortcut : fl
73 74
 #    api_key: 'apikey' # required!
75
+# Or you can use the html non-stable engine, activated by default
76
+    engine : flickr-noapi
74 77
 
75 78
   - name : general-file
76 79
     engine : generalfile