on master help sign in
Merge pull request #728 from kvch/fix-kickass-torrents
85c7237Adam Tauber
searx/engines/kickass.py+11−35
@@ -16,13 +16,14 @@ from urllib import quote
16from lxml import html
16from lxml import html
17from operator import itemgetter
17from operator import itemgetter
18from searx.engines.xpath import extract_text
18from searx.engines.xpath import extract_text
19+from searx.utils import get_torrent_size, convert_str_to_int
19
20
20# engine dependent config
21# engine dependent config
21categories = ['videos', 'music', 'files']
22categories = ['videos', 'music', 'files']
22paging = True
23paging = True
23
24
24# search-url
25# search-url
25−url = 'https://kickass.to/'
26+url = 'https://kickass.cd/'
26search_url = url + 'search/{search_term}/{pageno}/'
27search_url = url + 'search/{search_term}/{pageno}/'
27
28
28# specific xpath variables
29# specific xpath variables
@@ -57,41 +58,16 @@ def response(resp):
57 href = urljoin(url, link.attrib['href'])
58 href = urljoin(url, link.attrib['href'])
58 title = extract_text(link)
59 title = extract_text(link)
59 content = escape(extract_text(result.xpath(content_xpath)))
60 content = escape(extract_text(result.xpath(content_xpath)))
60− seed = result.xpath('.//td[contains(@class, "green")]/text()')[0]
61+ seed = extract_text(result.xpath('.//td[contains(@class, "green")]'))
61− leech = result.xpath('.//td[contains(@class, "red")]/text()')[0]
62+ leech = extract_text(result.xpath('.//td[contains(@class, "red")]'))
62− filesize = result.xpath('.//td[contains(@class, "nobr")]/text()')[0]
63− filesize_multiplier = result.xpath('.//td[contains(@class, "nobr")]//span/text()')[0]
63+ filesize_info = extract_text(result.xpath('.//td[contains(@class, "nobr")]'))
64− files = result.xpath('.//td[contains(@class, "center")][2]/text()')[0]
64+ files = extract_text(result.xpath('.//td[contains(@class, "center")][2]'))
65−
66− # convert seed to int if possible
67− if seed.isdigit():
68− seed = int(seed)
69− else:
70− seed = 0
71
65
72− # convert leech to int if possible
66+ seed = convert_str_to_int(seed)
73− if leech.isdigit():
67+ leech = convert_str_to_int(leech)
74− leech = int(leech)
68+
75− else:
69+ filesize, filesize_multiplier = filesize_info.split()
76− leech = 0
77−
78− # convert filesize to byte if possible
79− try:
80− filesize = float(filesize)
81−
82− # convert filesize to byte
83− if filesize_multiplier == 'TB':
84− filesize = int(filesize * 1024 * 1024 * 1024 * 1024)
85− elif filesize_multiplier == 'GB':
86− filesize = int(filesize * 1024 * 1024 * 1024)
87− elif filesize_multiplier == 'MB':
88− filesize = int(filesize * 1024 * 1024)
89− elif filesize_multiplier == 'KB':
70+ filesize = get_torrent_size(filesize, filesize_multiplier)
90− filesize = int(filesize * 1024)
91− except:
92− filesize = None
93−
94− # convert files to int if possible
95 if files.isdigit():
71 if files.isdigit():
96 files = int(files)
72 files = int(files)
97 else:
73 else:
searx/settings.yml+6
@@ -307,6 +307,12 @@ engines:
307 timeout : 6.0
307 timeout : 6.0
308 disabled : True
308 disabled : True
309
309
310+ - name: kickass
311+ engine : kickass
312+ shortcut : kc
313+ timeout : 4.0
314+ disabled : True
315+
310 - name : microsoft academic
316 - name : microsoft academic
311 engine : json_engine
317 engine : json_engine
312 paging : True
318 paging : True
searx/utils.py+15
@@ -252,12 +252,27 @@ def get_torrent_size(filesize, filesize_multiplier):
252 filesize = int(filesize * 1024 * 1024)
252 filesize = int(filesize * 1024 * 1024)
253 elif filesize_multiplier == 'KB':
253 elif filesize_multiplier == 'KB':
254 filesize = int(filesize * 1024)
254 filesize = int(filesize * 1024)
255+ elif filesize_multiplier == 'TiB':
256+ filesize = int(filesize * 1000 * 1000 * 1000 * 1000)
257+ elif filesize_multiplier == 'GiB':
258+ filesize = int(filesize * 1000 * 1000 * 1000)
259+ elif filesize_multiplier == 'MiB':
260+ filesize = int(filesize * 1000 * 1000)
261+ elif filesize_multiplier == 'KiB':
262+ filesize = int(filesize * 1000)
255 except:
263 except:
256 filesize = None
264 filesize = None
257
265
258 return filesize
266 return filesize
259
267
260
268
269+def convert_str_to_int(number_str):
270+ if number_str.isdigit():
271+ return int(number_str)
272+ else:
273+ return 0
274+
275+
261def is_valid_lang(lang):
276def is_valid_lang(lang):
262 is_abbr = (len(lang) == 2)
277 is_abbr = (len(lang) == 2)
263 if is_abbr:
278 if is_abbr:
tests/unit/engines/test_kickass.py+13−13
@@ -14,7 +14,7 @@ class TestKickassEngine(SearxTestCase):
14 params = kickass.request(query, dicto)
14 params = kickass.request(query, dicto)
15 self.assertIn('url', params)
15 self.assertIn('url', params)
16 self.assertIn(query, params['url'])
16 self.assertIn(query, params['url'])
17− self.assertIn('kickass.to', params['url'])
17+ self.assertIn('kickass.cd', params['url'])
18 self.assertFalse(params['verify'])
18 self.assertFalse(params['verify'])
19
19
20 def test_response(self):
20 def test_response(self):
@@ -84,7 +84,7 @@ class TestKickassEngine(SearxTestCase):
84 </span>
84 </span>
85 </div>
85 </div>
86 </td>
86 </td>
87− <td class="nobr center">449 <span>bytes</span></td>
87+ <td class="nobr center">449 bytes</td>
88 <td class="center">4</td>
88 <td class="center">4</td>
89 <td class="center">2&nbsp;years</td>
89 <td class="center">2&nbsp;years</td>
90 <td class="green center">10</td>
90 <td class="green center">10</td>
@@ -97,7 +97,7 @@ class TestKickassEngine(SearxTestCase):
97 self.assertEqual(type(results), list)
97 self.assertEqual(type(results), list)
98 self.assertEqual(len(results), 1)
98 self.assertEqual(len(results), 1)
99 self.assertEqual(results[0]['title'], 'This should be the title')
99 self.assertEqual(results[0]['title'], 'This should be the title')
100− self.assertEqual(results[0]['url'], 'https://kickass.to/url.html')
100+ self.assertEqual(results[0]['url'], 'https://kickass.cd/url.html')
101 self.assertEqual(results[0]['content'], 'Posted by riri in Other &gt; Unsorted')
101 self.assertEqual(results[0]['content'], 'Posted by riri in Other &gt; Unsorted')
102 self.assertEqual(results[0]['seed'], 10)
102 self.assertEqual(results[0]['seed'], 10)
103 self.assertEqual(results[0]['leech'], 1)
103 self.assertEqual(results[0]['leech'], 1)
@@ -191,7 +191,7 @@ class TestKickassEngine(SearxTestCase):
191 </span>
191 </span>
192 </div>
192 </div>
193 </td>
193 </td>
194− <td class="nobr center">1 <span>KB</span></td>
194+ <td class="nobr center">1 KiB</td>
195 <td class="center">4</td>
195 <td class="center">4</td>
196 <td class="center">2&nbsp;years</td>
196 <td class="center">2&nbsp;years</td>
197 <td class="green center">10</td>
197 <td class="green center">10</td>
@@ -235,7 +235,7 @@ class TestKickassEngine(SearxTestCase):
235 </span>
235 </span>
236 </div>
236 </div>
237 </td>
237 </td>
238− <td class="nobr center">1 <span>MB</span></td>
238+ <td class="nobr center">1 MiB</td>
239 <td class="center">4</td>
239 <td class="center">4</td>
240 <td class="center">2&nbsp;years</td>
240 <td class="center">2&nbsp;years</td>
241 <td class="green center">9</td>
241 <td class="green center">9</td>
@@ -279,7 +279,7 @@ class TestKickassEngine(SearxTestCase):
279 </span>
279 </span>
280 </div>
280 </div>
281 </td>
281 </td>
282− <td class="nobr center">1 <span>GB</span></td>
282+ <td class="nobr center">1 GiB</td>
283 <td class="center">4</td>
283 <td class="center">4</td>
284 <td class="center">2&nbsp;years</td>
284 <td class="center">2&nbsp;years</td>
285 <td class="green center">8</td>
285 <td class="green center">8</td>
@@ -323,7 +323,7 @@ class TestKickassEngine(SearxTestCase):
323 </span>
323 </span>
324 </div>
324 </div>
325 </td>
325 </td>
326− <td class="nobr center">1 <span>TB</span></td>
326+ <td class="nobr center">1 TiB</td>
327 <td class="center">4</td>
327 <td class="center">4</td>
328 <td class="center">2&nbsp;years</td>
328 <td class="center">2&nbsp;years</td>
329 <td class="green center">7</td>
329 <td class="green center">7</td>
@@ -367,7 +367,7 @@ class TestKickassEngine(SearxTestCase):
367 </span>
367 </span>
368 </div>
368 </div>
369 </td>
369 </td>
370− <td class="nobr center">z <span>bytes</span></td>
370+ <td class="nobr center">z bytes</td>
371 <td class="center">r</td>
371 <td class="center">r</td>
372 <td class="center">2&nbsp;years</td>
372 <td class="center">2&nbsp;years</td>
373 <td class="green center">a</td>
373 <td class="green center">a</td>
@@ -380,17 +380,17 @@ class TestKickassEngine(SearxTestCase):
380 self.assertEqual(type(results), list)
380 self.assertEqual(type(results), list)
381 self.assertEqual(len(results), 5)
381 self.assertEqual(len(results), 5)
382 self.assertEqual(results[0]['title'], 'This should be the title')
382 self.assertEqual(results[0]['title'], 'This should be the title')
383− self.assertEqual(results[0]['url'], 'https://kickass.to/url.html')
383+ self.assertEqual(results[0]['url'], 'https://kickass.cd/url.html')
384 self.assertEqual(results[0]['content'], 'Posted by riri in Other &gt; Unsorted')
384 self.assertEqual(results[0]['content'], 'Posted by riri in Other &gt; Unsorted')
385 self.assertEqual(results[0]['seed'], 10)
385 self.assertEqual(results[0]['seed'], 10)
386 self.assertEqual(results[0]['leech'], 1)
386 self.assertEqual(results[0]['leech'], 1)
387 self.assertEqual(results[0]['files'], 4)
387 self.assertEqual(results[0]['files'], 4)
388 self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:MAGNETURL&dn=test')
388 self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:MAGNETURL&dn=test')
389 self.assertEqual(results[0]['torrentfile'], 'http://torcache.net/torrent/53917.torrent?title=test')
389 self.assertEqual(results[0]['torrentfile'], 'http://torcache.net/torrent/53917.torrent?title=test')
390− self.assertEqual(results[0]['filesize'], 1024)
390+ self.assertEqual(results[0]['filesize'], 1000)
391− self.assertEqual(results[1]['filesize'], 1048576)
391+ self.assertEqual(results[1]['filesize'], 1000000)
392− self.assertEqual(results[2]['filesize'], 1073741824)
392+ self.assertEqual(results[2]['filesize'], 1000000000)
393− self.assertEqual(results[3]['filesize'], 1099511627776)
393+ self.assertEqual(results[3]['filesize'], 1000000000000)
394 self.assertEqual(results[4]['seed'], 0)
394 self.assertEqual(results[4]['seed'], 0)
395 self.assertEqual(results[4]['leech'], 0)
395 self.assertEqual(results[4]['leech'], 0)
396 self.assertEqual(results[4]['files'], None)
396 self.assertEqual(results[4]['files'], None)