diff --git a/lbry/lbry/schema/claim.py b/lbry/lbry/schema/claim.py index 2a8033333..ef507dbf8 100644 --- a/lbry/lbry/schema/claim.py +++ b/lbry/lbry/schema/claim.py @@ -179,6 +179,9 @@ class BaseClaim: def locations(self) -> LocationList: return LocationList(self.claim.message.locations) + def __delitem__(self, key): + self.message.ClearField(key) + class Stream(BaseClaim): @@ -214,6 +217,12 @@ class Stream(BaseClaim): kwargs.pop('fee_amount', None) ) + source_stream_type = None + if self.source.name: + _, source_stream_type = guess_media_type(self.source.name) + elif self.source.media_type: + source_stream_type = guess_stream_type(self.source.media_type) + if 'sd_hash' in kwargs: self.source.sd_hash = kwargs.pop('sd_hash') if 'file_name' in kwargs: @@ -232,6 +241,9 @@ class Stream(BaseClaim): if 'file_size' in kwargs: self.source.size = kwargs.pop('file_size') + if source_stream_type in ('image', 'video', 'audio') and stream_type != source_stream_type: + del self[source_stream_type] + if stream_type in ('image', 'video', 'audio'): media = getattr(self, stream_type) media_args = {'file_metadata': None} diff --git a/lbry/tests/integration/test_claim_commands.py b/lbry/tests/integration/test_claim_commands.py index 2a0e05736..4908931f0 100644 --- a/lbry/tests/integration/test_claim_commands.py +++ b/lbry/tests/integration/test_claim_commands.py @@ -49,6 +49,24 @@ class ClaimTestCase(CommandTestCase): await self.on_transaction_dict(tx) return tx + async def update_stream_to_image_type(self, claim_id, confirm=True): + with tempfile.NamedTemporaryFile(suffix='.png') as file: + file.write(unhexlify( + b'89504e470d0a1a0a0000000d49484452000000050000000708020000004fc' + b'510b9000000097048597300000b1300000b1301009a9c1800000015494441' + b'5408d763fcffff3f031260624005d4e603004c45030b5286e9ea000000004' + b'9454e44ae426082' + )) + file.flush() + tx = await self.out(self.daemon.jsonrpc_stream_update( + claim_id, file_path=file.name + )) + if confirm: + await self.on_transaction_dict(tx) + await self.generate(1) + await self.on_transaction_dict(tx) + return tx + async def video_stream_create(self, name='chrome', bid='1.0', confirm=True): tx = await self.out( self.daemon.jsonrpc_stream_create( @@ -989,6 +1007,30 @@ class StreamCommands(ClaimTestCase): } ) + async def test_update_file_type(self): + video_txo = (await self.video_stream_create())['outputs'][0] + claim_id = video_txo['claim_id'] + self.assertEqual(video_txo['value']['stream_type'], 'video') + self.assertEqual(video_txo['value']['source']['media_type'], 'video/mp4') + self.assertEqual( + video_txo['value']['video'], { + 'duration': 15, + 'height': 720, + 'width': 1280 + } + ) + + image_txo = (await self.update_stream_to_image_type(claim_id))['outputs'][0] + self.assertEqual(image_txo['value']['stream_type'], 'image') + self.assertEqual(image_txo['value']['source']['media_type'], 'image/png') + self.assertEqual( + image_txo['value']['image'], { + 'height': 7, + 'width': 5 + } + ) + self.assertFalse('video' in image_txo['value']) + async def test_replace_mode_preserves_source_and_type(self): expected = { 'tags': ['blah'],