2015-01-09 14:11:21 +03:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
'''
|
2015-06-30 18:08:57 +03:00
|
|
|
Torrenter v2 plugin for XBMC/Kodi
|
|
|
|
Copyright (C) 2012-2015 Vadim Skorba v1 - DiMartino v2
|
|
|
|
http://forum.kodi.tv/showthread.php?tid=214366
|
|
|
|
|
2015-01-09 14:11:21 +03:00
|
|
|
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 thread
|
|
|
|
import os
|
|
|
|
import urllib2
|
|
|
|
import hashlib
|
|
|
|
import re
|
|
|
|
from StringIO import StringIO
|
|
|
|
import gzip
|
|
|
|
|
|
|
|
import xbmc
|
|
|
|
import xbmcgui
|
|
|
|
import xbmcvfs
|
|
|
|
import Localization
|
2015-06-23 23:00:27 +03:00
|
|
|
from functions import file_decode, file_encode, isSubtitle, DownloadDB
|
2015-07-12 02:01:29 +03:00
|
|
|
from platform_pulsar import get_platform
|
2015-06-23 23:00:27 +03:00
|
|
|
|
2015-01-09 14:11:21 +03:00
|
|
|
|
|
|
|
class Libtorrent:
|
|
|
|
torrentFile = None
|
|
|
|
magnetLink = None
|
|
|
|
storageDirectory = ''
|
|
|
|
startPart = 0
|
|
|
|
endPart = 0
|
|
|
|
partOffset = 0
|
|
|
|
torrentHandle = None
|
|
|
|
session = None
|
|
|
|
downloadThread = None
|
|
|
|
threadComplete = False
|
|
|
|
lt = None
|
|
|
|
|
|
|
|
def __init__(self, storageDirectory='', torrentFile='', torrentFilesDirectory='torrents'):
|
2015-06-28 13:47:37 +03:00
|
|
|
self.platform = get_platform()
|
|
|
|
try:
|
|
|
|
import libtorrent
|
2015-06-28 16:28:20 +03:00
|
|
|
|
2015-07-11 12:58:33 +03:00
|
|
|
print '[Torrenter v2]: Imported libtorrent v' + libtorrent.version + ' from system'
|
2015-06-28 16:28:20 +03:00
|
|
|
except Exception, e:
|
2015-07-11 12:58:33 +03:00
|
|
|
print '[Torrenter v2]: Error importing from system. Exception: ' + str(e)
|
|
|
|
from python_libtorrent import get_libtorrent
|
|
|
|
libtorrent=get_libtorrent()
|
2015-06-13 00:46:15 +03:00
|
|
|
|
|
|
|
try:
|
|
|
|
self.lt = libtorrent
|
|
|
|
del libtorrent
|
2015-07-11 12:58:33 +03:00
|
|
|
print '[Torrenter v2]: Imported libtorrent v' + self.lt.version + ' from python_libtorrent.' + self.platform[
|
2015-06-28 13:47:37 +03:00
|
|
|
'system']
|
|
|
|
except Exception, e:
|
2015-07-11 12:58:33 +03:00
|
|
|
print '[Torrenter v2]: Error importing python_libtorrent.' + self.platform['system'] + '. Exception: ' + str(e)
|
2015-06-13 00:46:15 +03:00
|
|
|
xbmcgui.Dialog().ok(Localization.localize('Python-Libtorrent Not Found'),
|
2015-06-23 23:00:27 +03:00
|
|
|
Localization.localize(self.platform["message"][0]),
|
|
|
|
Localization.localize(self.platform["message"][1]))
|
2015-06-13 00:46:15 +03:00
|
|
|
return
|
2015-01-09 14:11:21 +03:00
|
|
|
|
|
|
|
self.storageDirectory = storageDirectory
|
2015-06-23 23:00:27 +03:00
|
|
|
self.torrentFilesPath = os.path.join(self.storageDirectory, torrentFilesDirectory) + os.sep
|
2015-01-09 14:11:21 +03:00
|
|
|
if xbmcvfs.exists(torrentFile):
|
|
|
|
self.torrentFile = torrentFile
|
|
|
|
self.torrentFileInfo = self.lt.torrent_info(file_decode(self.torrentFile))
|
|
|
|
elif re.match("^magnet\:.+$", torrentFile):
|
|
|
|
self.magnetLink = torrentFile
|
|
|
|
|
|
|
|
def saveTorrent(self, torrentUrl):
|
|
|
|
if re.match("^magnet\:.+$", torrentUrl):
|
|
|
|
self.magnetLink = torrentUrl
|
|
|
|
self.magnetToTorrent(torrentUrl)
|
2015-06-23 23:00:27 +03:00
|
|
|
self.magnetLink = None
|
2015-01-09 14:11:21 +03:00
|
|
|
return self.torrentFile
|
|
|
|
else:
|
2015-01-10 18:47:07 +03:00
|
|
|
if not xbmcvfs.exists(self.torrentFilesPath):
|
|
|
|
xbmcvfs.mkdirs(self.torrentFilesPath)
|
|
|
|
torrentFile = self.torrentFilesPath + self.md5(
|
2015-01-09 14:11:21 +03:00
|
|
|
torrentUrl) + '.torrent'
|
|
|
|
try:
|
|
|
|
if not re.match("^http\:.+$", torrentUrl):
|
|
|
|
content = xbmcvfs.File(file_decode(torrentUrl), "rb").read()
|
|
|
|
else:
|
|
|
|
request = urllib2.Request(torrentUrl)
|
|
|
|
request.add_header('Referer', torrentUrl)
|
|
|
|
request.add_header('Accept-encoding', 'gzip')
|
|
|
|
result = urllib2.urlopen(request)
|
|
|
|
if result.info().get('Content-Encoding') == 'gzip':
|
|
|
|
buf = StringIO(result.read())
|
|
|
|
f = gzip.GzipFile(fileobj=buf)
|
|
|
|
content = f.read()
|
|
|
|
else:
|
|
|
|
content = result.read()
|
|
|
|
|
|
|
|
localFile = xbmcvfs.File(torrentFile, "w+b")
|
|
|
|
localFile.write(content)
|
|
|
|
localFile.close()
|
|
|
|
except Exception, e:
|
2015-06-23 23:00:27 +03:00
|
|
|
print 'Unable to save torrent file from "' + torrentUrl + '" to "' + torrentFile + '" in Torrent::saveTorrent' + '. Exception: ' + str(
|
|
|
|
e)
|
2015-01-09 14:11:21 +03:00
|
|
|
return
|
|
|
|
if xbmcvfs.exists(torrentFile):
|
|
|
|
try:
|
|
|
|
self.torrentFileInfo = self.lt.torrent_info(file_decode(torrentFile))
|
|
|
|
except Exception, e:
|
|
|
|
print 'Exception: ' + str(e)
|
|
|
|
xbmcvfs.delete(torrentFile)
|
|
|
|
return
|
2015-03-19 23:29:04 +03:00
|
|
|
baseName = file_encode(os.path.basename(self.getFilePath()))
|
2015-01-10 18:47:07 +03:00
|
|
|
if not xbmcvfs.exists(self.torrentFilesPath):
|
|
|
|
xbmcvfs.mkdirs(self.torrentFilesPath)
|
2015-06-23 23:00:27 +03:00
|
|
|
newFile = self.torrentFilesPath + self.md5(baseName) + '.' + self.md5(
|
|
|
|
torrentUrl) + '.torrent' # + '.'+ baseName
|
2015-03-19 23:29:04 +03:00
|
|
|
if not xbmcvfs.exists(newFile):
|
|
|
|
xbmcvfs.delete(newFile)
|
2015-01-09 14:11:21 +03:00
|
|
|
if not xbmcvfs.exists(newFile):
|
|
|
|
try:
|
|
|
|
xbmcvfs.rename(torrentFile, newFile)
|
|
|
|
except Exception, e:
|
2015-06-23 23:00:27 +03:00
|
|
|
print 'Unable to rename torrent file from "' + torrentFile + '" to "' + newFile + '" in Torrent::renameTorrent' + '. Exception: ' + str(
|
|
|
|
e)
|
2015-01-09 14:11:21 +03:00
|
|
|
return
|
|
|
|
self.torrentFile = newFile
|
|
|
|
if not self.torrentFileInfo:
|
|
|
|
self.torrentFileInfo = self.lt.torrent_info(file_decode(self.torrentFile))
|
|
|
|
return self.torrentFile
|
|
|
|
|
|
|
|
def getMagnetInfo(self):
|
|
|
|
magnetSettings = {
|
|
|
|
'save_path': self.storageDirectory,
|
|
|
|
'storage_mode': self.lt.storage_mode_t(0),
|
|
|
|
'paused': True,
|
|
|
|
'auto_managed': True,
|
|
|
|
'duplicate_is_error': True
|
|
|
|
}
|
|
|
|
progressBar = xbmcgui.DialogProgress()
|
|
|
|
progressBar.create(Localization.localize('Please Wait'), Localization.localize('Magnet-link is converting.'))
|
|
|
|
self.torrentHandle = self.lt.add_magnet_uri(self.session, self.magnetLink, magnetSettings)
|
|
|
|
iterator = 0
|
|
|
|
while not self.torrentHandle.has_metadata() and iterator != 100:
|
|
|
|
progressBar.update(iterator)
|
|
|
|
iterator += 1
|
|
|
|
if progressBar.iscanceled():
|
|
|
|
progressBar.update(0)
|
|
|
|
progressBar.close()
|
|
|
|
return
|
|
|
|
xbmc.sleep(500)
|
|
|
|
progressBar.update(0)
|
|
|
|
progressBar.close()
|
|
|
|
if self.torrentHandle.has_metadata():
|
|
|
|
return self.torrentHandle.get_torrent_info()
|
|
|
|
|
|
|
|
def magnetToTorrent(self, magnet):
|
|
|
|
self.magnetLink = magnet
|
|
|
|
self.initSession()
|
|
|
|
torrentInfo = self.getMagnetInfo()
|
|
|
|
try:
|
|
|
|
torrentFile = self.lt.create_torrent(torrentInfo)
|
2015-05-14 19:20:49 +03:00
|
|
|
baseName = os.path.basename(self.storageDirectory + os.sep + torrentInfo.files()[0].path)
|
2015-01-10 18:47:07 +03:00
|
|
|
if not xbmcvfs.exists(self.torrentFilesPath):
|
|
|
|
xbmcvfs.mkdirs(self.torrentFilesPath)
|
2015-05-14 19:20:49 +03:00
|
|
|
self.torrentFile = self.torrentFilesPath + self.md5(baseName) + '.torrent'
|
2015-01-09 14:11:21 +03:00
|
|
|
torentFileHandler = xbmcvfs.File(self.torrentFile, "w+b")
|
|
|
|
torentFileHandler.write(self.lt.bencode(torrentFile.generate()))
|
|
|
|
torentFileHandler.close()
|
|
|
|
self.torrentFileInfo = self.lt.torrent_info(file_decode(self.torrentFile))
|
|
|
|
except:
|
|
|
|
xbmc.executebuiltin("Notification(%s, %s, 7500)" % (Localization.localize('Error'), Localization.localize(
|
|
|
|
'Can\'t download torrent, probably no seeds available.')))
|
|
|
|
self.torrentFileInfo = torrentInfo
|
|
|
|
|
|
|
|
def getUploadRate(self):
|
|
|
|
if None == self.torrentHandle:
|
|
|
|
return 0
|
|
|
|
else:
|
|
|
|
return self.torrentHandle.status().upload_payload_rate
|
|
|
|
|
|
|
|
def getDownloadRate(self):
|
|
|
|
if None == self.torrentHandle:
|
|
|
|
return 0
|
|
|
|
else:
|
|
|
|
return self.torrentHandle.status().download_payload_rate
|
|
|
|
|
|
|
|
def getPeers(self):
|
|
|
|
if None == self.torrentHandle:
|
|
|
|
return 0
|
|
|
|
else:
|
|
|
|
return self.torrentHandle.status().num_peers
|
|
|
|
|
|
|
|
def getSeeds(self):
|
|
|
|
if None == self.torrentHandle:
|
|
|
|
return 0
|
|
|
|
else:
|
|
|
|
return self.torrentHandle.status().num_seeds
|
|
|
|
|
|
|
|
def getFileSize(self, contentId=0):
|
|
|
|
return self.getContentList()[contentId]['size']
|
|
|
|
|
|
|
|
def getFilePath(self, contentId=0):
|
2015-06-23 23:00:27 +03:00
|
|
|
return os.path.join(self.storageDirectory, self.getContentList()[contentId]['title']) # .decode('utf8')
|
2015-01-09 14:11:21 +03:00
|
|
|
|
|
|
|
def getContentList(self):
|
|
|
|
filelist = []
|
2015-06-28 18:04:09 +03:00
|
|
|
for contentId, contentFile in enumerate(self.torrentFileInfo.files()):
|
|
|
|
stringdata = {"title": contentFile.path, "size": contentFile.size, "ind": int(contentId),
|
|
|
|
'offset': contentFile.offset}
|
|
|
|
filelist.append(stringdata)
|
|
|
|
return filelist
|
2015-06-13 00:46:15 +03:00
|
|
|
|
2015-01-09 14:11:21 +03:00
|
|
|
def getSubsIds(self, filename):
|
2015-06-23 23:00:27 +03:00
|
|
|
subs = []
|
2015-01-09 14:11:21 +03:00
|
|
|
for i in self.getContentList():
|
|
|
|
if isSubtitle(filename, i['title']):
|
|
|
|
subs.append((i['ind'], i['title']))
|
|
|
|
return subs
|
|
|
|
|
|
|
|
def setUploadLimit(self, bytesPerSecond):
|
|
|
|
self.session.set_upload_rate_limit(int(bytesPerSecond))
|
|
|
|
|
|
|
|
def setDownloadLimit(self, bytesPerSecond):
|
|
|
|
self.session.set_download_rate_limit(int(bytesPerSecond))
|
|
|
|
|
|
|
|
def md5(self, string):
|
|
|
|
hasher = hashlib.md5()
|
|
|
|
try:
|
|
|
|
hasher.update(string)
|
|
|
|
except:
|
|
|
|
hasher.update(string.encode('utf-8', 'ignore'))
|
|
|
|
return hasher.hexdigest()
|
|
|
|
|
2015-06-28 18:04:09 +03:00
|
|
|
def downloadProcess(self, contentId, encrytion=True):
|
|
|
|
self.initSession()
|
|
|
|
if encrytion:
|
|
|
|
self.encryptSession()
|
2015-01-12 23:10:20 +03:00
|
|
|
self.startSession()
|
2015-06-23 23:00:27 +03:00
|
|
|
self.paused = False
|
|
|
|
db = DownloadDB()
|
|
|
|
ContentList = self.getContentList()
|
|
|
|
if contentId != None: contentId = int(contentId)
|
|
|
|
if len(ContentList) == 1 or contentId not in [None, -1]:
|
|
|
|
if not contentId: contentId = 0
|
|
|
|
title = os.path.basename(ContentList[contentId]['title'])
|
|
|
|
path = os.path.join(self.storageDirectory, ContentList[contentId]['title'])
|
|
|
|
type = 'file'
|
2015-01-12 23:10:20 +03:00
|
|
|
else:
|
2015-06-23 23:00:27 +03:00
|
|
|
contentId = -1
|
|
|
|
title = ContentList[0]['title'].split('\\')[0]
|
|
|
|
path = os.path.join(self.storageDirectory, title)
|
|
|
|
type = 'folder'
|
|
|
|
|
|
|
|
add = db.add(title, path, type, {'progress': 0}, 'downloading', self.torrentFile, contentId,
|
|
|
|
self.storageDirectory)
|
|
|
|
get = db.get(title)
|
|
|
|
if add or get[5] == 'stopped':
|
|
|
|
if get[5] == 'stopped':
|
2015-01-13 20:06:34 +03:00
|
|
|
db.update_status(get[0], 'downloading')
|
|
|
|
if contentId not in [None, -1]:
|
2015-01-12 23:10:20 +03:00
|
|
|
self.continueSession(int(contentId), Offset=0, seeding=False)
|
|
|
|
else:
|
|
|
|
for i in range(self.torrentFileInfo.num_pieces()):
|
|
|
|
self.torrentHandle.piece_priority(i, 6)
|
|
|
|
thread.start_new_thread(self.downloadLoop, (title,))
|
|
|
|
|
|
|
|
def downloadLoop(self, title):
|
2015-06-23 23:00:27 +03:00
|
|
|
db = DownloadDB()
|
|
|
|
status = 'downloading'
|
|
|
|
while db.get(title) and status != 'stopped':
|
2015-01-14 23:24:01 +03:00
|
|
|
xbmc.sleep(3000)
|
2015-06-23 23:00:27 +03:00
|
|
|
status = db.get_status(title)
|
2015-01-13 17:24:53 +03:00
|
|
|
if not self.paused:
|
2015-06-23 23:00:27 +03:00
|
|
|
if status == 'pause':
|
|
|
|
self.paused = True
|
2015-01-13 17:24:53 +03:00
|
|
|
self.session.pause()
|
|
|
|
else:
|
2015-06-23 23:00:27 +03:00
|
|
|
if status != 'pause':
|
|
|
|
self.paused = False
|
2015-01-13 17:24:53 +03:00
|
|
|
self.session.resume()
|
|
|
|
s = self.torrentHandle.status()
|
2015-06-23 23:00:27 +03:00
|
|
|
info = {}
|
|
|
|
info['upload'] = s.upload_payload_rate
|
|
|
|
info['download'] = s.download_payload_rate
|
|
|
|
info['peers'] = s.num_peers
|
|
|
|
info['seeds'] = s.num_seeds
|
2015-01-13 17:24:53 +03:00
|
|
|
iterator = int(s.progress * 100)
|
2015-06-23 23:00:27 +03:00
|
|
|
info['progress'] = iterator
|
2015-01-12 23:10:20 +03:00
|
|
|
db.update(title, info)
|
|
|
|
self.debug()
|
2015-01-13 20:06:34 +03:00
|
|
|
self.session.remove_torrent(self.torrentHandle)
|
2015-01-18 20:29:38 +03:00
|
|
|
return
|
2015-01-09 14:11:21 +03:00
|
|
|
|
|
|
|
def initSession(self):
|
|
|
|
try:
|
|
|
|
self.session.remove_torrent(self.torrentHandle)
|
|
|
|
except:
|
|
|
|
pass
|
|
|
|
self.session = self.lt.session()
|
2015-06-28 18:04:09 +03:00
|
|
|
self.session.set_alert_mask(self.lt.alert.category_t.error_notification | self.lt.alert.category_t.status_notification | self.lt.alert.category_t.storage_notification)
|
2015-01-09 14:11:21 +03:00
|
|
|
self.session.start_dht()
|
|
|
|
self.session.add_dht_router("router.bittorrent.com", 6881)
|
|
|
|
self.session.add_dht_router("router.utorrent.com", 6881)
|
|
|
|
self.session.add_dht_router("router.bitcomet.com", 6881)
|
2015-06-28 18:04:09 +03:00
|
|
|
self.session.start_lsd()
|
|
|
|
self.session.start_upnp()
|
|
|
|
self.session.start_natpmp()
|
2015-01-09 14:11:21 +03:00
|
|
|
self.session.listen_on(6881, 6891)
|
2015-06-28 18:04:09 +03:00
|
|
|
|
2015-07-15 19:14:22 +03:00
|
|
|
#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)
|
|
|
|
|
2015-06-28 18:04:09 +03:00
|
|
|
# Session settings
|
2015-07-15 19:14:22 +03:00
|
|
|
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
|
2015-06-28 18:04:09 +03:00
|
|
|
|
|
|
|
self.session.set_settings(session_settings)
|
|
|
|
|
|
|
|
def encryptSession(self):
|
|
|
|
# Encryption settings
|
2015-07-11 12:58:33 +03:00
|
|
|
print '[Torrenter v2]: Encryption enabling...'
|
|
|
|
try:
|
|
|
|
encryption_settings = self.lt.pe_settings()
|
|
|
|
encryption_settings.out_enc_policy = self.lt.enc_policy(self.lt.enc_policy.forced)
|
|
|
|
encryption_settings.in_enc_policy = self.lt.enc_policy(self.lt.enc_policy.forced)
|
|
|
|
encryption_settings.allowed_enc_level = self.lt.enc_level.both
|
|
|
|
encryption_settings.prefer_rc4 = True
|
|
|
|
self.session.set_pe_settings(encryption_settings)
|
|
|
|
print '[Torrenter v2]: Encryption on!'
|
|
|
|
except Exception, e:
|
|
|
|
print '[Torrenter v2]: Encryption failed! Exception: ' + str(e)
|
|
|
|
pass
|
2015-01-09 14:11:21 +03:00
|
|
|
|
|
|
|
def startSession(self):
|
|
|
|
if None == self.magnetLink:
|
|
|
|
self.torrentHandle = self.session.add_torrent({'ti': self.torrentFileInfo,
|
|
|
|
'save_path': self.storageDirectory,
|
|
|
|
'flags': 0x300,
|
2015-06-23 23:00:27 +03:00
|
|
|
# 'storage_mode': self.lt.storage_mode_t.storage_mode_allocate,
|
|
|
|
})
|
2015-01-09 14:11:21 +03:00
|
|
|
else:
|
|
|
|
self.torrentFileInfo = self.getMagnetInfo()
|
|
|
|
self.torrentHandle.set_sequential_download(True)
|
2015-07-15 19:14:22 +03:00
|
|
|
#self.torrentHandle.set_max_connections(60)
|
|
|
|
#self.torrentHandle.set_max_uploads(-1)
|
2015-01-09 14:11:21 +03:00
|
|
|
self.stopSession()
|
|
|
|
|
|
|
|
def stopSession(self):
|
|
|
|
for i in range(self.torrentFileInfo.num_pieces()):
|
|
|
|
self.torrentHandle.piece_priority(i, 0)
|
|
|
|
|
2015-06-08 21:17:37 +03:00
|
|
|
def continueSession(self, contentId=0, Offset=0, seeding=False, isMP4=False):
|
2015-01-09 14:11:21 +03:00
|
|
|
self.piece_length = self.torrentFileInfo.piece_length()
|
|
|
|
selectedFileInfo = self.getContentList()[contentId]
|
|
|
|
if not Offset:
|
|
|
|
Offset = selectedFileInfo['size'] / (1024 * 1024)
|
|
|
|
self.partOffset = (Offset * 1024 * 1024 / self.piece_length) + 1
|
2015-06-23 23:00:27 +03:00
|
|
|
# print 'partOffset ' + str(self.partOffset)+str(' ')
|
2015-01-09 14:11:21 +03:00
|
|
|
self.startPart = selectedFileInfo['offset'] / self.piece_length
|
|
|
|
self.endPart = int((selectedFileInfo['offset'] + selectedFileInfo['size']) / self.piece_length)
|
2015-06-23 23:00:27 +03:00
|
|
|
# print 'part ' + str(self.startPart)+ str(' ')+ str(self.endPart)
|
|
|
|
multiplier = self.partOffset / 5
|
|
|
|
print 'continueSession: multiplier ' + str(multiplier)
|
2015-01-09 14:11:21 +03:00
|
|
|
for i in range(self.startPart, self.startPart + self.partOffset):
|
|
|
|
if i <= self.endPart:
|
|
|
|
self.torrentHandle.piece_priority(i, 7)
|
2015-06-23 23:00:27 +03:00
|
|
|
if isMP4 and i % multiplier == 0:
|
|
|
|
self.torrentHandle.piece_priority(self.endPart - i / multiplier, 7)
|
|
|
|
# print str(i)
|
|
|
|
if multiplier >= i:
|
2015-06-08 21:17:37 +03:00
|
|
|
self.torrentHandle.piece_priority(self.endPart - i, 7)
|
2015-06-23 23:00:27 +03:00
|
|
|
# print str(i)
|
2015-01-09 14:11:21 +03:00
|
|
|
|
|
|
|
def fetchParts(self):
|
|
|
|
priorities = self.torrentHandle.piece_priorities()
|
|
|
|
status = self.torrentHandle.status()
|
|
|
|
if len(status.pieces) == 0:
|
|
|
|
return
|
|
|
|
if priorities[self.startPart] == 0:
|
|
|
|
self.torrentHandle.piece_priority(self.startPart, 2)
|
|
|
|
for part in range(self.startPart, self.endPart + 1):
|
|
|
|
if priorities[part] == 0:
|
|
|
|
self.torrentHandle.piece_priority(part, 1)
|
|
|
|
|
|
|
|
def checkThread(self):
|
|
|
|
if self.threadComplete == True:
|
|
|
|
print 'checkThread KIIIIIIIIIIILLLLLLLLLLLLLLL'
|
|
|
|
self.session.remove_torrent(self.torrentHandle)
|
2015-06-28 18:04:09 +03:00
|
|
|
self.session.stop_natpmp()
|
|
|
|
self.session.stop_upnp()
|
|
|
|
self.session.stop_lsd()
|
|
|
|
self.session.stop_dht()
|
2015-01-09 14:11:21 +03:00
|
|
|
|
2015-01-14 23:24:01 +03:00
|
|
|
def debug(self):
|
2015-01-09 14:11:21 +03:00
|
|
|
try:
|
2015-06-23 23:00:27 +03:00
|
|
|
# print str(self.getFilePath(0))
|
2015-01-14 23:24:01 +03:00
|
|
|
s = self.torrentHandle.status()
|
2015-06-23 23:00:27 +03:00
|
|
|
# get_settings=self.torrentHandle.status
|
|
|
|
# print s.num_pieces
|
|
|
|
# priorities = self.torrentHandle.piece_priorities()
|
|
|
|
# self.dump(priorities)
|
|
|
|
# print str('anonymous_mode '+str(get_settings['anonymous_mode']))
|
2015-01-09 14:11:21 +03:00
|
|
|
|
|
|
|
state_str = ['queued', 'checking', 'downloading metadata',
|
|
|
|
'downloading', 'finished', 'seeding', 'allocating']
|
2015-01-14 23:24:01 +03:00
|
|
|
print '[%s] %.2f%% complete (down: %.1f kb/s up: %.1f kB/s peers: %d) %s' % \
|
|
|
|
(self.lt.version, s.progress * 100, s.download_rate / 1000,
|
2015-01-09 14:11:21 +03:00
|
|
|
s.upload_rate / 1000,
|
|
|
|
s.num_peers, state_str[s.state])
|
|
|
|
i = 0
|
2015-06-23 23:00:27 +03:00
|
|
|
# for t in s.pieces:
|
2015-01-09 14:11:21 +03:00
|
|
|
# if t: i=i+1
|
2015-06-23 23:00:27 +03:00
|
|
|
# print str(self.session.pop_alert())
|
|
|
|
# print str(s.pieces[self.startPart:self.endPart])
|
|
|
|
# print 'True pieces: %d' % i
|
|
|
|
# print s.current_tracker
|
|
|
|
# print str(s.pieces)
|
2015-01-09 14:11:21 +03:00
|
|
|
except:
|
|
|
|
print 'debug error'
|
|
|
|
pass
|
|
|
|
|
|
|
|
def dump(self, obj):
|
|
|
|
for attr in dir(obj):
|
|
|
|
try:
|
|
|
|
print "'%s':'%s'," % (attr, getattr(obj, attr))
|
|
|
|
except:
|
2015-06-23 23:00:27 +03:00
|
|
|
pass
|