Убрал ненужную прослойку при передаче параметров
parent
f9840c39c0
commit
9740ebf6f3
|
@ -99,8 +99,8 @@ class Engine:
|
|||
enable_dht=True, enable_lsd=True, enable_natpmp=True, enable_upnp=True, enable_scrape=False,
|
||||
log_stats=False, encryption=Encryption.ENABLED, keep_complete=False, keep_incomplete=False,
|
||||
keep_files=False, log_files_progress=False, log_overall_progress=False, log_pieces_progress=False,
|
||||
listen_port=6881, use_random_port=False, max_idle_timeout=None, no_sparse=False, resume_file=None,
|
||||
user_agent=None, startup_timeout=5, state_file=None, enable_utp=True, enable_tcp=True,
|
||||
listen_port=6881, use_random_port=False, max_idle_timeout=None, no_sparse=False, resume_file='',
|
||||
user_agent=None, startup_timeout=5, state_file='', enable_utp=True, enable_tcp=True,
|
||||
debug_alerts=False, logger=None, torrent_connect_boost=50, connection_speed=50,
|
||||
peer_connect_timeout=15, request_timeout=20, min_reconnect_time=60, max_failcount=3,
|
||||
dht_routers=None, trackers=None):
|
||||
|
@ -239,61 +239,46 @@ class Engine:
|
|||
self.bind_port = port
|
||||
|
||||
kwargs = {
|
||||
'--bind': "%s:%s" % (self.bind_host, self.bind_port),
|
||||
'--uri': self.uri,
|
||||
'--file-index': start_index,
|
||||
'--dl-path': download_path,
|
||||
'--connections-limit': self.connections_limit,
|
||||
'--dl-rate': self.download_kbps,
|
||||
'--ul-rate': self.upload_kbps,
|
||||
'--enable-dht': self.enable_dht,
|
||||
'--enable-lsd': self.enable_lsd,
|
||||
'--enable-natpmp': self.enable_natpmp,
|
||||
'--enable-upnp': self.enable_upnp,
|
||||
'--enable-scrape': self.enable_scrape,
|
||||
'--encryption': self.encryption,
|
||||
'--show-stats': self.log_stats,
|
||||
'--files-progress': self.log_files_progress,
|
||||
'--overall-progress': self.log_overall_progress,
|
||||
'--pieces-progress': self.log_pieces_progress,
|
||||
'--listen-port': self.listen_port,
|
||||
'--random-port': self.use_random_port,
|
||||
'--keep-complete': self.keep_complete,
|
||||
'--keep-incomplete': self.keep_incomplete,
|
||||
'--keep-files': self.keep_files,
|
||||
'--max-idle': self.max_idle_timeout,
|
||||
'--no-sparse': self.no_sparse,
|
||||
'--resume-file': self.resume_file,
|
||||
'--user-agent': self.user_agent,
|
||||
'--state-file': self.state_file,
|
||||
'--enable-utp': self.enable_utp,
|
||||
'--enable-tcp': self.enable_tcp,
|
||||
'--debug-alerts': self.debug_alerts,
|
||||
'--torrent-connect-boost': self.torrent_connect_boost,
|
||||
'--connection-speed': self.connection_speed,
|
||||
'--peer-connect-timeout': self.peer_connect_timeout,
|
||||
'--request-timeout': self.request_timeout,
|
||||
'--min-reconnect-time': self.min_reconnect_time,
|
||||
'--max-failcount': self.max_failcount,
|
||||
'--dht-routers': ",".join(self.dht_routers),
|
||||
'--trackers': ",".join(self.trackers),
|
||||
}
|
||||
'torrentConnectBoost': self.torrent_connect_boost,
|
||||
'trackers': ",".join(self.trackers),
|
||||
'resumeFile': self.resume_file,
|
||||
'minReconnectTime': self.min_reconnect_time,
|
||||
'enableUPNP': self.enable_upnp,
|
||||
'showAllStats': self.log_stats,
|
||||
'debugAlerts': self.debug_alerts,
|
||||
'keepComplete': self.keep_complete,
|
||||
'dhtRouters': ",".join(self.dht_routers),
|
||||
'userAgent': self.user_agent,
|
||||
'enableLSD': self.enable_lsd,
|
||||
'uri': self.uri,
|
||||
'randomPort': self.use_random_port,
|
||||
'noSparseFile': self.no_sparse,
|
||||
'maxUploadRate': self.upload_kbps,
|
||||
'downloadPath': download_path,
|
||||
'showOverallProgress': self.log_overall_progress,
|
||||
'enableDHT': self.enable_dht,
|
||||
'showFilesProgress': self.log_files_progress,
|
||||
'requestTimeout': self.request_timeout,
|
||||
'bindAddress': "%s:%s" % (self.bind_host, self.bind_port),
|
||||
'maxDownloadRate': self.download_kbps,
|
||||
'connectionSpeed': self.connection_speed,
|
||||
'keepIncomplete': self.keep_incomplete,
|
||||
'enableTCP': self.enable_tcp,
|
||||
'listenPort': self.listen_port,
|
||||
'keepFiles': self.keep_files,
|
||||
'stateFile': self.state_file,
|
||||
'peerConnectTimeout': self.peer_connect_timeout,
|
||||
'maxFailCount': self.max_failcount,
|
||||
'showPiecesProgress': self.log_pieces_progress,
|
||||
'idleTimeout': self.max_idle_timeout,
|
||||
'fileIndex': start_index,
|
||||
'connectionsLimit': self.connections_limit,
|
||||
'enableScrape': self.enable_scrape,
|
||||
'enableUTP': self.enable_utp,
|
||||
'encryption': self.encryption,
|
||||
'enableNATPMP': self.enable_natpmp
|
||||
|
||||
args = []
|
||||
for k, v in kwargs.iteritems():
|
||||
if v is not None:
|
||||
if isinstance(v, bool):
|
||||
if v:
|
||||
args.append(k)
|
||||
else:
|
||||
args.append("%s=false" % k)
|
||||
else:
|
||||
args.append(k)
|
||||
if isinstance(v, str) or isinstance(v, unicode):
|
||||
v = ensure_fs_encoding(v)
|
||||
else:
|
||||
v = str(v)
|
||||
args.append(v)
|
||||
}
|
||||
|
||||
self._log("Invoking pyrrent2http")
|
||||
class Logging(object):
|
||||
|
@ -306,22 +291,19 @@ class Engine:
|
|||
if LOGGING:
|
||||
self._log('ERROR: %s' % (message,))
|
||||
pyrrent2http.logging = Logging(self._log)
|
||||
# startupinfo = None
|
||||
# if self.platform.system == "windows":
|
||||
# startupinfo = subprocess.STARTUPINFO()
|
||||
# startupinfo.dwFlags |= 1
|
||||
# startupinfo.wShowWindow = 0
|
||||
#
|
||||
# self.logpipe = logpipe.LogPipe(self._log)
|
||||
# try:
|
||||
# self.process = subprocess.Popen(args, stderr=self.logpipe, stdout=self.logpipe, startupinfo=startupinfo)
|
||||
# except OSError, e:
|
||||
# raise Error("Can't start pyrrent2http: %r" % e, Error.POPEN_ERROR)
|
||||
|
||||
|
||||
self.pyrrent2http = pyrrent2http.Pyrrent2http()
|
||||
self.pyrrent2http.parseFlags(args)
|
||||
self.pyrrent2http.startSession()
|
||||
self._log('init config')
|
||||
try:
|
||||
self.pyrrent2http.initConfig(**kwargs)
|
||||
except Exception as e:
|
||||
self._log('%s' % (e.args,))
|
||||
self._log('Starting session')
|
||||
try:
|
||||
self.pyrrent2http.startSession()
|
||||
except Exception as e:
|
||||
self._log('%s' % (e.args,))
|
||||
self._log('starting services')
|
||||
self.pyrrent2http.startServices()
|
||||
self.pyrrent2http.addTorrent()
|
||||
self.pyrrent2http.startHTTP()
|
||||
|
@ -440,34 +422,6 @@ class Engine:
|
|||
|
||||
def is_alive(self):
|
||||
return self.pyrrent2http_loop.is_alive()
|
||||
|
||||
__to_del = '''@staticmethod
|
||||
def _decode(response):
|
||||
try:
|
||||
return json.loads(response)
|
||||
except (KeyError, ValueError), e:
|
||||
raise Error("Can't decode response from pyrrent2http: %r" % e, Error.REQUEST_ERROR)
|
||||
'''
|
||||
__to_del = '''def _request(self, cmd, timeout=None):
|
||||
if not self.started:
|
||||
raise Error("pyrrent2http is not started", Error.REQUEST_ERROR)
|
||||
try:
|
||||
url = "http://%s:%s/%s" % (self.bind_host, self.bind_port, cmd)
|
||||
kwargs = {}
|
||||
if timeout is not None:
|
||||
kwargs['timeout'] = timeout
|
||||
return urllib2.urlopen(url, **kwargs).read()
|
||||
except (urllib2.URLError, httplib.HTTPException) as e:
|
||||
if isinstance(e, urllib2.URLError) and isinstance(e.reason, socket.timeout):
|
||||
raise Error("Timeout occurred while sending command '%s' to pyrrent2http" % cmd, Error.TIMEOUT)
|
||||
elif not self.is_alive() and self.started:
|
||||
raise Error("pyrrent2http has crashed.", Error.CRASHED)
|
||||
else:
|
||||
raise Error("Can't send command '%s' to pyrrent2http: %r" % (cmd, e), Error.REQUEST_ERROR)
|
||||
except socket.error as e:
|
||||
reason = e[1] if isinstance(e, tuple) else e
|
||||
raise Error("Can't read from pyrrent2http: %s" % reason, Error.REQUEST_ERROR)
|
||||
'''
|
||||
def wait_on_close(self, wait_timeout=10):
|
||||
"""
|
||||
By default, close() method sends shutdown command to pyrrent2http, stops logging and returns immediately, not
|
||||
|
@ -483,16 +437,12 @@ class Engine:
|
|||
Shuts down pyrrent2http and stops logging. If wait_on_close() was called earlier, it will wait until
|
||||
pyrrent2http successfully exits.
|
||||
"""
|
||||
# if self.logpipe and self.wait_on_close_timeout is None:
|
||||
# self.logpipe.close()
|
||||
if self.is_alive():
|
||||
self._log("Shutting down pyrrent2http...")
|
||||
# self._request('shutdown')
|
||||
self.pyrrent2http.shutdown()
|
||||
finished = False
|
||||
if self.wait_on_close_timeout is not None:
|
||||
start = time.time()
|
||||
# os.close(self.logpipe.write_fd)
|
||||
while (time.time() - start) < self.wait_on_close_timeout:
|
||||
time.sleep(0.5)
|
||||
if not self.is_alive():
|
||||
|
@ -500,11 +450,9 @@ class Engine:
|
|||
break
|
||||
if not finished:
|
||||
self._log("PANIC: Timeout occurred while shutting down pyrrent2http thread")
|
||||
#self.process.kill()
|
||||
else:
|
||||
self._log("pyrrent2http successfully shut down.")
|
||||
self.wait_on_close_timeout = None
|
||||
# self.process.wait()
|
||||
self.started = False
|
||||
self.logpipe = None
|
||||
self.process = None
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
import argparse
|
||||
import sys, os
|
||||
import json
|
||||
import chardet
|
||||
|
@ -28,7 +27,7 @@ import BaseHTTPServer
|
|||
import SocketServer
|
||||
import threading
|
||||
import io
|
||||
from util import localize_path
|
||||
from util import localize_path, Struct
|
||||
|
||||
|
||||
|
||||
|
@ -423,20 +422,6 @@ class TorrentFS(object):
|
|||
|
||||
#############################################################
|
||||
|
||||
class AttributeDict(dict):
|
||||
def __getattr__(self, attr):
|
||||
return self[attr]
|
||||
def __setattr__(self, attr, value):
|
||||
self[attr] = value
|
||||
|
||||
class BoolArg(argparse.Action):
|
||||
def __call__(self, parser, namespace, values, option_string=None):
|
||||
#print(repr(values))
|
||||
if values is None: v = True
|
||||
elif values.lower() == 'true': v = True
|
||||
elif values.lower() == 'false': v = False
|
||||
setattr(namespace, self.dest, v)
|
||||
|
||||
class ThreadingHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
|
||||
def handle_error(self, *args, **kwargs):
|
||||
'''Обходим злосчастный "Broken Pipe" и прочие трейсы'''
|
||||
|
@ -591,68 +576,67 @@ class Pyrrent2http(object):
|
|||
self.forceShutdown = False
|
||||
self.session = None
|
||||
self.magnet = False
|
||||
def parseFlags(self, params = None):
|
||||
parser = argparse.ArgumentParser(add_help=True, version=VERSION)
|
||||
parser.add_argument('--uri', type=str, default='', help='Magnet URI or .torrent file URL', dest='uri')
|
||||
parser.add_argument('--bind', type=str, default='localhost:5001', help='Bind address of torrent2http', dest='bindAddress')
|
||||
parser.add_argument('--dl-path', type=str, default='.', help='Download path', dest='downloadPath')
|
||||
parser.add_argument('--max-idle', type=int, default=-1, help='Automatically shutdown if no connection are active after a timeout', dest='idleTimeout')
|
||||
parser.add_argument('--file-index', type=int, default=-1, help='Start downloading file with specified index immediately (or start in paused state otherwise)', dest='fileIndex')
|
||||
parser.add_argument('--keep-complete', nargs='?', action=BoolArg, default=False, help='Keep complete files after exiting', dest='keepComplete', choices=('true', 'false'))
|
||||
parser.add_argument('--keep-incomplete', nargs='?', action=BoolArg, default=False, help='Keep incomplete files after exiting', dest='keepIncomplete', choices=('true', 'false'))
|
||||
parser.add_argument('--keep-files', nargs='?', action=BoolArg, default=False, help='Keep all files after exiting (incl. -keep-complete and -keep-incomplete)', dest='keepFiles', choices=('true', 'false'))
|
||||
parser.add_argument('--show-stats', nargs='?', action=BoolArg, default=False, help='Show all stats (incl. -overall-progress -files-progress -pieces-progress)', dest='showAllStats', choices=('true', 'false'))
|
||||
parser.add_argument('--overall-progress', nargs='?', action=BoolArg, default=False, help='Show overall progress', dest='showOverallProgress', choices=('true', 'false'))
|
||||
parser.add_argument('--files-progress', nargs='?', action=BoolArg, default=False, help='Show files progress', dest='showFilesProgress', choices=('true', 'false'))
|
||||
parser.add_argument('--pieces-progress', nargs='?', action=BoolArg, default=False, help='Show pieces progress', dest='showPiecesProgress', choices=('true', 'false'))
|
||||
parser.add_argument('--debug-alerts', nargs='?', action=BoolArg, default=False, help='Show debug alert notifications', dest='debugAlerts', choices=('true', 'false'))
|
||||
parser.add_argument('--exit-on-finish', nargs='?', action=BoolArg, default=False, help='Exit when download finished', dest='exitOnFinish', choices=('true', 'false'))
|
||||
parser.add_argument('--resume-file', type=str, default='', help='Use fast resume file', dest='resumeFile')
|
||||
parser.add_argument('--state-file', type=str, default='', help='Use file for saving/restoring session state', dest='stateFile')
|
||||
parser.add_argument('--user-agent', type=str, default=USER_AGENT, help='Set an user agent', dest='userAgent')
|
||||
parser.add_argument('--dht-routers', type=str, default='', help='Additional DHT routers (comma-separated host:port pairs)', dest='dhtRouters')
|
||||
parser.add_argument('--trackers', type=str, default='', help='Additional trackers (comma-separated URLs)', dest='trackers')
|
||||
parser.add_argument('--listen-port', type=int, default=6881, help='Use specified port for incoming connections', dest='listenPort')
|
||||
parser.add_argument('--torrent-connect-boost', type=int, default=50, help='The number of peers to try to connect to immediately when the first tracker response is received for a torrent', dest='torrentConnectBoost')
|
||||
parser.add_argument('--connection-speed', type=int, default=50, help='The number of peer connection attempts that are made per second', dest='connectionSpeed')
|
||||
parser.add_argument('--peer-connect-timeout', type=int, default=15, help='The number of seconds to wait after a connection attempt is initiated to a peer', dest='peerConnectTimeout')
|
||||
parser.add_argument('--request-timeout', type=int, default=20, help='The number of seconds until the current front piece request will time out', dest='requestTimeout')
|
||||
parser.add_argument('--dl-rate', type=int, default=-1, help='Max download rate (kB/s)', dest='maxDownloadRate')
|
||||
parser.add_argument('--ul-rate', type=int, default=-1, help='Max upload rate (kB/s)', dest='maxUploadRate')
|
||||
parser.add_argument('--connections-limit', type=int, default=200, help='Set a global limit on the number of connections opened', dest='connectionsLimit')
|
||||
parser.add_argument('--encryption', type=int, default=1, help='Encryption: 0=forced 1=enabled (default) 2=disabled', dest='encryption')
|
||||
parser.add_argument('--min-reconnect-time', type=int, default=60, help='The time to wait between peer connection attempts. If the peer fails, the time is multiplied by fail counter', dest='minReconnectTime')
|
||||
parser.add_argument('--max-failcount', type=int, default=3, help='The maximum times we try to connect to a peer before stop connecting again', dest='maxFailCount')
|
||||
parser.add_argument('--no-sparse', nargs='?', action=BoolArg, default=False, help='Do not use sparse file allocation', dest='noSparseFile', choices=('true', 'false'))
|
||||
parser.add_argument('--random-port', nargs='?', action=BoolArg, default=False, help='Use random listen port (49152-65535)', dest='randomPort', choices=('true', 'false'))
|
||||
parser.add_argument('--enable-scrape', nargs='?', action=BoolArg, default=False, help='Enable sending scrape request to tracker (updates total peers/seeds count)', dest='enableScrape', choices=('true', 'false'))
|
||||
parser.add_argument('--enable-dht', nargs='?', action=BoolArg, default=True, help='Enable DHT (Distributed Hash Table)', dest='enableDHT', choices=('true', 'false'))
|
||||
parser.add_argument('--enable-lsd', nargs='?', action=BoolArg, default=True, help='Enable LSD (Local Service Discovery)', dest='enableLSD', choices=('true', 'false'))
|
||||
parser.add_argument('--enable-upnp', nargs='?', action=BoolArg, default=True, help='Enable UPnP (UPnP port-mapping)', dest='enableUPNP', choices=('true', 'false'))
|
||||
parser.add_argument('--enable-natpmp', nargs='?', action=BoolArg, default=True, help='Enable NATPMP (NAT port-mapping)', dest='enableNATPMP', choices=('true', 'false'))
|
||||
parser.add_argument('--enable-utp', nargs='?', action=BoolArg, default=True, help='Enable uTP protocol', dest='enableUTP', choices=('true', 'false'))
|
||||
parser.add_argument('--enable-tcp', nargs='?', action=BoolArg, default=True, help='Enable TCP protocol', dest='enableTCP', choices=('true', 'false'))
|
||||
if params is None:
|
||||
config_ = parser.parse_args()
|
||||
else:
|
||||
config_ = parser.parse_args(args = params)
|
||||
self.config = AttributeDict()
|
||||
for k in config_.__dict__.keys():
|
||||
self.config[k] = config_.__dict__[k]
|
||||
def initConfig(self, uri = '', bindAddress = 'localhost:5001', downloadPath = '.',
|
||||
idleTimeout = -1, fileIndex = -1, keepComplete = False,
|
||||
keepIncomplete = False, keepFiles = False, showAllStats = False,
|
||||
showOverallProgress = False, showFilesProgress = False,
|
||||
showPiecesProgress = False, debugAlerts = False,
|
||||
exitOnFinish = False, resumeFile = '', stateFile = '',
|
||||
userAgent = USER_AGENT, dhtRouters = '', trackers = '',
|
||||
listenPort = 6881, torrentConnectBoost = 50, connectionSpeed = 50,
|
||||
peerConnectTimeout = 15, requestTimeout = 20, maxDownloadRate = -1,
|
||||
maxUploadRate = -1, connectionsLimit = 200, encryption = 1,
|
||||
minReconnectTime = 60, maxFailCount = 3, noSparseFile = False,
|
||||
randomPort = False, enableScrape = False, enableDHT = True,
|
||||
enableLSD = True, enableUPNP = True, enableNATPMP = True, enableUTP = True, enableTCP = True):
|
||||
self.config = Struct()
|
||||
self.config.uri = uri
|
||||
self.config.bindAddress = bindAddress
|
||||
self.config.downloadPath = downloadPath
|
||||
self.config.idleTimeout = idleTimeout
|
||||
self.config.fileIndex = fileIndex
|
||||
self.config.keepComplete = keepComplete
|
||||
self.config.keepIncomplete = keepIncomplete
|
||||
self.config.keepFiles = keepFiles
|
||||
self.config.showAllStats = showAllStats
|
||||
self.config.showOverallProgress = showOverallProgress
|
||||
self.config.showFilesProgress = showFilesProgress
|
||||
self.config.showPiecesProgress = showPiecesProgress
|
||||
self.config.debugAlerts = debugAlerts
|
||||
self.config.exitOnFinish = exitOnFinish
|
||||
self.config.resumeFile = resumeFile
|
||||
self.config.stateFile = stateFile
|
||||
self.config.userAgent = userAgent
|
||||
self.config.dhtRouters = dhtRouters
|
||||
self.config.trackers = trackers
|
||||
self.config.listenPort = listenPort
|
||||
self.config.torrentConnectBoost = torrentConnectBoost
|
||||
self.config.connectionSpeed = connectionSpeed
|
||||
self.config.peerConnectTimeout = peerConnectTimeout
|
||||
self.config.requestTimeout = requestTimeout
|
||||
self.config.maxDownloadRate = maxDownloadRate
|
||||
self.config.maxUploadRate = maxUploadRate
|
||||
self.config.connectionsLimit = connectionsLimit
|
||||
self.config.encryption = encryption
|
||||
self.config.minReconnectTime = minReconnectTime
|
||||
self.config.maxFailCount = maxFailCount
|
||||
self.config.noSparseFile = noSparseFile
|
||||
self.config.randomPort = randomPort
|
||||
self.config.enableScrape = enableScrape
|
||||
self.config.enableDHT = enableDHT
|
||||
self.config.enableLSD = enableLSD
|
||||
self.config.enableUPNP = enableUPNP
|
||||
self.config.enableNATPMP = enableNATPMP
|
||||
self.config.enableUTP = enableUTP
|
||||
self.config.enableTCP = enableTCP
|
||||
if self.config.uri == '':
|
||||
parser.print_usage()
|
||||
if STANDALONE:
|
||||
sys.exit(1)
|
||||
else:
|
||||
raise "Invalid argument"
|
||||
raise Exception("uri is empty string")
|
||||
if self.config.uri.startswith('magnet:'):
|
||||
self.magnet = True
|
||||
if self.config.resumeFile is None: self.config.resumeFile = ''
|
||||
if self.config.resumeFile != '' and not self.config.keepFiles:
|
||||
logging.error('Usage of option --resume-file is allowed only along with --keep-files')
|
||||
if STANDALONE:
|
||||
sys.exit(1)
|
||||
else:
|
||||
raise
|
||||
raise Exception('Не должно быть файла восстановления, если мы не храним файлы')
|
||||
|
||||
def buildTorrentParams(self, uri):
|
||||
if uri[1] == ':' and sys.platform.startswith('win'):
|
||||
uri = 'file:///' + uri
|
||||
|
@ -796,7 +780,7 @@ class Pyrrent2http(object):
|
|||
self.session.set_settings(settings)
|
||||
|
||||
if self.config.stateFile != '':
|
||||
logging.info('Loading session state from %s', self.config.stateFile)
|
||||
logging.info('Loading session state from %s' % (self.config.stateFile,))
|
||||
try:
|
||||
with open(self.config.stateFile, 'rb') as f:
|
||||
bytes__ = f.read()
|
||||
|
@ -900,7 +884,7 @@ class Pyrrent2http(object):
|
|||
'offset': file_.offset,
|
||||
'download': file_.Downloaded(),
|
||||
'progress': file_.Progress(),
|
||||
'save_path': file_.SavePath(),
|
||||
'save_path': file_.save_path,
|
||||
'url': Url
|
||||
}
|
||||
retFiles['files'].append(fi)
|
||||
|
@ -1019,6 +1003,7 @@ class Pyrrent2http(object):
|
|||
data = lt.bencode(entry)
|
||||
logging.info('Saving session state to: %s' % (self.config.stateFile,))
|
||||
try:
|
||||
logging.info('Saving session state to: %s' % (self.config.stateFile,))
|
||||
with open(self.config.stateFile, 'wb') as f:
|
||||
f.write(data)
|
||||
except IOError as e:
|
||||
|
@ -1044,8 +1029,8 @@ class Pyrrent2http(object):
|
|||
if self.TorrentFS.HasTorrentInfo():
|
||||
for file in self.TorrentFS.Files():
|
||||
if (not self.config.keepComplete or not file.IsComplete()) and (not self.config.keepIncomplete or file.IsComplete()):
|
||||
if os.path.exists(file.SavePath()):
|
||||
files.append(file.SavePath())
|
||||
if os.path.exists(file.save_path):
|
||||
files.append(file.save_path)
|
||||
return files
|
||||
def removeTorrent(self):
|
||||
files = []
|
||||
|
|
|
@ -3,6 +3,13 @@ import socket
|
|||
import chardet
|
||||
|
||||
|
||||
class Struct(dict):
|
||||
def __getattr__(self, attr):
|
||||
return self[attr]
|
||||
def __setattr__(self, attr, value):
|
||||
self[attr] = value
|
||||
|
||||
|
||||
def localize_path(path):
|
||||
path = path.decode(chardet.detect(path)['encoding'])
|
||||
if not sys.platform.startswith('win'):
|
||||
|
|
Loading…
Reference in New Issue