mirror of
https://code.eliotberriot.com/funkwhale/funkwhale.git
synced 2025-10-06 07:09:56 +02:00
Now store remote library tracks in a dedicated model, this is much simpler
This commit is contained in:
parent
f273faf9de
commit
b29ca44797
17 changed files with 555 additions and 394 deletions
|
@ -1,10 +1,13 @@
|
|||
import arrow
|
||||
|
||||
from django.urls import reverse
|
||||
from django.core.paginator import Paginator
|
||||
|
||||
from funkwhale_api.federation import actors
|
||||
from funkwhale_api.federation import keys
|
||||
from funkwhale_api.federation import models
|
||||
from funkwhale_api.federation import serializers
|
||||
from funkwhale_api.music.serializers import AudioSerializer
|
||||
from funkwhale_api.federation import utils
|
||||
|
||||
|
||||
def test_actor_serializer_from_ap(db):
|
||||
|
@ -174,7 +177,7 @@ def test_paginated_collection_serializer(factories):
|
|||
conf = {
|
||||
'id': 'https://test.federation/test',
|
||||
'items': tfs,
|
||||
'item_serializer': AudioSerializer,
|
||||
'item_serializer': serializers.AudioSerializer,
|
||||
'actor': actor,
|
||||
'page_size': 2,
|
||||
}
|
||||
|
@ -204,7 +207,7 @@ def test_collection_page_serializer(factories):
|
|||
|
||||
conf = {
|
||||
'id': 'https://test.federation/test',
|
||||
'item_serializer': AudioSerializer,
|
||||
'item_serializer': serializers.AudioSerializer,
|
||||
'actor': actor,
|
||||
'page': Paginator(tfs, 2).page(2),
|
||||
}
|
||||
|
@ -235,3 +238,140 @@ def test_collection_page_serializer(factories):
|
|||
serializer = serializers.CollectionPageSerializer(conf)
|
||||
|
||||
assert serializer.data == expected
|
||||
|
||||
|
||||
def test_activity_pub_audio_serializer_to_library_track(factories):
|
||||
remote_library = factories['federation.Library']()
|
||||
audio = factories['federation.Audio']()
|
||||
serializer = serializers.AudioSerializer(
|
||||
data=audio, context={'library': remote_library})
|
||||
|
||||
assert serializer.is_valid(raise_exception=True)
|
||||
|
||||
lt = serializer.save()
|
||||
|
||||
assert lt.pk is not None
|
||||
assert lt.url == audio['id']
|
||||
assert lt.library == remote_library
|
||||
assert lt.audio_url == audio['url']['href']
|
||||
assert lt.audio_mimetype == audio['url']['mediaType']
|
||||
assert lt.metadata == audio['metadata']
|
||||
assert lt.title == audio['metadata']['recording']['title']
|
||||
assert lt.artist_name == audio['metadata']['artist']['name']
|
||||
assert lt.album_title == audio['metadata']['release']['title']
|
||||
assert lt.published_date == arrow.get(audio['published'])
|
||||
|
||||
|
||||
def test_activity_pub_audio_serializer_to_ap(factories):
|
||||
tf = factories['music.TrackFile'](mimetype='audio/mp3')
|
||||
library = actors.SYSTEM_ACTORS['library'].get_actor_instance()
|
||||
expected = {
|
||||
'@context': serializers.AP_CONTEXT,
|
||||
'type': 'Audio',
|
||||
'id': tf.get_federation_url(),
|
||||
'name': tf.track.full_name,
|
||||
'published': tf.creation_date.isoformat(),
|
||||
'updated': tf.modification_date.isoformat(),
|
||||
'metadata': {
|
||||
'artist': {
|
||||
'musicbrainz_id': tf.track.artist.mbid,
|
||||
'name': tf.track.artist.name,
|
||||
},
|
||||
'release': {
|
||||
'musicbrainz_id': tf.track.album.mbid,
|
||||
'title': tf.track.album.title,
|
||||
},
|
||||
'recording': {
|
||||
'musicbrainz_id': tf.track.mbid,
|
||||
'title': tf.track.title,
|
||||
},
|
||||
},
|
||||
'url': {
|
||||
'href': utils.full_url(tf.path),
|
||||
'type': 'Link',
|
||||
'mediaType': 'audio/mp3'
|
||||
},
|
||||
'attributedTo': [
|
||||
library.url
|
||||
]
|
||||
}
|
||||
|
||||
serializer = serializers.AudioSerializer(tf, context={'actor': library})
|
||||
|
||||
assert serializer.data == expected
|
||||
|
||||
|
||||
def test_activity_pub_audio_serializer_to_ap_no_mbid(factories):
|
||||
tf = factories['music.TrackFile'](
|
||||
mimetype='audio/mp3',
|
||||
track__mbid=None,
|
||||
track__album__mbid=None,
|
||||
track__album__artist__mbid=None,
|
||||
)
|
||||
library = actors.SYSTEM_ACTORS['library'].get_actor_instance()
|
||||
expected = {
|
||||
'@context': serializers.AP_CONTEXT,
|
||||
'type': 'Audio',
|
||||
'id': tf.get_federation_url(),
|
||||
'name': tf.track.full_name,
|
||||
'published': tf.creation_date.isoformat(),
|
||||
'updated': tf.modification_date.isoformat(),
|
||||
'metadata': {
|
||||
'artist': {
|
||||
'name': tf.track.artist.name,
|
||||
'musicbrainz_id': None,
|
||||
},
|
||||
'release': {
|
||||
'title': tf.track.album.title,
|
||||
'musicbrainz_id': None,
|
||||
},
|
||||
'recording': {
|
||||
'title': tf.track.title,
|
||||
'musicbrainz_id': None,
|
||||
},
|
||||
},
|
||||
'url': {
|
||||
'href': utils.full_url(tf.path),
|
||||
'type': 'Link',
|
||||
'mediaType': 'audio/mp3'
|
||||
},
|
||||
'attributedTo': [
|
||||
library.url
|
||||
]
|
||||
}
|
||||
|
||||
serializer = serializers.AudioSerializer(tf, context={'actor': library})
|
||||
|
||||
assert serializer.data == expected
|
||||
|
||||
|
||||
def test_collection_serializer_to_ap(factories):
|
||||
tf1 = factories['music.TrackFile'](mimetype='audio/mp3')
|
||||
tf2 = factories['music.TrackFile'](mimetype='audio/ogg')
|
||||
library = actors.SYSTEM_ACTORS['library'].get_actor_instance()
|
||||
expected = {
|
||||
'@context': serializers.AP_CONTEXT,
|
||||
'id': 'https://test.id',
|
||||
'actor': library.url,
|
||||
'totalItems': 2,
|
||||
'type': 'Collection',
|
||||
'items': [
|
||||
serializers.AudioSerializer(
|
||||
tf1, context={'actor': library, 'include_ap_context': False}
|
||||
).data,
|
||||
serializers.AudioSerializer(
|
||||
tf2, context={'actor': library, 'include_ap_context': False}
|
||||
).data,
|
||||
]
|
||||
}
|
||||
|
||||
collection = {
|
||||
'id': expected['id'],
|
||||
'actor': library,
|
||||
'items': [tf1, tf2],
|
||||
'item_serializer': serializers.AudioSerializer
|
||||
}
|
||||
serializer = serializers.CollectionSerializer(
|
||||
collection, context={'actor': library, 'id': 'https://test.id'})
|
||||
|
||||
assert serializer.data == expected
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue