mirror of
				https://github.com/searxng/searxng.git
				synced 2025-11-03 19:17:07 -05:00 
			
		
		
		
	Merge pull request #728 from kvch/fix-kickass-torrents
fix kickass torrents engine
This commit is contained in:
		
						commit
						85c7237a4f
					
				@ -16,13 +16,14 @@ from urllib import quote
 | 
				
			|||||||
from lxml import html
 | 
					from lxml import html
 | 
				
			||||||
from operator import itemgetter
 | 
					from operator import itemgetter
 | 
				
			||||||
from searx.engines.xpath import extract_text
 | 
					from searx.engines.xpath import extract_text
 | 
				
			||||||
 | 
					from searx.utils import get_torrent_size, convert_str_to_int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# engine dependent config
 | 
					# engine dependent config
 | 
				
			||||||
categories = ['videos', 'music', 'files']
 | 
					categories = ['videos', 'music', 'files']
 | 
				
			||||||
paging = True
 | 
					paging = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# search-url
 | 
					# search-url
 | 
				
			||||||
url = 'https://kickass.to/'
 | 
					url = 'https://kickass.cd/'
 | 
				
			||||||
search_url = url + 'search/{search_term}/{pageno}/'
 | 
					search_url = url + 'search/{search_term}/{pageno}/'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# specific xpath variables
 | 
					# specific xpath variables
 | 
				
			||||||
@ -57,41 +58,16 @@ def response(resp):
 | 
				
			|||||||
        href = urljoin(url, link.attrib['href'])
 | 
					        href = urljoin(url, link.attrib['href'])
 | 
				
			||||||
        title = extract_text(link)
 | 
					        title = extract_text(link)
 | 
				
			||||||
        content = escape(extract_text(result.xpath(content_xpath)))
 | 
					        content = escape(extract_text(result.xpath(content_xpath)))
 | 
				
			||||||
        seed = result.xpath('.//td[contains(@class, "green")]/text()')[0]
 | 
					        seed = extract_text(result.xpath('.//td[contains(@class, "green")]'))
 | 
				
			||||||
        leech = result.xpath('.//td[contains(@class, "red")]/text()')[0]
 | 
					        leech = extract_text(result.xpath('.//td[contains(@class, "red")]'))
 | 
				
			||||||
        filesize = result.xpath('.//td[contains(@class, "nobr")]/text()')[0]
 | 
					        filesize_info = extract_text(result.xpath('.//td[contains(@class, "nobr")]'))
 | 
				
			||||||
        filesize_multiplier = result.xpath('.//td[contains(@class, "nobr")]//span/text()')[0]
 | 
					        files = extract_text(result.xpath('.//td[contains(@class, "center")][2]'))
 | 
				
			||||||
        files = result.xpath('.//td[contains(@class, "center")][2]/text()')[0]
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # convert seed to int if possible
 | 
					        seed = convert_str_to_int(seed)
 | 
				
			||||||
        if seed.isdigit():
 | 
					        leech = convert_str_to_int(leech)
 | 
				
			||||||
            seed = int(seed)
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            seed = 0
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # convert leech to int if possible
 | 
					        filesize, filesize_multiplier = filesize_info.split()
 | 
				
			||||||
        if leech.isdigit():
 | 
					        filesize = get_torrent_size(filesize, filesize_multiplier)
 | 
				
			||||||
            leech = int(leech)
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            leech = 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # convert filesize to byte if possible
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            filesize = float(filesize)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            # convert filesize to byte
 | 
					 | 
				
			||||||
            if filesize_multiplier == 'TB':
 | 
					 | 
				
			||||||
                filesize = int(filesize * 1024 * 1024 * 1024 * 1024)
 | 
					 | 
				
			||||||
            elif filesize_multiplier == 'GB':
 | 
					 | 
				
			||||||
                filesize = int(filesize * 1024 * 1024 * 1024)
 | 
					 | 
				
			||||||
            elif filesize_multiplier == 'MB':
 | 
					 | 
				
			||||||
                filesize = int(filesize * 1024 * 1024)
 | 
					 | 
				
			||||||
            elif filesize_multiplier == 'KB':
 | 
					 | 
				
			||||||
                filesize = int(filesize * 1024)
 | 
					 | 
				
			||||||
        except:
 | 
					 | 
				
			||||||
            filesize = None
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # convert files to int if possible
 | 
					 | 
				
			||||||
        if files.isdigit():
 | 
					        if files.isdigit():
 | 
				
			||||||
            files = int(files)
 | 
					            files = int(files)
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
 | 
				
			|||||||
@ -307,6 +307,12 @@ engines:
 | 
				
			|||||||
    timeout : 6.0
 | 
					    timeout : 6.0
 | 
				
			||||||
    disabled : True
 | 
					    disabled : True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - name: kickass
 | 
				
			||||||
 | 
					    engine : kickass
 | 
				
			||||||
 | 
					    shortcut : kc
 | 
				
			||||||
 | 
					    timeout : 4.0
 | 
				
			||||||
 | 
					    disabled : True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - name : microsoft academic
 | 
					  - name : microsoft academic
 | 
				
			||||||
    engine : json_engine
 | 
					    engine : json_engine
 | 
				
			||||||
    paging : True
 | 
					    paging : True
 | 
				
			||||||
 | 
				
			|||||||
@ -252,12 +252,27 @@ def get_torrent_size(filesize, filesize_multiplier):
 | 
				
			|||||||
            filesize = int(filesize * 1024 * 1024)
 | 
					            filesize = int(filesize * 1024 * 1024)
 | 
				
			||||||
        elif filesize_multiplier == 'KB':
 | 
					        elif filesize_multiplier == 'KB':
 | 
				
			||||||
            filesize = int(filesize * 1024)
 | 
					            filesize = int(filesize * 1024)
 | 
				
			||||||
 | 
					        elif filesize_multiplier == 'TiB':
 | 
				
			||||||
 | 
					            filesize = int(filesize * 1000 * 1000 * 1000 * 1000)
 | 
				
			||||||
 | 
					        elif filesize_multiplier == 'GiB':
 | 
				
			||||||
 | 
					            filesize = int(filesize * 1000 * 1000 * 1000)
 | 
				
			||||||
 | 
					        elif filesize_multiplier == 'MiB':
 | 
				
			||||||
 | 
					            filesize = int(filesize * 1000 * 1000)
 | 
				
			||||||
 | 
					        elif filesize_multiplier == 'KiB':
 | 
				
			||||||
 | 
					            filesize = int(filesize * 1000)
 | 
				
			||||||
    except:
 | 
					    except:
 | 
				
			||||||
        filesize = None
 | 
					        filesize = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return filesize
 | 
					    return filesize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def convert_str_to_int(number_str):
 | 
				
			||||||
 | 
					    if number_str.isdigit():
 | 
				
			||||||
 | 
					        return int(number_str)
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def is_valid_lang(lang):
 | 
					def is_valid_lang(lang):
 | 
				
			||||||
    is_abbr = (len(lang) == 2)
 | 
					    is_abbr = (len(lang) == 2)
 | 
				
			||||||
    if is_abbr:
 | 
					    if is_abbr:
 | 
				
			||||||
 | 
				
			|||||||
@ -14,7 +14,7 @@ class TestKickassEngine(SearxTestCase):
 | 
				
			|||||||
        params = kickass.request(query, dicto)
 | 
					        params = kickass.request(query, dicto)
 | 
				
			||||||
        self.assertIn('url', params)
 | 
					        self.assertIn('url', params)
 | 
				
			||||||
        self.assertIn(query, params['url'])
 | 
					        self.assertIn(query, params['url'])
 | 
				
			||||||
        self.assertIn('kickass.to', params['url'])
 | 
					        self.assertIn('kickass.cd', params['url'])
 | 
				
			||||||
        self.assertFalse(params['verify'])
 | 
					        self.assertFalse(params['verify'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_response(self):
 | 
					    def test_response(self):
 | 
				
			||||||
@ -84,7 +84,7 @@ class TestKickassEngine(SearxTestCase):
 | 
				
			|||||||
                        </span>
 | 
					                        </span>
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                </td>
 | 
					                </td>
 | 
				
			||||||
                <td class="nobr center">449 <span>bytes</span></td>
 | 
					                <td class="nobr center">449 bytes</td>
 | 
				
			||||||
                <td class="center">4</td>
 | 
					                <td class="center">4</td>
 | 
				
			||||||
                <td class="center">2 years</td>
 | 
					                <td class="center">2 years</td>
 | 
				
			||||||
                <td class="green center">10</td>
 | 
					                <td class="green center">10</td>
 | 
				
			||||||
@ -97,7 +97,7 @@ class TestKickassEngine(SearxTestCase):
 | 
				
			|||||||
        self.assertEqual(type(results), list)
 | 
					        self.assertEqual(type(results), list)
 | 
				
			||||||
        self.assertEqual(len(results), 1)
 | 
					        self.assertEqual(len(results), 1)
 | 
				
			||||||
        self.assertEqual(results[0]['title'], 'This should be the title')
 | 
					        self.assertEqual(results[0]['title'], 'This should be the title')
 | 
				
			||||||
        self.assertEqual(results[0]['url'], 'https://kickass.to/url.html')
 | 
					        self.assertEqual(results[0]['url'], 'https://kickass.cd/url.html')
 | 
				
			||||||
        self.assertEqual(results[0]['content'], 'Posted by riri in Other > Unsorted')
 | 
					        self.assertEqual(results[0]['content'], 'Posted by riri in Other > Unsorted')
 | 
				
			||||||
        self.assertEqual(results[0]['seed'], 10)
 | 
					        self.assertEqual(results[0]['seed'], 10)
 | 
				
			||||||
        self.assertEqual(results[0]['leech'], 1)
 | 
					        self.assertEqual(results[0]['leech'], 1)
 | 
				
			||||||
@ -191,7 +191,7 @@ class TestKickassEngine(SearxTestCase):
 | 
				
			|||||||
                        </span>
 | 
					                        </span>
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                </td>
 | 
					                </td>
 | 
				
			||||||
                <td class="nobr center">1 <span>KB</span></td>
 | 
					                <td class="nobr center">1 KiB</td>
 | 
				
			||||||
                <td class="center">4</td>
 | 
					                <td class="center">4</td>
 | 
				
			||||||
                <td class="center">2 years</td>
 | 
					                <td class="center">2 years</td>
 | 
				
			||||||
                <td class="green center">10</td>
 | 
					                <td class="green center">10</td>
 | 
				
			||||||
@ -235,7 +235,7 @@ class TestKickassEngine(SearxTestCase):
 | 
				
			|||||||
                        </span>
 | 
					                        </span>
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                </td>
 | 
					                </td>
 | 
				
			||||||
                <td class="nobr center">1 <span>MB</span></td>
 | 
					                <td class="nobr center">1 MiB</td>
 | 
				
			||||||
                <td class="center">4</td>
 | 
					                <td class="center">4</td>
 | 
				
			||||||
                <td class="center">2 years</td>
 | 
					                <td class="center">2 years</td>
 | 
				
			||||||
                <td class="green center">9</td>
 | 
					                <td class="green center">9</td>
 | 
				
			||||||
@ -279,7 +279,7 @@ class TestKickassEngine(SearxTestCase):
 | 
				
			|||||||
                        </span>
 | 
					                        </span>
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                </td>
 | 
					                </td>
 | 
				
			||||||
                <td class="nobr center">1 <span>GB</span></td>
 | 
					                <td class="nobr center">1 GiB</td>
 | 
				
			||||||
                <td class="center">4</td>
 | 
					                <td class="center">4</td>
 | 
				
			||||||
                <td class="center">2 years</td>
 | 
					                <td class="center">2 years</td>
 | 
				
			||||||
                <td class="green center">8</td>
 | 
					                <td class="green center">8</td>
 | 
				
			||||||
@ -323,7 +323,7 @@ class TestKickassEngine(SearxTestCase):
 | 
				
			|||||||
                        </span>
 | 
					                        </span>
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                </td>
 | 
					                </td>
 | 
				
			||||||
                <td class="nobr center">1 <span>TB</span></td>
 | 
					                <td class="nobr center">1 TiB</td>
 | 
				
			||||||
                <td class="center">4</td>
 | 
					                <td class="center">4</td>
 | 
				
			||||||
                <td class="center">2 years</td>
 | 
					                <td class="center">2 years</td>
 | 
				
			||||||
                <td class="green center">7</td>
 | 
					                <td class="green center">7</td>
 | 
				
			||||||
@ -367,7 +367,7 @@ class TestKickassEngine(SearxTestCase):
 | 
				
			|||||||
                        </span>
 | 
					                        </span>
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                </td>
 | 
					                </td>
 | 
				
			||||||
                <td class="nobr center">z <span>bytes</span></td>
 | 
					                <td class="nobr center">z bytes</td>
 | 
				
			||||||
                <td class="center">r</td>
 | 
					                <td class="center">r</td>
 | 
				
			||||||
                <td class="center">2 years</td>
 | 
					                <td class="center">2 years</td>
 | 
				
			||||||
                <td class="green center">a</td>
 | 
					                <td class="green center">a</td>
 | 
				
			||||||
@ -380,17 +380,17 @@ class TestKickassEngine(SearxTestCase):
 | 
				
			|||||||
        self.assertEqual(type(results), list)
 | 
					        self.assertEqual(type(results), list)
 | 
				
			||||||
        self.assertEqual(len(results), 5)
 | 
					        self.assertEqual(len(results), 5)
 | 
				
			||||||
        self.assertEqual(results[0]['title'], 'This should be the title')
 | 
					        self.assertEqual(results[0]['title'], 'This should be the title')
 | 
				
			||||||
        self.assertEqual(results[0]['url'], 'https://kickass.to/url.html')
 | 
					        self.assertEqual(results[0]['url'], 'https://kickass.cd/url.html')
 | 
				
			||||||
        self.assertEqual(results[0]['content'], 'Posted by riri in Other > Unsorted')
 | 
					        self.assertEqual(results[0]['content'], 'Posted by riri in Other > Unsorted')
 | 
				
			||||||
        self.assertEqual(results[0]['seed'], 10)
 | 
					        self.assertEqual(results[0]['seed'], 10)
 | 
				
			||||||
        self.assertEqual(results[0]['leech'], 1)
 | 
					        self.assertEqual(results[0]['leech'], 1)
 | 
				
			||||||
        self.assertEqual(results[0]['files'], 4)
 | 
					        self.assertEqual(results[0]['files'], 4)
 | 
				
			||||||
        self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:MAGNETURL&dn=test')
 | 
					        self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:MAGNETURL&dn=test')
 | 
				
			||||||
        self.assertEqual(results[0]['torrentfile'], 'http://torcache.net/torrent/53917.torrent?title=test')
 | 
					        self.assertEqual(results[0]['torrentfile'], 'http://torcache.net/torrent/53917.torrent?title=test')
 | 
				
			||||||
        self.assertEqual(results[0]['filesize'], 1024)
 | 
					        self.assertEqual(results[0]['filesize'], 1000)
 | 
				
			||||||
        self.assertEqual(results[1]['filesize'], 1048576)
 | 
					        self.assertEqual(results[1]['filesize'], 1000000)
 | 
				
			||||||
        self.assertEqual(results[2]['filesize'], 1073741824)
 | 
					        self.assertEqual(results[2]['filesize'], 1000000000)
 | 
				
			||||||
        self.assertEqual(results[3]['filesize'], 1099511627776)
 | 
					        self.assertEqual(results[3]['filesize'], 1000000000000)
 | 
				
			||||||
        self.assertEqual(results[4]['seed'], 0)
 | 
					        self.assertEqual(results[4]['seed'], 0)
 | 
				
			||||||
        self.assertEqual(results[4]['leech'], 0)
 | 
					        self.assertEqual(results[4]['leech'], 0)
 | 
				
			||||||
        self.assertEqual(results[4]['files'], None)
 | 
					        self.assertEqual(results[4]['files'], None)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user