diff --git a/funkwhale_api/music/models.py b/funkwhale_api/music/models.py index 90d369a7dd6e74afc60fbc705953c3b08a117513..770274bdfd00ba81bfd11009bbf2aab0581f4244 100644 --- a/funkwhale_api/music/models.py +++ b/funkwhale_api/music/models.py @@ -9,10 +9,10 @@ import markdown from django.conf import settings from django.db import models from django.contrib.staticfiles.templatetags.staticfiles import static -from django.core.files import File from django.core.files.base import ContentFile -from django.utils import timezone from django.core.files import File +from django.core.urlresolvers import reverse +from django.utils import timezone from taggit.managers import TaggableManager from versatileimagefield.fields import VersatileImageField @@ -309,10 +309,13 @@ class Track(APIModelMixin): try: work_data = data['recording']['work-relation-list'][0]['work'] except (IndexError, KeyError): - raise + return work, _ = Work.get_or_create_from_api(mbid=work_data['id']) return work + def get_lyrics_url(self): + return reverse('api:tracks-lyrics', kwargs={'pk': self.pk}) + class TrackFile(models.Model): track = models.ForeignKey(Track, related_name='files') audio_file = models.FileField(upload_to='tracks/%Y/%m/%d') diff --git a/funkwhale_api/music/serializers.py b/funkwhale_api/music/serializers.py index 98faa009963e8316d31f9915b973e1e5f05779a2..92806cf86f60cfc344798bf805b405a1f0dc1d5b 100644 --- a/funkwhale_api/music/serializers.py +++ b/funkwhale_api/music/serializers.py @@ -50,21 +50,28 @@ class AlbumSerializer(serializers.ModelSerializer): fields = ('id', 'mbid', 'title', 'cover', 'release_date', 'tags') -class TrackSerializer(serializers.ModelSerializer): +class LyricsMixin(serializers.ModelSerializer): + lyrics = serializers.SerializerMethodField() + + def get_lyrics(self, obj): + return obj.get_lyrics_url() + + +class TrackSerializer(LyricsMixin): files = TrackFileSerializer(many=True, read_only=True) tags = TagSerializer(many=True, read_only=True) class Meta: model = models.Track - fields = ('id', 'mbid', 'title', 'artist', 'files', 'tags') + fields = ('id', 'mbid', 'title', 'artist', 'files', 'tags', 'lyrics') -class TrackSerializerNested(serializers.ModelSerializer): +class TrackSerializerNested(LyricsMixin): artist = ArtistSerializer() files = TrackFileSerializer(many=True, read_only=True) album = SimpleAlbumSerializer(read_only=True) tags = TagSerializer(many=True, read_only=True) class Meta: model = models.Track - fields = ('id', 'mbid', 'title', 'artist', 'files', 'album', 'tags') + fields = ('id', 'mbid', 'title', 'artist', 'files', 'album', 'tags', 'lyrics') class AlbumSerializerNested(serializers.ModelSerializer): tracks = TrackSerializer(many=True, read_only=True) diff --git a/funkwhale_api/music/views.py b/funkwhale_api/music/views.py index 1656754214a70bfe57033554586d4bbfdf422049..ff771dc38cf2e5d90de7541b3112cdd2cd6aac62 100644 --- a/funkwhale_api/music/views.py +++ b/funkwhale_api/music/views.py @@ -106,6 +106,9 @@ class TrackViewSet(TagViewSetMixin, SearchMixin, viewsets.ReadOnlyModelViewSet): if not work: work = track.get_work() + if not work: + return Response({'error': 'unavailable work'}, status=404) + lyrics = work.fetch_lyrics() try: if not lyrics.content: