Added torrent2magnet.py.
This commit is contained in:
parent
ae8f708ef6
commit
59eff6fe6c
1 changed files with 103 additions and 0 deletions
103
torrent2magnet.py
Executable file
103
torrent2magnet.py
Executable file
|
|
@ -0,0 +1,103 @@
|
||||||
|
#! /usr/bin/python3
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os.path
|
||||||
|
import hashlib
|
||||||
|
import urllib.parse
|
||||||
|
import bencode
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
def print_magnet(torrentdic, output=sys.stdout, new_trackers=None):
|
||||||
|
result = []
|
||||||
|
|
||||||
|
# add hash info
|
||||||
|
if "info" not in torrentdic:
|
||||||
|
raise ValueError("No info dict in torrent file")
|
||||||
|
encodedInfo = bencode.bencode(torrentdic["info"])
|
||||||
|
sha1 = hashlib.sha1(encodedInfo).hexdigest()
|
||||||
|
result.append("xt=urn:btih:"+sha1)
|
||||||
|
|
||||||
|
# add display name
|
||||||
|
if "name" in torrentdic["info"]:
|
||||||
|
quoted = urllib.parse.quote(torrentdic["info"]["name"], safe="")
|
||||||
|
result.append("dn="+quoted)
|
||||||
|
|
||||||
|
# add trackers list
|
||||||
|
trackers = []
|
||||||
|
if "announce-list" in torrentdic:
|
||||||
|
for urllist in torrentdic["announce-list"]:
|
||||||
|
trackers += urllist
|
||||||
|
elif "announce" in torrentdic:
|
||||||
|
trackers.append(torrentdic["announce"])
|
||||||
|
if new_trackers:
|
||||||
|
trackers += new_trackers
|
||||||
|
|
||||||
|
# eliminate duplicates without sorting
|
||||||
|
seen_urls = []
|
||||||
|
for url in trackers:
|
||||||
|
if [url] not in seen_urls:
|
||||||
|
seen_urls.append([url])
|
||||||
|
quoted = urllib.parse.quote(url, safe="")
|
||||||
|
result.append("tr="+quoted)
|
||||||
|
torrentdic["announce-list"] = seen_urls
|
||||||
|
|
||||||
|
# output magnet or torrent file
|
||||||
|
if output == sys.stdout:
|
||||||
|
print("magnet:?", "&".join(result), sep="")
|
||||||
|
else:
|
||||||
|
out = open(output, 'bw')
|
||||||
|
out.write(bencode.bencode(torrentdic))
|
||||||
|
out.close()
|
||||||
|
|
||||||
|
# main ()
|
||||||
|
parser = argparse.ArgumentParser(description='Convert torrent files to magnet '
|
||||||
|
'links')
|
||||||
|
parser.add_argument('files', metavar='torrent', nargs='*',
|
||||||
|
help='read from file instead of stdin; if outputting to a '
|
||||||
|
'torrent file, only one input file is allowed')
|
||||||
|
parser.add_argument('-a', '--append-trackers', dest='trackers_file',
|
||||||
|
metavar='trackers_file',
|
||||||
|
help='append tracker list to magnet')
|
||||||
|
parser.add_argument('-o', '--output-torrent', dest='output_file',
|
||||||
|
metavar='output_file',
|
||||||
|
help="output to torrent file instead of magnet (for adding "
|
||||||
|
"trackers, otherwise useless)")
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# select output
|
||||||
|
output = sys.stdout
|
||||||
|
if args.output_file:
|
||||||
|
if os.path.exists(args.output_file):
|
||||||
|
print('File exists, aborting:', args.output_file, file=sys.stderr)
|
||||||
|
exit(1)
|
||||||
|
else:
|
||||||
|
output = args.output_file
|
||||||
|
if len(args.files) > 1:
|
||||||
|
raise ValueError('Can\'t output multiple input files into a torrent '
|
||||||
|
'file')
|
||||||
|
|
||||||
|
# read trackers file
|
||||||
|
new_trackers = []
|
||||||
|
if args.trackers_file != None:
|
||||||
|
f = open(args.trackers_file, 'r')
|
||||||
|
for line in f:
|
||||||
|
new_trackers.append(line.rstrip())
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
# read from torrent files or stdin and print magnets
|
||||||
|
if args.files:
|
||||||
|
for filename in args.files:
|
||||||
|
print(filename, ":", sep="", file=sys.stderr)
|
||||||
|
file = open(filename, "br")
|
||||||
|
byte_stream = file.read()
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
torrentdic = bencode.bdecode(byte_stream)
|
||||||
|
print_magnet(torrentdic, output, new_trackers)
|
||||||
|
else:
|
||||||
|
byte_stream = b''
|
||||||
|
for line in sys.stdin.buffer:
|
||||||
|
byte_stream += line
|
||||||
|
|
||||||
|
torrentdic = bencode.bdecode(byte_stream)
|
||||||
|
print_magnet(torrentdic, output, new_trackers)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue