Explorar el Código

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 hace 10 años
padre
commit
930f724ec6
Se han modificado 3 ficheros con 110 adiciones y 8 borrados
  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 Ver fichero

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

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

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