lbry-sdk/scripts/download_blob_from_peer.py

99 lines
3.2 KiB
Python
Raw Normal View History

"""A simple script that attempts to directly download a single blob or stream from a given peer"""
2016-12-16 20:35:33 +01:00
import argparse
import logging
import sys
import tempfile
import time
import shutil
from pprint import pprint
2016-12-16 20:35:33 +01:00
from twisted.internet import defer, reactor, threads
2016-12-16 20:35:33 +01:00
from lbrynet import conf
from lbrynet.core import log_support, Wallet, Peer
from lbrynet.core.SinglePeerDownloader import SinglePeerDownloader
from lbrynet.core.StreamDescriptor import BlobStreamDescriptorReader
from lbrynet.core.BlobManager import DiskBlobManager
2018-05-02 19:23:57 +02:00
from lbrynet.database.storage import SQLiteStorage
2016-12-16 20:35:33 +01:00
log = logging.getLogger()
def main(args=None):
2017-01-18 00:11:14 +01:00
conf.initialize_settings()
2016-12-16 20:35:33 +01:00
parser = argparse.ArgumentParser()
parser.add_argument('peer')
parser.add_argument('blob_hash')
parser.add_argument('--timeout', type=int, default=30)
2016-12-16 20:35:33 +01:00
args = parser.parse_args(args)
log_support.configure_console(level='DEBUG')
log_support.configure_twisted()
2016-12-16 20:35:33 +01:00
if ":" in str(args.peer):
host, port = str(args.peer).strip().split(":")
2016-12-16 20:35:33 +01:00
else:
host = args.peer
port = 3333
2016-12-16 20:35:33 +01:00
d = download_it(Peer.Peer(host, int(port)), args.timeout, args.blob_hash)
d.addErrback(log.exception)
d.addBoth(lambda _: reactor.callLater(0, reactor.stop))
reactor.run()
2016-12-16 20:35:33 +01:00
@defer.inlineCallbacks
def download_it(peer, timeout, blob_hash):
tmp_dir = yield threads.deferToThread(tempfile.mkdtemp)
2018-05-02 19:23:57 +02:00
storage = SQLiteStorage(tmp_dir, reactor)
yield storage.setup()
tmp_blob_manager = DiskBlobManager(tmp_dir, storage)
2016-12-16 20:35:33 +01:00
config = {'auto_connect': True}
2017-01-17 04:23:20 +01:00
if conf.settings['lbryum_wallet_dir']:
config['lbryum_path'] = conf.settings['lbryum_wallet_dir']
wallet = Wallet.LBRYumWallet(storage, config)
downloader = SinglePeerDownloader()
downloader.setup(wallet)
try:
blob_downloaded = yield downloader.download_blob_from_peer(peer, timeout, blob_hash,
tmp_blob_manager)
if blob_downloaded:
log.info("SUCCESS!")
blob = yield tmp_blob_manager.get_blob(blob_hash)
pprint(blob)
if not blob.verified:
log.error("except that its not verified....")
else:
reader = BlobStreamDescriptorReader(blob)
info = None
for x in range(0, 3):
try:
info = yield reader.get_info()
except ValueError:
pass
if info:
break
2018-05-02 19:23:57 +02:00
# there's some kind of race condition where it sometimes doesnt write the blob to disk in time
time.sleep(0.1)
if info is not None:
pprint(info)
for content_blob in info['blobs']:
if 'blob_hash' in content_blob:
yield download_it(peer, timeout, content_blob['blob_hash'])
2016-12-16 20:35:33 +01:00
else:
log.error("Download failed")
finally:
yield tmp_blob_manager.stop()
yield threads.deferToThread(shutil.rmtree, tmp_dir)
2016-12-16 20:35:33 +01:00
defer.returnValue(True)
2016-12-16 20:35:33 +01:00
if __name__ == '__main__':
sys.exit(main())