# Written by Arno Bakker # see LICENSE.txt for license information # # Razvan Deaconescu, 2008: # * corrected problem when running in background # * added usage and print_version functions # * uses getopt for command line argument parsing import sys import shutil import time import tempfile import random import os import getopt from traceback import print_exc from Tribler.Core.API import * from Tribler.Core.BitTornado.__init__ import version, report_email def usage(): print "Usage: python cmdlinedl.py [options] torrentfile_or_url" print "Options:" print "\t--port " print "\t-p \t\tuse to listen for connections" print "\t\t\t\t(default is random value)" print "\t--output " print "\t-o \t\tuse " def print_version(): print version, "<" + report_email + ">" def state_callback(ds): d = ds.get_download() # print >>sys.stderr,`d.get_def().get_name()`,dlstatus_strings[ds.get_status()],ds.get_progress(),"%",ds.get_error(),"up",ds.get_current_speed(UPLOAD),"down",ds.get_current_speed(DOWNLOAD) print >>sys.stderr, '%s %s %5.2f%% %s up %8.2fKB/s down %8.2fKB/s' % \ (d.get_def().get_name(), \ dlstatus_strings[ds.get_status()], \ ds.get_progress() * 100, \ ds.get_error(), \ ds.get_current_speed(UPLOAD), \ ds.get_current_speed(DOWNLOAD)) return (1.0, False) def main(): try: opts, args = getopt.getopt(sys.argv[1:], "hvo:p:", ["help", "version", "output-dir", "port"]) except getopt.GetoptError, err: print str(err) usage() sys.exit(2) # init to default values output_dir = os.getcwd() port = random.randint(10000, 65535) for o, a in opts: if o in ("-h", "--help"): usage() sys.exit(0) elif o in ("-o", "--output-dir"): output_dir = a elif o in ("-p", "--port"): port = int(a) elif o in ("-v", "--version"): print_version() sys.exit(0) else: assert False, "unhandled option" if len(args) == 0: usage() sys.exit(2) if len(args) > 1: print "Too many arguments" usage() sys.exit(2) torrentfile_or_url = args[0] print "Press Ctrl-C to stop the download" # setup session sscfg = SessionStartupConfig() statedir = tempfile.mkdtemp() sscfg.set_state_dir(statedir) sscfg.set_listen_port(port) sscfg.set_megacache(False) sscfg.set_overlay(False) sscfg.set_dialback(True) sscfg.set_internal_tracker(False) s = Session(sscfg) # setup and start download dscfg = DownloadStartupConfig() dscfg.set_dest_dir(output_dir); if torrentfile_or_url.startswith("http") or torrentfile_or_url.startswith(P2PURL_SCHEME): tdef = TorrentDef.load_from_url(torrentfile_or_url) else: tdef = TorrentDef.load(torrentfile_or_url) if tdef.get_live(): raise ValueError("cmdlinedl does not support live torrents") d = s.start_download(tdef, dscfg) d.set_state_callback(state_callback, getpeerlist=False) # # loop while waiting for CTRL-C (or any other signal/interrupt) # # - cannot use sys.stdin.read() - it means busy waiting when running # the process in background # - cannot use condition variable - that don't listen to KeyboardInterrupt # # time.sleep(sys.maxint) has "issues" on 64bit architectures; divide it # by some value (2048) to solve problem # try: while True: time.sleep(sys.maxint/2048) except: print_exc() s.shutdown() time.sleep(3) shutil.rmtree(statedir) if __name__ == "__main__": main()