#!/usr/bin/env python # The contents of this file are subject to the BitTorrent Open Source License # Version 1.1 (the License). You may not copy or use this file, in either # source code or executable form, except in compliance with the License. You # may obtain a copy of the License at http://www.bittorrent.com/license/. # # Software distributed under the License is distributed on an AS IS basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # Written by John Hoffman # Updated to 4.20 by David Harrison app_name = "BitTorrent" if __name__ == '__main__': from BTL.translation import _ import sys import os from BitTorrent import platform from BitTorrent.launchmanycore import LaunchMany from BitTorrent.defaultargs import get_defaults from BitTorrent.parseargs import parseargs, printHelp from BitTorrent.prefs import Preferences from BitTorrent import configfile from BitTorrent import version from BTL.platform import encode_for_filesystem, decode_from_filesystem from BitTorrent import BTFailure from BitTorrent import bt_log_fmt import logging from logging import ERROR, WARNING, INFO from BitTorrent import console, old_stderr, STDERR exceptions = [] class HeadlessDisplayer: def display(self, data): # formats the data and dumps it to the root logger. #print '' logging.getLogger('launchmany-console').info('STARTSTATUS') if not data: logging.getLogger('launchmany-console').info( _("no torrents")) for x in data: ( name, status, progress, peers, seeds, seedsmsg, uprate, dnrate, upamt, dnamt, size, t, msg ) = x logging.getLogger('launchmany-console').info( 'STATUS "%s" "%s" %s %d %d %d %d %d %d "%s"' % ( name, status, progress, peers, seeds, uprate, dnrate, upamt, dnamt, msg)) logging.getLogger('launchmany-console').info( '"%s": "%s" (%s) - %sP%s%s u%0.1fK/s-d%0.1fK/s u%dK-d%dK "%s"' % ( name, status, progress, peers, seeds, seedsmsg, uprate/1000, dnrate/1000, upamt/1024, dnamt/1024, msg)) return False def modify_default( defaults_tuplelist, key, newvalue ): name,value,doc = [(n,v,d) for (n,v,d) in defaults_tuplelist if n == key][0] defaults_tuplelist = [(n,v,d) for (n,v,d) in defaults_tuplelist if not n == key] defaults_tuplelist.append( (key,newvalue,doc) ) return defaults_tuplelist if __name__ == '__main__': uiname = 'launchmany-console' defaults = get_defaults(uiname) try: if len(sys.argv) < 2: printHelp(uiname, defaults) sys.exit(1) # Modifying default values from get_defaults is annoying... # Implementing specific default values for each uiname in # defaultargs.py is even more annoying. --Dave ddir = os.path.join( platform.get_dot_dir(), "launchmany-console" ) ddir = decode_from_filesystem(ddir) modify_default(defaults, 'data_dir', ddir) config, args = configfile.parse_configuration_and_args(defaults, uiname, sys.argv[1:], 0, 1) # returned from here config['save_in'] is /home/dave/Desktop/... if args: torrent_dir = args[0] config['torrent_dir'] = \ platform.decode_from_filesystem(torrent_dir) else: torrent_dir = config['torrent_dir'] torrent_dir,bad = platform.encode_for_filesystem(torrent_dir) if bad: raise BTFailure(_("Warning: ")+config['torrent_dir']+ _(" is not a directory")) if not os.path.isdir(torrent_dir): raise BTFailure(_("Warning: ")+torrent_dir+ _(" is not a directory")) # the default behavior is to save_in files to the platform # get_save_dir. For launchmany, if no command-line argument # changed the save directory then use the torrent directory. if config['save_in'] == platform.get_save_dir(): config['save_in'] = config['torrent_dir'] except BTFailure, e: print _("error: ") + unicode(e.args[0]) + \ _("\nrun with no args for parameter explanations") sys.exit(1) except KeyboardInterrupt: sys.exit(1) d = HeadlessDisplayer() # BitTorrent.__init__ installs a StderrProxy that replaces sys.stderr # and outputs all stderr output to the logger. Output error log to # original stderr to avoid infinite loop. stderr_console = logging.StreamHandler(old_stderr) stderr_console.setLevel(STDERR) stderr_console.setFormatter(bt_log_fmt) logging.getLogger('').addHandler(stderr_console) logging.getLogger().setLevel(STDERR) logging.getLogger().removeHandler(console) # more liberal with logging launchmany-console specific output. lmany_logger = logging.getLogger('launchmany-console') lmany_handler = logging.StreamHandler(old_stderr) lmany_handler.setFormatter(bt_log_fmt) lmany_handler.setLevel(INFO) lmany_logger.setLevel(INFO) lmany_logger.addHandler(lmany_handler) config = Preferences().initWithDict(config) LaunchMany(config, d.display, 'launchmany-console')