diff --git a/api/funkwhale_api/subsonic/views.py b/api/funkwhale_api/subsonic/views.py index 3836019d4b6e6f66999bf6a958305ea68afc43f4..f428e81d95a4761d9416d3baa05626a1a34f2651 100644 --- a/api/funkwhale_api/subsonic/views.py +++ b/api/funkwhale_api/subsonic/views.py @@ -365,15 +365,24 @@ class SubsonicViewSet(viewsets.GenericViewSet): else: plt.delete(update_indexes=True) - try: - to_add = int(data['songIdToAdd']) - track = music_models.Track.objects.get(pk=to_add) - except (TypeError, ValueError, KeyError): - pass - except music_models.Track.DoesNotExist: - pass - else: - playlist.insert_many([track]) + ids = [] + for i in data.getlist('songIdToAdd'): + try: + ids.append(int(i)) + except (TypeError, ValueError): + pass + if ids: + tracks = music_models.Track.objects.filter(pk__in=ids) + by_id = {t.id: t for t in tracks} + sorted_tracks = [] + for i in ids: + try: + sorted_tracks.append(by_id[i]) + except KeyError: + pass + if sorted_tracks: + playlist.insert_many(sorted_tracks) + data = { 'status': 'ok' } @@ -409,15 +418,24 @@ class SubsonicViewSet(viewsets.GenericViewSet): playlist = request.user.playlists.create( name=name ) - try: - to_add = int(data['songId']) - track = music_models.Track.objects.get(pk=to_add) - except (TypeError, ValueError, KeyError): - pass - except music_models.Track.DoesNotExist: - pass - else: - playlist.insert_many([track]) + ids = [] + for i in data.getlist('songId'): + try: + ids.append(int(i)) + except (TypeError, ValueError): + pass + + if ids: + tracks = music_models.Track.objects.filter(pk__in=ids) + by_id = {t.id: t for t in tracks} + sorted_tracks = [] + for i in ids: + try: + sorted_tracks.append(by_id[i]) + except KeyError: + pass + if sorted_tracks: + playlist.insert_many(sorted_tracks) playlist = request.user.playlists.with_tracks_count().get( pk=playlist.pk) data = { diff --git a/api/tests/subsonic/test_views.py b/api/tests/subsonic/test_views.py index 93aa72855ef1c194c6952cce9762e6937af59c06..781c05331ce796f830780ee4caf8122f0ffe1aa7 100644 --- a/api/tests/subsonic/test_views.py +++ b/api/tests/subsonic/test_views.py @@ -318,15 +318,17 @@ def test_delete_playlist(f, db, logged_in_api_client, factories): def test_create_playlist(f, db, logged_in_api_client, factories): url = reverse('api:subsonic-create-playlist') assert url.endswith('createPlaylist') is True - track = factories['music.Track']() + track1 = factories['music.Track']() + track2 = factories['music.Track']() response = logged_in_api_client.get( - url, {'f': f, 'name': 'hello', 'songId': track.pk}) + url, {'f': f, 'name': 'hello', 'songId': [track1.pk, track2.pk]}) assert response.status_code == 200 playlist = logged_in_api_client.user.playlists.latest('id') - plt = playlist.playlist_tracks.latest('id') + assert playlist.playlist_tracks.count() == 2 + for i, t in enumerate([track1, track2]): + plt = playlist.playlist_tracks.get(track=t) + assert plt.index == i assert playlist.name == 'hello' - assert plt.index == 0 - assert plt.track == track qs = playlist.__class__.objects.with_tracks_count() assert response.data == { 'playlist': serializers.get_playlist_detail_data(qs.first())