See #75: music direcory and indexes endpoints
This commit is contained in:
parent
7c85d1ca81
commit
67dc414c8a
|
@ -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):
|
||||||
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):
|
||||||
|
|
||||||
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):
|
||||||
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):
|
||||||
'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):
|
||||||
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):
|
||||||
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):
|
||||||
|
|
||||||
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):
|
||||||
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
|
||||||
|
|
Loading…
Reference in New Issue