ускорил список файлов
parent
b52e975c03
commit
f8c956ab0b
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
<addon id="script.module.pyrrent2http" name="pyrrent2http" version="0.7.3" provider-name="inpos">
|
<addon id="script.module.pyrrent2http" name="pyrrent2http" version="0.7.4" provider-name="inpos">
|
||||||
<requires>
|
<requires>
|
||||||
<import addon="xbmc.python" version="2.14.0"/>
|
<import addon="xbmc.python" version="2.14.0"/>
|
||||||
<import addon="script.module.libtorrent" />
|
<import addon="script.module.libtorrent" />
|
||||||
|
|
|
@ -12,7 +12,7 @@ import pyrrent2http
|
||||||
import xbmc
|
import xbmc
|
||||||
from error import Error
|
from error import Error
|
||||||
from . import SessionStatus, FileStatus, PeerInfo, Encryption
|
from . import SessionStatus, FileStatus, PeerInfo, Encryption
|
||||||
from util import can_bind, find_free_port, localize_path
|
from util import can_bind, find_free_port, localize_path, uri2path
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
LOGGING = True
|
LOGGING = True
|
||||||
|
@ -130,6 +130,7 @@ class Engine:
|
||||||
self.logger = logger
|
self.logger = logger
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
self.started = False
|
self.started = False
|
||||||
|
self.fullStart = True
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -293,6 +294,28 @@ class Engine:
|
||||||
if media_types is not None:
|
if media_types is not None:
|
||||||
res = filter(lambda fs: fs.media_type in media_types, res)
|
res = filter(lambda fs: fs.media_type in media_types, res)
|
||||||
return res
|
return res
|
||||||
|
def list_from_info(self):
|
||||||
|
self.fullStart = False
|
||||||
|
try:
|
||||||
|
info = pyrrent2http.lt.torrent_info(uri2path(self.uri))
|
||||||
|
except:
|
||||||
|
return []
|
||||||
|
files = []
|
||||||
|
for i in range(info.num_files()):
|
||||||
|
f = info.file_at(i)
|
||||||
|
files.append({
|
||||||
|
'name': localize_path(f.path),
|
||||||
|
'size': f.size,
|
||||||
|
'offset': f.offset,
|
||||||
|
'media_type': '',
|
||||||
|
'download': 0,
|
||||||
|
'progress': 0.0,
|
||||||
|
'save_path': '',
|
||||||
|
'url': ''
|
||||||
|
})
|
||||||
|
if files:
|
||||||
|
res = [FileStatus(index=index, **f) for index, f in enumerate(files)]
|
||||||
|
return res
|
||||||
|
|
||||||
def file_status(self, file_index, timeout=10):
|
def file_status(self, file_index, timeout=10):
|
||||||
"""
|
"""
|
||||||
|
@ -342,7 +365,7 @@ class Engine:
|
||||||
Shuts down pyrrent2http and stops logging. If wait_on_close() was called earlier, it will wait until
|
Shuts down pyrrent2http and stops logging. If wait_on_close() was called earlier, it will wait until
|
||||||
pyrrent2http successfully exits.
|
pyrrent2http successfully exits.
|
||||||
"""
|
"""
|
||||||
if self.is_alive():
|
if self.fullStart and self.is_alive():
|
||||||
self._log("Shutting down pyrrent2http...")
|
self._log("Shutting down pyrrent2http...")
|
||||||
self.pyrrent2http.shutdown()
|
self.pyrrent2http.shutdown()
|
||||||
finished = False
|
finished = False
|
||||||
|
|
|
@ -24,7 +24,7 @@ import BaseHTTPServer
|
||||||
import SocketServer
|
import SocketServer
|
||||||
import threading
|
import threading
|
||||||
import io
|
import io
|
||||||
from util import localize_path, Struct, detect_media_type
|
from util import localize_path, Struct, detect_media_type, uri2path, normalize_msg
|
||||||
|
|
||||||
|
|
||||||
######################################################################################
|
######################################################################################
|
||||||
|
@ -601,34 +601,15 @@ class Pyrrent2http(object):
|
||||||
raise Exception('Не должно быть файла восстановления, если мы не храним файлы')
|
raise Exception('Не должно быть файла восстановления, если мы не храним файлы')
|
||||||
|
|
||||||
def buildTorrentParams(self, uri):
|
def buildTorrentParams(self, uri):
|
||||||
if uri[1] == ':' and sys.platform.startswith('win'):
|
|
||||||
uri = 'file:///' + uri
|
|
||||||
fileUri = urlparse.urlparse(uri)
|
|
||||||
torrentParams = {}
|
|
||||||
if self.magnet:
|
|
||||||
torrentParams['url'] = uri
|
|
||||||
elif fileUri.scheme == 'file':
|
|
||||||
uriPath = fileUri.path
|
|
||||||
if uriPath != '' and sys.platform.startswith('win') and (os.path.sep == uriPath[0] or uriPath[0] == '/'):
|
|
||||||
uriPath = uriPath[1:]
|
|
||||||
try:
|
try:
|
||||||
absPath = os.path.abspath(urllib.unquote(uriPath))
|
absPath = uri2path(uri)
|
||||||
logging.info('Opening local torrent file: %s' % (absPath,))
|
logging.info(normalize_msg('Opening local torrent file: %s', absPath))
|
||||||
torrent_info = lt.torrent_info(absPath)
|
torrent_info = lt.torrent_info(absPath)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
strerror = e.args
|
strerror = e.args
|
||||||
logging.error('Build torrent params error is (%s)' % (strerror,))
|
logging.error('Build torrent params error is (%s)' % (strerror,))
|
||||||
raise
|
raise
|
||||||
torrentParams['ti'] = torrent_info
|
torrentParams = {}
|
||||||
else:
|
|
||||||
logging.info('Will fetch: %s' % (uri,))
|
|
||||||
try:
|
|
||||||
torrent_raw = urllib.urlopen(uri).read()
|
|
||||||
torrent_info = lt.torrent_info(torrent_raw, len(torrent_raw))
|
|
||||||
except Exception as e:
|
|
||||||
strerror = e.args
|
|
||||||
logging.error(strerror)
|
|
||||||
raise
|
|
||||||
torrentParams['ti'] = torrent_info
|
torrentParams['ti'] = torrent_info
|
||||||
logging.info('Setting save path: %s' % (self.config.downloadPath,))
|
logging.info('Setting save path: %s' % (self.config.downloadPath,))
|
||||||
torrentParams['save_path'] = self.config.downloadPath
|
torrentParams['save_path'] = self.config.downloadPath
|
||||||
|
|
|
@ -4,6 +4,7 @@ import chardet
|
||||||
import os
|
import os
|
||||||
from . import MediaType
|
from . import MediaType
|
||||||
import mimetypes
|
import mimetypes
|
||||||
|
import urlparse, urllib
|
||||||
|
|
||||||
SUBTITLES_FORMATS = ['.aqt', '.gsub', '.jss', '.sub', '.ttxt', '.pjs', '.psb', '.rt', '.smi', '.stl',
|
SUBTITLES_FORMATS = ['.aqt', '.gsub', '.jss', '.sub', '.ttxt', '.pjs', '.psb', '.rt', '.smi', '.stl',
|
||||||
'.ssf', '.srt', '.ssa', '.ass', '.usf', '.idx']
|
'.ssf', '.srt', '.ssa', '.ass', '.usf', '.idx']
|
||||||
|
@ -14,6 +15,17 @@ class Struct(dict):
|
||||||
def __setattr__(self, attr, value):
|
def __setattr__(self, attr, value):
|
||||||
self[attr] = value
|
self[attr] = value
|
||||||
|
|
||||||
|
def uri2path(uri):
|
||||||
|
if uri[1] == ':' and sys.platform.startswith('win'):
|
||||||
|
uri = 'file:///' + uri
|
||||||
|
fileUri = urlparse.urlparse(uri)
|
||||||
|
if fileUri.scheme == 'file':
|
||||||
|
uriPath = fileUri.path
|
||||||
|
if uriPath != '' and sys.platform.startswith('win') and (os.path.sep == uriPath[0] or uriPath[0] == '/'):
|
||||||
|
uriPath = uriPath[1:]
|
||||||
|
absPath = os.path.abspath(urllib.unquote(uriPath))
|
||||||
|
return localize_path(absPath)
|
||||||
|
|
||||||
def detect_media_type(name):
|
def detect_media_type(name):
|
||||||
ext = os.path.splitext(name)[1]
|
ext = os.path.splitext(name)[1]
|
||||||
if ext in SUBTITLES_FORMATS:
|
if ext in SUBTITLES_FORMATS:
|
||||||
|
@ -29,9 +41,16 @@ def detect_media_type(name):
|
||||||
return MediaType.VIDEO
|
return MediaType.VIDEO
|
||||||
else:
|
else:
|
||||||
return MediaType.UNKNOWN
|
return MediaType.UNKNOWN
|
||||||
|
def normalize_msg(tmpl, *args):
|
||||||
|
msg = tmpl.decode(chardet.detect(tmpl)['encoding'])
|
||||||
|
arg_ = []
|
||||||
|
for a in args:
|
||||||
|
if not isinstance(a, unicode): arg_.append(a.decode(chardet.detect(a)['encoding']))
|
||||||
|
return msg % tuple(arg_)
|
||||||
|
|
||||||
|
|
||||||
def localize_path(path):
|
def localize_path(path):
|
||||||
path = path.decode(chardet.detect(path)['encoding'])
|
if not isinstance(path, unicode): path = path.decode(chardet.detect(path)['encoding'])
|
||||||
if not sys.platform.startswith('win'):
|
if not sys.platform.startswith('win'):
|
||||||
path = path.encode(True and sys.getfilesystemencoding() or 'utf-8')
|
path = path.encode(True and sys.getfilesystemencoding() or 'utf-8')
|
||||||
return path
|
return path
|
||||||
|
|
Loading…
Reference in New Issue