diff --git a/Content.py b/Content.py
index 6fc8f24..eead168 100644
--- a/Content.py
+++ b/Content.py
@@ -38,8 +38,11 @@ class Content:
cookieJar = None
baseurl = ''
- def isLabel(self):
- return 'Should search on ruhunt?'
+ def isTracker(self):
+ return 'Never seen'
+
+ def isSearcher(self):
+ return False
def isPages(self):
return False
diff --git a/Core.py b/Core.py
index ad5a5c7..98c5e37 100644
--- a/Core.py
+++ b/Core.py
@@ -89,7 +89,7 @@ class Core:
def sectionMenu(self):
if self.__settings__.getSetting('plugin_name')!=self.__plugin__:
- if self.__plugin__ == 'Torrenter v.2.3.1':
+ if self.__plugin__ == 'Torrenter v.2.3.2':
#first_run_230(self.__settings__.getSetting('delete_russian')=='true')
first_run_231()
if self.__settings__.getSetting('delete_russian')!='false':
@@ -630,7 +630,7 @@ class Core:
else:
if provider:
self.Content = self.contenterObject[provider]
- if not self.Content.isLabel():
+ if not self.Content.isTracker():
self.draw(apps, mode='content')
else:
self.draw(apps, mode='tracker')
@@ -878,6 +878,8 @@ class Core:
def drawtrackerList(self, provider, contentList):
contentList = sorted(contentList, key=lambda x: x[0], reverse=True)
+ if self.contenterObject[provider].isSearcher():
+ Searchers().checkExist(provider)
for num, originaltitle, title, year, img, info in contentList:
if not info.get('label'):
continue
@@ -888,17 +890,16 @@ class Core:
continue
label = info.get('label').encode('utf-8', 'ignore')
- if self.contenterObject[provider].isInfoLink() and info.get('link'):
+ if info.get('link'):
if isinstance(info.get('link'), tuple):
url=info.get('link')[0]
else:
url=info.get('link')
- if not '::' in url:
+
+ if self.contenterObject[provider].isSearcher():
link = {'url': '%s::%s' % (provider, url), 'thumbnail': img}
else:
link = {'url': url, 'thumbnail': img}
- elif self.contenterObject[provider].isLabel():
- link = {'url': '%s::%s' % (provider, urllib.quote_plus(label)), 'thumbnail': img}
contextMenu = [
(self.localize('Download via T-client'),
@@ -1640,10 +1641,8 @@ class Core:
searcher = classMatch.group(1)
url = Searchers().downloadWithSearcher(classMatch.group(2), searcher)
- torrent = Downloader.Torrent(self.userStorageDirectory,
- torrentFilesDirectory=self.torrentFilesDirectory)
- if not torrent: torrent = Downloader.Torrent(self.userStorageDirectory,
- torrentFilesDirectory=self.torrentFilesDirectory)
+ torrent = Downloader.Torrent(self.userStorageDirectory,
+ torrentFilesDirectory=self.torrentFilesDirectory)
if re.match("^magnet\:.+$", url):
if not dirname:
diff --git a/Libtorrent.py b/Libtorrent.py
index 29f112f..ccc08d5 100644
--- a/Libtorrent.py
+++ b/Libtorrent.py
@@ -316,15 +316,26 @@ class Libtorrent:
self.session.start_natpmp()
self.session.listen_on(6881, 6891)
+ #self.session.set_severity_level(self.lt.alert.severity_levels.info)
+ #self.session.add_extension(self.lt.create_ut_pex_plugin)
+ #self.session.add_extension(self.lt.create_ut_metadata_plugin)
+ #self.session.add_extension(self.lt.create_metadata_plugin)
+
# Session settings
- session_settings = self.session.settings()
- session_settings.announce_to_all_tiers = True
- session_settings.announce_to_all_trackers = True
- session_settings.connection_speed = 100
- session_settings.peer_connect_timeout = 2
- session_settings.rate_limit_ip_overhead = True
- session_settings.request_timeout = 5
- session_settings.torrent_connect_boost = 100
+ session_settings = self.session.get_settings()
+
+ #session_settings['user_agent'] = 'python_client/' + self.lt.version
+ #session_settings['auto_manage_startup'] = 30
+ #session_settings['auto_manage_interval'] = 30
+ #session_settings['dht_announce_interval'] = 60
+
+ session_settings['announce_to_all_tiers'] = True
+ session_settings['announce_to_all_trackers'] = True
+ session_settings['connection_speed'] = 100
+ session_settings['peer_connect_timeout'] = 2
+ session_settings['rate_limit_ip_overhead'] = True
+ session_settings['request_timeout'] = 5
+ session_settings['torrent_connect_boost'] = 100
self.session.set_settings(session_settings)
@@ -353,6 +364,8 @@ class Libtorrent:
else:
self.torrentFileInfo = self.getMagnetInfo()
self.torrentHandle.set_sequential_download(True)
+ #self.torrentHandle.set_max_connections(60)
+ #self.torrentHandle.set_max_uploads(-1)
self.stopSession()
def stopSession(self):
diff --git a/Localization.py b/Localization.py
index 242b19f..f2639b0 100644
--- a/Localization.py
+++ b/Localization.py
@@ -261,7 +261,9 @@ def localize(text):
'Please contact DiMartino on kodi.tv forum. We compiled python-libtorrent for Android,':'Свяжитесь с DiMartino на xbmc.ru. Мы собрали python-libtorrent на Android',
'but we need your help with some tests on different processors.':'но нам нужна помощь в тестировании на разные процессоры.',
'We added Android ARM full support to Torrenter v2!':'Мы добавили полную поддержку Android ARM в Torrenter v2!',
- 'I deleted pre-installed ones, install them in Search Control Window!':'Теперь серчеры нужно устанавливать отдельно в Окне Управления Поиском!'
+ 'I deleted pre-installed ones, install them in Search Control Window!':'Теперь серчеры нужно устанавливать отдельно в Окне Управления Поиском!',
+ 'Torrenter didn\'t find %s searcher':'Торрентер не нашел серчер трекера %s',
+ 'Torrenter Tracker Install':'Установка трекеров в Torrenter',
},
'uk': {
diff --git a/changelog.txt b/changelog.txt
index 183fee3..28aa077 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,5 +1,8 @@
[B]Version 2.3.2[/B]
[+] Control Center: Исправлена работа без серчеров
+[+] Списки Медиа: Проверка отсутствия серчера
+[+] Списки Медиа: Исправлен ThePirateBay
+[+] Торрент-клиент: Добавлена возможность указать путь Deluge
[B]Version 2.3.1[/B]
[+] Загрузка: Исправлена ошибка удаления базы данных
diff --git a/controlcenter.py b/controlcenter.py
index d2ea005..fb1cc8a 100644
--- a/controlcenter.py
+++ b/controlcenter.py
@@ -32,7 +32,7 @@ __version__ = __settings__.getAddonInfo('version')
__plugin__ = __settings__.getAddonInfo('name') + " v." + __version__
__root__ = __settings__.getAddonInfo('path')
-print 'SYS ARGV: ' + str(sys.argv)
+#print 'SYS ARGV: ' + str(sys.argv)
if len(sys.argv) > 1:
params = getParameters(sys.argv[1])
@@ -47,6 +47,8 @@ class ControlCenter(AddonDialogWindow):
self.db = None
self.addtime = None
self.has_searchers=len(self.dic)>0
+ self.more_one_searcher=len(self.dic)>1
+ self.more_two_searcher=len(self.dic)>2
if self.has_searchers:
if addtime:
self.addtime = addtime
@@ -66,6 +68,7 @@ class ControlCenter(AddonDialogWindow):
self.keys = self.dic.keys()
self.placed, self.button_columns, self.last_column_row = self.place()
+ #print str((self.placed, self.button_columns, self.last_column_row))
else:
self.button_columns=0
@@ -87,22 +90,10 @@ class ControlCenter(AddonDialogWindow):
else:
i += 1
placed[item] = (j, i)
- # print item+str((j, i))
+ #print item+str((j, i))
return placed, j, i
def set_info_controls(self):
- # Demo for PyXBMCt UI controls.
- # no_int_label = Label(__language__(30146), alignment=ALIGN_CENTER)
- # self.placeControl(no_int_label, 0, 0, 1, 3)
- #
- # label_timeout = Label(__language__(30410))
- # self.placeControl(label_timeout, 1, 0)
- # Label
- # self.label = Label(__language__(30545) % TimeOut().timeout())
- # self.placeControl(self.label, 1, 1)
- #
- # label_watched = Label(__language__(30414) % (WatchedDB().count()))
- # self.placeControl(label_watched, 2, 0)
pass
def set_active_controls(self):
@@ -167,27 +158,28 @@ class ControlCenter(AddonDialogWindow):
self.radiobutton[searcher].controlUp(self.radiobutton[ser])
# self.button_columns, self.last_column_row
- if place[1] == 0 and place[0] == self.button_columns:
- if self.last_column_row > 0:
- ser = placed_keys[placed_values.index((place[0], self.last_column_row))]
+ if self.more_one_searcher:
+ if place[1] == 0 and place[0] == self.button_columns:
+ if self.last_column_row > 0:
+ ser = placed_keys[placed_values.index((place[0], self.last_column_row))]
+ else:
+ ser = placed_keys[placed_values.index((place[0] - 1, 2))]
+ elif place[1] == 0:
+ ser = placed_keys[placed_values.index((place[0], 2))]
else:
- ser = placed_keys[placed_values.index((place[0] - 1, 2))]
- elif place[1] == 0:
- ser = placed_keys[placed_values.index((place[0], 2))]
- else:
- ser = placed_keys[placed_values.index((place[0], place[1] - 1))]
- self.radiobutton[searcher].controlLeft(self.radiobutton[ser])
+ ser = placed_keys[placed_values.index((place[0], place[1] - 1))]
+ self.radiobutton[searcher].controlLeft(self.radiobutton[ser])
- # print str((self.button_columns, self.last_column_row))
- # print searcher
-
- if place == (self.button_columns, self.last_column_row) and self.last_column_row < 2:
- ser = placed_keys[placed_values.index((place[0] - 1, place[1] + 1))]
- elif place[1] == 2:
- ser = placed_keys[placed_values.index((place[0], 0))]
- else:
- ser = placed_keys[placed_values.index((place[0], place[1] + 1))]
- self.radiobutton[searcher].controlRight(self.radiobutton[ser])
+ #print str((self.button_columns, self.last_column_row))
+ #print searcher
+ if self.more_two_searcher:
+ if place == (self.button_columns, self.last_column_row) and self.last_column_row < 2:
+ ser = placed_keys[placed_values.index((place[0] - 1, place[1] + 1))]
+ elif place[1] == 2:
+ ser = placed_keys[placed_values.index((place[0], 0))]
+ else:
+ ser = placed_keys[placed_values.index((place[0], place[1] + 1))]
+ self.radiobutton[searcher].controlRight(self.radiobutton[ser])
if place[0] == self.button_columns - 1 and place[1] > self.last_column_row or \
place[0] == self.button_columns:
@@ -197,11 +189,22 @@ class ControlCenter(AddonDialogWindow):
self.radiobutton[searcher].controlDown(self.radiobutton[ser])
self.button_install.controlUp(self.radiobutton_bottom[0])
- self.button_openserchset.controlUp(self.radiobutton_bottom[1])
- self.button_clearstor.controlUp(self.radiobutton_bottom[2])
self.button_openset.controlDown(self.radiobutton_top[0])
- self.button_utorrent.controlDown(self.radiobutton_top[1])
- self.button_close.controlDown(self.radiobutton_top[2])
+ if self.more_one_searcher:
+ self.button_openserchset.controlUp(self.radiobutton_bottom[1])
+ self.button_utorrent.controlDown(self.radiobutton_top[1])
+ else:
+ self.button_openserchset.controlUp(self.radiobutton_bottom[0])
+ self.button_utorrent.controlDown(self.radiobutton_top[0])
+ if self.more_two_searcher:
+ self.button_clearstor.controlUp(self.radiobutton_bottom[2])
+ self.button_close.controlDown(self.radiobutton_top[2])
+ elif self.more_one_searcher:
+ self.button_clearstor.controlUp(self.radiobutton_bottom[1])
+ self.button_close.controlDown(self.radiobutton_top[1])
+ else:
+ self.button_clearstor.controlUp(self.radiobutton_bottom[0])
+ self.button_close.controlDown(self.radiobutton_top[0])
else:
self.button_install.controlUp(self.button_openset)
self.button_openserchset.controlUp(self.button_utorrent)
diff --git a/functions.py b/functions.py
index 3bd84fd..0688596 100644
--- a/functions.py
+++ b/functions.py
@@ -1091,6 +1091,7 @@ class Searchers():
'path':path,
'searcher':os.path.join(path,name+'.py'),
'type':'external'}
+ #if len(searchersDict)>1: break
return searchersDict
def dic(self, providers=[]):
@@ -1143,6 +1144,16 @@ class Searchers():
e)
return url
+ def checkExist(self, searcher):
+ if searcher not in self.list():
+ yes=xbmcgui.Dialog().yesno('< %s >' % Localization.localize('Torrenter Tracker Install'),
+ Localization.localize('Torrenter didn\'t find %s searcher' % searcher),
+ Localization.localize('Would you like to install %s from "MyShows.me Kodi Repo" in Programs section?') % searcher,)
+ if yes:
+ xbmc.executebuiltin('Dialog.Close(all,true)')
+ xbmc.executebuiltin('XBMC.ActivateWindow(Addonbrowser,addons://search/%s)' % ('Torrenter Searcher %s' % searcher))
+
+
def search(url, searchersList, isApi=None):
from threading import Thread
@@ -1801,4 +1812,4 @@ def noActiveSerachers():
Localization.localize('Would you like to install %s from "MyShows.me Kodi Repo" in Programs section?') % '',)
if yes:
xbmc.executebuiltin('Dialog.Close(all,true)')
- xbmc.executebuiltin('XBMC.ActivateWindow(Addonbrowser,addons://search/%s)' % ('Torrenter Searcher'))
+ xbmc.executebuiltin('XBMC.ActivateWindow(Addonbrowser,addons://search/%s)' % ('Torrenter Searcher'))
\ No newline at end of file
diff --git a/resources/contenters/CXZ.py b/resources/contenters/CXZ.py
index fa4b456..a06d9cb 100644
--- a/resources/contenters/CXZ.py
+++ b/resources/contenters/CXZ.py
@@ -98,7 +98,10 @@ class CXZ(Content.Content):
sourceWeight = 2
- def isLabel(self):
+ def isTracker(self):
+ return False
+
+ def isSearcher(self):
return False
def isInfoLink(self):
diff --git a/resources/contenters/EZTV.py b/resources/contenters/EZTV.py
index 9c5ab44..8cf2e13 100644
--- a/resources/contenters/EZTV.py
+++ b/resources/contenters/EZTV.py
@@ -40,9 +40,12 @@ class EZTV(Content.Content):
'''
sourceWeight = 1
- def isLabel(self):
+ def isTracker(self):
return True
+ def isSearcher(self):
+ return False
+
def isScrappable(self):
return False
diff --git a/resources/contenters/FastTorrent.py b/resources/contenters/FastTorrent.py
index 249af2c..ff34491 100644
--- a/resources/contenters/FastTorrent.py
+++ b/resources/contenters/FastTorrent.py
@@ -51,7 +51,10 @@ class FastTorrent(Content.Content):
'''
sourceWeight = 1
- def isLabel(self):
+ def isTracker(self):
+ return False
+
+ def isSearcher(self):
return False
def isScrappable(self):
diff --git a/resources/contenters/IMDB.py b/resources/contenters/IMDB.py
index ca7e675..6793cf0 100644
--- a/resources/contenters/IMDB.py
+++ b/resources/contenters/IMDB.py
@@ -81,7 +81,10 @@ class IMDB(Content.Content):
'''
sourceWeight = 2
- def isLabel(self):
+ def isTracker(self):
+ return False
+
+ def isSearcher(self):
return False
def isPages(self):
diff --git a/resources/contenters/KickAssSo.py b/resources/contenters/KickAssSo.py
index c570f0a..6b5e597 100644
--- a/resources/contenters/KickAssSo.py
+++ b/resources/contenters/KickAssSo.py
@@ -50,9 +50,12 @@ class KickAssSo(Content.Content):
'''
sourceWeight = 1
- def isLabel(self):
+ def isTracker(self):
return True
+ def isSearcher(self):
+ return False
+
def isScrappable(self):
return False
diff --git a/resources/contenters/KinoPoisk.py b/resources/contenters/KinoPoisk.py
index 5155e16..e49e2f9 100644
--- a/resources/contenters/KinoPoisk.py
+++ b/resources/contenters/KinoPoisk.py
@@ -87,7 +87,10 @@ class KinoPoisk(Content.Content):
'''
sourceWeight = 2
- def isLabel(self):
+ def isTracker(self):
+ return False
+
+ def isSearcher(self):
return False
def isPages(self):
diff --git a/resources/contenters/RiperAM.py b/resources/contenters/RiperAM.py
index 27b6a07..118464d 100644
--- a/resources/contenters/RiperAM.py
+++ b/resources/contenters/RiperAM.py
@@ -45,7 +45,10 @@ class RiperAM(Content.Content):
'''
sourceWeight = 1
- def isLabel(self):
+ def isTracker(self):
+ return True
+
+ def isSearcher(self):
return True
def isScrappable(self):
diff --git a/resources/contenters/SWESUB.py b/resources/contenters/SWESUB.py
index 44d1d05..26e0e4c 100644
--- a/resources/contenters/SWESUB.py
+++ b/resources/contenters/SWESUB.py
@@ -118,7 +118,7 @@ class SWESUB(Content.Content):
# info
info['label'] = info['title'] = self.unescape(title)
- info['link'] = '%s::%s' % ('Nyaa', self.baseurl + '/downloads' + link + '/')
+ info['link'] = self.baseurl + '/downloads' + link + '/'
info['infolink'] = self.baseurl + link + '.html'
info['plot'] = article.find('div', {'class': 'item-content'}).text
diff --git a/resources/contenters/ThePirateBaySe.py b/resources/contenters/ThePirateBaySe.py
index 5129772..2a27a6d 100644
--- a/resources/contenters/ThePirateBaySe.py
+++ b/resources/contenters/ThePirateBaySe.py
@@ -38,7 +38,7 @@ class ThePirateBaySe(Content.Content):
{'name': 'by Date', 'url_after': '/0/3/0'}]}),
}
- baseurl = "https://thepiratebay.se"
+ baseurl = "thepiratebay.gd"
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'),
@@ -50,9 +50,12 @@ class ThePirateBaySe(Content.Content):
'''
sourceWeight = 1
- def isLabel(self):
+ def isTracker(self):
return True
+ def isSearcher(self):
+ return False
+
def isScrappable(self):
return False
@@ -72,7 +75,7 @@ class ThePirateBaySe(Content.Content):
contentList = []
url = self.get_url(category, subcategory, apps_property)
- response = self.makeRequest(url, headers=self.headers)
+ response = self.open2(url)
if None != response and 0 < len(response):
# print response
@@ -81,6 +84,17 @@ class ThePirateBaySe(Content.Content):
# print str(contentList)
return contentList
+ def open2(self, url=''):
+ import httplib
+ conn = httplib.HTTPConnection(self.baseurl)
+ conn.request("GET", url.replace(self.baseurl,''))
+ r1 = conn.getresponse()
+ status = str(r1.status) + " " + r1.reason
+ content = r1.read()
+ #print str(status)
+ #print str(content)
+ return content
+
def mode(self, response):
contentList = []
# print str(result)
diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml
index 1da98ab..7e3dacc 100644
--- a/resources/language/English/strings.xml
+++ b/resources/language/English/strings.xml
@@ -53,6 +53,7 @@
Login
Password
Torrent Client
+ URL (only No SSL)
Path replacement (remote only)
Close
Open Settings
diff --git a/resources/language/Russian/strings.xml b/resources/language/Russian/strings.xml
index d7b1631..e26fe41 100644
--- a/resources/language/Russian/strings.xml
+++ b/resources/language/Russian/strings.xml
@@ -52,6 +52,7 @@
URL
Логин
Пароль
+ URL (только без SSL)
Торрент-клиент
Замена пути (remote only)
Закрыть
diff --git a/resources/settings.xml b/resources/settings.xml
index ebd80ed..3f5bc0d 100644
--- a/resources/settings.xml
+++ b/resources/settings.xml
@@ -168,7 +168,7 @@
-
+
diff --git a/resources/utorrent/net.py b/resources/utorrent/net.py
index 58ae6ea..ea32cd5 100644
--- a/resources/utorrent/net.py
+++ b/resources/utorrent/net.py
@@ -849,10 +849,11 @@ class Deluge:
self.login = login
self.password = password
- self.url = ['http://', 'https://'][int(url)] + host
+ self.url = 'http://'+host
if port:
self.url += ':' + str(port)
-
+ self.url += url
+ print str(self.url)
self.http = HTTP()
def get_info(self):
@@ -1299,7 +1300,7 @@ class Download():
config = {
'host': self.setting.getSetting("torrent_deluge_host"),
'port': self.setting.getSetting("torrent_deluge_port"),
- 'url': self.setting.getSetting("torrent_deluge_url"),
+ 'url': self.setting.getSetting("torrent_deluge_path"),
'login': '',
'password': self.setting.getSetting("torrent_deluge_password")
}