From 8994326634b686efa7fd4a02f377e207d7c571a0 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Tue, 15 May 2018 22:00:59 +0200 Subject: [PATCH] See #195: expose bitrate, duration and size in AP audio representations --- api/funkwhale_api/federation/factories.py | 3 +++ api/funkwhale_api/federation/models.py | 3 +++ api/funkwhale_api/federation/serializers.py | 9 +++++++++ api/tests/federation/test_serializers.py | 13 ++++++++++++- 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/api/funkwhale_api/federation/factories.py b/api/funkwhale_api/federation/factories.py index 0754c4b2f..891609cba 100644 --- a/api/funkwhale_api/federation/factories.py +++ b/api/funkwhale_api/federation/factories.py @@ -233,6 +233,9 @@ class AudioMetadataFactory(factory.Factory): release = factory.LazyAttribute( lambda o: 'https://musicbrainz.org/release/{}'.format(uuid.uuid4()) ) + bitrate = 42 + length = 43 + size = 44 class Meta: model = dict diff --git a/api/funkwhale_api/federation/models.py b/api/funkwhale_api/federation/models.py index d91a00c8b..69d0ea925 100644 --- a/api/funkwhale_api/federation/models.py +++ b/api/funkwhale_api/federation/models.py @@ -216,3 +216,6 @@ class LibraryTrack(models.Model): for chunk in r.iter_content(chunk_size=512): tmp_file.write(chunk) self.audio_file.save(filename, tmp_file) + + def get_metadata(self, key): + return self.metadata.get(key) diff --git a/api/funkwhale_api/federation/serializers.py b/api/funkwhale_api/federation/serializers.py index 426aabd77..8d3dd6379 100644 --- a/api/funkwhale_api/federation/serializers.py +++ b/api/funkwhale_api/federation/serializers.py @@ -688,6 +688,12 @@ class AudioMetadataSerializer(serializers.Serializer): artist = ArtistMetadataSerializer() release = ReleaseMetadataSerializer() recording = RecordingMetadataSerializer() + bitrate = serializers.IntegerField( + required=False, allow_null=True, min_value=0) + size = serializers.IntegerField( + required=False, allow_null=True, min_value=0) + length = serializers.IntegerField( + required=False, allow_null=True, min_value=0) class AudioSerializer(serializers.Serializer): @@ -760,6 +766,9 @@ class AudioSerializer(serializers.Serializer): 'musicbrainz_id': str(track.mbid) if track.mbid else None, 'title': track.title, }, + 'bitrate': instance.bitrate, + 'size': instance.size, + 'length': instance.duration, }, 'url': { 'href': utils.full_url(instance.path), diff --git a/api/tests/federation/test_serializers.py b/api/tests/federation/test_serializers.py index 85208fa49..f298c61f5 100644 --- a/api/tests/federation/test_serializers.py +++ b/api/tests/federation/test_serializers.py @@ -533,7 +533,12 @@ def test_activity_pub_audio_serializer_to_library_track_no_duplicate( def test_activity_pub_audio_serializer_to_ap(factories): - tf = factories['music.TrackFile'](mimetype='audio/mp3') + tf = factories['music.TrackFile']( + mimetype='audio/mp3', + bitrate=42, + duration=43, + size=44, + ) library = actors.SYSTEM_ACTORS['library'].get_actor_instance() expected = { '@context': serializers.AP_CONTEXT, @@ -555,6 +560,9 @@ def test_activity_pub_audio_serializer_to_ap(factories): 'musicbrainz_id': tf.track.mbid, 'title': tf.track.title, }, + 'size': tf.size, + 'length': tf.duration, + 'bitrate': tf.bitrate, }, 'url': { 'href': utils.full_url(tf.path), @@ -599,6 +607,9 @@ def test_activity_pub_audio_serializer_to_ap_no_mbid(factories): 'title': tf.track.title, 'musicbrainz_id': None, }, + 'size': None, + 'length': None, + 'bitrate': None, }, 'url': { 'href': utils.full_url(tf.path),