diff --git a/lbry/extras/daemon/daemon.py b/lbry/extras/daemon/daemon.py index 195564c54b..003ea9cf77 100644 --- a/lbry/extras/daemon/daemon.py +++ b/lbry/extras/daemon/daemon.py @@ -37,7 +37,8 @@ from lbry.error import ( DownloadSDTimeoutError, ComponentsNotStartedError, ComponentStartConditionNotMetError, CommandDoesNotExistError, BaseError, WalletNotFoundError, WalletAlreadyLoadedError, WalletAlreadyExistsError, - ConflictingInputValueError, AlreadyPurchasedError, PrivateKeyNotFoundError, InputStringIsBlankError + ConflictingInputValueError, AlreadyPurchasedError, PrivateKeyNotFoundError, InputStringIsBlankError, + InputValueError ) from lbry.extras import system_info from lbry.extras.daemon import analytics @@ -3614,15 +3615,17 @@ async def jsonrpc_stream_update( ) if len(existing_claims) != 1: account_ids = ', '.join(f"'{account.id}'" for account in accounts) - # TODO: use error from lbry.error - raise Exception( + raise InputValueError( f"Can't find the stream '{claim_id}' in account(s) {account_ids}." ) + old_txo = existing_claims[0] - if not old_txo.claim.is_stream: - # TODO: use error from lbry.error - raise Exception( - f"A claim with id '{claim_id}' was found but it is not a stream claim." + if not old_txo.claim.is_stream and not old_txo.claim.is_repost: + # in principle it should work with any type of claim, but its safer to + # limit it to ones we know won't be broken. in the future we can expand + # this if we have a test case for e.g. channel or support claims + raise InputValueError( + f"A claim with id '{claim_id}' was found but it is not a stream or repost claim." ) if bid is not None: @@ -3653,28 +3656,32 @@ async def jsonrpc_stream_update( if replace: claim = Claim() - if old_txo.claim.stream.has_source: - claim.stream.message.source.CopyFrom( - old_txo.claim.stream.message.source - ) - stream_type = old_txo.claim.stream.stream_type - if stream_type: - old_stream_type = getattr(old_txo.claim.stream.message, stream_type) - new_stream_type = getattr(claim.stream.message, stream_type) - new_stream_type.CopyFrom(old_stream_type) - claim.stream.update(file_path=file_path, **kwargs) + if old_txo.claim.is_stream: + if old_txo.claim.stream.has_source: + claim.stream.message.source.CopyFrom( + old_txo.claim.stream.message.source + ) + stream_type = old_txo.claim.stream.stream_type + if stream_type: + old_stream_type = getattr(old_txo.claim.stream.message, stream_type) + new_stream_type = getattr(claim.stream.message, stream_type) + new_stream_type.CopyFrom(old_stream_type) else: claim = Claim.from_bytes(old_txo.claim.to_bytes()) + + if old_txo.claim.is_stream: claim.stream.update(file_path=file_path, **kwargs) + if clear_channel: claim.clear_signature() tx = await Transaction.claim_update( old_txo, claim, amount, claim_address, funding_accounts, funding_accounts[0], channel if not clear_channel else None ) + new_txo = tx.outputs[0] stream_hash = None - if not preview: + if not preview and old_txo.claim.is_stream: old_stream = self.file_manager.get_filtered(sd_hash=old_txo.claim.stream.source.sd_hash) old_stream = old_stream[0] if old_stream else None if file_path is not None: diff --git a/tests/integration/claims/test_claim_commands.py b/tests/integration/claims/test_claim_commands.py index b5aeefdd0d..5768863764 100644 --- a/tests/integration/claims/test_claim_commands.py +++ b/tests/integration/claims/test_claim_commands.py @@ -1499,6 +1499,11 @@ async def test_repost(self): self.assertEqual(resolved['@reposting-goodies/repost-on-channel'], search) self.assertEqual(resolved['newstuff-again']['reposted_claim']['name'], 'newstuff') + await self.stream_update(repost_id, bid='0.42') + searched_repost = (await self.claim_search(claim_id=repost_id))[0] + self.assertEqual(searched_repost['amount'], '0.42') + self.assertEqual(searched_repost['signing_channel']['claim_id'], spam_claim_id) + async def test_filtering_channels_for_removing_content(self): await self.channel_create('@some_channel', '0.1') await self.stream_create('good_content', '0.1', channel_name='@some_channel', tags=['good'])