#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys import argparse import os import subprocess if not __file__: __file__ = '/home/e/.scripts/downloader.py' dir_path = os.path.dirname(os.path.realpath(__file__)) aria2_args_index = ['local proxy', 'local no proxy', 'router proxy', 'router no proxy', 'remote proxy', 'remote no proxy'] aria2_args = {'local proxy': {'server': 'localhost', 'port': 6800, 'secret': 'you_aria2rpc_token', 'all-proxy': '127.0.0.1:8118'}, 'local no proxy': {'server': 'localhost', 'port': 6800, 'secret': 'you_aria2rpc_token', 'all-proxy': ''}, 'router proxy': {'server': 'your.router.address', 'port': 6800, 'secret': 'you_aria2rpc_token', 'all-proxy': '127.0.0.1:8118'}, 'router no proxy': {'server': 'your.router.address', 'port': 6800, 'secret': 'you_aria2rpc_token', 'all-proxy': ''}, 'remote proxy': {'server': 'your.server.address', 'port': 6800, 'secret': 'you_aria2rpc_token', 'all-proxy': '127.0.0.1:8118'}, 'remote no proxy': {'server': 'your.server.address', 'port': 6800, 'secret': 'you_aria2rpc_token', 'all-proxy': ''}, } def parse_args(): parser = argparse.ArgumentParser(description='downloader wrapper') parser.add_argument('url', metavar='url', help='url to download') parser.add_argument('-b', '--backend', help='backend downloader', default='aria2') parser.add_argument('--bo', '--backend-option', help='backend option', dest='backend_option', type=int, default=0) parser.add_argument('--comment', help='comment',) parser.add_argument('--referer', help='referer URL',) parser.add_argument('--cookie', help='cookie',) parser.add_argument('--folder', help='download folder',) parser.add_argument('--fname', help='file name',) parser.add_argument('--headers', help='HTTP headers',) parser.add_argument('--post', help='post data',) parser.add_argument('--rawpost', help='raw post data',) parser.add_argument('--ulist', help='URL list',) parser.add_argument('--ufile', help='URL file',) parser.add_argument('--cfile', help='cookies file',) parser.add_argument('--userpass', help='HTTP username password',) parser.add_argument('--ua', help='Useragent',) # test_args = ["--backend-option", "5", "--comment", "GET", "--referer", "http://libgen.io/ads.php?md5=A1E5BB7E56CAB2135BC9CE4424445203", "--cookie", "lg_topic=libgen;, libgen_get_key=IN9KIT57EFA3HMG9;, ", "--folder", "/home/e/Downloads", "--ulist", "http://libgen.io/get.php?md5=A1E5BB7E56CAB2135BC9CE4424445203&key=IN9KIT57EFA3HMG9", "--ufile", "/tmp/flashgot.im0nx8ya.default/flashgot-5.fgt", "--cfile", "/tmp/flashgot.im0nx8ya.default/cookies-5", "--ua", "Mozilla/5.0, (X11;, Linux, x86_64;, rv:52.9), Gecko/20100101, Goanna/3.4, Firefox/52.9, PaleMoon/27.6.1", "http://libgen.io/get.php?md5=A1E5BB7E56CAB2135BC9CE4424445203&key=IN9KIT57EFA3HMG9"] # flashgot options -b aria2 --bo 2 [--comment COMMENT] [--referer REFERER] [--cookie COOKIE] [--folder FOLDER] [--fname FNAME] [--headers HEADERS] [--post POST] [--rawpost RAWPOST] [--ulist ULIST] [--ufile UFILE] [--cfile CFILE] [--userpass USERPASS] [--ua UA] [URL] args = vars(parser.parse_args()) return args class Downloader: name = '' exec_prefix = [] args_translation = {} # translate arguments into the form program understands default_args = {} # additional options special_args = {} # arguments whose value needs to process def __init__(self, args): self.exec_args = [] def __repr__(self): command = self.exec_prefix + self.exec_args return ' '.join('"' + str(i) + '"' for i in command) def process_args(self, args): args = {key: args[key] for key in args if args[key] != None} special_args = {key: args[key] for key in args if key in self.special_args} args = {key: args[key] for key in args if key not in special_args} merged_args = {} if args and self.args_translation: for key in args.keys(): if key in self.args_translation.keys(): if self.args_translation[key]: merged_args[self.args_translation[key]] = args[key] else: merged_args[key] = args[key] args = self.default_args.copy() args.update(merged_args) for key in args.keys(): if len(key) == 1: self.exec_args.append('-' + key) self.exec_args.append(str(args[key])) else: self.exec_args.append('--' + key) self.exec_args.append(str(args[key])) if special_args: pass # TODO def exec(self): subprocess.call(self.exec_prefix + self.exec_args) class Aria2rpc(Downloader): name = 'aria2rpc' exec_prefix = [os.path.join(dir_path, 'aria2rpc.rb'), 'addUri'] args_translation = {'comment': None, 'folder': None, 'ua': 'user-agent', 'fname': 'out', 'headers': 'header', 'post': None, 'rawpost': None, 'ulist': None, 'ufile': None, 'cfile': None, } special_args = {'cookie': ''} def __init__(self, args, default_args = aria2_args['local proxy']): self.default_args = default_args self.exec_args = [] url = args['url'] del args['url'] self.process_args(args) self.exec_args.append(url) def main(): args = parse_args() if args['backend'] == 'aria2': del args['backend'] default_args = aria2_args[aria2_args_index[args['backend_option']]] del args['backend_option'] aria2rpc = Aria2rpc(args, default_args) aria2rpc.exec() print(aria2rpc) main()