# -*- coding: utf-8 -*- #VERSION: 1.3 #AUTHORS: Anatoly Mayorov (mmajor@yandex.ru), Konstantin Lebedev (whitef0x@ya.ru) # This plugin is licensed under the GNU GPL Version 2. from novaprinter import prettyPrinter from helpers import download_file, htmlentitydecode import http.cookiejar import re import gzip from io import StringIO import urllib.parse import urllib.request import os import logging ''' 12 Дек 14DM Oddworld: Stranger's Wrath (2014) Android 4C 4.26 GBS 44 L 17 ''' torrent_pattern = re.compile(r'''.*DM\s*(?P.+)?\s\s*(.+)?\s*(?P.+)S.*(?P\d+) L.*(?P\d+)''') tag = re.compile(r'<.*?>') class rutor(object): ''' RUTOR.ORG Russian free tracker ''' url = 'http://x-bit.net/' name = 'rutor.org' supported_categories = {'all': 0, 'movies': 1, 'tv': 6, 'music': 2, 'games': 8, 'anime': 10, 'software': 9, 'pictures': 3, 'books': 11} query_pattern = '%(url)s/search/%(start)i/%(f)i/000/2/%(q)s' cookie_filename = os.path.join(os.path.dirname(os.path.abspath(__file__)),name + ".cookies") cookie_pattern = re.compile(r'''document.cookie.indexOf\('(?P.+)=(?P.+)'\)''') def __init__(self): pass def download_torrent(self, info): print(download_file(info, info)) def retrieve_url(self,url): cj = http.cookiejar.MozillaCookieJar(self.cookie_filename) if os.access(self.cookie_filename, os.F_OK): cj.load() opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) req = urllib.request.Request(url) response = opener.open(req) dat = response.read() # Check if it is gzipped if dat[:2] == '\037\213': # Data is gzip encoded, decode it compressedstream = StringIO.StringIO(dat) gzipper = gzip.GzipFile(fileobj=compressedstream) dat = gzipper.read() # document.cookie.indexOf('_ddn_intercept_2_=ebdc811923afde6a39f0d7bc77dfe97d') m = re.search(self.cookie_pattern, dat.decode('utf-8')) if m: #opener.addheaders.append(('Cookie', m.group('cookie'))) ck = http.cookiejar.Cookie(version=0, name=m.group('name'), value=m.group('value'), port=None, port_specified=False, domain=self.name, domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False) cj.set_cookie(ck) cj.save(self.cookie_filename, ignore_discard=True, ignore_expires=True) response = opener.open(req) dat = response.read() info = response.info() charset = 'utf-8' try: ignore, charset = info['Content-Type'].split('charset=') except: pass dat = dat.decode(charset, 'replace') dat = htmlentitydecode(dat) return dat.encode('utf-8', 'replace') def search_page(self, what, cat, start): params = {'url': self.url, 'q': urllib.parse.quote(what), 'f': self.supported_categories[cat], 'start': start} dat = self.retrieve_url(self.query_pattern % params).decode('utf-8') for el in torrent_pattern.finditer(dat): d = el.groupdict() d['desc_link'] = self.url + d['desc_link'] d['engine_url'] = self.url d['name'] = tag.sub('', d['name']) yield d def search(self, what, cat='all'): start = 0 f = True while f: f = False for d in self.search_page(what, cat, start): if __name__ != "__main__": prettyPrinter(d) f = True start += 1 # For testing purposes. if __name__ == "__main__": logger = logging.getLogger() logger.setLevel(logging.INFO) engine = rutor() engine.search('friends')