меньше жрём, быстрее двигаемся...
parent
453ed45166
commit
8ea64f3cd3
|
@ -9,10 +9,9 @@ import urllib2
|
|||
import httplib
|
||||
from os.path import dirname
|
||||
import pyrrent2http
|
||||
import mimetypes
|
||||
import xbmc
|
||||
from error import Error
|
||||
from . import SessionStatus, FileStatus, PeerInfo, MediaType, Encryption
|
||||
from . import SessionStatus, FileStatus, PeerInfo, Encryption
|
||||
from util import can_bind, find_free_port, localize_path
|
||||
import threading
|
||||
|
||||
|
@ -22,9 +21,6 @@ class Engine:
|
|||
"""
|
||||
This is python binding class to pyrrent2http client.
|
||||
"""
|
||||
SUBTITLES_FORMATS = ['.aqt', '.gsub', '.jss', '.sub', '.ttxt', '.pjs', '.psb', '.rt', '.smi', '.stl',
|
||||
'.ssf', '.srt', '.ssa', '.ass', '.usf', '.idx']
|
||||
|
||||
def _log(self, message):
|
||||
if self.logger:
|
||||
self.logger(message)
|
||||
|
@ -278,21 +274,7 @@ class Engine:
|
|||
status = SessionStatus(**status)
|
||||
return status
|
||||
|
||||
def _detect_media_type(self, name):
|
||||
ext = os.path.splitext(name)[1]
|
||||
if ext in self.SUBTITLES_FORMATS:
|
||||
return MediaType.SUBTITLES
|
||||
else:
|
||||
mime_type = mimetypes.guess_type(name)[0]
|
||||
if not mime_type:
|
||||
return MediaType.UNKNOWN
|
||||
mime_type = mime_type.split("/")[0]
|
||||
if mime_type == 'audio':
|
||||
return MediaType.AUDIO
|
||||
elif mime_type == 'video':
|
||||
return MediaType.VIDEO
|
||||
else:
|
||||
return MediaType.UNKNOWN
|
||||
|
||||
|
||||
def list(self, media_types=None, timeout=10):
|
||||
"""
|
||||
|
@ -307,7 +289,7 @@ class Engine:
|
|||
"""
|
||||
files = self.pyrrent2http.Ls()['files']
|
||||
if files:
|
||||
res = [FileStatus(index=index, media_type=self._detect_media_type(f['name']), **f)
|
||||
res = [FileStatus(index=index, **f)
|
||||
for index, f in enumerate(files)]
|
||||
if media_types is not None:
|
||||
res = filter(lambda fs: fs.media_type in media_types, res)
|
||||
|
|
|
@ -24,7 +24,7 @@ import BaseHTTPServer
|
|||
import SocketServer
|
||||
import threading
|
||||
import io
|
||||
from util import localize_path, Struct
|
||||
from util import localize_path, Struct, detect_media_type
|
||||
|
||||
|
||||
######################################################################################
|
||||
|
@ -135,16 +135,17 @@ class TorrentFile(object):
|
|||
closed = True
|
||||
save_path = str()
|
||||
fileEntry = None
|
||||
index = int()
|
||||
index = 0
|
||||
filePtr = None
|
||||
downloaded = int()
|
||||
progress = float()
|
||||
downloaded = 0
|
||||
progress = 0.0
|
||||
pdl_thread = None
|
||||
def __init__(self, tfs, fileEntry, savePath, index):
|
||||
self.tfs = tfs
|
||||
self.fileEntry = fileEntry
|
||||
self.name = self.Name()
|
||||
self.unicode_name = self.name.decode(chardet.detect(self.name)['encoding'])
|
||||
self.media_type = detect_media_type(self.unicode_name)
|
||||
self.save_path = savePath
|
||||
self.index = index
|
||||
self.piece_length = int(self.pieceLength())
|
||||
|
@ -277,7 +278,8 @@ class TorrentFS(object):
|
|||
self.handle = handle
|
||||
self.waitForMetadata()
|
||||
self.save_path = localize_path(self.root.torrentParams['save_path'])
|
||||
self.priorities = [[i, p] for i,p in enumerate(self.handle.file_priorities())]
|
||||
self.priorities = list(self.handle.file_priorities())
|
||||
self.files = []
|
||||
if startIndex < 0:
|
||||
logging.info('No -file-index specified, downloading will be paused until any file is requested')
|
||||
for i in range(self.TorrentInfo().num_files()):
|
||||
|
@ -325,22 +327,26 @@ class TorrentFS(object):
|
|||
return self.info
|
||||
def LoadFileProgress(self):
|
||||
self.progresses = self.handle.file_progress()
|
||||
for i, f in enumerate(self.files):
|
||||
f.downloaded = self.getFileDownloadedBytes(i)
|
||||
if f.size > 0: f.progress = float(f.downloaded)/float(f.size)
|
||||
def getFileDownloadedBytes(self, i):
|
||||
try:
|
||||
bytes = self.progresses[i]
|
||||
bytes_ = self.progresses[i]
|
||||
except IndexError:
|
||||
bytes = 0
|
||||
return bytes
|
||||
bytes_ = 0
|
||||
return bytes_
|
||||
def Files(self):
|
||||
if len(self.files) > 0:
|
||||
return self.files
|
||||
info = self.TorrentInfo()
|
||||
files = [None for x in range(info.num_files())]
|
||||
for i in range(info.num_files()):
|
||||
file_ = self.FileAt(i)
|
||||
file_.downloaded = self.getFileDownloadedBytes(i)
|
||||
if file_.Size() > 0:
|
||||
file_.progress = float(file_.downloaded)/float(file_.Size())
|
||||
files[i] = file_
|
||||
return files
|
||||
self.files.append(file_)
|
||||
return self.files
|
||||
def FileAt(self, index):
|
||||
info = self.TorrentInfo()
|
||||
if index < 0 or index >= info.num_files():
|
||||
|
@ -839,11 +845,12 @@ class Pyrrent2http(object):
|
|||
Url = 'http://' + self.config.bindAddress + '/files/' + urllib.quote(file_.name)
|
||||
fi = {
|
||||
'name': file_.unicode_name,
|
||||
'media_type': file_.media_type,
|
||||
'size': file_.size,
|
||||
'offset': file_.offset,
|
||||
'download': file_.Downloaded(),
|
||||
'progress': file_.Progress(),
|
||||
'save_path': file_.save_path,
|
||||
'download': file_.downloaded,
|
||||
'progress': file_.progress,
|
||||
'save_path': file_.save_path,
|
||||
'url': Url
|
||||
}
|
||||
retFiles['files'].append(fi)
|
||||
|
@ -900,6 +907,7 @@ class Pyrrent2http(object):
|
|||
for alert in alerts:
|
||||
if isinstance(alert, lt.save_resume_data_alert):
|
||||
self.processSaveResumeDataAlert(alert)
|
||||
break
|
||||
def waitForAlert(self, alertClass, timeout):
|
||||
start = time.time()
|
||||
while True:
|
||||
|
@ -920,7 +928,7 @@ class Pyrrent2http(object):
|
|||
if self.forceShutdown:
|
||||
return
|
||||
if time.time() - time_start > 0.5:
|
||||
#self.consumeAlerts()
|
||||
self.consumeAlerts()
|
||||
self.TorrentFS.LoadFileProgress()
|
||||
state = self.torrentHandle.status().state
|
||||
if self.config.exitOnFinish and (state == state.finished or state == state.seeding):
|
||||
|
@ -932,6 +940,7 @@ class Pyrrent2http(object):
|
|||
self.stats()
|
||||
if self.saveResumeDataTicker.true:
|
||||
self.saveResumeData(True)
|
||||
time.sleep(0.3)
|
||||
|
||||
def processSaveResumeDataAlert(self, alert):
|
||||
logging.info('Saving resume data to: %s' % (self.config.resumeFile))
|
||||
|
|
|
@ -1,7 +1,12 @@
|
|||
import sys
|
||||
import socket
|
||||
import chardet
|
||||
import os
|
||||
from . import MediaType
|
||||
import mimetypes
|
||||
|
||||
SUBTITLES_FORMATS = ['.aqt', '.gsub', '.jss', '.sub', '.ttxt', '.pjs', '.psb', '.rt', '.smi', '.stl',
|
||||
'.ssf', '.srt', '.ssa', '.ass', '.usf', '.idx']
|
||||
|
||||
class Struct(dict):
|
||||
def __getattr__(self, attr):
|
||||
|
@ -9,6 +14,21 @@ class Struct(dict):
|
|||
def __setattr__(self, attr, value):
|
||||
self[attr] = value
|
||||
|
||||
def detect_media_type(name):
|
||||
ext = os.path.splitext(name)[1]
|
||||
if ext in SUBTITLES_FORMATS:
|
||||
return MediaType.SUBTITLES
|
||||
else:
|
||||
mime_type = mimetypes.guess_type(name)[0]
|
||||
if not mime_type:
|
||||
return MediaType.UNKNOWN
|
||||
mime_type = mime_type.split("/")[0]
|
||||
if mime_type == 'audio':
|
||||
return MediaType.AUDIO
|
||||
elif mime_type == 'video':
|
||||
return MediaType.VIDEO
|
||||
else:
|
||||
return MediaType.UNKNOWN
|
||||
|
||||
def localize_path(path):
|
||||
path = path.decode(chardet.detect(path)['encoding'])
|
||||
|
|
Loading…
Reference in New Issue