import json
import logging
import os
import random
from argparse import ArgumentParser
import humanize
import requests
from bitween.log import setup_logging
setup_logging()
logger = logging.getLogger(__name__)
[docs]class BitweenClient:
def __init__(self, host, port):
self.host = host
self.port = port
[docs] def post(self, method, params=None):
"""
post data to run methods
.. code-block:: json
POST /api
{
"date": "Wed, 04 May 2016 11:00:06 GMT",
"server": "Werkzeug/0.11.5 Python/2.7.6",
"content-length": "90",
"content-type": "application/json",
"data": {
"jsonrpc": "2.0",
"method": "Api.exit",
"params": [],
"id": "e998df3f-523b-4533-915f-99bc2936f1bf"
}
}
:param method:
:param params:
:return:
"""
if params is None:
params = []
data = {"jsonrpc": "2.0",
"method": method,
"params": params,
"id": "%s" % random.randint(1000, 9999)}
ret = requests.post("http://%s:%s/api" % (self.host, self.port), data=json.dumps(data))
return ret
[docs] def exit(self):
method = "Api.exit"
print(self.post(method))
[docs] def list(self):
hashes = {}
method = "Api.get_all_torrents"
contacts = self.post(method).json()['result']
# print(contacts)
for contact in contacts:
for resource in contacts[contact]:
for hash, val_dict in contacts[contact][resource]['shares'].iteritems():
c = hashes.get(hash, {'contacts': []}).get('contacts')
c.append('%s/%s' % (contact, resource))
hashes[hash] = {'name': val_dict['name'],
'size': val_dict['size'],
'contacts': c}
# print(json.dumps(hashes, indent=2))
for h, v in hashes.iteritems():
print("%s - %s - %s \n-- %s" % (h, humanize.naturalsize(v['size']), v['name'], ', '.join(v['contacts'])))
[docs] def add_hash(self, hash, dest=None):
import os
if not dest:
dest = json.load(open('conf.json'))['save_path']
method = "bt.add_torrent_by_hash"
params = {
"hash": hash,
"save_path": os.path.abspath(dest)
}
print(self.post(method, params))
[docs] def add_path(self, path):
method = "bt.add_path"
params = {
"path": path
}
print(self.post(method, params))
[docs]def main(args=None):
parser = ArgumentParser()
parser.add_argument("-p", "--port", default=5000)
parser.add_argument("-b", "--bind", default='localhost')
parser.add_argument("--exit", default=False, action='store_true')
parser.add_argument("--list", default=False, action='store_true')
parser.add_argument("--add_hash")
parser.add_argument("--dest")
parser.add_argument("--add_path")
parser.add_argument("--debug", default=False, action='store_true')
args = parser.parse_args()
bc = BitweenClient(args.bind, args.port)
if args.exit:
bc.exit()
elif args.list:
bc.list()
elif args.add_hash:
if not args.dest:
bc.add_hash(args.add_hash)
else:
bc.add_hash(args.add_hash, args.dest)
elif args.add_path:
print('adding %s' % os.path.abspath(args.add_path))
bc.add_path(args.add_path)
if __name__ == '__main__':
main()