Skip to content
Snippets Groups Projects
Verified Commit 67dc414c authored by Eliot Berriot's avatar Eliot Berriot
Browse files

See #75: music direcory and indexes endpoints

parent 7c85d1ca
No related branches found
No related tags found
No related merge requests found
...@@ -72,7 +72,7 @@ def get_track_data(album, track, tf): ...@@ -72,7 +72,7 @@ def get_track_data(album, track, tf):
'title': track.title, 'title': track.title,
'album': album.title, 'album': album.title,
'artist': album.artist.name, 'artist': album.artist.name,
'track': track.position, 'track': track.position or 1,
'contentType': tf.mimetype, 'contentType': tf.mimetype,
'suffix': tf.extension or '', 'suffix': tf.extension or '',
'duration': tf.duration or 0, 'duration': tf.duration or 0,
...@@ -178,3 +178,38 @@ def get_playlist_detail_data(playlist): ...@@ -178,3 +178,38 @@ def get_playlist_detail_data(playlist):
td = get_track_data(plt.track.album, plt.track, tf) td = get_track_data(plt.track.album, plt.track, tf)
data['entry'].append(td) data['entry'].append(td)
return data return data
def get_music_directory_data(artist):
tracks = artist.tracks.select_related('album').prefetch_related('files')
data = {
'id': artist.pk,
'parent': 1,
'name': artist.name,
'child': []
}
for track in tracks:
try:
tf = [tf for tf in track.files.all()][0]
except IndexError:
continue
album = track.album
td = {
'id': track.pk,
'isDir': 'false',
'title': track.title,
'album': album.title,
'artist': artist.name,
'track': track.position or 1,
'year': track.album.release_date.year if track.album.release_date else 0,
'contentType': tf.mimetype,
'suffix': tf.extension or '',
'duration': tf.duration or 0,
'created': track.creation_date,
'albumId': album.pk,
'artistId': artist.pk,
'parent': artist.id,
'type': 'music',
}
data['child'].append(td)
return data
...@@ -125,6 +125,19 @@ class SubsonicViewSet(viewsets.GenericViewSet): ...@@ -125,6 +125,19 @@ class SubsonicViewSet(viewsets.GenericViewSet):
return response.Response(payload, status=200) return response.Response(payload, status=200)
@list_route(
methods=['get', 'post'],
url_name='get_indexes',
url_path='getIndexes')
def get_indexes(self, request, *args, **kwargs):
artists = music_models.Artist.objects.all()
data = serializers.GetArtistsSerializer(artists).data
payload = {
'indexes': data
}
return response.Response(payload, status=200)
@list_route( @list_route(
methods=['get', 'post'], methods=['get', 'post'],
url_name='get_artist', url_name='get_artist',
...@@ -213,7 +226,22 @@ class SubsonicViewSet(viewsets.GenericViewSet): ...@@ -213,7 +226,22 @@ class SubsonicViewSet(viewsets.GenericViewSet):
def get_starred2(self, request, *args, **kwargs): def get_starred2(self, request, *args, **kwargs):
favorites = request.user.track_favorites.all() favorites = request.user.track_favorites.all()
data = { data = {
'song': serializers.get_starred_tracks_data(favorites) 'starred2': {
'song': serializers.get_starred_tracks_data(favorites)
}
}
return response.Response(data)
@list_route(
methods=['get', 'post'],
url_name='get_starred',
url_path='getStarred')
def get_starred(self, request, *args, **kwargs):
favorites = request.user.track_favorites.all()
data = {
'starred': {
'song': serializers.get_starred_tracks_data(favorites)
}
} }
return response.Response(data) return response.Response(data)
...@@ -442,3 +470,18 @@ class SubsonicViewSet(viewsets.GenericViewSet): ...@@ -442,3 +470,18 @@ class SubsonicViewSet(viewsets.GenericViewSet):
'playlist': serializers.get_playlist_detail_data(playlist) 'playlist': serializers.get_playlist_detail_data(playlist)
} }
return response.Response(data) return response.Response(data)
@list_route(
methods=['get', 'post'],
url_name='get_music_folders',
url_path='getMusicFolders')
def get_music_folders(self, request, *args, **kwargs):
data = {
'musicFolders': {
'musicFolder': [{
'id': 1,
'name': 'Music'
}]
}
}
return response.Response(data)
...@@ -173,3 +173,35 @@ def test_playlist_detail_serializer(factories): ...@@ -173,3 +173,35 @@ def test_playlist_detail_serializer(factories):
qs = playlist.__class__.objects.with_tracks_count() qs = playlist.__class__.objects.with_tracks_count()
data = serializers.get_playlist_detail_data(qs.first()) data = serializers.get_playlist_detail_data(qs.first())
assert data == expected assert data == expected
def test_directory_serializer_artist(factories):
track = factories['music.Track']()
tf = factories['music.TrackFile'](track=track)
album = track.album
artist = track.artist
expected = {
'id': artist.pk,
'parent': 1,
'name': artist.name,
'child': [{
'id': track.pk,
'isDir': 'false',
'title': track.title,
'album': album.title,
'artist': artist.name,
'track': track.position,
'year': track.album.release_date.year,
'contentType': tf.mimetype,
'suffix': tf.extension or '',
'duration': tf.duration or 0,
'created': track.creation_date,
'albumId': album.pk,
'artistId': artist.pk,
'parent': artist.pk,
'type': 'music',
}]
}
data = serializers.get_music_directory_data(artist)
assert data == expected
...@@ -88,7 +88,7 @@ def test_get_artists(f, db, logged_in_api_client, factories): ...@@ -88,7 +88,7 @@ def test_get_artists(f, db, logged_in_api_client, factories):
music_models.Artist.objects.all() music_models.Artist.objects.all()
).data ).data
} }
response = logged_in_api_client.get(url) response = logged_in_api_client.get(url, {'f': f})
assert response.status_code == 200 assert response.status_code == 200
assert response.data == expected assert response.data == expected
...@@ -197,7 +197,26 @@ def test_get_starred2(f, db, logged_in_api_client, factories): ...@@ -197,7 +197,26 @@ def test_get_starred2(f, db, logged_in_api_client, factories):
assert response.status_code == 200 assert response.status_code == 200
assert response.data == { assert response.data == {
'song': serializers.get_starred_tracks_data([favorite]) 'starred2': {
'song': serializers.get_starred_tracks_data([favorite])
}
}
@pytest.mark.parametrize('f', ['xml', 'json'])
def test_get_starred(f, db, logged_in_api_client, factories):
url = reverse('api:subsonic-get-starred')
assert url.endswith('getStarred') is True
track = factories['music.Track']()
favorite = factories['favorites.TrackFavorite'](
track=track, user=logged_in_api_client.user)
response = logged_in_api_client.get(url, {'f': f, 'id': track.pk})
assert response.status_code == 200
assert response.data == {
'starred': {
'song': serializers.get_starred_tracks_data([favorite])
}
} }
...@@ -333,3 +352,35 @@ def test_create_playlist(f, db, logged_in_api_client, factories): ...@@ -333,3 +352,35 @@ def test_create_playlist(f, db, logged_in_api_client, factories):
assert response.data == { assert response.data == {
'playlist': serializers.get_playlist_detail_data(qs.first()) 'playlist': serializers.get_playlist_detail_data(qs.first())
} }
@pytest.mark.parametrize('f', ['xml', 'json'])
def test_get_music_folders(f, db, logged_in_api_client, factories):
url = reverse('api:subsonic-get-music-folders')
assert url.endswith('getMusicFolders') is True
response = logged_in_api_client.get(url, {'f': f})
assert response.status_code == 200
assert response.data == {
'musicFolders': {
'musicFolder': [{
'id': 1,
'name': 'Music'
}]
}
}
@pytest.mark.parametrize('f', ['xml', 'json'])
def test_get_indexes(f, db, logged_in_api_client, factories):
url = reverse('api:subsonic-get-indexes')
assert url.endswith('getIndexes') is True
artists = factories['music.Artist'].create_batch(size=10)
expected = {
'indexes': serializers.GetArtistsSerializer(
music_models.Artist.objects.all()
).data
}
response = logged_in_api_client.get(url)
assert response.status_code == 200
assert response.data == expected
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment