From 40955a402f90f51d9f12aec1d4a4381e0d418056 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Wed, 1 Jul 2015 23:15:29 +0300 Subject: [PATCH] major search update, external serachers --- Content.py | 2 +- Core.py | 101 ++++------------- SearcherABC.py | 13 ++- cal.py | 20 ---- changelog.txt | 7 +- controlcenter.py | 70 ++++++++++-- functions.py | 133 +++++++++++++++++++++-- resources/language/English/strings.xml | 5 + resources/language/Russian/strings.xml | 7 +- resources/language/Ukrainian/strings.xml | 5 + resources/searchers/OldPirateBay.py | 90 --------------- resources/searchers/RuTorOrg.py | 8 +- resources/searchers/ThePirateBaySe.py | 88 --------------- 13 files changed, 244 insertions(+), 305 deletions(-) delete mode 100644 cal.py delete mode 100644 resources/searchers/OldPirateBay.py delete mode 100644 resources/searchers/ThePirateBaySe.py diff --git a/Content.py b/Content.py index d77f8de..6fc8f24 100644 --- a/Content.py +++ b/Content.py @@ -185,7 +185,7 @@ class Content: return else: print '[makeRequest]: HTTP Error, e.code=' + str(e.code) - + return if response.info().get('Content-Encoding') == 'gzip': buf = StringIO(response.read()) f = gzip.GzipFile(fileobj=buf) diff --git a/Core.py b/Core.py index ccd7f0f..92cfc10 100644 --- a/Core.py +++ b/Core.py @@ -78,6 +78,8 @@ class Core: def sectionMenu(self): if self.__settings__.getSetting('plugin_name')!=self.__plugin__: + if self.__plugin__ == 'Torrenter v.2.3.0': + first_run_230(self.__settings__.getSetting('delete_russian')=='true') if self.__settings__.getSetting('delete_russian')!='false': not_russian=delete_russian(ok=self.__settings__.getSetting('delete_russian')=='true', action='delete') if not_russian: @@ -124,16 +126,6 @@ class Core: self.drawItem('full_download', 'full_download', image=self.ROOT + '/icons/magnet.png') self.drawItem('test', 'test', image=self.ROOT + '/icons/magnet.png') - '''self.drawItem(self.localize('< Popular >'), 'getPopular', image=self.ROOT + '/icons/video.png') - self.drawItem(self.localize('< Ratings >'), 'getRatings', image=self.ROOT + '/icons/video.png') - self.drawItem(self.localize('< Recent Materials >'), 'recentMaterilas', image=self.ROOT + '/icons/video.png') - if self.__settings__.getSetting("auth"): - self.drawItem(self.localize('< Bookmarks >'), 'getBookmarks', image=self.ROOT + '/icons/bookmarks.png') - self.drawItem(self.localize('< History >'), 'getHistory', image=self.ROOT + '/icons/history.png') - self.drawItem(self.localize('< Logout >'), 'logoutUser', image=self.ROOT + '/icons/logout.png') - else: - self.drawItem(self.localize('< Login >'), 'loginUser', image=self.ROOT + '/icons/login.png') - self.drawItem(self.localize('< Register >'), 'registerUser', image=self.ROOT + '/icons/register.png')''' if 'true' == self.__settings__.getSetting("keep_files"): self.drawItem('< %s >' % self.localize('Clear Storage'), 'clearStorage', isFolder=True, image=self.ROOT + '/icons/clear.png') @@ -279,6 +271,9 @@ class Core: #self.DownloadStatus() url='http://torcache.net/torrent/6698E0950DCD257A6B03AF2E8B068B7FF9D4619D.torrent?title=[kickass.to]game.of.thrones.season.2.720p.bluray.x264.shaanig' #xbmc.executebuiltin('xbmc.RunPlugin("plugin://plugin.video.torrenter/?action=openTorrent&external=ThePirateBaySe&url=ThePirateBaySe%3A%3A'+urllib.quote_plus(url)+'¬_download_only=True")') + #print str(Searchers().list()) + first_run_230(False) + def DownloadStatus(self, params={}): db = DownloadDB() @@ -1232,10 +1227,11 @@ class Core: if not url: action = xbmcgui.Dialog() url = action.browse(1, self.localize('Choose .torrent in video library'), 'video', '.torrent') - xbmc.executebuiltin( - 'XBMC.ActivateWindow(%s)' % 'Videos,plugin://plugin.video.torrenter/?action=%s&url=%s' - % ('torrentPlayer', url)) - return + if url: + xbmc.executebuiltin( + 'XBMC.ActivateWindow(%s)' % 'Videos,plugin://plugin.video.torrenter/?action=%s&url=%s' + % ('torrentPlayer', url)) + return if url: self.__settings__.setSetting("lastTorrentUrl", url) torrent = Downloader.Torrent(self.userStorageDirectory, torrentFilesDirectory=self.torrentFilesDirectory) @@ -1382,14 +1378,7 @@ class Core: classMatch = re.search('(\w+)::(.+)', url) if classMatch: searcher = classMatch.group(1) - if self.ROOT + os.sep + 'resources' + os.sep + 'searchers' not in sys.path: - sys.path.insert(0, self.ROOT + os.sep + 'resources' + os.sep + 'searchers') - try: - searcherObject = getattr(__import__(searcher), searcher)() - except Exception, e: - print 'Unable to use searcher: ' + searcher + ' at ' + self.__plugin__ + ' openTorrent(). Exception: ' + str(e) - return - url = searcherObject.getTorrentFile(classMatch.group(2)) + url = Searchers().downloadWithSearcher(classMatch.group(2), searcher) self.__settings__.setSetting("lastTorrentUrl", url) if not_download_only: if re.match("^http.+$", url): @@ -1403,10 +1392,7 @@ class Core: self.__settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) if silent != 'true': if external: - myshows_items = [] - myshows_files = [] - myshows_sizes = {} - contentList = [] + myshows_items, myshows_files, contentList, myshows_sizes = [], [], [], {} for filedict in torrent.getContentList(): fileTitle = '' if filedict.get('size'): @@ -1482,46 +1468,26 @@ class Core: addtime=get("addtime") if self.__settings__.getSetting('history')=='true': HistoryDB().add(url) - try: - external = urllib.unquote_plus(get("external")) - except: - external = None - filesList = [] - if None == get('isApi'): - progressBar = xbmcgui.DialogProgress() - progressBar.create(self.localize('Please Wait'), self.localize('Materials are loading now.')) - iterator = 0 + external = unquote(get("external")) searchersList = [] if not external or external == 'torrenterall': if addtime: providers=HistoryDB().get_providers(addtime) if providers: for searcher in providers: - searchersList.append(searcher + '.py') + searchersList.append(searcher) if not addtime or not searchersList: searchersList = Searchers().get_active() elif external == 'torrenterone': - slist = Searchers().list() - ret = xbmcgui.Dialog().select(self.localize('Choose searcher:'), slist) + slist = Searchers().list().keys() + ret = xbmcgui.Dialog().select(self.localize('Choose searcher')+':', slist) if ret > -1 and ret < len(slist): external = slist[ret] - searchersList.append(external + '.py') + searchersList.append(external) else: - searchersList.append(external + '.py') - for searcherFile in searchersList: - searcher = re.search('^(\w+)\.py$', searcherFile).group(1) - if searcher: - if None == get('isApi'): - progressBar.update(int(iterator), searcher) - iterator += 100 / len(searchersList) - filesList += self.searchWithSearcher(url, searcher) - if None == get('isApi') and progressBar.iscanceled(): - progressBar.update(0) - progressBar.close() - return - if None == get('isApi'): - progressBar.update(0) - progressBar.close() + searchersList.append(external) + + filesList=search(url, searchersList, get('isApi')) if self.__settings__.getSetting('sort_search')=='true': filesList = sorted(filesList, key=lambda x: x[0], reverse=True) self.showFilesList(filesList, params) @@ -1530,18 +1496,6 @@ class Core: xbmc.executebuiltin( 'xbmc.RunScript(%s,)' % os.path.join(ROOT, 'controlcenter.py')) - def searchWithSearcher(self, keyword, searcher): - filesList = [] - if self.ROOT + os.sep + 'resources' + os.sep + 'searchers' not in sys.path: - sys.path.insert(0, self.ROOT + os.sep + 'resources' + os.sep + 'searchers') - try: - searcherObject = getattr(__import__(searcher), searcher)() - filesList = searcherObject.search(keyword) - except Exception, e: - print 'Unable to use searcher: ' + searcher + ' at ' + self.__plugin__ + ' searchWithSearcher(). Exception: ' + str( - e) - return filesList - def showFilesList(self, filesList, params={}): get = params.get external = unquote(get("external"), None) @@ -1661,28 +1615,17 @@ class Core: dirname = self.__settings__.getSetting("torrent_dir") get = params.get - try: - url = urllib.unquote_plus(get("url")) - except: - url = self.__settings__.getSetting("lastTorrent").decode('utf-8') + url = unquote(get("url"), self.__settings__.getSetting("lastTorrent").decode('utf-8')) ind = get("ind") if not ind: self.__settings__.setSetting("lastTorrentUrl", url) classMatch = re.search('(\w+)::(.+)', url) if classMatch: - print str(dirname)+str(re.match("^magnet\:.+$", classMatch.group(2))==None) if re.match("^magnet\:.+$", classMatch.group(2)) and dirname: url=classMatch.group(2) else: searcher = classMatch.group(1) - if self.ROOT + os.sep + 'resources' + os.sep + 'searchers' not in sys.path: - sys.path.insert(0, self.ROOT + os.sep + 'resources' + os.sep + 'searchers') - try: - searcherObject = getattr(__import__(searcher), searcher)() - except Exception, e: - print 'Unable to use searcher: ' + searcher + ' at ' + self.__plugin__ + ' openTorrent(). Exception: ' + str(e) - return - url = searcherObject.getTorrentFile(classMatch.group(2)) + url = Searchers().downloadWithSearcher(classMatch.group(2), searcher) torrent = Downloader.Torrent(self.userStorageDirectory, torrentFilesDirectory=self.torrentFilesDirectory) diff --git a/SearcherABC.py b/SearcherABC.py index 1234b7f..7803dbf 100644 --- a/SearcherABC.py +++ b/SearcherABC.py @@ -99,7 +99,18 @@ class SearcherABC: encodedData = urllib.urlencode(data) else: encodedData = None - response = opener.open(url, encodedData) + try: + response = opener.open(url, encodedData) + except urllib2.HTTPError as e: + if e.code == 404: + print '[makeRequest]: Not Found! HTTP Error, e.code=' + str(e.code) + return + elif e.code in [503]: + print '[makeRequest]: Denied, HTTP Error, e.code=' + str(e.code) + return + else: + print '[makeRequest]: HTTP Error, e.code=' + str(e.code) + return #self.cookieJar.extract_cookies(response, urllib2) if response.info().get('Content-Encoding') == 'gzip': buf = StringIO(response.read()) diff --git a/cal.py b/cal.py deleted file mode 100644 index 5a4ec1f..0000000 --- a/cal.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -import sys -import os -import re - -ROOT = os.path.dirname(sys.modules["__main__"].sys.argv[0]) -searcherObject = {} -searcher = 'KickAssSo' -if ROOT + os.sep + 'resources' + os.sep + 'contenters' not in sys.path: - sys.path.insert(0, ROOT + os.sep + 'resources' + os.sep + 'contenters') -searcherObject[searcher] = getattr(__import__(searcher), searcher)() - -# print str(searcherObject[searcher].get_info('http://kickass.so/greys-anatomy-s11e09-hdtv-x264-lol-ettv-t10144556.html')) - - -x = 'Action
  • Animerat
  • Dans
  • Dokumentär
  • Drama
  • Familj
  • Fantasy
  • Komedi
  • Krig
  • Kriminal
  • Musikal
  • Romantik
  • Sci-Fi
  • Skräck
  • Sport
  • Thriller
  • Western
  • Äventyr
  • ' -y = 'href="http://swesub.tv/(.+?)/">(.+?)<' -for u, t in re.findall(y, x): - # print ", '/"+u+"/', {'page': '/"+u+"/?page=%d', 'increase': 1, 'second_page': 2,})," - print t diff --git a/changelog.txt b/changelog.txt index e1ad808..bea1298 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,4 +1,9 @@ -[B]Version 2.2.9[/B] +[B]Version 2.3.0[/B] +[+] Поиск: Поиск существенно ускорился, стал многопоточным (пока 3 потока одновременно) +[+] Поиск: Добавлена поддержка внешних серчеров с индивидуальными настройками (в стиле Pulsar) +[+] Обновлено окно Torrenter Global Control Center + +[B]Version 2.2.9[/B] [+] .torrent Проигрыватель: Теперь .torrent не теряется при обновлении окна Kodi [+] Проигрыватель: Улучшенная настройка сессии из cherrytorrent [+] Списки Медиа: Обновление баз на русском diff --git a/controlcenter.py b/controlcenter.py index b30b621..aec21f1 100644 --- a/controlcenter.py +++ b/controlcenter.py @@ -22,6 +22,7 @@ import sys import xbmcaddon import xbmc +import xbmcgui from functions import getParameters, HistoryDB from resources.pyxbmct.addonwindow import * from functions import Searchers @@ -211,7 +212,7 @@ class ControlCenter(AddonDialogWindow): self.keys = self.dic.keys() self.placed, self.button_columns, self.last_column_row = self.place() - self.setGeometry(700, 150 + 50 * self.button_columns, 3 + self.button_columns, 3) + self.setGeometry(850, 200 + 50 * self.button_columns, 4 + self.button_columns, 3) self.set_info_controls() self.set_active_controls() self.set_navigation() @@ -260,22 +261,34 @@ class ControlCenter(AddonDialogWindow): self.radiobutton_top[place[1]] = self.radiobutton[searcher] self.radiobutton_bottom[place[1]] = self.radiobutton[searcher] + # Button + self.button_install = Button(__language__(30415)) + self.placeControl(self.button_install, 2 + self.button_columns, 0) + self.connect(self.button_install, self.installSearcher) + + # Button + self.button_openserchset = Button(__language__(30416)) + self.placeControl(self.button_openserchset, 2 + self.button_columns, 1) + self.connect(self.button_openserchset, self.openSearcherSettings) + + # Button + self.button_clearstor = Button(__language__(30417)) + self.placeControl(self.button_clearstor, 2 + self.button_columns, 2) + self.connect(self.button_clearstor, self.clearStorage) + # Button self.button_openset = Button(__language__(30413)) - self.placeControl(self.button_openset, 2 + self.button_columns, 0) - # Connect control to close the window. + self.placeControl(self.button_openset, 3 + self.button_columns, 0) self.connect(self.button_openset, self.openSettings) # Button self.button_utorrent = Button(__language__(30414)) - self.placeControl(self.button_utorrent, 2 + self.button_columns, 1) - # Connect control to close the window. + self.placeControl(self.button_utorrent, 3 + self.button_columns, 1) self.connect(self.button_utorrent, self.openUtorrent) # Button self.button_close = Button(__language__(30412)) - self.placeControl(self.button_close, 2 + self.button_columns, 2) - # Connect control to close the window. + self.placeControl(self.button_close, 3 + self.button_columns, 2) self.connect(self.button_close, self.close) def set_navigation(self): @@ -284,7 +297,7 @@ class ControlCenter(AddonDialogWindow): placed_keys = self.placed.keys() for searcher in placed_keys: - buttons = [self.button_openset, self.button_utorrent, self.button_close] + buttons = [self.button_install, self.button_openserchset, self.button_clearstor] place = self.placed[searcher] if place[0] == 0: @@ -323,30 +336,65 @@ class ControlCenter(AddonDialogWindow): ser = placed_keys[placed_values.index((place[0] + 1, place[1]))] self.radiobutton[searcher].controlDown(self.radiobutton[ser]) - self.button_openset.controlUp(self.radiobutton_bottom[0]) + self.button_install.controlUp(self.radiobutton_bottom[0]) + self.button_install.controlDown(self.button_openset) + self.button_install.controlLeft(self.button_clearstor) + self.button_install.controlRight(self.button_openserchset) + + self.button_openserchset.controlUp(self.radiobutton_bottom[1]) + self.button_openserchset.controlDown(self.button_utorrent) + self.button_openserchset.controlLeft(self.button_install) + self.button_openserchset.controlRight(self.button_clearstor) + + self.button_clearstor.controlUp(self.radiobutton_bottom[2]) + self.button_clearstor.controlDown(self.button_close) + self.button_clearstor.controlLeft(self.button_openserchset) + self.button_clearstor.controlRight(self.button_install) + + self.button_openset.controlUp(self.button_install) self.button_openset.controlDown(self.radiobutton_top[0]) self.button_openset.controlLeft(self.button_close) self.button_openset.controlRight(self.button_utorrent) - self.button_utorrent.controlUp(self.radiobutton_bottom[1]) + self.button_utorrent.controlUp(self.button_openserchset) self.button_utorrent.controlDown(self.radiobutton_top[1]) self.button_utorrent.controlLeft(self.button_openset) self.button_utorrent.controlRight(self.button_close) - self.button_close.controlUp(self.radiobutton_bottom[2]) + self.button_close.controlUp(self.button_clearstor) self.button_close.controlDown(self.radiobutton_top[2]) self.button_close.controlLeft(self.button_utorrent) self.button_close.controlRight(self.button_openset) + # Set initial focus self.setFocus(self.button_close) def openSettings(self): __settings__.openSettings() + def openSearcherSettings(self): + slist = Searchers().list('external').keys() + if len(slist)>0: + ret = xbmcgui.Dialog().select(__language__(30418), slist) + if ret > -1 and ret < len(slist): + sid = slist[ret] + Searcher=xbmcaddon.Addon(id='torrenter.searcher.'+sid) + Searcher.openSettings() + self.close() + else: + xbmcgui.Dialog().ok(__language__(30415), slist) + + def installSearcher(self): + xbmc.executebuiltin('XBMC.ActivateWindow(Addonbrowser,addons://search/%s)' % ('Torrenter Searcher')) + self.close() + def openUtorrent(self): xbmc.executebuiltin('ActivateWindow(Videos,plugin://plugin.video.torrenter/?action=uTorrentBrowser)') self.close() + def clearStorage(self): + xbmc.executebuiltin('XBMC.RunPlugin(%s)' % ('plugin://plugin.video.torrenter/?action=%s') % 'clearStorage') + def slider_update(self): # Update slider value label when the slider nib moves try: diff --git a/functions.py b/functions.py index be15846..7eb6457 100644 --- a/functions.py +++ b/functions.py @@ -56,6 +56,8 @@ torrentFilesDirectory = 'torrents' __addonpath__ = __settings__.getAddonInfo('path') icon = __addonpath__ + '/icon.png' debug = __settings__.getSetting("debug") +__version__ = __settings__.getAddonInfo('version') +__plugin__ = __settings__.getAddonInfo('name') + " v." + __version__ def clearStorage(userStorageDirectory): @@ -1065,13 +1067,30 @@ class Searchers(): def setBoolSetting(self, setting, bool=True): __settings__.setSetting(setting, "true" if bool else "false") - def list(self): - searchersList = [] - dirList = os.listdir(ROOT + os.sep + 'resources' + os.sep + 'searchers') - for searcherFile in dirList: - if re.match('^(\w+)\.py$', searcherFile): - searchersList.append(searcherFile.replace('.py', '')) - return searchersList + def list(self, only=None): + searchersDict = {} + if only!='external': + searchers_dir = os.path.join(ROOT, 'resources', 'searchers') + searchers_dirList=xbmcvfs.listdir(searchers_dir)[1] + for searcherFile in searchers_dirList: + if re.match('^(\w+)\.py$', searcherFile): + name=searcherFile.replace('.py', '') + searchersDict[name]={'name':name, + 'path':searchers_dir, + 'searcher':os.path.join(searchers_dir,name+'.py'), + 'type':'local'} + if only!='local': + addons_dir = os.path.join(xbmc.translatePath('special://home'),'addons') + addons_dirsList = xbmcvfs.listdir(addons_dir)[0] + for searcherDir in addons_dirsList: + if re.match('^torrenter\.searcher\.(\w+)$', searcherDir): + name=searcherDir.replace('torrenter.searcher.', '') + path=os.path.join(addons_dir, searcherDir) + searchersDict[name]={'name':name, + 'path':path, + 'searcher':os.path.join(path,name+'.py'), + 'type':'external'} + return searchersDict def dic(self, providers=[]): dic = {} @@ -1090,11 +1109,97 @@ class Searchers(): def get_active(self): get_active = [] - for searcher in self.list(): + for searcher in self.list().iterkeys(): if self.old(searcher): get_active.append(searcher + '.py') print 'Active Searchers: ' + str(get_active) return get_active + def searchWithSearcher(self, keyword, searcher): + filesList = [] + slist = Searchers().list() + if slist[searcher]['path'] not in sys.path: + sys.path.insert(0, slist[searcher]['path']) + print 'Added %s in sys.path' % (slist[searcher]['path']) + try: + searcherObject = getattr(__import__(searcher), searcher)() + filesList = searcherObject.search(keyword) + except Exception, e: + print 'Unable to use searcher: ' + searcher + ' at ' + __plugin__ + ' searchWithSearcher(). Exception: ' + str( + e) + return filesList + + def downloadWithSearcher(self, url, searcher): + slist = Searchers().list() + if slist[searcher]['path'] not in sys.path: + sys.path.insert(0, slist[searcher]['path']) + print 'Added %s in sys.path' % (slist[searcher]['path']) + try: + searcherObject = getattr(__import__(searcher), searcher)() + url = searcherObject.getTorrentFile(url) + except Exception, e: + print 'Unable to use searcher: ' + searcher + ' at ' + __plugin__ + ' downloadWithSearcher(). Exception: ' + str( + e) + return url + + +def search(url, searchersList, isApi=None): + from threading import Thread + from Queue import Queue + + num_threads = 3 + queue = Queue() + result = {} + iterator, filesList, left_searchers = 0, [], [] + timeout_multi=int(sys.modules["__main__"].__settings__.getSetting("timeout")) + wait_time=10+(10*timeout_multi) + left_searchers.extend(searchersList) + if not isApi: + progressBar = xbmcgui.DialogProgress() + progressBar.create(Localization.localize('Please Wait'), Localization.localize('Materials are loading now.')) + + def search_one(i, q): + while True: + if not isApi and progressBar.iscanceled(): + progressBar.update(0) + progressBar.close() + return + iterator=100*int(len(searchersList)-len(left_searchers))/len(searchersList) + if not isApi: + progressBar.update(int(iterator), join_list(left_searchers, replace='.py')) + searcherFile = q.get() + searcher=searcherFile.replace('.py','') + print "Thread %s: Searching at %s" % (i, searcher) + result[searcherFile]=Searchers().searchWithSearcher(url, searcher) + left_searchers.remove(searcherFile) + q.task_done() + + for i in range(num_threads): + worker = Thread(target=search_one, args=(i, queue)) + worker.setDaemon(True) + worker.start() + + for searcherFile in searchersList: + queue.put(searcherFile, timeout=wait_time) + + print "Main Thread Waiting" + queue.join() + print "Done" + + if not isApi: + progressBar.update(0) + progressBar.close() + + for k in result.keys(): + filesList.extend(result[k]) + return filesList + + +def join_list(l, char=', ', replace=''): + string='' + for i in l: + string+=i.replace(replace,'')+char + return string.rstrip(' ,') + class Contenters(): def __init__(self): @@ -1653,3 +1758,15 @@ def get_ids_video(contentList): break # print Debug('[get_ids_video]:'+str(ids_video)) return ids_video + + +def first_run_230(delete_russian): + ok = xbmcgui.Dialog().ok('< %s >' % Localization.localize('Torrenter Update 2.3.0'), + Localization.localize('I added custom searchers for Torrenter v2!'), + Localization.localize('Now you can use your login on trackers or write and install your own searcher!')) + if not delete_russian: + yes=xbmcgui.Dialog().yesno('< %s >' % Localization.localize('Torrenter Update 2.3.0'), + Localization.localize('Would you like to install %s from "MyShows.me Kodi Repo" in Programs section!') % 'RuTrackerOrg', + Localization.localize('Open installation window?')) + if yes: + xbmc.executebuiltin('XBMC.ActivateWindow(Addonbrowser,addons://search/%s)' % ('Torrenter Searcher')) diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 81e033c..1da98ab 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -57,5 +57,10 @@ Close Open Settings Torrent Client Browser + Install Trackers + Trackers Settings + Clear Storage + Choose searcher + You don't have external searcher. Please install it first. diff --git a/resources/language/Russian/strings.xml b/resources/language/Russian/strings.xml index 023e6a3..d7b1631 100644 --- a/resources/language/Russian/strings.xml +++ b/resources/language/Russian/strings.xml @@ -57,6 +57,9 @@ Закрыть Открыть Настройки Браузер Торрент-клиента - - Статус Плагина + Установить Трекеры + Настройки Трекеров + Очистить хранилище + Выберите трекер + У вас нет внешних серчеров. Пожалуйста, сначало установите их. diff --git a/resources/language/Ukrainian/strings.xml b/resources/language/Ukrainian/strings.xml index 3268026..e8cb760 100644 --- a/resources/language/Ukrainian/strings.xml +++ b/resources/language/Ukrainian/strings.xml @@ -58,4 +58,9 @@ Відкрити налаштування Браузер торрент-клієнта Статус плагіна + Установить Трекеры + Настройки Трекеров + Очистити сховище + Оберіть трекер + У вас нет внешних серчеров. Пожалуйста, сначало установите их. diff --git a/resources/searchers/OldPirateBay.py b/resources/searchers/OldPirateBay.py deleted file mode 100644 index ded1764..0000000 --- a/resources/searchers/OldPirateBay.py +++ /dev/null @@ -1,90 +0,0 @@ -# -*- coding: utf-8 -*- -''' - Torrenter plugin for XBMC - Copyright (C) 2012 Vadim Skorba - vadim.skorba@gmail.com - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -''' - -import urllib -import re -import sys - -import SearcherABC - - -class OldPirateBay(SearcherABC.SearcherABC): - ''' - Weight of source with this searcher provided. - Will be multiplied on default weight. - Default weight is seeds number - ''' - sourceWeight = 1 - - ''' - Relative (from root directory of plugin) path to image - will shown as source image at result listing - ''' - searchIcon = '/resources/searchers/icons/OldPirateBay3.png' - - ''' - Flag indicates is this source - magnet links source or not. - Used for filtration of sources in case of old library (setting selected). - Old libraries won't to convert magnet as torrent file to the storage - ''' - - @property - def isMagnetLinkSource(self): - return False - - ''' - Main method should be implemented for search process. - Receives keyword and have to return dictionary of proper tuples: - filesList.append(( - int(weight),# Calculated global weight of sources - int(seeds),# Seeds count - str(title),# Title will be shown - str(link),# Link to the torrent/magnet - str(image),# Path/URL to image shown at the list - )) - ''' - - def search(self, keyword): - self.timeout(10) - filesList = [] - url = "http://oldpiratebay.org/search.php?q=%s" % (urllib.quote_plus(keyword)) - headers = [('User-Agent', - 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), - ('Referer', 'http://opensharing.org/'), ('Accept-encoding', 'gzip'), ] - response = self.makeRequest(url, headers=headers) - - if None != response and 0 < len(response): - #print response - dat = re.compile( - r'''(.+?).+?.+?(.+?)(.+?)(.+?)(.+?)''', - re.DOTALL).findall(response) - for (title, link, age, size, seeds, leechers) in dat: - torrentTitle = title #"%s [S\L: %s\%s]" % (title, seeds, leechers) - size = self.unescape(self.stripHtml(size)) - image = sys.modules["__main__"].__root__ + self.searchIcon - link = self.unescape(link) - filesList.append(( - int(int(self.sourceWeight) * int(seeds)), - int(seeds), int(leechers), size, - self.unescape(self.stripHtml(torrentTitle)), - self.__class__.__name__ + '::' + link, - image, - )) - return filesList \ No newline at end of file diff --git a/resources/searchers/RuTorOrg.py b/resources/searchers/RuTorOrg.py index f882e3e..a80765d 100644 --- a/resources/searchers/RuTorOrg.py +++ b/resources/searchers/RuTorOrg.py @@ -65,10 +65,10 @@ class RuTorOrg(SearcherABC.SearcherABC): filesList = [] self.timeout(5) #print 'strating Rutor' - url = "http://zerkalo-rutor.org/search/0/0/100/2/%s" % urllib.quote_plus(keyword) + url = "http://anti-tor.org/search/0/0/100/2/%s" % urllib.quote_plus(keyword) headers = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), - ('Referer', 'http://zerkalo-rutor.org'), ('Accept-encoding', 'gzip'), + ('Referer', 'http://anti-tor.org'), ('Accept-encoding', 'gzip'), ('Cookie', str(sys.modules["__main__"].__settings__.getSetting("rutor-auth")))] response = self.makeRequest(url, headers=headers) @@ -83,7 +83,7 @@ class RuTorOrg(SearcherABC.SearcherABC): sys.modules["__main__"].__settings__.setSetting("rutor-auth", cookie) headers = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), - ('Referer', 'http://zerkalo-rutor.org'), ('Accept-encoding', 'gzip'), + ('Referer', 'http://anti-tor.org'), ('Accept-encoding', 'gzip'), ('Cookie', str(sys.modules["__main__"].__settings__.getSetting("rutor-auth")))] response = self.makeRequest(url, headers=headers) @@ -97,7 +97,7 @@ class RuTorOrg(SearcherABC.SearcherABC): for (link, title, size, seeds, leechers) in dat: torrentTitle = title.strip() #"%s [S\L: %s\%s]" % (title, seeds, leechers) size = size.replace(' ', ' ') - if link[0]=='/': link='http://zerkalo-rutor.org'+link + if link[0]=='/': link='http://anti-tor.org'+link image = sys.modules["__main__"].__root__ + self.searchIcon filesList.append(( int(int(self.sourceWeight) * int(seeds)), diff --git a/resources/searchers/ThePirateBaySe.py b/resources/searchers/ThePirateBaySe.py deleted file mode 100644 index a00dd14..0000000 --- a/resources/searchers/ThePirateBaySe.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding: utf-8 -*- -''' - Torrenter plugin for XBMC - Copyright (C) 2012 Vadim Skorba - vadim.skorba@gmail.com - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -''' - -import urllib -import re -import sys - -import SearcherABC - - -class ThePirateBaySe(SearcherABC.SearcherABC): - ''' - Weight of source with this searcher provided. - Will be multiplied on default weight. - Default weight is seeds number - ''' - sourceWeight = 1 - - ''' - Relative (from root directory of plugin) path to image - will shown as source image at result listing - ''' - searchIcon = '/resources/searchers/icons/thepiratebay.se.png' - - ''' - Flag indicates is this source - magnet links source or not. - Used for filtration of sources in case of old library (setting selected). - Old libraries won't to convert magnet as torrent file to the storage - ''' - - @property - def isMagnetLinkSource(self): - return True - - ''' - Main method should be implemented for search process. - Receives keyword and have to return dictionary of proper tuples: - filesList.append(( - int(weight),# Calculated global weight of sources - int(seeds),# Seeds count - str(title),# Title will be shown - str(link),# Link to the torrent/magnet - str(image),# Path/URL to image shown at the list - )) - ''' - - def search(self, keyword): - filesList = [] - url = "http://thepiratebay.se/search/%s/0/99/200" % (urllib.quote_plus(keyword)) - - response = self.makeRequest(url) - - if None != response and 0 < len(response): - # print response - dat = re.compile( - r'