From 05107c31a81288cbba16f5c9b259e4c8e7bef46d Mon Sep 17 00:00:00 2001 From: Neraste Date: Sun, 8 Mar 2026 18:25:07 +0100 Subject: [PATCH] Add route for lyrics --- dakara_server/dakara_server/urls.py | 5 ++++ dakara_server/library/serializers.py | 8 ++++++ dakara_server/library/tests/test_song.py | 34 ++++++++++++++++++++++++ dakara_server/library/views.py | 12 +++++++++ 4 files changed, 59 insertions(+) diff --git a/dakara_server/dakara_server/urls.py b/dakara_server/dakara_server/urls.py index 1005b016..cba8a04d 100644 --- a/dakara_server/dakara_server/urls.py +++ b/dakara_server/dakara_server/urls.py @@ -102,6 +102,11 @@ library_views.SongView.as_view(), name="library-song", ), + path( + "api/library/songs/lyrics//", + library_views.SongLyricsView.as_view(), + name="library-song-lyrics", + ), path( "api/library/songs/retrieve/", library_views.SongRetrieveListView.as_view(), diff --git a/dakara_server/library/serializers.py b/dakara_server/library/serializers.py index 4a1a02b2..cf76978d 100644 --- a/dakara_server/library/serializers.py +++ b/dakara_server/library/serializers.py @@ -403,6 +403,14 @@ def update(self, song, validated_data): return song +class SongLyricsSerializer(serializers.ModelSerializer): + """Song lyrics field serializer.""" + + class Meta: + model = Song + fields = ("id", "lyrics") + + class SongForPlayerSerializer(serializers.ModelSerializer): """Song serializer. diff --git a/dakara_server/library/tests/test_song.py b/dakara_server/library/tests/test_song.py index f51fe55f..e4786cec 100644 --- a/dakara_server/library/tests/test_song.py +++ b/dakara_server/library/tests/test_song.py @@ -57,6 +57,9 @@ def test_get_song_long_lyrics(self): self.assertEqual(len(response.data["results"]), 2) # check lyrics + self.assertNotEqual( + response.data["results"][1]["lyrics_preview"]["text"], self.song2.lyrics + ) self.assertDictEqual( response.data["results"][1]["lyrics_preview"], { @@ -936,3 +939,34 @@ def test_put_song_embedded_work_subtitle(self): self.assertEqual(Work.objects.count(), 4) workNew = Work.objects.get(title="Work1", subtitle="", work_type=self.wt1) self.assertIsNotNone(workNew) + + +class SongLyricsViewTestCase(LibraryAPITestCase): + def setUp(self): + # create a user without any rights + self.user = self.create_user("TestUser") + + # create test data + self.create_test_data() + + # add lyrics to one song + self.song2.lyrics = """Mary had a little lamb +Little lamb, little lamb +Mary had a little lamb +Its fleece was white as snow +And everywhere that Mary went +Mary went, Mary.""" + self.song2.save() + + # Create urls to access these playlist entries + self.url_song2 = reverse("library-song-lyrics", kwargs={"pk": self.song2.id}) + + def test_get_lyrics(self): + """Get a song lyrics.""" + self.authenticate(self.user) + + response = self.client.get(self.url_song2) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["id"], self.song2.id) + self.assertEqual(response.data["lyrics"], self.song2.lyrics) diff --git a/dakara_server/library/views.py b/dakara_server/library/views.py index 708965c6..82a4569c 100644 --- a/dakara_server/library/views.py +++ b/dakara_server/library/views.py @@ -7,6 +7,7 @@ from rest_framework.generics import ( ListAPIView, ListCreateAPIView, + RetrieveAPIView, RetrieveUpdateDestroyAPIView, ) from rest_framework.permissions import IsAuthenticated @@ -194,6 +195,17 @@ class SongView(RetrieveUpdateDestroyAPIView): serializer_class = serializers.SongSerializer +class SongLyricsView(RetrieveAPIView): + """List of songs.""" + + permission_classes = [ + IsAuthenticated, + permissions.IsLibraryManager | internal_permissions.IsReadOnly, + ] + queryset = models.Song.objects.all() + serializer_class = serializers.SongLyricsSerializer + + class SongRetrieveListView(ListAPIView): """List of all songs.