-#! /usr/bin/env python
+#! /usr/bin/env python3
"""Torrent Virtual FileSystem for Midnight Commander
The script requires Midnight Commander 3.1+
cd file#torrent, where "file" is the name of your torrent metafile.
See detailed installation instructions at
-http://phdru.name/Software/mc/torrent_INSTALL.html.
+https://phdru.name/Software/mc/torrent_INSTALL.html.
The VFS lists all files and directories from the torrent metafile; all files
appear empty, of course, but the sizes are shown. Filenames are reencoded from
"""
-__version__ = "1.2.4"
+__version__ = "1.3.0"
__author__ = "Oleg Broytman <phd@phdru.name>"
-__copyright__ = "Copyright (C) 2010-2016 PhiloSoft Design"
+__copyright__ = "Copyright (C) 2010-2023 PhiloSoft Design"
__license__ = "GPL"
+from datetime import datetime
from os.path import dirname, getmtime
import sys
from time import localtime, asctime
# Get the default charset.
try:
lcAll = locale.getdefaultlocale()
- except locale.Error, err:
- print >>sys.stderr, "WARNING:", err
+ except locale.Error as err:
+ #print("WARNING:", err, file=sys.stderr)
lcAll = []
if len(lcAll) == 2:
else:
try:
default_encoding = locale.getpreferredencoding()
- except locale.Error, err:
- print >>sys.stderr, "WARNING:", err
+ except locale.Error as err:
+ #print("WARNING:", err, file=sys.stderr)
default_encoding = sys.getdefaultencoding()
else:
default_encoding = sys.getdefaultencoding()
if 'path.utf-8' in file:
if name_utf8:
path = '/'.join([name_utf8] + file['path.utf-8'])
- if default_encoding != 'utf-8':
- path = path.decode('utf-8', 'replace').encode(
- default_encoding, 'replace')
else:
_name_utf8 = name
- if encoding and (encoding != 'utf-8'):
- _name_utf8 = _name_utf8.decode(
- encoding, 'replace').encode('utf-8', 'replace')
path = '/'.join([_name_utf8] + file['path.utf-8'])
- if default_encoding != 'utf-8':
- path = path.decode('utf-8', 'replace').encode(
- default_encoding, 'replace')
else:
if name_utf8:
- path = file['path']
- if encoding and (encoding != 'utf-8'):
- path = path.decode(encoding, 'replace').encode(
- 'utf-8', 'replace')
path = '/'.join([name_utf8] + path)
- if default_encoding != 'utf-8':
- path = path.decode('utf-8', 'replace').encode(
- default_encoding, 'replace')
else:
path = '/'.join([name] + file['path'])
- if encoding and (default_encoding != encoding):
- path = path.decode(encoding, 'replace').encode(
- default_encoding, 'replace')
length = file['length']
paths.append((path, length))
else: # One-file torrent
torrent_error('Unknown length')
length = info['length']
if name_utf8:
- if default_encoding != 'utf-8':
- name = name_utf8.decode('utf-8', 'replace').encode(
- default_encoding, 'replace')
- elif encoding and (default_encoding != encoding):
- name = name.decode(encoding, 'replace').encode(
- default_encoding, 'replace')
+ name = name_utf8
paths = [(name, length)]
meta = []
'created by', 'creation date', 'encoding', \
'nodes', 'publisher', 'publisher-url':
if name == 'comment' and 'comment.utf-8' in torrent:
- data = torrent['comment.utf-8'].decode('utf-8').encode(
- default_encoding, 'replace')
+ data = torrent['comment.utf-8']
meta.append(('.META/' + name, len(data)))
elif name in torrent:
if name == 'announce-list':
dt = decode_datetime(getmtime(sys.argv[2]))
for name in sorted(dirs):
- print "dr-xr-xr-x 1 user group 0 %s %s" % (dt, name)
+ print("dr-xr-xr-x 1 user group 0 %s %s" % (dt, name))
for name, size in sorted(paths):
- print "-r--r--r-- 1 user group %d %s %s" % (size, dt, name)
+ print("-r--r--r-- 1 user group %d %s %s" % (size, dt, name))
def mctorrent_copyout():
'created by', 'creation date', 'encoding', \
'nodes', 'publisher', 'publisher-url':
if name == 'comment' and 'comment.utf-8' in torrent:
- data = torrent['comment.utf-8'].decode('utf-8').encode(
- default_encoding, 'replace')
+ data = torrent['comment.utf-8']
elif torrent_filename == '.META/' + name:
if name in torrent:
if name == 'announce-list':
def decode_torrent():
try:
- torrent_file = open(sys.argv[2], 'r')
+ torrent_file = open(sys.argv[2], 'rb')
data = torrent_file.read()
torrent_file.close()
return decode(data)
- except IOError, error_str:
+ except IOError as error_str:
torrent_error(error_str)
def decode_datetime_asc(dt):
- return asctime(localtime(float(dt)))
+ try:
+ return asctime(localtime(float(dt)))
+ except ValueError:
+ return datetime.max.ctime()
def decode_datetime(dt):
- Y, m, d, H, M = localtime(float(dt))[0:5]
- return "%02d-%02d-%d %02d:%02d" % (m, d, Y, H, M)
+ try:
+ Y, m, d, H, M = localtime(float(dt))[0:5]
+ except ValueError:
+ return datetime.max.ctime()
+ else:
+ return "%02d-%02d-%d %02d:%02d" % (m, d, Y, H, M)
def decode_announce_list(announce):
- return '\n'.join(l[0] for l in announce if l)
+ return '\n'.join(a[0] for a in announce if a)
command = sys.argv[1]
g[procname]()
except SystemExit:
raise
-except:
+except Exception:
logger.exception("Error during run")