forked from LBRYCommunity/lbry-sdk
refactor get_est_cost
-add size parameter, if provided the sd blob won’t be downloaded (can be used with size information from lighthouse) -check if blob was already downloaded before trying to download it again
This commit is contained in:
parent
f579c8dbb8
commit
d9e1e88c05
2 changed files with 62 additions and 29 deletions
|
@ -141,8 +141,8 @@ ENVIRONMENT = Env(
|
|||
reflector_port=(int, 5566),
|
||||
download_timeout=(int, 30),
|
||||
max_search_results=(int, 25),
|
||||
search_timeout=(float, 3.0),
|
||||
cache_time=(int, 150),
|
||||
search_timeout=(float, 5.0),
|
||||
host_ui=(bool, True),
|
||||
check_ui_requirements=(bool, True),
|
||||
local_ui_path=(bool, False),
|
||||
|
|
|
@ -17,6 +17,7 @@ from decimal import Decimal
|
|||
from twisted.web import server
|
||||
from twisted.internet import defer, threads, error, reactor, task
|
||||
from twisted.internet.task import LoopingCall
|
||||
from twisted.python.failure import Failure
|
||||
from txjsonrpc import jsonrpclib
|
||||
from jsonschema import ValidationError
|
||||
|
||||
|
@ -819,7 +820,8 @@ class Daemon(AuthJSONRPCServer):
|
|||
self.session = Session(results['default_data_payment_rate'], db_dir=self.db_dir, lbryid=self.lbryid,
|
||||
blob_dir=self.blobfile_dir, dht_node_port=self.dht_node_port,
|
||||
known_dht_nodes=conf.settings.known_dht_nodes, peer_port=self.peer_port,
|
||||
use_upnp=self.use_upnp, wallet=results['wallet'])
|
||||
use_upnp=self.use_upnp, wallet=results['wallet'],
|
||||
is_generous=conf.settings.is_generous_host)
|
||||
self.startup_status = STARTUP_STAGES[2]
|
||||
|
||||
dl = defer.DeferredList([d1, d2], fireOnOneErrback=True)
|
||||
|
@ -940,35 +942,60 @@ class Daemon(AuthJSONRPCServer):
|
|||
d.addCallback(lambda _: log.info("Delete lbry file"))
|
||||
return d
|
||||
|
||||
def _get_est_cost(self, name):
|
||||
def _check_est(d, name):
|
||||
try:
|
||||
if isinstance(d.result, float):
|
||||
log.info("Cost est for lbry://" + name + ": " + str(d.result) + "LBC")
|
||||
return defer.succeed(None)
|
||||
except AttributeError:
|
||||
pass
|
||||
log.info("Timeout estimating cost for lbry://" + name + ", using key fee")
|
||||
d.cancel()
|
||||
return defer.succeed(None)
|
||||
def _get_est_cost_from_name(self, name):
|
||||
d = self._resolve_name(name)
|
||||
d.addCallback(self._get_est_cost_from_metadata, name)
|
||||
return d
|
||||
|
||||
def _get_est_cost_from_metadata(self, metadata, name):
|
||||
d = self._get_est_cost_from_sd_hash(metadata['sources']['lbry_sd_hash'])
|
||||
|
||||
def _handle_err(err):
|
||||
if isinstance(err, Failure):
|
||||
log.warning("Timeout getting blob for cost est for lbry://%s, using only key fee", name)
|
||||
return 0.0
|
||||
raise err
|
||||
|
||||
d.addErrback(_handle_err)
|
||||
|
||||
def _add_key_fee(data_cost):
|
||||
d = self._resolve_name(name)
|
||||
d.addCallback(lambda info: self.exchange_rate_manager.to_lbc(info.get('fee', None)))
|
||||
d.addCallback(lambda fee: data_cost if fee is None else data_cost + fee.amount)
|
||||
fee = self.exchange_rate_manager.to_lbc(metadata.get('fee', None))
|
||||
return data_cost if fee is None else data_cost + fee.amount
|
||||
|
||||
d.addCallback(_add_key_fee)
|
||||
return d
|
||||
|
||||
d = self._resolve_name(name)
|
||||
d.addCallback(lambda info: info['sources']['lbry_sd_hash'])
|
||||
d.addCallback(lambda sd_hash: download_sd_blob(self.session, sd_hash,
|
||||
self.blob_request_payment_rate_manager))
|
||||
d.addCallback(self.sd_identifier.get_metadata_for_sd_blob)
|
||||
d.addCallback(lambda metadata: metadata.validator.info_to_show())
|
||||
d.addCallback(lambda info: int(dict(info)['stream_size']) / 1000000 * self.data_rate)
|
||||
d.addCallbacks(_add_key_fee, lambda _: _add_key_fee(0.0))
|
||||
reactor.callLater(self.search_timeout, _check_est, d, name)
|
||||
def _get_sd_blob(self, blob, sd_hash):
|
||||
if blob:
|
||||
return self.session.blob_manager.get_blob(blob[0], True)
|
||||
|
||||
def _check_est(downloader):
|
||||
if downloader.result is not None:
|
||||
downloader.cancel()
|
||||
|
||||
d = defer.succeed(None)
|
||||
reactor.callLater(self.search_timeout, _check_est, d)
|
||||
d.addCallback(lambda _: download_sd_blob(self.session, sd_hash, self.blob_request_payment_rate_manager))
|
||||
return d
|
||||
|
||||
def _get_size_from_sd_blob(self, sd_blob):
|
||||
d = self.sd_identifier.get_metadata_for_sd_blob(sd_blob)
|
||||
d.addCallback(lambda metadata: metadata.validator.info_to_show())
|
||||
d.addCallback(lambda info: int(dict(info)['stream_size']))
|
||||
return d
|
||||
|
||||
def _get_est_cost_from_sd_hash(self, sd_hash):
|
||||
d = self.session.blob_manager.completed_blobs([sd_hash])
|
||||
d.addCallback(self._get_sd_blob, sd_hash)
|
||||
d.addCallback(self._get_size_from_sd_blob)
|
||||
d.addCallback(self._get_est_cost_from_stream_size)
|
||||
return d
|
||||
|
||||
def _get_est_cost_from_stream_size(self, size):
|
||||
if self.session.payment_rate_manager.generous:
|
||||
return 0.0
|
||||
return size / (10**6) * conf.settings.data_rate
|
||||
|
||||
def _get_lbry_file_by_uri(self, name):
|
||||
def _get_file(stream_info):
|
||||
sd = stream_info['sources']['lbry_sd_hash']
|
||||
|
@ -1563,17 +1590,23 @@ class Daemon(AuthJSONRPCServer):
|
|||
|
||||
def jsonrpc_get_est_cost(self, p):
|
||||
"""
|
||||
Get estimated cost for a lbry uri
|
||||
Get estimated cost for a lbry stream
|
||||
|
||||
Args:
|
||||
'name': lbry uri
|
||||
'size': stream size, in bytes. if provided an sd blob won't be downloaded.
|
||||
Returns:
|
||||
estimated cost
|
||||
"""
|
||||
|
||||
name = p[FileID.NAME]
|
||||
if 'size' in p:
|
||||
size = p['size']
|
||||
d = defer.succeed(self._get_est_cost_from_stream_size(size))
|
||||
d.addCallback(lambda r: self._render_response(r, OK_CODE))
|
||||
return d
|
||||
|
||||
d = self._get_est_cost(name)
|
||||
name = p[FileID.NAME]
|
||||
d = self._get_est_cost_from_name(name)
|
||||
d.addCallback(lambda r: self._render_response(r, OK_CODE))
|
||||
return d
|
||||
|
||||
|
|
Loading…
Reference in a new issue