예제 #1
0
def commandline_handler():
    parser = argparse.ArgumentParser()
    parser.add_argument("-c",
                        "--config",
                        dest="config_file",
                        default="autotorrent.conf",
                        help="Path to config file")
    parser.add_argument(
        "-l",
        "--client",
        dest="client",
        default="default",
        help="Name of client to use (when multiple configured)")
    parser.add_argument("--create_config",
                        dest="create_config_file",
                        nargs='?',
                        const='autotorrent.conf',
                        default=None,
                        help="Creates a new configuration file")

    parser.add_argument("-t",
                        "--test_connection",
                        action="store_true",
                        dest="test_connection",
                        default=False,
                        help='Tests the connection to the torrent client')
    parser.add_argument(
        "--dry-run",
        nargs='?',
        const='txt',
        default=None,
        dest="dry_run",
        choices=['txt', 'json'],
        help=
        "Don't do any actual adding, just scan for files needed for torrents.")
    parser.add_argument("-r",
                        "--rebuild",
                        dest="rebuild",
                        default=False,
                        help='Rebuild the database',
                        nargs='*')
    parser.add_argument("-a",
                        "--addfile",
                        dest="addfile",
                        default=False,
                        help='Add a new torrent file to client',
                        nargs='+')
    parser.add_argument(
        "-d",
        "--delete_torrents",
        action="store_true",
        dest="delete_torrents",
        default=False,
        help='Delete torrents when they are added to the client')
    parser.add_argument("--verbose",
                        help="increase output verbosity",
                        action="store_true",
                        dest="verbose")

    args = parser.parse_args()

    logging.basicConfig(level=logging.DEBUG if args.verbose else logging.ERROR)

    if args.create_config_file:  # autotorrent.conf
        if os.path.exists(args.create_config_file):
            parser.error("Target %r already exists, not creating" %
                         args.create_config_file)
        else:
            src = os.path.join(os.path.dirname(__file__),
                               'autotorrent.conf.dist')
            shutil.copy(src, args.create_config_file)
            print('Created configuration file %r' % args.create_config_file)

        client_config = {
            'client': 'rtorrent',
            'url': 'http://*****:*****@127.0.0.1/RPC2',
            'label': 'autotorrent',
        }

        if query_yes_no(
                'Do you want to try and auto-configure torrent client?'):
            working_clients = []
            for client_name, cls in TORRENT_CLIENTS.items():
                obj = cls.auto_config()
                try:
                    if obj.test_connection():
                        working_clients.append(obj)
                except:
                    continue

            if working_clients:
                print('Found %i clients - please choose a client to use' %
                      len(working_clients))
                for i, client in enumerate(working_clients, 1):
                    print('[%i] %s' % (i, client.identifier))
                print(
                    '[0] None of the above - do not auto-configure any client\n'
                )

                while True:
                    error = False
                    try:
                        choice = int(input('> '))
                    except ValueError:
                        error = True
                    else:
                        if len(working_clients) < choice or choice < 0:
                            error = True

                    if error:
                        print('Invalid choice, please choose again')
                    else:
                        if choice > 0:
                            client = working_clients[choice - 1]
                            print('Setting client to %s' % client.identifier)
                            client_config = client.get_config()
                            client_config['client'] = client.identifier

                        break
            else:
                print(
                    'Unable to auto-detect any clients, you will have to configure it manually.'
                )

        config = configparser.ConfigParser()
        config.read(args.create_config_file)
        for k, v in client_config.items():
            config.set('client', k, v)

        with open(args.create_config_file, 'w') as configfile:
            config.write(configfile)

        quit()

    if not os.path.isfile(args.config_file):
        parser.error("Config file not found %r" % args.config_file)

    config = configparser.ConfigParser()
    config.read(args.config_file)

    current_path = os.getcwd()
    os.chdir(os.path.dirname(os.path.abspath(
        args.config_file)))  # Changing directory to where the config file is.

    if not config.has_section('general'):
        parser.error('AutoTorrent is not properly configured, please edit %r' %
                     args.config_file)
        quit(1)

    disks = [disk for _, disk in config.items('disks')]

    scan_mode = set(config.get('general', 'scan_mode').split(','))

    exact_mode = 'exact' in scan_mode
    unsplitable_mode = 'unsplitable' in scan_mode
    normal_mode = 'normal' in scan_mode

    hash_name_mode = 'hash_name' in scan_mode
    hash_size_mode = 'hash_size' in scan_mode
    hash_slow_mode = 'hash_slow' in scan_mode

    db = Database(config.get('general', 'db'), disks,
                  config.get('general', 'ignore_files').split(','),
                  normal_mode, unsplitable_mode, exact_mode, hash_name_mode,
                  hash_size_mode, hash_slow_mode)

    client_option = 'client'
    if args.client != 'default':
        client_option += '-%s' % args.client

    try:
        client_name = config.get(client_option, 'client')
    except configparser.NoSectionError:
        print('It seems like %r is not a configured client' % args.client)
        quit(1)

    if client_name not in TORRENT_CLIENTS:
        print('Unknown client %r - Known clients are: %s' %
              (client_name, ', '.join(TORRENT_CLIENTS.keys())))
        quit(1)

    client_options = dict(config.items(client_option))
    client_options.pop('client')
    client = TORRENT_CLIENTS[client_name](**client_options)

    at = AutoTorrent(
        db,
        client,
        config.get('general', 'store_path'),
        config.getint('general', 'add_limit_size'),
        config.getfloat('general', 'add_limit_percent'),
        args.delete_torrents,
        (config.get('general', 'link_type') if config.has_option(
            'general', 'link_type') else 'soft'),
    )

    if args.test_connection:
        proxy_test_result = client.test_connection()
        if proxy_test_result:
            print('Connected to torrent client successfully!')
            print('  result: %s' % proxy_test_result)

    if isinstance(args.rebuild, list):
        if args.rebuild:
            print('Adding new folders to database')
            db.rebuild(args.rebuild)
            print('Added to database')
        else:
            print('Rebuilding database')
            db.rebuild()
            print('Database rebuilt')

    if args.addfile:
        dry_run = bool(args.dry_run)
        dry_run_data = []

        print('Found %s torrent(s)' % len(args.addfile))
        if not dry_run:
            at.populate_torrents_seeded()

        for torrent in args.addfile:
            result = at.handle_torrentfile(os.path.join(current_path, torrent),
                                           dry_run)
            if dry_run:
                dry_run_data.append({
                    'torrent': torrent,
                    'found_bytes': result[0],
                    'missing_bytes': result[1],
                    'would_add': not result[2],
                    'local_files': result[3],
                })

        if dry_run:
            if args.dry_run == 'json':
                print(json.dumps(dry_run_data))
            elif args.dry_run == 'txt':
                for torrent in dry_run_data:
                    print('Torrent: %s' % torrent['torrent'])
                    print(
                        ' Found data: %s - Missing data: %s - Would add: %s' %
                        (humanize_bytes(torrent['found_bytes']),
                         humanize_bytes(torrent['missing_bytes']),
                         torrent['would_add'] and 'Yes' or 'No'))
                    print(' Local files used:')
                    for f in torrent['local_files']:
                        print('  %s' % f)
                    print('')