btclient
This commit is contained in:
		
							parent
							
								
									2198b927b0
								
							
						
					
					
						commit
						b239e74bff
					
				
							
								
								
									
										488
									
								
								BTClientPlayer.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										488
									
								
								BTClientPlayer.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,488 @@
 | 
				
			|||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					'''
 | 
				
			||||||
 | 
					    Torrenter v2 plugin for XBMC/Kodi
 | 
				
			||||||
 | 
					    Copyright (C) 2012-2015 Vadim Skorba v1 - DiMartino v2
 | 
				
			||||||
 | 
					    http://forum.kodi.tv/showthread.php?tid=214366
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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/>.
 | 
				
			||||||
 | 
					'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					import urllib
 | 
				
			||||||
 | 
					import json
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					from contextlib import contextmanager, closing, nested
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import xbmc
 | 
				
			||||||
 | 
					import xbmcgui
 | 
				
			||||||
 | 
					import Downloader
 | 
				
			||||||
 | 
					import xbmcgui
 | 
				
			||||||
 | 
					import xbmcvfs
 | 
				
			||||||
 | 
					import Localization
 | 
				
			||||||
 | 
					from platform_pulsar import get_platform
 | 
				
			||||||
 | 
					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')
 | 
				
			||||||
 | 
					TORRENT2HTTP_TIMEOUT = 20
 | 
				
			||||||
 | 
					TORRENT2HTTP_POLL = 1000
 | 
				
			||||||
 | 
					PLAYING_EVENT_INTERVAL = 60
 | 
				
			||||||
 | 
					MIN_COMPLETED_PIECES = 0.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WINDOW_FULLSCREEN_VIDEO = 12005
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					XBFONT_LEFT = 0x00000000
 | 
				
			||||||
 | 
					XBFONT_RIGHT = 0x00000001
 | 
				
			||||||
 | 
					XBFONT_CENTER_X = 0x00000002
 | 
				
			||||||
 | 
					XBFONT_CENTER_Y = 0x00000004
 | 
				
			||||||
 | 
					XBFONT_TRUNCATED = 0x00000008
 | 
				
			||||||
 | 
					XBFONT_JUSTIFY = 0x00000010
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					STATE_STRS = [
 | 
				
			||||||
 | 
					    'Queued',
 | 
				
			||||||
 | 
					    'Checking',
 | 
				
			||||||
 | 
					    'Downloading metadata',
 | 
				
			||||||
 | 
					    'Downloading',
 | 
				
			||||||
 | 
					    'Finished',
 | 
				
			||||||
 | 
					    'Seeding',
 | 
				
			||||||
 | 
					    'Allocating',
 | 
				
			||||||
 | 
					    'Allocating file & Checking resume'
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VIEWPORT_WIDTH = 1920.0
 | 
				
			||||||
 | 
					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__
 | 
				
			||||||
 | 
					    ROOT = sys.modules["__main__"].__root__  # .decode('utf-8').encode(sys.getfilesystemencoding())
 | 
				
			||||||
 | 
					    USERAGENT = "Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.0"
 | 
				
			||||||
 | 
					    torrentFilesDirectory = 'torrents'
 | 
				
			||||||
 | 
					    debug = __settings__.getSetting('debug') == 'true'
 | 
				
			||||||
 | 
					    subs_dl = __settings__.getSetting('subs_dl') == 'true'
 | 
				
			||||||
 | 
					    seeding = __settings__.getSetting('keep_seeding') == 'true' and __settings__.getSetting('keep_files') == '1'
 | 
				
			||||||
 | 
					    seeding_status = False
 | 
				
			||||||
 | 
					    seeding_run = False
 | 
				
			||||||
 | 
					    ids_video = None
 | 
				
			||||||
 | 
					    episodeId = None
 | 
				
			||||||
 | 
					    basename = ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, userStorageDirectory, torrentUrl, params={}):
 | 
				
			||||||
 | 
					        self.userStorageDirectory = userStorageDirectory
 | 
				
			||||||
 | 
					        self.torrentUrl = torrentUrl
 | 
				
			||||||
 | 
					        xbmc.Player.__init__(self)
 | 
				
			||||||
 | 
					        log("[BTClientPlayer] Initalized")
 | 
				
			||||||
 | 
					        self.params = params
 | 
				
			||||||
 | 
					        self.get = self.params.get
 | 
				
			||||||
 | 
					        self.contentId = int(self.get("url"))
 | 
				
			||||||
 | 
					        self.platform = get_platform()
 | 
				
			||||||
 | 
					        self.init()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.torrent = Downloader.Torrent(self.userStorageDirectory, self.torrentUrl, self.torrentFilesDirectory).player
 | 
				
			||||||
 | 
					        self.lt=self.torrent.lt
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            if self.get("url2"):
 | 
				
			||||||
 | 
					                self.ids_video = urllib.unquote_plus(self.get("url2")).split(',')
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                self.ids_video = self.get_ids()
 | 
				
			||||||
 | 
					        except:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        args=Namespace(bt_download_limit=0,#KB
 | 
				
			||||||
 | 
					                  bt_upload_limit=0,
 | 
				
			||||||
 | 
					                  choose_subtitles=False,
 | 
				
			||||||
 | 
					                  clear_older=0,
 | 
				
			||||||
 | 
					                  debug_log='',#os.path.join(self.userStorageDirectory, 'log.txt'),
 | 
				
			||||||
 | 
					                  delete_on_finish=False,
 | 
				
			||||||
 | 
					                  directory=self.userStorageDirectory,
 | 
				
			||||||
 | 
					                  listen_port_max=6891,#
 | 
				
			||||||
 | 
					                  listen_port_min=6881,
 | 
				
			||||||
 | 
					                  no_resume=False,
 | 
				
			||||||
 | 
					                  player='kodi',
 | 
				
			||||||
 | 
					                  port=5001,
 | 
				
			||||||
 | 
					                  print_pieces=False,
 | 
				
			||||||
 | 
					                  quiet=False,
 | 
				
			||||||
 | 
					                  stdin=False,
 | 
				
			||||||
 | 
					                  stream=True,
 | 
				
			||||||
 | 
					                  subtitles=None,
 | 
				
			||||||
 | 
					                  trace=False,
 | 
				
			||||||
 | 
					                  content_id=self.contentId,
 | 
				
			||||||
 | 
					                  url=self.torrentUrl)
 | 
				
			||||||
 | 
					        args=main(args) #config
 | 
				
			||||||
 | 
					        self.free_port = args.port
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        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:
 | 
				
			||||||
 | 
					            while True:
 | 
				
			||||||
 | 
					                try:
 | 
				
			||||||
 | 
					                    s = socket.socket()
 | 
				
			||||||
 | 
					                    res = s.connect_ex(('127.0.0.1', self.free_port))
 | 
				
			||||||
 | 
					                    if res:
 | 
				
			||||||
 | 
					                        break
 | 
				
			||||||
 | 
					                finally:
 | 
				
			||||||
 | 
					                    s.close()
 | 
				
			||||||
 | 
					                self.free_port += 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            self.server = StreamServer(('127.0.0.1', self.free_port), BTFileHandler, allow_range=True,
 | 
				
			||||||
 | 
					                                  status_fn=self.c.get_normalized_status)
 | 
				
			||||||
 | 
					            log('Started http server on port %d' % self.free_port)
 | 
				
			||||||
 | 
					            self.server.run()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            log('Starting btclient - libtorrent version %s' % self.lt.version)
 | 
				
			||||||
 | 
					            self.c.start_url(args.url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if self.buffer():
 | 
				
			||||||
 | 
					                f = self.c._file
 | 
				
			||||||
 | 
					                self.server.set_file(f)
 | 
				
			||||||
 | 
					                self.setup_play()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            status = self.c.status
 | 
				
			||||||
 | 
					                            overlay.text = "\n".join(self._get_status_lines(status))
 | 
				
			||||||
 | 
					                            xbmc.sleep(1000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            log('Play ended')
 | 
				
			||||||
 | 
					            if self.server:
 | 
				
			||||||
 | 
					                self.server.stop()
 | 
				
			||||||
 | 
					        except Exception:
 | 
				
			||||||
 | 
					            traceback.print_exc()
 | 
				
			||||||
 | 
					        finally:
 | 
				
			||||||
 | 
					            self.on_exit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def init(self):
 | 
				
			||||||
 | 
					        self.next_dl = True if self.__settings__.getSetting('next_dl') == 'true' and self.ids_video else False
 | 
				
			||||||
 | 
					        log('[BTClientPlayer]: init next_dl - ' + str(self.next_dl))
 | 
				
			||||||
 | 
					        self.next_contentId = False
 | 
				
			||||||
 | 
					        self.display_name = ''
 | 
				
			||||||
 | 
					        self.downloadedSize = 0
 | 
				
			||||||
 | 
					        self.dialog = xbmcgui.Dialog()
 | 
				
			||||||
 | 
					        self.on_playback_started = []
 | 
				
			||||||
 | 
					        self.on_playback_resumed = []
 | 
				
			||||||
 | 
					        self.on_playback_paused = []
 | 
				
			||||||
 | 
					        self.on_playback_stopped = []
 | 
				
			||||||
 | 
					        self.fullSize = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def setup_torrent(self):
 | 
				
			||||||
 | 
					        self.torrent.initSession()
 | 
				
			||||||
 | 
					        if self.__settings__.getSetting('encryption') == 'true':
 | 
				
			||||||
 | 
					            self.torrent.encryptSession()
 | 
				
			||||||
 | 
					        self.torrent.startSession()
 | 
				
			||||||
 | 
					        upload_limit = self.__settings__.getSetting("upload_limit") if self.__settings__.getSetting(
 | 
				
			||||||
 | 
					            "upload_limit") != "" else 0
 | 
				
			||||||
 | 
					        if 0 < int(upload_limit):
 | 
				
			||||||
 | 
					            self.torrent.setUploadLimit(int(upload_limit) * 1000000 / 8)  # MBits/second
 | 
				
			||||||
 | 
					        download_limit = self.__settings__.getSetting("download_limit") if self.__settings__.getSetting(
 | 
				
			||||||
 | 
					            "download_limit") != "" else 0
 | 
				
			||||||
 | 
					        if 0 < int(download_limit):
 | 
				
			||||||
 | 
					            self.torrent.setDownloadLimit(
 | 
				
			||||||
 | 
					                int(download_limit) * 1000000 / 8)  # MBits/second
 | 
				
			||||||
 | 
					        self.torrent.status = False
 | 
				
			||||||
 | 
					        self.fullSize = self.torrent.getFileSize(self.contentId)
 | 
				
			||||||
 | 
					        Offset = calculate(self.fullSize)
 | 
				
			||||||
 | 
					        debug('Offset: '+str(Offset))
 | 
				
			||||||
 | 
					        if self.subs_dl:
 | 
				
			||||||
 | 
					            subs = self.torrent.getSubsIds(os.path.basename(self.torrent.getFilePath(self.contentId)))
 | 
				
			||||||
 | 
					            if len(subs) > 0:
 | 
				
			||||||
 | 
					                for ind, title in subs:
 | 
				
			||||||
 | 
					                    self.torrent.continueSession(ind)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # mp4 fix
 | 
				
			||||||
 | 
					        label = os.path.basename(self.torrent.getFilePath(self.contentId))
 | 
				
			||||||
 | 
					        isMP4 = False
 | 
				
			||||||
 | 
					        if '.' in label and  str(label.split('.')[-1]).lower() == 'mp4':
 | 
				
			||||||
 | 
					            isMP4 = True
 | 
				
			||||||
 | 
					        debug('setup_torrent: '+str((self.contentId, Offset, isMP4, label)))
 | 
				
			||||||
 | 
					        self.torrent.continueSession(self.contentId, Offset=Offset, isMP4=isMP4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def buffer(self):
 | 
				
			||||||
 | 
					        #iterator = 0
 | 
				
			||||||
 | 
					        progressBar = xbmcgui.DialogProgress()
 | 
				
			||||||
 | 
					        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:#or not self.torrent.is_playble()
 | 
				
			||||||
 | 
					            status = self.c.get_normalized_status()
 | 
				
			||||||
 | 
					            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...'), ' ', ' ')
 | 
				
			||||||
 | 
					            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.c.close()
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					            xbmc.sleep(1000)
 | 
				
			||||||
 | 
					        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
 | 
				
			||||||
 | 
					        path = os.path.join(self.userStorageDirectory, self.c._file.path)
 | 
				
			||||||
 | 
					        label = os.path.basename(self.c._file.path)
 | 
				
			||||||
 | 
					        self.basename = label
 | 
				
			||||||
 | 
					        #self.seeding_run = False
 | 
				
			||||||
 | 
					        listitem = xbmcgui.ListItem(label)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #if self.subs_dl:
 | 
				
			||||||
 | 
					        #    self.setup_subs(label, path)
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            seasonId = self.get("seasonId")
 | 
				
			||||||
 | 
					            self.episodeId = self.get("episodeId") if not self.episodeId else int(self.episodeId) + 1
 | 
				
			||||||
 | 
					            title = urllib.unquote_plus(self.get("title")) if self.get("title") else None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if self.get("label") and self.episodeId == self.get("episodeId"):
 | 
				
			||||||
 | 
					                label = urllib.unquote_plus(self.get("label"))
 | 
				
			||||||
 | 
					            elif seasonId and self.episodeId and title:
 | 
				
			||||||
 | 
					                label = '%s S%02dE%02d.%s (%s)' % (
 | 
				
			||||||
 | 
					                title, int(seasonId), int(self.episodeId), self.basename.split('.')[-1], self.basename)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if seasonId and self.episodeId and label and 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")
 | 
				
			||||||
 | 
					        if thumbnail:
 | 
				
			||||||
 | 
					            listitem.setThumbnailImage(urllib.unquote_plus(thumbnail))
 | 
				
			||||||
 | 
					        self.display_name = label
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        base = 'http://127.0.0.1:' + str(self.free_port) + '/'
 | 
				
			||||||
 | 
					        url = urlparse.urljoin(base, urllib.quote(path))
 | 
				
			||||||
 | 
					        # мегакостыль!
 | 
				
			||||||
 | 
					        rpc = ({'jsonrpc': '2.0', 'method': 'Files.GetDirectory', 'params': {
 | 
				
			||||||
 | 
					            'media': 'video', 'directory': os.path.dirname(path)}, 'id': 0})
 | 
				
			||||||
 | 
					        data = json.dumps(rpc)
 | 
				
			||||||
 | 
					        request = xbmc.executeJSONRPC(data)
 | 
				
			||||||
 | 
					        response = json.loads(request)
 | 
				
			||||||
 | 
					        xbmc.sleep(300)
 | 
				
			||||||
 | 
					        if response:
 | 
				
			||||||
 | 
					            playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
 | 
				
			||||||
 | 
					            playlist.clear()
 | 
				
			||||||
 | 
					            playlist.add(url, listitem)
 | 
				
			||||||
 | 
					            xbmc.Player().play(playlist)
 | 
				
			||||||
 | 
					        print "\nServing file on %s" % url
 | 
				
			||||||
 | 
					        return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def onPlayBackStarted(self):
 | 
				
			||||||
 | 
					        for f in self.on_playback_started:
 | 
				
			||||||
 | 
					            f()
 | 
				
			||||||
 | 
					        log('[onPlayBackStarted]: '+(str(("video", "play", self.display_name))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def onPlayBackResumed(self):
 | 
				
			||||||
 | 
					        for f in self.on_playback_resumed:
 | 
				
			||||||
 | 
					            f()
 | 
				
			||||||
 | 
					        self.onPlayBackStarted()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def onPlayBackPaused(self):
 | 
				
			||||||
 | 
					        for f in self.on_playback_paused:
 | 
				
			||||||
 | 
					            f()
 | 
				
			||||||
 | 
					        log('[onPlayBackPaused]: '+(str(("video", "pause", self.display_name))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def onPlayBackStopped(self):
 | 
				
			||||||
 | 
					        for f in self.on_playback_stopped:
 | 
				
			||||||
 | 
					            f()
 | 
				
			||||||
 | 
					        log('[onPlayBackStopped]: '+(str(("video", "stop", self.display_name))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @contextmanager
 | 
				
			||||||
 | 
					    def attach(self, callback, *events):
 | 
				
			||||||
 | 
					        for event in events:
 | 
				
			||||||
 | 
					            event.append(callback)
 | 
				
			||||||
 | 
					        yield
 | 
				
			||||||
 | 
					        for event in events:
 | 
				
			||||||
 | 
					            event.remove(callback)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def loop(self):
 | 
				
			||||||
 | 
					        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 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:
 | 
				
			||||||
 | 
					                        next_contentId_index = self.ids_video.index(str(self.contentId)) + 1
 | 
				
			||||||
 | 
					                        if len(self.ids_video) > next_contentId_index:
 | 
				
			||||||
 | 
					                            self.next_contentId = int(self.ids_video[next_contentId_index])
 | 
				
			||||||
 | 
					                        else:
 | 
				
			||||||
 | 
					                            self.next_contentId = False
 | 
				
			||||||
 | 
					                            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)
 | 
				
			||||||
 | 
					                        self.seeding_status = True
 | 
				
			||||||
 | 
					                        # xbmc.sleep(7000)
 | 
				
			||||||
 | 
					                    if self.iterator == 100 and self.next_dl and not self.next_dling and isinstance(self.next_contentId,
 | 
				
			||||||
 | 
					                                                                                                    int) and self.next_contentId != False:
 | 
				
			||||||
 | 
					                        showMessage(self.localize('Torrent Downloading'),
 | 
				
			||||||
 | 
					                                    self.localize('Starting download next episode!'), forced=True)
 | 
				
			||||||
 | 
					                        self.torrent.stopSession()
 | 
				
			||||||
 | 
					                        # xbmc.sleep(1000)
 | 
				
			||||||
 | 
					                        path = self.torrent.getFilePath(self.next_contentId)
 | 
				
			||||||
 | 
					                        self.basename = self.display_name = os.path.basename(path)
 | 
				
			||||||
 | 
					                        self.torrent.continueSession(self.next_contentId)
 | 
				
			||||||
 | 
					                        self.next_dling = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _get_status_lines(self, s):
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					            self.display_name.decode('utf-8'),
 | 
				
			||||||
 | 
					            "%.2f%% %s" % (s.progress * 100, self.localize(STATE_STRS[s.state]).decode('utf-8')),
 | 
				
			||||||
 | 
					            "D:%.2f%s U:%.2f%s S:%d P:%d" % (s.download_rate / 1000, self.localize('kb/s').decode('utf-8'),
 | 
				
			||||||
 | 
					                                             s.upload_rate / 1000, self.localize('kb/s').decode('utf-8'),
 | 
				
			||||||
 | 
					                                             s.num_seeds, s.num_peers)
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def db_delete(self):
 | 
				
			||||||
 | 
					        if self.basename:
 | 
				
			||||||
 | 
					            db = DownloadDB()
 | 
				
			||||||
 | 
					            get = db.get(self.basename)
 | 
				
			||||||
 | 
					            if get:
 | 
				
			||||||
 | 
					                db.delete(get[0])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def seed(self, contentId):
 | 
				
			||||||
 | 
					        self.db_delete()
 | 
				
			||||||
 | 
					        exec_str = 'XBMC.RunPlugin(%s)' % \
 | 
				
			||||||
 | 
					                   ('%s?action=%s&url=%s&storage=%s&ind=%s') % \
 | 
				
			||||||
 | 
					                   (sys.argv[0], 'downloadLibtorrent', urllib.quote_plus(self.torrentUrl),
 | 
				
			||||||
 | 
					                    urllib.quote_plus(self.userStorageDirectory), str(contentId))
 | 
				
			||||||
 | 
					        xbmc.executebuiltin(exec_str)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_ids(self):
 | 
				
			||||||
 | 
					        contentList = []
 | 
				
			||||||
 | 
					        for filedict in self.torrent.getContentList():
 | 
				
			||||||
 | 
					            contentList.append((filedict.get('title'), str(filedict.get('ind'))))
 | 
				
			||||||
 | 
					        contentList = sorted(contentList, key=lambda x: x[0])
 | 
				
			||||||
 | 
					        return get_ids_video(contentList)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def localize(self, string):
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            return Localization.localize(string)
 | 
				
			||||||
 | 
					        except:
 | 
				
			||||||
 | 
					            return string
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user