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())