Добавлен поисковик RuTracker. SOCKS-прокси для подключения к трекерам
parent
be14440f2f
commit
c4e6d7763e
6
addon.py
6
addon.py
|
@ -4,7 +4,7 @@ from codequick import Route, Script, Listitem, utils, run # @UnresolvedImport
|
||||||
from codequick.storage import PersistentList # @UnresolvedImport
|
from codequick.storage import PersistentList # @UnresolvedImport
|
||||||
import os.path
|
import os.path
|
||||||
import xbmcgui, xbmc
|
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.utils import localize, store_torrent_file, get_engine
|
||||||
from resources.lib.overrrides.session import torrent_file_fetch
|
from resources.lib.overrrides.session import torrent_file_fetch
|
||||||
from resources.lib.player import VideoLoop
|
from resources.lib.player import VideoLoop
|
||||||
|
@ -13,7 +13,8 @@ video_extensions = ('.mp4', '.avi', '.3gp', '.ogv', '.mkv', '.ts', '.mpg', '.mpe
|
||||||
|
|
||||||
search_engines = [
|
search_engines = [
|
||||||
rutor.SearchEngine,
|
rutor.SearchEngine,
|
||||||
kinozal.SearchEngine
|
kinozal.SearchEngine,
|
||||||
|
rutracker.SearchEngine
|
||||||
]
|
]
|
||||||
|
|
||||||
ROOT = os.path.abspath(os.path.dirname(__file__))
|
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):
|
for p, se in zip(range(0, 100, 100 / len(search_in)), search_in):
|
||||||
progress.update(p, line1=se.name)
|
progress.update(p, line1=se.name)
|
||||||
found_items.extend(se().search(search_query))
|
found_items.extend(se().search(search_query))
|
||||||
|
open('/tmp/t.t', 'w').write(repr(list(map(lambda x: x.url, found_items))))
|
||||||
res_items = []
|
res_items = []
|
||||||
for i in sorted(found_items, key=lambda x: x.seeders, reverse=True):
|
for i in sorted(found_items, key=lambda x: x.seeders, reverse=True):
|
||||||
if '2160p' in i.title: hd = '[2160p/{}] '.format(i.size)
|
if '2160p' in i.title: hd = '[2160p/{}] '.format(i.size)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
<addon id="plugin.video.torrenter3" name="Torrenter3" provider-name="inpos" version="3.1.2">
|
<addon id="plugin.video.torrenter3" name="Torrenter3" provider-name="inpos" version="3.2.0">
|
||||||
<requires>
|
<requires>
|
||||||
<import addon="xbmc.python" version="2.25.0"/>
|
<import addon="xbmc.python" version="2.25.0"/>
|
||||||
<import addon="script.module.pyrrent2http"/>
|
<import addon="script.module.pyrrent2http"/>
|
||||||
|
@ -22,8 +22,9 @@
|
||||||
<email>roman@ukamnya.ru</email>
|
<email>roman@ukamnya.ru</email>
|
||||||
<platform>all</platform>
|
<platform>all</platform>
|
||||||
<language>en_GB ru_RU</language>
|
<language>en_GB ru_RU</language>
|
||||||
<news>- 3.1.0: add searcher kinozal.tv</news>
|
<news>- 3.2.0: Add searcher rutracker.org. Add socks-proxy for trackers</news>
|
||||||
<news>- 3.0.1: first rewrited version</news>
|
<news>- 3.1.0: Add searcher kinozal.tv</news>
|
||||||
|
<news>- 3.0.1: First rewrited version</news>
|
||||||
<reuselanguageinvoker>true</reuselanguageinvoker>
|
<reuselanguageinvoker>true</reuselanguageinvoker>
|
||||||
</extension>
|
</extension>
|
||||||
</addon>
|
</addon>
|
||||||
|
|
|
@ -31,6 +31,10 @@ msgctxt "#33003"
|
||||||
msgid "Kinozal"
|
msgid "Kinozal"
|
||||||
msgstr "Kinozal"
|
msgstr "Kinozal"
|
||||||
|
|
||||||
|
msgctxt "#33004"
|
||||||
|
msgid "RuTracker"
|
||||||
|
msgstr "RuTracker"
|
||||||
|
|
||||||
msgctxt "#33011"
|
msgctxt "#33011"
|
||||||
msgid "Storage folder"
|
msgid "Storage folder"
|
||||||
msgstr "Storage folder"
|
msgstr "Storage folder"
|
||||||
|
@ -47,6 +51,10 @@ msgctxt "#33014"
|
||||||
msgid "SOCKS port"
|
msgid "SOCKS port"
|
||||||
msgstr "SOCKS port"
|
msgstr "SOCKS port"
|
||||||
|
|
||||||
|
msgctxt "#33015"
|
||||||
|
msgid "Use SOCKS proxy for trackers"
|
||||||
|
msgstr "Use SOCKS proxy for trackers"
|
||||||
|
|
||||||
msgctxt "#33051"
|
msgctxt "#33051"
|
||||||
msgid "Please specify storage folder in Settings!"
|
msgid "Please specify storage folder in Settings!"
|
||||||
msgstr "Please specify storage folder in Settings"
|
msgstr "Please specify storage folder in Settings"
|
||||||
|
|
|
@ -31,6 +31,10 @@ msgctxt "#33003"
|
||||||
msgid "Kinozal"
|
msgid "Kinozal"
|
||||||
msgstr "Kinozal"
|
msgstr "Kinozal"
|
||||||
|
|
||||||
|
msgctxt "#33004"
|
||||||
|
msgid "RuTracker"
|
||||||
|
msgstr "RuTracker"
|
||||||
|
|
||||||
msgctxt "#33011"
|
msgctxt "#33011"
|
||||||
msgid "Storage folder"
|
msgid "Storage folder"
|
||||||
msgstr "Папка хранения"
|
msgstr "Папка хранения"
|
||||||
|
@ -47,6 +51,10 @@ msgctxt "#33014"
|
||||||
msgid "SOCKS port"
|
msgid "SOCKS port"
|
||||||
msgstr "Порт SOCKS"
|
msgstr "Порт SOCKS"
|
||||||
|
|
||||||
|
msgctxt "#33015"
|
||||||
|
msgid "Use SOCKS proxy for trackers"
|
||||||
|
msgstr "Использовать SOCKS-прокси для подключения к трекерам"
|
||||||
|
|
||||||
msgctxt "#33051"
|
msgctxt "#33051"
|
||||||
msgid "Please specify storage folder in Settings!"
|
msgid "Please specify storage folder in Settings!"
|
||||||
msgstr "Укажите папку хранения"
|
msgstr "Укажите папку хранения"
|
||||||
|
|
|
@ -49,7 +49,7 @@ class SearchEngine(Searcher):
|
||||||
self.cookies = cookies
|
self.cookies = cookies
|
||||||
return True
|
return True
|
||||||
except:
|
except:
|
||||||
notify('Kinozal.tv', localize(33056), local_image.format('searcher_kinozal.png'))
|
notify(self.name, localize(33056), local_image.format(self.icon))
|
||||||
return False
|
return False
|
||||||
def normalize_url(self, url):
|
def normalize_url(self, url):
|
||||||
return url.encode('cp1251')
|
return url.encode('cp1251')
|
||||||
|
|
|
@ -11,14 +11,17 @@ class SearchEngine(Searcher):
|
||||||
url_constructor = urljoin_partial(self.base_url)
|
url_constructor = urljoin_partial(self.base_url)
|
||||||
rows = list(filter(lambda x: len(x.findall('.//a')) == 3, body.findall('.//tr')))
|
rows = list(filter(lambda x: len(x.findall('.//a')) == 3, body.findall('.//tr')))
|
||||||
for r in rows:
|
for r in rows:
|
||||||
links = r.findall('.//a')
|
try:
|
||||||
url = url_constructor(links[0].get('href').strip())
|
links = r.findall('.//a')
|
||||||
title = links[2].text
|
url = url_constructor(links[0].get('href').strip())
|
||||||
seeders = int(list(r.findall('.//span[@class="green"]')[0].itertext())[0].strip())
|
title = links[2].text
|
||||||
leachers = int(list(r.findall('.//span[@class="red"]')[0].itertext())[0].strip())
|
seeders = int(list(r.findall('.//span[@class="green"]')[0].itertext())[0].strip())
|
||||||
size = list(
|
leachers = int(list(r.findall('.//span[@class="red"]')[0].itertext())[0].strip())
|
||||||
list(filter(lambda x: len(list(x.itertext())) == 1 and list(x.itertext())[0].strip().endswith(('GB', 'MB')),
|
size = list(
|
||||||
r.findall('.//td'))
|
list(filter(lambda x: len(list(x.itertext())) == 1 and list(x.itertext())[0].strip().endswith(('GB', 'MB')),
|
||||||
)[0].itertext()
|
r.findall('.//td'))
|
||||||
)[0].strip()
|
)[0].itertext()
|
||||||
yield ResultItem(url, title, size, seeders, leachers, self.icon, self.cookies, self.base_url)
|
)[0].strip()
|
||||||
|
yield ResultItem(url, title, size, seeders, leachers, self.icon, self.cookies, self.base_url)
|
||||||
|
except:
|
||||||
|
continue
|
||||||
|
|
|
@ -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')
|
|
@ -39,10 +39,17 @@ def file_url(path):
|
||||||
return path
|
return path
|
||||||
|
|
||||||
def get_engine(torrent_uri):
|
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,
|
return Engine(uri=file_url(torrent_uri), download_path=storage_download_dir,
|
||||||
encryption=1, keep_complete=False, keep_incomplete=False,
|
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,
|
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']:
|
while not option['storage_dir']:
|
||||||
dialog = xbmcgui.Dialog()
|
dialog = xbmcgui.Dialog()
|
||||||
dialog.ok(localize(33000), localize(33051))
|
dialog.ok(localize(33000), localize(33051))
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 46 KiB |
|
@ -5,6 +5,7 @@
|
||||||
<setting label="33012" type="bool" id="use_socks" default="false"/>
|
<setting label="33012" type="bool" id="use_socks" default="false"/>
|
||||||
<setting label="33013" type="ipaddress" id="socks_ip" default="127.0.0.1" visible="eq(-1,true)"/>
|
<setting label="33013" type="ipaddress" id="socks_ip" default="127.0.0.1" visible="eq(-1,true)"/>
|
||||||
<setting label="33014" type="number" id="socks_port" default="9050" visible="eq(-2,true)"/>
|
<setting label="33014" type="number" id="socks_port" default="9050" visible="eq(-2,true)"/>
|
||||||
|
<setting label="33015" type="bool" id="use_socks_for_trackers" default="false" visible="eq(-3,true)"/>
|
||||||
</category>
|
</category>
|
||||||
<category label="33002">
|
<category label="33002">
|
||||||
<setting label="33057" type="bool" id="rutor_enable" default="true"/>
|
<setting label="33057" type="bool" id="rutor_enable" default="true"/>
|
||||||
|
@ -16,4 +17,10 @@
|
||||||
<setting label="33059" type="text" id="kinozal_login" default="" visible="eq(-2,true)"/>
|
<setting label="33059" type="text" id="kinozal_login" default="" visible="eq(-2,true)"/>
|
||||||
<setting label="33060" type="text" id="kinozal_password" default="" option="hidden" visible="eq(-3,true)" enable="!eq(-1,)"/>
|
<setting label="33060" type="text" id="kinozal_password" default="" option="hidden" visible="eq(-3,true)" enable="!eq(-1,)"/>
|
||||||
</category>
|
</category>
|
||||||
|
<category label="33004">
|
||||||
|
<setting label="33057" type="bool" id="rutracker_enable" default="true"/>
|
||||||
|
<setting label="33058" type="text" id="rutracker_url" default="https://rutracker.org" visible="eq(-1,true)"/>
|
||||||
|
<setting label="33059" type="text" id="rutracker_login" default="" visible="eq(-2,true)"/>
|
||||||
|
<setting label="33060" type="text" id="rutracker_password" default="" option="hidden" visible="eq(-3,true)" enable="!eq(-1,)"/>
|
||||||
|
</category>
|
||||||
</settings>
|
</settings>
|
||||||
|
|
Loading…
Reference in New Issue