diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 209d2d4..3ab8267 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,16 +2,47 @@ - - - - - - - + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -44,144 +75,10 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -214,48 +111,45 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - + + + + + + + + + + + + + + + + - - + + + + @@ -264,23 +158,9 @@ - + - - - - - - - - - - - - - - - + @@ -299,68 +179,52 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -404,18 +268,15 @@ @@ -473,8 +337,6 @@ - - @@ -493,40 +355,10 @@ - - - - - - - - - - - - - - - - - - + + @@ -708,12 +540,6 @@ - + - + - + @@ -1026,7 +858,7 @@ - + @@ -1043,7 +875,6 @@ - @@ -1068,15 +899,41 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1168,13 +1025,6 @@ - - - - - - - @@ -1231,143 +1081,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1378,13 +1095,6 @@ - - - - - - - @@ -1434,7 +1144,6 @@ - @@ -1452,156 +1161,166 @@ - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BTClientPlayer.py b/BTClientPlayer.py index 7e5072c..631bfc4 100644 --- a/BTClientPlayer.py +++ b/BTClientPlayer.py @@ -19,8 +19,10 @@ ''' import os +import urllib +import json +import sys from contextlib import contextmanager, closing, nested -from resources.btclient.argparse import Namespace import xbmc import xbmcgui @@ -29,9 +31,14 @@ import xbmcgui import xbmcvfs import Localization from platform_pulsar import get_platform -from resources.btclient.btclient import * -from functions import showMessage, DownloadDB, get_ids_video, log, debug, clearStorage +import traceback +from btclient import * +from functions import calculate, showMessage, clearStorage, DownloadDB, get_ids_video, log, debug, is_writable +from argparse import Namespace from Player import OverlayText +from Libtorrent import Libtorrent + + ROOT = sys.modules["__main__"].__root__ RESOURCES_PATH = os.path.join(ROOT, 'resources') @@ -65,6 +72,12 @@ VIEWPORT_HEIGHT = 1088.0 OVERLAY_WIDTH = int(VIEWPORT_WIDTH * 0.7) # 70% size OVERLAY_HEIGHT = 150 +ENCRYPTION_SETTINGS = { + "Forced": 0, + "Enabled": 1, + "Disabled": 2, +} + class BTClientPlayer(xbmc.Player): __plugin__ = sys.modules["__main__"].__plugin__ __settings__ = sys.modules["__main__"].__settings__ @@ -80,11 +93,7 @@ class BTClientPlayer(xbmc.Player): episodeId = None basename = '' - def __del__(self): - print '!!!!!!!!!!!!!!!!!! DIED !!! '+self.__class__.__name__ - def __init__(self, userStorageDirectory, torrentUrl, params={}): - print '!!!!!!!!!!!!!!!!!! BORN '+self.__class__.__name__ self.userStorageDirectory = userStorageDirectory self.torrentUrl = torrentUrl xbmc.Player.__init__(self) @@ -109,7 +118,7 @@ class BTClientPlayer(xbmc.Player): bt_upload_limit=self.upload_limit, choose_subtitles=False, clear_older=0, - debug_log=os.path.join(self.userStorageDirectory, 'log.txt'), + debug_log='',#os.path.join(self.userStorageDirectory, 'log.txt'), delete_on_finish=False, directory=self.userStorageDirectory, listen_port_max=6891,# @@ -122,7 +131,7 @@ class BTClientPlayer(xbmc.Player): stdin=False, stream=True, subtitles=None, - trace=True, + trace=False, content_id=self.contentId, url=self.torrentUrl) args=main(args) #config @@ -131,6 +140,42 @@ class BTClientPlayer(xbmc.Player): self.btclient=self.stream(args, BTClient) + #self.init() + #self.setup_torrent() + #if self.buffer(): + # while True: + # if self.setup_play(): + # debug('************************************* GOING LOOP') + # #self.torrent.continueSession(self.contentId) + # self.loop() + # else: + # break + # debug('************************************* GO NEXT?') + # if self.next_dl and self.next_dling and isinstance(self.next_contentId, int) and self.iterator == 100: + # self.contentId = self.next_contentId + # continue + # debug('************************************* NO! break') + # break + #self.torrent.stopSession() + #self.torrent.threadComplete = True + #self.torrent.checkThread() + + #if '1' != self.__settings__.getSetting("keep_files") and 'Saved Files' not in self.userStorageDirectory: + # xbmc.sleep(1000) + # clearStorage(self.userStorageDirectory) + #else: + # if self.seeding_status: + # showMessage(self.localize('Information'), + # self.localize('Torrent is seeding. To stop it use Download Status.'), forced=True) + # else: + # if self.seeding: self.db_delete() + # showMessage(self.localize('Information'), + # self.localize('Torrent downloading is stopped.'), forced=True) + + def on_exit(self): + self.c.close() + sys.exit(0) + def stream(self, args, client_class): self.c = client_class(args.directory, args=args, lt=self.lt) try: @@ -151,38 +196,23 @@ class BTClientPlayer(xbmc.Player): log('Starting btclient - libtorrent version %s' % self.lt.version) self.c.start_url(args.url) - self.setup_torrent() if self.buffer(): f = self.c._file self.server.set_file(f) self.setup_play() - while True: - if self.setup_play(): - log('************************************* GOING LOOP') - #self.torrent.continueSession(self.contentId) - self.loop() - else: - break - log('************************************* GO NEXT?') - if self.next_dl and self.next_dling and isinstance(self.next_contentId, int) and self.iterator == 100: - self.contentId = self.next_contentId - continue - log('************************************* NO! break') - break + with closing( + OverlayText(w=OVERLAY_WIDTH, h=OVERLAY_HEIGHT, alignment=XBFONT_CENTER_X | XBFONT_CENTER_Y)) as overlay: + with nested(self.attach(overlay.show, self.on_playback_paused), + self.attach(overlay.hide, self.on_playback_resumed, self.on_playback_stopped)): + while True: + if xbmc.abortRequested or not self.isPlaying(): + break - if '1' != self.__settings__.getSetting("keep_files") and 'Saved Files' not in self.userStorageDirectory: - xbmc.sleep(1000) - clearStorage(self.userStorageDirectory) - else: - if self.seeding_status: - showMessage(self.localize('Information'), - self.localize('Torrent is seeding. To stop it use Download Status.'), forced=True) - else: - if self.seeding: self.db_delete() - showMessage(self.localize('Information'), - self.localize('Torrent downloading is stopped.'), forced=True) + status = self.c.status + overlay.text = "\n".join(self._get_status_lines(status)) + xbmc.sleep(1000) log('Play ended') if self.server: @@ -216,7 +246,10 @@ class BTClientPlayer(xbmc.Player): def setup_torrent(self): pass #if self.__settings__.getSetting('encryption') == 'true': - # self.c.encrypt() + # self.torrent.encryptSession() + #self.torrent.startSession() + + #if self.subs_dl: # subs = self.torrent.getSubsIds(os.path.basename(self.torrent.getFilePath(self.contentId))) # if len(subs) > 0: @@ -224,43 +257,34 @@ class BTClientPlayer(xbmc.Player): # self.torrent.continueSession(ind) def buffer(self): - iterator = 0 + #iterator = 0 progressBar = xbmcgui.DialogProgress() - progressBar.create('%s [%s]' % (self.__class__.__name__,str(self.lt.version)), + progressBar.create(self.localize('Please Wait') + str(' [%s]' % str(self.lt.version)), self.localize('Seeds searching.')) - while not self.c.is_file_ready:#iterator < 100: - iterator = 0 - ready_list=[] + while not self.c.is_file_ready: #iterator < 100:#or not self.torrent.is_playble() status = self.c.get_normalized_status() - conditions=[status['state'] in ['downloading', 'finished', 'seeding'], status['desired_rate'] > 0 or status['progress'] > 0.01, - status['progress'] > 0.005, self.c.is_file_ready,# or status['progress'] > 0.02 - (status['download_rate'] > status['desired_rate'] or - status['download_rate'] * int(status['progress'] * 100) > status['desired_rate'])] - for cond in conditions: - if cond: - ready_list.append(True) - iterator+=100/len(conditions) - else: - ready_list.append(False) - - speedsText = '%s: %s Mbit/s %s %s: %s Mbit/s' % (self.localize('Download speed'),str(status['download_rate'] * 8 / 1000000), - '[COLOR=green]>[/COLOR]' if ready_list[4] else '[COLOR=red]<[/COLOR]', - self.localize('Bitrate'), str(int(status['desired_rate'] * 8 / (1024 * 1024))) if status['desired_rate'] else 0,) - + iterator = int(status['progress'] * 10000) + if iterator > 99: iterator = 99 if status['state'] in ['queued','checking','checking fastresume'] or (status['progress'] == 0 and status['num_pieces'] > 0): - progressBar.update(iterator, self.localize('Checking preloaded files...'), speedsText, ' ') - - elif status['state'] in ['downloading', 'finished', 'seeding']: - dialogText = self.localize('Preloaded: ') + '%s MB %s %s MB (%s MB)' % \ - (str(status['downloaded'] / 1024 / 1024), '[COLOR=green]>[/COLOR]' if ready_list[2] else '[COLOR=red]<[/COLOR]', str(status['total_size'] / 1024 / 1024 /200), str(status['total_size'] / 1024 / 1024)) - peersText = '%s: %s [%s: %s; %s: %s]' % (self.localize('File ready: '), '[COLOR=green]YES[/COLOR]' if ready_list[3] else '[COLOR=red]NO[/COLOR]', - self.localize('Seeds'), str(status['seeds_connected']), self.localize('Peers'), str(status['peers_connected']),) - progressBar.update(iterator, peersText, speedsText, dialogText, - ) + progressBar.update(iterator, self.localize('Checking preloaded files...'), ' ', ' ') + elif status['state'] == 'downloading': + dialogText = self.localize('Preloaded: ') + str(status['downloaded'] / 1024 / 1024) + ' MB / ' + str( + status['total_size'] / 1024 / 1024) + ' MB' + peersText = ' [%s: %s; %s: %s]' % ( + self.localize('Seeds'), str(status['seeds_connected']), self.localize('Peers'), + str(status['peers_connected']),) + speedsText = '%s: %s Mbit/s; %s: %s Mbit/s' % ( + self.localize('Downloading'), str(status['download_rate'] * 8 / 1000000), + self.localize('Uploading'), str(status['upload_rate'] * 8 / 1000000)) + #if self.debug: + # peersText=peersText + ' ' + self.torrent.get_debug_info('dht_state') + # dialogText=dialogText.replace(self.localize('Preloaded: '),'') + ' ' + self.torrent.get_debug_info('trackers_sum') + progressBar.update(iterator, self.localize('Seeds searching.') + peersText, dialogText, + speedsText) else: progressBar.update(iterator, self.localize('UNKNOWN STATUS'), ' ', ' ') if progressBar.iscanceled(): - self.on_exit() + self.c.close() break xbmc.sleep(1000) progressBar.update(0) @@ -270,7 +294,7 @@ class BTClientPlayer(xbmc.Player): def setup_subs(self, label, path): iterator = 0 subs = self.torrent.getSubsIds(label) - log('[setup_subs] subs: '+str(subs)) + debug('[setup_subs] subs: '+str(subs)) if len(subs) > 0: showMessage(self.localize('Information'), self.localize('Downloading and copy subtitles. Please wait.'), forced=True) @@ -278,7 +302,7 @@ class BTClientPlayer(xbmc.Player): self.torrent.continueSession(ind) while iterator < 100: xbmc.sleep(1000) - #self.torrent.debug() + self.torrent.debug() status = self.torrent.torrentHandle.status() iterator = int(status.progress * 100) # xbmc.sleep(2000) @@ -289,7 +313,7 @@ class BTClientPlayer(xbmc.Player): ext = temp.split('.')[-1] temp = temp[:len(temp) - len(ext) - 1] + '.' + addition + '.' + ext newFileName = os.path.join(os.path.dirname(path), temp) - log('[setup_subs]: '+str((os.path.join(os.path.dirname(os.path.dirname(path)),title),newFileName))) + debug('[setup_subs]: '+str((os.path.join(os.path.dirname(os.path.dirname(path)),title),newFileName))) if not xbmcvfs.exists(newFileName): xbmcvfs.copy(os.path.join(os.path.dirname(os.path.dirname(path)), title), newFileName) @@ -301,7 +325,6 @@ class BTClientPlayer(xbmc.Player): self.basename = label #self.seeding_run = False listitem = xbmcgui.ListItem(label) - info={} #if self.subs_dl: # self.setup_subs(label, path) @@ -317,15 +340,16 @@ class BTClientPlayer(xbmc.Player): title, int(seasonId), int(self.episodeId), self.basename.split('.')[-1], self.basename) if seasonId and self.episodeId and label and title: - info={'title': label, - 'episode': int(self.episodeId), - 'season': int(seasonId), - 'tvshowtitle': title} + listitem = xbmcgui.ListItem(label) + + listitem.setInfo(type='video', infoLabels={'title': label, + 'episode': int(self.episodeId), + 'season': int(seasonId), + 'tvshowtitle': title}) except: log('[BTClientPlayer] Operation INFO failed!') thumbnail = self.get("thumbnail") - listitem.setInfo(type='Video', infoLabels=info) if thumbnail: listitem.setThumbnailImage(urllib.unquote_plus(thumbnail)) self.display_name = label @@ -341,13 +365,11 @@ class BTClientPlayer(xbmc.Player): while not response: xbmc.sleep(100) if response: - xbmc.sleep(3000) - #if 1==1: playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) playlist.clear() playlist.add(url, listitem) xbmc.Player().play(playlist) - log("Serving file on %s" % url) + print "\nServing file on %s" % url return True def onPlayBackStarted(self): @@ -370,18 +392,6 @@ class BTClientPlayer(xbmc.Player): f() log('[onPlayBackStopped]: '+(str(("video", "stop", self.display_name)))) - def onPlayBackSeek(self, x ,y): - log('[onPlayBackSeek]: '+(str(("video", "seek", self.display_name)))) - #xbmc.Player().pause() - #if self.buffer(): - # xbmc.Player().play() - - def onPlayBackSeekChapter(self, x): - log('[onPlayBackSeek]: '+(str(("video", "seek", self.display_name)))) - #xbmc.Player().pause() - #if self.buffer(): - # xbmc.Player().play() - @contextmanager def attach(self, callback, *events): for event in events: @@ -391,22 +401,21 @@ class BTClientPlayer(xbmc.Player): event.remove(callback) def loop(self): - #debug_counter=0 + debug_counter=0 with closing( - OverlayText(w=OVERLAY_WIDTH, h=OVERLAY_HEIGHT, alignment=XBFONT_CENTER_X | XBFONT_CENTER_Y)) as overlay: - with nested(self.attach(overlay.show, self.on_playback_paused), - self.attach(overlay.hide, self.on_playback_resumed, self.on_playback_stopped)): - while True: - if xbmc.abortRequested or not self.isPlaying(): - break - - #if self.iterator == 100 and debug_counter < 100: - # debug_counter += 1 - #else: - # self.torrent.debug() - # debug_counter=0 - status = self.c.status + OverlayText(w=OVERLAY_WIDTH, h=OVERLAY_HEIGHT, alignment=XBFONT_CENTER_X | XBFONT_CENTER_Y)) as overlay: + with nested(self.attach(overlay.show, self.on_playback_paused), + self.attach(overlay.hide, self.on_playback_resumed, self.on_playback_stopped)): + while not xbmc.abortRequested and self.isPlaying() and not self.torrent.threadComplete: + self.torrent.checkThread() + if self.iterator == 100 and debug_counter < 100: + debug_counter += 1 + else: + self.torrent.debug() + debug_counter=0 + status = self.torrent.torrentHandle.status() overlay.text = "\n".join(self._get_status_lines(status)) + # downloadedSize = torrent.torrentHandle.file_progress()[contentId] self.iterator = int(status.progress * 100) xbmc.sleep(1000) if self.iterator == 100 and self.next_dl: @@ -415,7 +424,7 @@ class BTClientPlayer(xbmc.Player): self.next_contentId = int(self.ids_video[next_contentId_index]) else: self.next_contentId = False - log('[loop] next_contentId: '+str(self.next_contentId)) + debug('[loop] next_contentId: '+str(self.next_contentId)) if not self.seeding_run and self.iterator == 100 and self.seeding: self.seeding_run = True self.seed(self.contentId) @@ -468,7 +477,3 @@ class BTClientPlayer(xbmc.Player): return Localization.localize(string) except: return string - - def on_exit(self): - self.c.close() - sys.exit(0) diff --git a/Core.py b/Core.py index 76b36fd..a77a546 100644 --- a/Core.py +++ b/Core.py @@ -43,9 +43,6 @@ class Core: print 'SYS ARGV: ' + str(sys.argv) - def __del__(self): - print '!!!!!!!!!!!!!!!!!! DIED !!! '+self.__class__.__name__ - def __init__(self): print '!!!!!!!!!!!!!!!!!! BORN '+self.__class__.__name__ if len(self.userStorageDirectory) == 0: @@ -236,17 +233,17 @@ class Core: lockView('wide') def test(self, params={}): - #from BTClientPlayer import BTClientPlayer - #torrentUrl='D:\\ntest.torrent' - #params['url']='0' - #if not xbmcvfs.exists(torrentUrl): - # action = xbmcgui.Dialog() - # torrentUrl = action.browse(1, self.localize('Choose .torrent in video library'), 'video', '.torrent') - #if torrentUrl and xbmcvfs.exists(torrentUrl): - # if 0 != len(torrentUrl): - # self.Player = BTClientPlayer(userStorageDirectory=self.userStorageDirectory, torrentUrl=torrentUrl, params=params) - # else: - # print self.__plugin__ + " Unexpected access to method playTorrent() without torrent content" + from BTClientPlayer import BTClientPlayer + torrentUrl='D:\\ntest.torrent' + params['url']='0' + if not xbmcvfs.exists(torrentUrl): + action = xbmcgui.Dialog() + torrentUrl = action.browse(1, self.localize('Choose .torrent in video library'), 'video', '.torrent') + if torrentUrl and xbmcvfs.exists(torrentUrl): + if 0 != len(torrentUrl): + self.Player = BTClientPlayer(userStorageDirectory=self.userStorageDirectory, torrentUrl=torrentUrl, params=params) + else: + print self.__plugin__ + " Unexpected access to method playTorrent() without torrent content" #path='http://127.0.0.1:5001/Inception.2010.1080p.BluRay.x264.5xRus.Eng-Otaibi.mkv' #listitem = xbmcgui.ListItem('Inception.2010.1080p.BluRay.x264.5xRus.Eng-Otaibi.mkv', path=path) #playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) @@ -254,34 +251,6 @@ class Core: #playlist.add(path, listitem) #xbmc.Player().play(playlist) - from resources.proxy import antizapret - config = antizapret.config() - log('[antizapret]: '+str(config["domains"])) - log('[antizapret]: '+str(config["server"])) - - #try: - # import cherrytorrent - # http_config = { - # 'port': 8089, - # } - - # torrent_config = { - # 'port': 6900, - # 'max_download_rate': 0, - # 'max_upload_rate': 0, - # 'keep_files': False - # } - # server = cherrytorrent.Server(http_config, torrent_config) - # server.run() - # url="http://localhost:8089/add?uri=magnet%3A%3Fxt%3Durn%3Abtih%3Ac39fe3eefbdb62da9c27eb6398ff4a7d2e26e7ab%26dn%3Dbig%2Bbuck%2Bbunny%2Bbdrip%2Bxvid%2Bmedic%26tr%3Dudp%253A%252F%252Ftracker.publicbt.com%253A80%252Fannounce%26tr%3Dudp%253A%252F%252Fopen.demonii.com%253A1337" - # print str(get_url('',url)) - # xbmc.sleep(3000) - # path="http://localhost:8089/video"#?info_hash=c39fe3eefbdb62da9c27eb6398ff4a7d2e26e7ab - # xbmc.Player().play(path) - # xbmc.sleep(30000) - #finally: - # get_url('',"http://localhost:8089/shutdown") - def DownloadStatus(self, params={}): db = DownloadDB() get = params.get diff --git a/Downloader.py b/Downloader.py index 9ab3f9b..ec3cd6c 100644 --- a/Downloader.py +++ b/Downloader.py @@ -28,11 +28,7 @@ import AceStream class Torrent(): __settings__ = sys.modules["__main__"].__settings__ - def __del__(self): - print '!!!!!!!!!!!!!!!!!! DIED !!! '+self.__class__.__name__ - def __init__(self, storageDirectory='', torrentFile='', torrentFilesDirectory='torrents'): - print '!!!!!!!!!!!!!!!!!! BORN '+self.__class__.__name__ self.get_torrent_client() if self.player == 'libtorrent': self.player = Libtorrent.Libtorrent(storageDirectory, torrentFile, torrentFilesDirectory) diff --git a/Libtorrent.py b/Libtorrent.py index 30c702b..11dd7df 100644 --- a/Libtorrent.py +++ b/Libtorrent.py @@ -34,7 +34,6 @@ import Localization from functions import file_encode, isSubtitle, DownloadDB, log, debug, is_writable from platform_pulsar import get_platform - class Libtorrent: magnetLink = None startPart = 0 @@ -45,12 +44,9 @@ class Libtorrent: downloadThread = None threadComplete = False lt = None - - def __del__(self): - print '!!!!!!!!!!!!!!!!!! DIED !!! '+self.__class__.__name__ + save_resume_data = None def __init__(self, storageDirectory='', torrentFile='', torrentFilesDirectory='torrents'): - print '!!!!!!!!!!!!!!!!!! BORN '+self.__class__.__name__ self.platform = get_platform() self.storageDirectory = storageDirectory self.torrentFilesPath = os.path.join(self.storageDirectory, torrentFilesDirectory) + os.sep @@ -169,9 +165,7 @@ class Libtorrent: iterator = 0 while iterator < 100: xbmc.sleep(500) - self.torrentHandle.force_dht_announce() - progressBar.update(iterator, Localization.localize('Please Wait'), Localization.localize('Magnet-link is converting')+'.' * (iterator % 4), ' ') iterator += 1 if progressBar.iscanceled(): @@ -419,9 +413,10 @@ class Libtorrent: self.torrentFileInfo = self.getMagnetInfo() torrent_info={'ti': self.torrentFileInfo, 'save_path': self.storageDirectory, + 'flags': 0x300, #'storage_mode': self.lt.storage_mode_t(1), 'paused': False, - 'auto_managed': False, + #'auto_managed': False, #'duplicate_is_error': True } self.torrentHandle = self.session.add_torrent(torrent_info) @@ -478,9 +473,8 @@ class Libtorrent: #log('get_cache_status - %s/%s' % (str(get_cache_status.blocks_written), str(get_cache_status.blocks_read))) # get_settings=self.torrentHandle.status # print s.num_pieces - priorities = self.torrentHandle.piece_priorities() - str(priorities) - # print str('anonymous_mode '+str(get_settings['anonymous_mode'])) + #priorities = self.torrentHandle.piece_priorities() + #print str(priorities) state_str = ['queued', 'checking', 'downloading metadata', 'downloading', 'finished', 'seeding', 'allocating', 'checking fastresume'] @@ -529,13 +523,11 @@ class Libtorrent: result=result+'Trackers: verified %d/%d, fails=%d' %(verified_sum, len(trackers)-1, fails_sum) if info=='dht_state': is_dht_running='ON' if self.session.is_dht_running() else 'OFF' - - dht_state = self.session.dht_state() - if 'nodes' in dht_state: - nodes = len(dht_state['nodes']) - else: - nodes=0 - + try: + nodes=self.session.dht_state().get('nodes') + except: + nodes=None + nodes=len(nodes) if nodes else 0 result='DHT: %s (%d)' % (is_dht_running, nodes) return result diff --git a/Player.py b/Player.py index f05b7b1..377aaa2 100644 --- a/Player.py +++ b/Player.py @@ -72,11 +72,7 @@ ENCRYPTION_SETTINGS = { class OverlayText(object): - def __del__(self): - print '!!!!!!!!!!!!!!!!!! DIED !!! '+self.__class__.__name__ - def __init__(self, w, h, *args, **kwargs): - print '!!!!!!!!!!!!!!!!!! BORN '+self.__class__.__name__ self.window = xbmcgui.Window(WINDOW_FULLSCREEN_VIDEO) viewport_w, viewport_h = self._get_skin_resolution() # Adjust size based on viewport, we are using 1080p coordinates @@ -140,11 +136,7 @@ class TorrentPlayer(xbmc.Player): episodeId = None basename = '' - def __del__(self): - print '!!!!!!!!!!!!!!!!!! DIED !!! '+self.__class__.__name__ - def __init__(self, userStorageDirectory, torrentUrl, params={}): - print '!!!!!!!!!!!!!!!!!! BORN '+self.__class__.__name__ self.userStorageDirectory = userStorageDirectory self.torrentUrl = torrentUrl xbmc.Player.__init__(self) @@ -277,37 +269,12 @@ class TorrentPlayer(xbmc.Player): self.torrent.checkThread() return xbmc.sleep(1000) - self.torrent.session.remove_torrent(self.torrent.torrentHandle) + #self.torrent.torrentHandle.flush_cache() + #self.torrent.session.remove_torrent(self.torrent.torrentHandle) progressBar.update(0) progressBar.close() return True - def setup_subs(self, label, path): - iterator = 0 - subs = self.torrent.getSubsIds(label) - debug('[setup_subs] subs: '+str(subs)) - if len(subs) > 0: - showMessage(self.localize('Information'), - self.localize('Downloading and copy subtitles. Please wait.'), forced=True) - for ind, title in subs: - self.torrent.continueSession(ind) - while iterator < 100: - xbmc.sleep(1000) - self.torrent.debug() - status = self.torrent.torrentHandle.status() - iterator = int(status.progress * 100) - # xbmc.sleep(2000) - for ind, title in subs: - folder = title.split(os.sep)[0] - temp = os.path.basename(title) - addition = os.path.dirname(title).lstrip(folder + os.sep).replace(os.sep, '.').replace(' ', '_').strip() - ext = temp.split('.')[-1] - temp = temp[:len(temp) - len(ext) - 1] + '.' + addition + '.' + ext - newFileName = os.path.join(os.path.dirname(path), temp) - debug('[setup_subs]: '+str((os.path.join(os.path.dirname(os.path.dirname(path)),title),newFileName))) - if not xbmcvfs.exists(newFileName): - xbmcvfs.copy(os.path.join(os.path.dirname(os.path.dirname(path)), title), newFileName) - def setup_play(self): self.next_dling = False self.iterator = 0 @@ -351,11 +318,10 @@ class TorrentPlayer(xbmc.Player): data = json.dumps(rpc) request = xbmc.executeJSONRPC(data) response = json.loads(request) - xbmc.sleep(300) + xbmc.sleep(1000) if response: # xbmc.Player().play(path, listitem) - log('Megakostil worked! Start playing '+str(path)) playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) playlist.clear() playlist.add(path, listitem) @@ -364,6 +330,32 @@ class TorrentPlayer(xbmc.Player): xbmc.sleep(2000) # very important, do not edit this, podavan return True + def setup_subs(self, label, path): + iterator = 0 + subs = self.torrent.getSubsIds(label) + debug('[setup_subs] subs: '+str(subs)) + if len(subs) > 0: + showMessage(self.localize('Information'), + self.localize('Downloading and copy subtitles. Please wait.'), forced=True) + for ind, title in subs: + self.torrent.continueSession(ind) + while iterator < 100: + xbmc.sleep(1000) + self.torrent.debug() + status = self.torrent.torrentHandle.status() + iterator = int(status.progress * 100) + # xbmc.sleep(2000) + for ind, title in subs: + folder = title.split(os.sep)[0] + temp = os.path.basename(title) + addition = os.path.dirname(title).lstrip(folder + os.sep).replace(os.sep, '.').replace(' ', '_').strip() + ext = temp.split('.')[-1] + temp = temp[:len(temp) - len(ext) - 1] + '.' + addition + '.' + ext + newFileName = os.path.join(os.path.dirname(path), temp) + debug('[setup_subs]: '+str((os.path.join(os.path.dirname(os.path.dirname(path)),title),newFileName))) + if not xbmcvfs.exists(newFileName): + xbmcvfs.copy(os.path.join(os.path.dirname(os.path.dirname(path)), title), newFileName) + def onPlayBackStarted(self): for f in self.on_playback_started: f() diff --git a/README.txt b/README.txt index 69858d3..683f60b 100644 --- a/README.txt +++ b/README.txt @@ -1,4 +1,4 @@ Plugin helps you to watch videos from p2p torrent-networks, without full predownload (uses inner python-libtorrent) or Ace Stream. It also can add, control torrents and play downloaded files with external uTorrent, Transmission, Vuze or Deluge. -Official forum thread and FAQ: http://forum.kodi.tv/showthread.php?tid=214366 +Official forum thread and FAQ: http://forums.tvaddons.ag/addon-releases/29224-torrenter-v2.html Инструкции и обсуждение: http://xbmc.ru/forum/showthread.php?t=6837 \ No newline at end of file diff --git a/addon.xml b/addon.xml index 4f05006..3a3a264 100644 --- a/addon.xml +++ b/addon.xml @@ -1,12 +1,10 @@  - + - - + - video @@ -18,10 +16,6 @@ Plugin helps you to watch videos from p2p torrent-networks, without full predownload (uses python-libtorrent or Ace Stream). It also can add, control torrents and play downloaded files with external torrent-client (uTorrent, Transmisson, Vuse, Deluge) or python-libtorrent. GNU GPLv3 http://www.gnu.org/licenses/ - תוסף המאפשר לך לצפות בקטעי וידאו מרשתות טורנט P2P, ללא הורדה מלאה. - - תוסף המאפשר לך לצפות בקטעי וידאו מרשתות טורנט P2P, ללא הורדה מלאה (משתמש ב-Python-libtorrent או Ace Stream). ניתן גם להוסיף,לשלוט ולנגן בקבצי טורנטים שהורדו עם תוכנת טורנט חיצונית (uTorrent, Transmisson, Vuse, Deluge) או Python-libtorrent. - Плагин позволяет просматривать видео из пиринговых торрент-сетей, не дожидаясь полного скачивания. Плагин позволяет просматривать видео из пиринговых торрент-сетей, не дожидаясь полного скачивания. Использует библиотеку python-libtorrent или Ace Stream. Так же плагин может добавлять, проигрывать и управлять скачками в торрент клиентах (uTorrent, Transmisson, Deluge и Vuse) или средставми python-libtorrent. diff --git a/changelog.txt b/changelog.txt index ced85dd..9d16225 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,12 +1,8 @@ English changelog at http://bit.ly/1MfSVUP -[B]Version 2.3.8[/B] -[+] Добавлен АнтиЗапрет -[+] Списки Медиа: Исправлен KickAssSo - [B]Version 2.3.6[/B] -[+] Оптимизация импорта, ускорена работа меню -[+] Новый Проигрыватель [url=https://github.com/izderadicka/btclient]BTclient[/url] в тестовом режиме, требует python-libtorrent >=1.0.4. +[+] Оптимизация импорта +[+] Новый Проигрыватель BTclient (https://github.com/izderadicka/btclient) в тестовом режиме. [B]Version 2.3.5[/B] [+] Проигрыватель: Уменьшена просадка после загрузки буфера diff --git a/default.py b/default.py index 61f0b6b..ed8a3dc 100644 --- a/default.py +++ b/default.py @@ -19,7 +19,7 @@ ''' import sys -import gc + import xbmcaddon @@ -38,7 +38,3 @@ if (__name__ == "__main__" ): else: params = core.getParameters(sys.argv[2]) core.executeAction(params) - del core - -collected = gc.collect() -print "Garbage collector: collected %d objects." % (collected) \ No newline at end of file diff --git a/functions.py b/functions.py index 9c4105c..64d826e 100644 --- a/functions.py +++ b/functions.py @@ -99,6 +99,8 @@ def clearStorage(userStorageDirectory): except Exception, e: log('[clearStorage]: DownloadDB().clear() failed. '+str(e)) + showMessage(Localization.localize('Storage'), Localization.localize('Storage was cleared'), forced=True) + def sortcomma(dict, json): for x in dict: @@ -801,11 +803,7 @@ class TimeOut(): class ListDB: - def __del__(self): - print '!!!!!!!!!!!!!!!!!! DIED !!! '+self.__class__.__name__ - def __init__(self, version=1.0): - print '!!!!!!!!!!!!!!!!!! BORN '+self.__class__.__name__ self.dbname = 'list' + '.db3' dirname = xbmc.translatePath('special://temp') self.dbfilename = os.path.join(dirname, 'xbmcup', @@ -864,11 +862,7 @@ class ListDB: class HistoryDB: - def __del__(self): - print '!!!!!!!!!!!!!!!!!! DIED !!! '+self.__class__.__name__ - def __init__(self, version=1.1): - print '!!!!!!!!!!!!!!!!!! BORN '+self.__class__.__name__ self.name = 'history.db3' self.version = version @@ -1008,11 +1002,7 @@ class HistoryDB: class Searchers(): - def __del__(self): - print '!!!!!!!!!!!!!!!!!! DIED !!! '+self.__class__.__name__ - def __init__(self): - print '!!!!!!!!!!!!!!!!!! BORN '+self.__class__.__name__ pass def getBoolSetting(self, setting): @@ -1131,6 +1121,7 @@ def search(url, searchersList, isApi=None): 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() @@ -1198,11 +1189,7 @@ def join_list(l, char=', ', replace=''): class Contenters(): - def __del__(self): - print '!!!!!!!!!!!!!!!!!! DIED !!! '+self.__class__.__name__ - def __init__(self): - print '!!!!!!!!!!!!!!!!!! BORN '+self.__class__.__name__ pass def first_time(self, scrapperDB_ver, language='ru'): @@ -1410,11 +1397,7 @@ def delete_russian(ok=False, action='delete'): class DownloadDB: - def __del__(self): - print '!!!!!!!!!!!!!!!!!! DIED !!! '+self.__class__.__name__ - def __init__(self, version=1.41): - print '!!!!!!!!!!!!!!!!!! BORN '+self.__class__.__name__ self.name = 'download.db3' self.version = version diff --git a/resources/__init__.py b/resources/__init__.py index 29440e1..e69de29 100644 --- a/resources/__init__.py +++ b/resources/__init__.py @@ -1,5 +0,0 @@ -#-*- coding: utf-8 -*- -''' - Torrenter v2 plugin for XBMC/Kodi - Copyright (C) 2015 DiMartino -''' \ No newline at end of file diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index bfd2d39..bc9c99d 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -44,10 +44,6 @@ Save files Ask to save BTclient (python-libtorrent via http) - Auto-unblocking proxy - None - Anti-zapret - Immunicity Interface P2P Network Advanced @@ -73,5 +69,4 @@ 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 1b4d968..6a2fce1 100644 --- a/resources/language/Russian/strings.xml +++ b/resources/language/Russian/strings.xml @@ -44,10 +44,6 @@ Сохранять файлы Спросить о сохранении BTclient (python-libtorrent по http) - Антизапрет (прокси) - Не использовать - Anti-zapret - Immunicity Интерфейс P2P Сеть Дополнительные diff --git a/resources/scrapers/fuzzywuzzy/StringMatcher.py b/resources/scrapers/fuzzywuzzy/StringMatcher.py index a4b4811..9dccfe7 100644 --- a/resources/scrapers/fuzzywuzzy/StringMatcher.py +++ b/resources/scrapers/fuzzywuzzy/StringMatcher.py @@ -7,10 +7,8 @@ ported from python-Levenshtein [https://github.com/miohtama/python-Levenshtein] """ -from warnings import warn - from Levenshtein import * - +from warnings import warn class StringMatcher: """A SequenceMatcher-like class built on the top of Levenshtein""" diff --git a/resources/scrapers/fuzzywuzzy/fuzz.py b/resources/scrapers/fuzzywuzzy/fuzz.py index db70af9..48470dc 100644 --- a/resources/scrapers/fuzzywuzzy/fuzz.py +++ b/resources/scrapers/fuzzywuzzy/fuzz.py @@ -25,10 +25,12 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ from __future__ import unicode_literals +import warnings try: from .StringMatcher import StringMatcher as SequenceMatcher except ImportError: + #warnings.warn('Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning') from difflib import SequenceMatcher from . import utils diff --git a/resources/scrapers/kinopoisk/pageparser.py b/resources/scrapers/kinopoisk/pageparser.py index 4246167..2b8555e 100644 --- a/resources/scrapers/kinopoisk/pageparser.py +++ b/resources/scrapers/kinopoisk/pageparser.py @@ -34,7 +34,6 @@ import translit - # MATCHER_MOVIE_DURATION = re.compile('\s*(\d+).*?', re.UNICODE | re.DOTALL) # MATCHER_IMDB_RATING = re.compile('IMDb:\s*(\d+\.?\d*)\s*\(\s*([\s\d]+)\s*\)', re.UNICODE | re.DOTALL) # MATCHER_IMDB_RATING = re.compile('IMDb:\s*(\d+\.?\d*)\s?\((.*)\)', re.UNICODE) diff --git a/resources/settings.xml b/resources/settings.xml index 5b81080..6cdd8a6 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -11,7 +11,6 @@ - diff --git a/resources/skins/DialogReviews.py b/resources/skins/DialogReviews.py index 959f46d..ca0a2bd 100644 --- a/resources/skins/DialogReviews.py +++ b/resources/skins/DialogReviews.py @@ -1,9 +1,7 @@ # -*- coding: utf-8 -*- -import re -import htmlentitydefs - -import xbmcgui +import sys, urllib, urllib2, re, os, cookielib, traceback, datetime, htmlentitydefs +import xbmc, xbmcgui, xbmcaddon pattern = re.compile("&(\w+?);") diff --git a/resources/utorrent/__init__.py b/resources/utorrent/__init__.py index 29440e1..e69de29 100644 --- a/resources/utorrent/__init__.py +++ b/resources/utorrent/__init__.py @@ -1,5 +0,0 @@ -#-*- coding: utf-8 -*- -''' - Torrenter v2 plugin for XBMC/Kodi - Copyright (C) 2015 DiMartino -''' \ No newline at end of file diff --git a/resources/utorrent/dopal/class_defs.py b/resources/utorrent/dopal/class_defs.py index 42ead4f..ccfb4a9 100644 --- a/resources/utorrent/dopal/class_defs.py +++ b/resources/utorrent/dopal/class_defs.py @@ -58,6 +58,7 @@ source file. # class_defs_make.py. # +import dopal.classes from dopal.aztypes import AzMethod as _method from dopal.aztypes import AzureusMethods