├── .gitignore ├── aria2rpc.go ├── aria2rpc.py ├── example.png └── readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | !*.go 4 | !*.md 5 | !*.py 6 | !example.png 7 | -------------------------------------------------------------------------------- /aria2rpc.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | "encoding/json" 6 | "flag" 7 | "fmt" 8 | "io/ioutil" 9 | "log" 10 | "net/http" 11 | "os" 12 | "path" 13 | ) 14 | 15 | var rpc = flag.String("rpc", "http://127.0.0.1:6800/jsonrpc", "Aria2 RPC server address") 16 | var cookie = flag.String("cookie", "", "set cookies in HTTP header") 17 | var dir = flag.String("dir", "", "Saved dest directory (server side)") 18 | var out = flag.String("out", "", "Saved output file name") 19 | var split = flag.Int("split", 15, "One file N connections") 20 | var server = flag.Int("server", 15, "One server N connections") 21 | var referer = flag.String("referer", "", "Set referer") 22 | var secret = flag.String("secret", "", "Set token for authorization") 23 | var user = flag.String("user", "", "Set user name[DEPRECATED]") 24 | var pw = flag.String("passwd", "", "Set password[DEPRECATED]") 25 | var ua = flag.String("ua", "Mozilla/5.0 (X11; Linux; rv:5.0) Gecko/5.0 Firefox/5.0", "Set user-agent in HTTP header") 26 | var host = flag.String("host", "", "Set host address in HTTP header") 27 | 28 | // var session = flag.String("session-dir", "", "Directory for session file (server side)") 29 | 30 | func init() { 31 | flag.Usage = func() { 32 | fmt.Fprintf(os.Stderr, 33 | fmt.Sprintf("%s [options] URLs ...\n", path.Base(os.Args[0]))) 34 | flag.PrintDefaults() 35 | } 36 | flag.Parse() 37 | } 38 | 39 | func main() { 40 | URIs := flag.Args() 41 | if len(URIs) == 0 { 42 | flag.PrintDefaults() 43 | os.Exit(0) 44 | } 45 | params := makeParamsArry(URIs) 46 | 47 | jsonreq, err := makeJsonStruct(params) 48 | if err != nil { 49 | log.Fatal(err) 50 | } 51 | // fmt.Println(string(jsonreq)) 52 | os.Stdout.Write(addTask(*rpc, jsonreq)) 53 | os.Stdout.Write([]byte{'\n'}) 54 | } 55 | 56 | func makeParamsArry(uris []string) []interface{} { 57 | 58 | output := make([]interface{}, 0, 2) 59 | 60 | if *secret != "" { 61 | output = append(output, "token:"+*secret) 62 | } 63 | 64 | output = append(output, uris) 65 | 66 | opts := make(map[string]interface{}, 11) 67 | if *dir != "" { 68 | opts["dir"] = *dir 69 | } 70 | if *out != "" { 71 | opts["out"] = *out 72 | // if *session != "" { 73 | // opts["save-session"] = filepath.Join(*session, *out+".session") 74 | // } 75 | } 76 | 77 | header := make([]string, 0, 1) 78 | if *cookie != "" { 79 | header = append(header, fmt.Sprintf("Cookie: %s", *cookie)) 80 | } 81 | if *host != "" { 82 | header = append(header, fmt.Sprintf("Host: %s", *host)) 83 | } 84 | opts["header"] = header 85 | 86 | if *referer != "" { 87 | opts["referer"] = *referer 88 | } 89 | 90 | if *secret != "" { 91 | opts["rpc-secret"] = secret 92 | } else if *user != "" && *pw != "" { 93 | opts["rpc-user"] = user 94 | opts["rpc-passwd"] = pw 95 | } 96 | 97 | opts["continue"] = "true" 98 | opts["max-connection-per-server"] = *server 99 | opts["split"] = *split 100 | opts["min-split-size"] = "5M" 101 | opts["user-agent"] = *ua 102 | 103 | output = append(output, opts) 104 | 105 | return output 106 | } 107 | 108 | func makeJsonStruct(params []interface{}) ([]byte, error) { 109 | output := make(map[string]interface{}, 4) 110 | output["jsonrpc"] = "2.0" 111 | output["id"] = "meoow/aria2rpc" 112 | output["method"] = "aria2.addUri" 113 | output["params"] = params 114 | return json.Marshal(output) 115 | } 116 | 117 | func addTask(url string, json []byte) []byte { 118 | body := bytes.NewReader(json) 119 | resp, err := http.Post(*rpc, "text/plain", body) 120 | if err != nil { 121 | log.Fatal(err) 122 | } 123 | defer resp.Body.Close() 124 | 125 | result, _ := ioutil.ReadAll(resp.Body) 126 | 127 | return result 128 | } 129 | -------------------------------------------------------------------------------- /aria2rpc.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import json, urllib2, sys, os 4 | from argparse import ArgumentParser 5 | from collections import defaultdict 6 | 7 | parser = ArgumentParser() 8 | parser.add_argument('-c', '--cookie', help='use cookies', type=str, 9 | default='', metavar='COOKIES', dest='cookies') 10 | parser.add_argument('-o', '--output', help='output name', type=str, 11 | default='', metavar='NAME', dest='output') 12 | parser.add_argument('-d', '--dir', help='dest dir (server side)', type=str, 13 | default='', metavar='DIR', dest='dir') 14 | parser.add_argument('-R', '--rpc', 15 | help='aria2 rpc (http://localhost:6800/jsonroc)', 16 | type=str, default='http://127.0.0.1:6800/jsonrpc', 17 | metavar='URL', dest='rpc') 18 | parser.add_argument('-s', '--secret', dest='secret', default='', metavar='TOKEN', help='token') 19 | parser.add_argument('-u', '--user', dest='user', default='', metavar='USER', help='user name (deprecated)') 20 | parser.add_argument('-p', '--passwd', dest='pw', default='', metavar='PASSWD', help='password (deprecated)') 21 | parser.add_argument('-r', '--referer', help='referer', default='', type=str, 22 | metavar='URL', dest='referer') 23 | parser.add_argument('-H', '--host', dest='host', default='') 24 | parser.add_argument('URIs', nargs='+', help='URIs', type=str, 25 | default='', metavar='URI') 26 | opts = parser.parse_args() 27 | 28 | jsondict = {'jsonrpc':'2.0', 29 | 'id':'meoow/aria2rpc', 30 | 'method':'aria2.addUri'} 31 | 32 | jsondict['params'] = [] 33 | if opts.secret: 34 | jsondict['params'].append('token:{0}'.format(opts.secret)) 35 | jsondict['params'].append(opts.URIs) 36 | 37 | aria2optsDefault={ 38 | 'continue' :'true', 39 | 'max-connection-per-server' :15, 40 | 'split' :15, 41 | 'min-split-size' :'10M', 42 | 'user-agent':'Mozilla/5.0 (X11; Linux; rv:5.0) Gecko/5.0 Firefox/5.0'} 43 | 44 | aria2opts = defaultdict(lambda:[]) 45 | aria2opts.update(aria2optsDefault) 46 | 47 | if opts.output: 48 | aria2opts['out'] = opts.output 49 | if opts.dir: 50 | aria2opts['dir'] = opts.dir 51 | if opts.referer: 52 | aria2opts['referer'] = opts.referer 53 | if opts.cookies: 54 | aria2opts['header'].append('Cookie: {0}'.format(opts.cookies)) 55 | if opts.host: 56 | aria2opts['header'].append('Host: {0}'.format(opts.host)) 57 | if opts.secret: 58 | aria2opts['rpc-secret'] = opts.secret 59 | 60 | if not opts.secret and opts.user and opts.passwd: 61 | aria2opts['rpc-user'] = opts.user 62 | aria2opts['rpc-passwd'] = opts.pw 63 | 64 | jsondict['params'].append(aria2opts) 65 | 66 | jsonreq = json.dumps(jsondict) 67 | #print jsonreq 68 | 69 | print urllib2.urlopen(opts.rpc, jsonreq).read() 70 | -------------------------------------------------------------------------------- /example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meoow/aria2rpc/0c8e2ffbbea496415d418238e94d8c118a5c09ed/example.png -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Add Downloading Tasks through Aria2 RPC 2 | 3 | 4 | A CLI tool for adding downloading tasks to Aria2 through RPC. 5 | Useful for **Firefox** extensions like **Flashgot** who can customize download utilities. 6 | 7 | Implemented in both **Go** and **Python**, choose which you like. 8 | Note that aria2 comes with its own script (at *doc/xmlrpc/aria2rpc* under the source file tree of aria2) which implemented the full XML-RPC APIs in **Ruby**, you might check on that if you need more than just adding download links. 9 | 10 | ![Example](example.png) 11 | 12 | Argument Example: 13 | 14 | ```sh 15 | aria2rpc -cookie 'id=xxx; name=yyy;' \ 16 | -dir /path/to/dest -out filename \ 17 | -rpc http://127.0.0.1:6800/jsonrpc \ 18 | http://example.org/file.zip 19 | ``` 20 | --------------------------------------------------------------------------------