diff --git a/addon.py b/addon.py index 6552e87..6429f78 100644 --- a/addon.py +++ b/addon.py @@ -4,7 +4,7 @@ from codequick import Route, Script, Listitem, utils, run # @UnresolvedImport from codequick.storage import PersistentList # @UnresolvedImport import os.path import xbmcgui, xbmc -from resources.lib.searchers import rutor, kinozal +from resources.lib.searchers import rutor, kinozal, rutracker from resources.lib.utils import localize, store_torrent_file, get_engine from resources.lib.overrrides.session import torrent_file_fetch from resources.lib.player import VideoLoop @@ -13,7 +13,8 @@ video_extensions = ('.mp4', '.avi', '.3gp', '.ogv', '.mkv', '.ts', '.mpg', '.mpe search_engines = [ rutor.SearchEngine, - kinozal.SearchEngine + kinozal.SearchEngine, + rutracker.SearchEngine ] ROOT = os.path.abspath(os.path.dirname(__file__)) @@ -71,6 +72,7 @@ def search(plugin, search_query, thumb=None): for p, se in zip(range(0, 100, 100 / len(search_in)), search_in): progress.update(p, line1=se.name) found_items.extend(se().search(search_query)) + open('/tmp/t.t', 'w').write(repr(list(map(lambda x: x.url, found_items)))) res_items = [] for i in sorted(found_items, key=lambda x: x.seeders, reverse=True): if '2160p' in i.title: hd = '[2160p/{}] '.format(i.size) diff --git a/addon.xml b/addon.xml index 2a4d0bc..2a48df8 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@ - + @@ -22,8 +22,9 @@ roman@ukamnya.ru all en_GB ru_RU - - 3.1.0: add searcher kinozal.tv - - 3.0.1: first rewrited version + - 3.2.0: Add searcher rutracker.org. Add socks-proxy for trackers + - 3.1.0: Add searcher kinozal.tv + - 3.0.1: First rewrited version true diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po index 1eaed8e..fe0d4b1 100644 --- a/resources/language/resource.language.en_gb/strings.po +++ b/resources/language/resource.language.en_gb/strings.po @@ -31,6 +31,10 @@ msgctxt "#33003" msgid "Kinozal" msgstr "Kinozal" +msgctxt "#33004" +msgid "RuTracker" +msgstr "RuTracker" + msgctxt "#33011" msgid "Storage folder" msgstr "Storage folder" @@ -47,6 +51,10 @@ msgctxt "#33014" msgid "SOCKS port" msgstr "SOCKS port" +msgctxt "#33015" +msgid "Use SOCKS proxy for trackers" +msgstr "Use SOCKS proxy for trackers" + msgctxt "#33051" msgid "Please specify storage folder in Settings!" msgstr "Please specify storage folder in Settings" diff --git a/resources/language/resource.language.ru_ru/strings.po b/resources/language/resource.language.ru_ru/strings.po index 73c702f..eac6566 100644 --- a/resources/language/resource.language.ru_ru/strings.po +++ b/resources/language/resource.language.ru_ru/strings.po @@ -31,6 +31,10 @@ msgctxt "#33003" msgid "Kinozal" msgstr "Kinozal" +msgctxt "#33004" +msgid "RuTracker" +msgstr "RuTracker" + msgctxt "#33011" msgid "Storage folder" msgstr "Папка хранения" @@ -47,6 +51,10 @@ msgctxt "#33014" msgid "SOCKS port" msgstr "Порт SOCKS" +msgctxt "#33015" +msgid "Use SOCKS proxy for trackers" +msgstr "Использовать SOCKS-прокси для подключения к трекерам" + msgctxt "#33051" msgid "Please specify storage folder in Settings!" msgstr "Укажите папку хранения" diff --git a/resources/lib/searchers/kinozal.py b/resources/lib/searchers/kinozal.py index bc0fdf3..655299c 100644 --- a/resources/lib/searchers/kinozal.py +++ b/resources/lib/searchers/kinozal.py @@ -49,7 +49,7 @@ class SearchEngine(Searcher): self.cookies = cookies return True except: - notify('Kinozal.tv', localize(33056), local_image.format('searcher_kinozal.png')) + notify(self.name, localize(33056), local_image.format(self.icon)) return False def normalize_url(self, url): return url.encode('cp1251') diff --git a/resources/lib/searchers/rutor.py b/resources/lib/searchers/rutor.py index 9593104..57f526f 100644 --- a/resources/lib/searchers/rutor.py +++ b/resources/lib/searchers/rutor.py @@ -11,14 +11,17 @@ class SearchEngine(Searcher): url_constructor = urljoin_partial(self.base_url) rows = list(filter(lambda x: len(x.findall('.//a')) == 3, body.findall('.//tr'))) for r in rows: - links = r.findall('.//a') - url = url_constructor(links[0].get('href').strip()) - title = links[2].text - seeders = int(list(r.findall('.//span[@class="green"]')[0].itertext())[0].strip()) - leachers = int(list(r.findall('.//span[@class="red"]')[0].itertext())[0].strip()) - size = list( - list(filter(lambda x: len(list(x.itertext())) == 1 and list(x.itertext())[0].strip().endswith(('GB', 'MB')), - r.findall('.//td')) - )[0].itertext() - )[0].strip() - yield ResultItem(url, title, size, seeders, leachers, self.icon, self.cookies, self.base_url) + try: + links = r.findall('.//a') + url = url_constructor(links[0].get('href').strip()) + title = links[2].text + seeders = int(list(r.findall('.//span[@class="green"]')[0].itertext())[0].strip()) + leachers = int(list(r.findall('.//span[@class="red"]')[0].itertext())[0].strip()) + size = list( + list(filter(lambda x: len(list(x.itertext())) == 1 and list(x.itertext())[0].strip().endswith(('GB', 'MB')), + r.findall('.//td')) + )[0].itertext() + )[0].strip() + yield ResultItem(url, title, size, seeders, leachers, self.icon, self.cookies, self.base_url) + except: + continue diff --git a/resources/lib/searchers/rutracker.py b/resources/lib/searchers/rutracker.py new file mode 100644 index 0000000..dbbe548 --- /dev/null +++ b/resources/lib/searchers/rutracker.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +from . import Searcher, urljoin_partial, ResultItem +from ..settings import option +from ..utils import notify, localize +from codequick.listing import local_image # @UnresolvedImport + +class SearchEngine(Searcher): + base_url = option['rutracker_url'] + search_path = '/forum/tracker.php?nm={}' + name = 'RuTracker.org' + icon = 'searcher_rutracker.png' + enabled = option.get_boolean('rutracker_enable') # @UndefinedVariable + def prepare(self): + if self.cookies: + bb_session = self.cookies.get('bb_session', None) + if bb_session: + return True + return self.login() + def process(self, body): + url_constructor = urljoin_partial(self.base_url) + rows = body.findall('.//div[@id="search-results"]/table/tbody/tr') + for r in rows: + link = list(filter(lambda x: 't-title' in x.attrib['class'], r.findall('.//td')))[0].find('.//a') + url_part = link.get('href').strip().split('=')[1] + url = url_constructor(u'/forum/dl.php?t={}'.format(url_part)) + title = link.text + seeders_el = r.find('.//*[@class="seedmed"]') + seeders = int(seeders_el.text.strip() if seeders_el is not None else 0) + leachers = int(list(filter(lambda x: 'leechmed' in x.attrib['class'], r.findall('.//td')))[0].text.strip()) + size = ' '.join(list(filter(lambda x: 't-title' in x.attrib['class'], r.findall('.//td')))[0].find('.//a').text.strip().split(' ')[:2]) + yield ResultItem(url, title, size, seeders, leachers, self.icon, self.cookies, self.base_url) + def login(self): + user = option['rutracker_login'] + password = option['rutracker_password'] + try: + if not user or not password: + raise Exception + resp = self.session.post('{}/forum/login.php'.format(self.base_url), data={'login_username': user, + 'login_password': password, + 'login': '%C2%F5%EE%E4', + 'redirect': 'index.php'}, + cookies={}, headers=self.headers, allow_redirects=False) + if not resp.ok: + raise Exception + cookies = resp.cookies + bb_session = cookies.get('bb_session', None) + if not bb_session: + raise Exception + self.cookies = cookies + return True + except: + notify(self.name, localize(33056), local_image.format(self.icon)) + return False + def normalize_url(self, url): + return url.encode('cp1251') diff --git a/resources/lib/utils/__init__.py b/resources/lib/utils/__init__.py index 3c71479..348ce0b 100644 --- a/resources/lib/utils/__init__.py +++ b/resources/lib/utils/__init__.py @@ -39,10 +39,17 @@ def file_url(path): return path def get_engine(torrent_uri): + if option.get_boolean('use_socks_for_trackers'): # @UndefinedVariable + proxy = { + 'host': option['socks_ip'], + 'port': int(option['socks_port']) + } + else: + proxy = None return Engine(uri=file_url(torrent_uri), download_path=storage_download_dir, encryption=1, keep_complete=False, keep_incomplete=False, dht_routers=["router.bittorrent.com:6881", "router.utorrent.com:6881"], use_random_port=False, listen_port=6881, - user_agent='', enable_dht=True) + user_agent='', enable_dht=True, proxy=proxy) while not option['storage_dir']: dialog = xbmcgui.Dialog() dialog.ok(localize(33000), localize(33051)) diff --git a/resources/media/searcher_rutracker.png b/resources/media/searcher_rutracker.png new file mode 100644 index 0000000..cee4f02 Binary files /dev/null and b/resources/media/searcher_rutracker.png differ diff --git a/resources/settings.xml b/resources/settings.xml index 00220f5..352134f 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -5,6 +5,7 @@ + @@ -16,4 +17,10 @@ + + + + + +