lbry-sdk/lbrynet/daemon/Publisher.py

82 lines
3.4 KiB
Python
Raw Normal View History

2018-10-16 21:04:20 +02:00
import asyncio
import logging
import mimetypes
import os
from lbrynet.file_manager.EncryptedFileCreator import create_lbry_file
2016-06-07 10:19:51 +02:00
2016-01-21 04:00:28 +01:00
log = logging.getLogger(__name__)
2018-10-16 21:04:20 +02:00
def d2f(d):
return d.asFuture(asyncio.get_event_loop())
class Publisher:
def __init__(self, account, blob_manager, payment_rate_manager, storage,
lbry_file_manager, wallet, certificate):
self.account = account
self.blob_manager = blob_manager
self.payment_rate_manager = payment_rate_manager
self.storage = storage
2016-01-21 04:00:28 +01:00
self.lbry_file_manager = lbry_file_manager
self.wallet = wallet
2018-07-12 05:18:59 +02:00
self.certificate = certificate
2016-01-21 04:00:28 +01:00
self.lbry_file = None
2018-10-16 21:04:20 +02:00
async def create_and_publish_stream(self, name, bid, claim_dict, file_path, holding_address=None):
2017-04-25 20:23:05 +02:00
"""Create lbry file and make claim"""
2016-08-11 02:04:03 +02:00
log.info('Starting publish for %s', name)
if not os.path.isfile(file_path):
raise Exception(f"File {file_path} not found")
if os.path.getsize(file_path) == 0:
raise Exception(f"Cannot publish empty file {file_path}")
file_name = os.path.basename(file_path)
2018-07-28 03:35:01 +02:00
with open(file_path, 'rb') as read_handle:
2018-10-16 21:04:20 +02:00
self.lbry_file = await d2f(create_lbry_file(
2018-08-03 15:36:03 +02:00
self.blob_manager, self.storage, self.payment_rate_manager, self.lbry_file_manager, file_name,
read_handle
2018-10-16 21:04:20 +02:00
))
2018-02-12 20:13:30 +01:00
2017-04-03 21:58:20 +02:00
if 'source' not in claim_dict['stream']:
claim_dict['stream']['source'] = {}
2018-02-12 20:13:30 +01:00
claim_dict['stream']['source']['source'] = self.lbry_file.sd_hash
2017-04-03 21:58:20 +02:00
claim_dict['stream']['source']['sourceType'] = 'lbry_sd_hash'
claim_dict['stream']['source']['contentType'] = get_content_type(file_path)
2018-01-05 03:28:09 +01:00
claim_dict['stream']['source']['version'] = "_0_0_1" # need current version here
2018-10-16 21:04:20 +02:00
tx = await self.wallet.claim_name(
self.account, name, bid, claim_dict, self.certificate, holding_address
)
2018-02-27 22:21:37 +01:00
# check if we have a file already for this claim (if this is a publish update with a new stream)
2018-10-16 21:04:20 +02:00
old_stream_hashes = await d2f(self.storage.get_old_stream_hashes_for_claim_id(
tx.outputs[0].claim_id, self.lbry_file.stream_hash
2018-10-16 21:04:20 +02:00
))
2018-02-27 22:21:37 +01:00
if old_stream_hashes:
2018-02-28 20:59:12 +01:00
for lbry_file in filter(lambda l: l.stream_hash in old_stream_hashes,
list(self.lbry_file_manager.lbry_files)):
2018-10-16 21:04:20 +02:00
await d2f(self.lbry_file_manager.delete_lbry_file(lbry_file, delete_file=False))
2018-02-28 20:59:12 +01:00
log.info("Removed old stream for claim update: %s", lbry_file.stream_hash)
2018-02-27 22:21:37 +01:00
2018-10-16 21:04:20 +02:00
await d2f(self.storage.save_content_claim(
self.lbry_file.stream_hash, tx.outputs[0].id
2018-10-16 21:04:20 +02:00
))
return tx
2018-10-16 21:04:20 +02:00
async def publish_stream(self, name, bid, claim_dict, stream_hash, holding_address=None):
2017-04-25 20:23:05 +02:00
"""Make a claim without creating a lbry file"""
2018-10-16 21:04:20 +02:00
tx = await self.wallet.claim_name(
self.account, name, bid, claim_dict, self.certificate, holding_address
)
if stream_hash: # the stream_hash returned from the db will be None if this isn't a stream we have
2018-10-16 21:04:20 +02:00
await d2f(self.storage.save_content_claim(
stream_hash, tx.outputs[0].id
2018-10-16 21:04:20 +02:00
))
self.lbry_file = [f for f in self.lbry_file_manager.lbry_files if f.stream_hash == stream_hash][0]
2018-10-16 21:04:20 +02:00
return tx
2016-08-11 02:04:03 +02:00
def get_content_type(filename):
return mimetypes.guess_type(filename)[0] or 'application/octet-stream'