2016-11-26 12:06:04 +03:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
'''
|
|
|
|
Torrenter v2 plugin for XBMC/Kodi
|
|
|
|
Copyright (C) 2012-2015 Vadim Skorba v1 - DiMartino v2
|
|
|
|
https://forums.tvaddons.ag/addon-releases/29224-torrenter-v2.html
|
|
|
|
|
|
|
|
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 <http://www.gnu.org/licenses/>.
|
|
|
|
'''
|
2016-11-26 19:05:04 +03:00
|
|
|
import sys, os, urllib
|
2016-11-26 13:14:33 +03:00
|
|
|
|
|
|
|
import xbmcaddon
|
2016-11-26 12:06:04 +03:00
|
|
|
import xbmc
|
|
|
|
import xbmcgui
|
2016-11-26 19:05:04 +03:00
|
|
|
from functions import search, HistoryDB, Searchers, log
|
2016-11-26 12:06:04 +03:00
|
|
|
import pyxbmct.addonwindow as pyxbmct
|
2016-11-26 13:14:33 +03:00
|
|
|
import Localization
|
2016-11-26 12:06:04 +03:00
|
|
|
|
|
|
|
__settings__ = xbmcaddon.Addon(id='plugin.video.torrenter')
|
2016-11-26 13:14:33 +03:00
|
|
|
__language__ = __settings__.getLocalizedString
|
2016-11-26 12:06:04 +03:00
|
|
|
__version__ = __settings__.getAddonInfo('version')
|
|
|
|
__plugin__ = __settings__.getAddonInfo('name') + " v." + __version__
|
2016-11-26 13:14:33 +03:00
|
|
|
__root__ = __settings__.getAddonInfo('path')
|
|
|
|
|
|
|
|
log('SYS ARGV: ' + str(sys.argv))
|
2016-11-26 12:06:04 +03:00
|
|
|
|
|
|
|
|
|
|
|
class MultiChoiceDialog(pyxbmct.AddonDialogWindow):
|
2016-11-26 19:05:04 +03:00
|
|
|
__settings__ = sys.modules["__main__"].__settings__
|
|
|
|
fileList = []
|
|
|
|
|
|
|
|
def __init__(self, title=""):
|
2016-11-26 12:06:04 +03:00
|
|
|
super(MultiChoiceDialog, self).__init__(title)
|
|
|
|
self.setGeometry(1280, 720, 9, 16)
|
|
|
|
self.selected = []
|
|
|
|
self.set_controls()
|
|
|
|
self.connect_controls()
|
|
|
|
self.set_navigation()
|
|
|
|
|
2016-11-26 13:14:33 +03:00
|
|
|
def icon(self, icon):
|
|
|
|
return '%s/icons/%s.png' %(__root__, icon)
|
|
|
|
|
2016-11-26 12:06:04 +03:00
|
|
|
def set_controls(self):
|
2016-11-26 19:05:04 +03:00
|
|
|
self.input_search = pyxbmct.Edit("")
|
2016-11-26 12:06:04 +03:00
|
|
|
self.placeControl(self.input_search, 0, 0, 1, 5)
|
|
|
|
self.button_search = pyxbmct.Button("Search")
|
2016-11-26 13:14:33 +03:00
|
|
|
self.placeControl(self.button_search, 0, 5, 1, 2)
|
|
|
|
self.button_history = pyxbmct.Button("History")
|
|
|
|
self.placeControl(self.button_history, 0, 7, 1, 2)
|
2016-11-26 19:05:04 +03:00
|
|
|
self.button_right1 = pyxbmct.Button("Open")
|
|
|
|
self.placeControl(self.button_right1, 1, 14, 1, 2)
|
|
|
|
self.right_menu()
|
2016-11-26 12:06:04 +03:00
|
|
|
|
|
|
|
self.listing = pyxbmct.List(_imageWidth=40, _imageHeight=40, _itemTextXOffset=10, _itemTextYOffset=2, _itemHeight=40, _space=2, _alignmentY=4)
|
2016-11-26 13:14:33 +03:00
|
|
|
self.placeControl(self.listing, 1, 0, 8, 14)
|
2016-11-26 12:06:04 +03:00
|
|
|
|
|
|
|
|
|
|
|
def connect_controls(self):
|
|
|
|
self.connect(self.listing, self.press)
|
2016-11-26 19:05:04 +03:00
|
|
|
self.connect(self.button_history, self.history)
|
|
|
|
self.connect(self.button_search, self.search)
|
2016-11-26 12:06:04 +03:00
|
|
|
|
|
|
|
def set_navigation(self):
|
2016-11-26 13:14:33 +03:00
|
|
|
#Top menu
|
|
|
|
self.input_search.setNavigation(self.listing, self.listing, self.button_history, self.button_search)
|
|
|
|
self.button_search.setNavigation(self.listing, self.listing, self.input_search, self.button_history)
|
|
|
|
self.button_history.setNavigation(self.listing, self.listing, self.button_search, self.input_search)
|
|
|
|
#Listing
|
2016-11-26 19:05:04 +03:00
|
|
|
self.listing.setNavigation(self.input_search, self.input_search, self.input_search, self.button_right1)
|
2016-11-26 13:14:33 +03:00
|
|
|
#Right menu
|
2016-11-26 19:05:04 +03:00
|
|
|
self.button_right1.setNavigation(self.button_history, self.listing, self.listing, self.input_search)
|
2016-11-26 13:14:33 +03:00
|
|
|
|
2016-11-26 12:06:04 +03:00
|
|
|
if self.listing.size():
|
|
|
|
self.setFocus(self.listing)
|
|
|
|
else:
|
|
|
|
self.setFocus(self.input_search)
|
|
|
|
|
2016-11-26 13:14:33 +03:00
|
|
|
def setAnimation(self, control):
|
|
|
|
# Set fade animation for all add-on window controls
|
|
|
|
control.setAnimations([('WindowOpen', 'effect=fade start=0 end=100 time=500',),
|
|
|
|
('WindowClose', 'effect=fade start=100 end=0 time=500',)])
|
|
|
|
|
2016-11-26 19:05:04 +03:00
|
|
|
def search(self, addtime=None):
|
2016-11-26 12:06:04 +03:00
|
|
|
self.listing.reset()
|
2016-11-26 19:05:04 +03:00
|
|
|
query = self.input_search.getText()
|
|
|
|
log('Search query: '+str(query))
|
|
|
|
|
|
|
|
if len(query)>0:
|
|
|
|
self.filesList = self.get_filesList(query, addtime)
|
|
|
|
else:
|
|
|
|
self.filesList = [(1919, 1919, 52, u'102.66 MiB', u'South.Park.S20E06.HDTV.x264-FUM[ettv]',
|
|
|
|
u'ThePirateBay::magnet:?xt=urn:btih:0792ea51bc16a19893871197fa927ecec7ca25aa&dn=South.Park.S20E06.HDTV.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969',
|
|
|
|
'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png')]
|
|
|
|
if 1==1:
|
|
|
|
for (order, seeds, leechers, size, title, link, image) in self.filesList:
|
|
|
|
title = titleMake(seeds, leechers, size, title)
|
|
|
|
#log(title)
|
|
|
|
listitem = xbmcgui.ListItem(title, "", image, '', '')
|
|
|
|
listitem.setInfo(type='Video', infoLabels={})
|
|
|
|
contextMenu = [(self.localize('Search Control Window'),
|
|
|
|
'xbmc.RunScript(%s,)' % os.path.join(__root__, 'controlcenter.py'))]
|
|
|
|
replaceMenu = False
|
|
|
|
listitem.addContextMenuItems(contextMenu, replaceItems=replaceMenu)
|
|
|
|
self.listing.addItem(listitem)
|
|
|
|
|
|
|
|
def get_filesList(self, query, addtime = None):
|
|
|
|
if self.__settings__.getSetting('history')=='true':
|
|
|
|
HistoryDB().add(query)
|
|
|
|
searchersList = []
|
|
|
|
if addtime:
|
|
|
|
providers=HistoryDB().get_providers(addtime)
|
|
|
|
if providers:
|
|
|
|
for searcher in providers:
|
|
|
|
searchersList.append(searcher)
|
|
|
|
if not addtime or not searchersList:
|
|
|
|
searchersList = Searchers().get_active()
|
|
|
|
|
|
|
|
filesList=search(query, searchersList)
|
|
|
|
if self.__settings__.getSetting('sort_search')=='true':
|
|
|
|
self.__settings__.setSetting('sort_search','1')
|
|
|
|
if int(self.__settings__.getSetting('sort_search'))==0:
|
|
|
|
filesList = sorted(filesList, key=lambda x: x[0], reverse=True)
|
|
|
|
elif int(self.__settings__.getSetting('sort_search'))==2:
|
|
|
|
filesList = sorted(filesList, key=lambda x: x[4], reverse=False)
|
|
|
|
|
|
|
|
log('get_filesList filesList: '+str(filesList))
|
|
|
|
|
|
|
|
return filesList
|
2016-11-26 12:06:04 +03:00
|
|
|
|
|
|
|
def press(self):
|
2016-11-26 13:14:33 +03:00
|
|
|
#self.filesList = sorted(self.filesList, key=lambda x: x[1], reverse=True)
|
|
|
|
#self.items()
|
|
|
|
log(self.listing.getSelectedItem().getLabel())
|
2016-11-26 19:05:04 +03:00
|
|
|
xbmcgui.Dialog().ok('yyy', 'yyy')
|
|
|
|
|
|
|
|
def history(self):
|
|
|
|
self.right_menu('history')
|
|
|
|
|
|
|
|
def history_search(self):
|
|
|
|
xbmcgui.Dialog().ok('xxx','xxx')
|
|
|
|
log('history_search: '+self.listing.getSelectedItem().getLabel())
|
|
|
|
|
|
|
|
def right_menu(self, mode='search'):
|
|
|
|
if mode == 'search':
|
|
|
|
self.button_right1.setLabel("Open")
|
|
|
|
self.connect(self.button_right1, self.press)
|
|
|
|
elif mode == 'history':
|
|
|
|
self.button_right1.setLabel("Search")
|
|
|
|
self.connect(self.button_right1, self.history_search)
|
|
|
|
self.connect(self.button_right1, self.history_search)
|
2016-11-26 13:14:33 +03:00
|
|
|
|
|
|
|
def localize(self, string):
|
|
|
|
try:
|
|
|
|
return Localization.localize(string)
|
|
|
|
except:
|
|
|
|
return string
|
2016-11-26 12:06:04 +03:00
|
|
|
|
|
|
|
def log(msg):
|
|
|
|
try:
|
|
|
|
xbmc.log("### [%s]: %s" % (__plugin__,msg,), level=xbmc.LOGNOTICE )
|
|
|
|
except UnicodeEncodeError:
|
|
|
|
xbmc.log("### [%s]: %s" % (__plugin__,msg.encode("utf-8", "ignore"),), level=xbmc.LOGNOTICE )
|
|
|
|
except:
|
|
|
|
xbmc.log("### [%s]: %s" % (__plugin__,'ERROR LOG',), level=xbmc.LOGNOTICE )
|
|
|
|
|
|
|
|
def titleMake(seeds, leechers, size, title):
|
|
|
|
|
|
|
|
#AARRGGBB
|
|
|
|
clGreen = '[COLOR FF008000]%s[/COLOR]'
|
|
|
|
clDodgerblue = '[COLOR FF1E90FF]%s[/COLOR]'
|
2016-11-26 13:14:33 +03:00
|
|
|
clDimgray = '[COLOR FF999999]%s[/COLOR]'
|
2016-11-26 12:06:04 +03:00
|
|
|
clWhite = '[COLOR FFFFFFFF]%s[/COLOR]'
|
|
|
|
clAliceblue = '[COLOR FFF0F8FF]%s[/COLOR]'
|
|
|
|
clRed = '[COLOR FFFF0000]%s[/COLOR]'
|
|
|
|
|
|
|
|
title = title.replace('720p', '[B]720p[/B]').replace('1080p', '[B]1080p[/B]')
|
|
|
|
title = clWhite % title
|
2016-11-26 13:14:33 +03:00
|
|
|
second = '[I](%s) [S/L: %d/%d] [/I]' % (size, seeds, leechers)
|
|
|
|
title += '\r\n' + clDimgray % second
|
2016-11-26 12:06:04 +03:00
|
|
|
return title
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2016-11-26 19:05:04 +03:00
|
|
|
|
|
|
|
dialog = MultiChoiceDialog("Torrenter Search Window")
|
2016-11-26 12:06:04 +03:00
|
|
|
dialog.doModal()
|
|
|
|
del dialog #You need to delete your instance when it is no longer needed
|
2016-11-26 19:05:04 +03:00
|
|
|
#because underlying xbmcgui classes are not grabage-collected.
|
|
|
|
|
|
|
|
'''
|
|
|
|
items = [(1919, 1919, 52, u'102.66 MiB', u'South.Park.S20E06.HDTV.x264-FUM[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:0792ea51bc16a19893871197fa927ecec7ca25aa&dn=South.Park.S20E06.HDTV.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (1545, 1545, 31, u'97.26 MiB', u'South.Park.S20E05.HDTV.x264-KILLERS[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:437487c32ce82f050cdbfccfc04e4e20aca0d4cb&dn=South.Park.S20E05.HDTV.x264-KILLERS%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (1265, 1265, 75, u'89.69 MiB', u'South.Park.S20E07.HDTV.x264-FLEET', u'ThePirateBay::magnet:?xt=urn:btih:a122b0b79c4cbacea959e6e032ab540674ce49eb&dn=South.Park.S20E07.HDTV.x264-FLEET&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (1083, 1083, 9, u'99.5 MiB', u'South.Park.S20E03.PROPER.HDTV.x264-KILLERS[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:ed2806f33629ec637caeabcc25ae1e70d5971ebe&dn=South.Park.S20E03.PROPER.HDTV.x264-KILLERS%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (429, 429, 19, u'85.08 MiB', u'South.Park.S20E08.WEBRip.x264-FUM[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:988728720702c55fd1d19cde10f9af720ed934eb&dn=South.Park.S20E08.WEBRip.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (311, 311, 229, u'251.67 MiB', u'South.Park.S20E08.1080p.HDTV.x264[state]', u'ThePirateBay::magnet:?xt=urn:btih:a5fa25dfccfa43723e34466b47fed2f89dd34072&dn=South.Park.S20E08.1080p.HDTV.x264%5Bstate%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (272, 272, 51, '6.08 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DL (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9, \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-10-seriya-1-iz-10-t111662.html?id=602710', 'C:\\Users\\Admin\\AppData\\Roam
|
|
|
|
'''
|