diff --git a/src/command/PlaylistCommands.cxx b/src/command/PlaylistCommands.cxx index 5c0bc47a8..af9a75caa 100644 --- a/src/command/PlaylistCommands.cxx +++ b/src/command/PlaylistCommands.cxx @@ -233,10 +233,12 @@ handle_playlistadd_position(Client &client, const char *playlist_name, #ifdef ENABLE_DATABASE const DatabaseSelection selection(uri, true, nullptr); - SearchInsertIntoPlaylist(client.GetDatabaseOrThrow(), - client.GetStorage(), - selection, - editor, position); + if (SearchInsertIntoPlaylist(client.GetDatabaseOrThrow(), + client.GetStorage(), + selection, + editor, position) == 0) + /* no song was found, don't need to save */ + return CommandResult::OK; #else (void)client; r.Error(ACK_ERROR_NO_EXIST, "No database"); diff --git a/src/db/DatabasePlaylist.cxx b/src/db/DatabasePlaylist.cxx index 9d72d32a8..931507c61 100644 --- a/src/db/DatabasePlaylist.cxx +++ b/src/db/DatabasePlaylist.cxx @@ -42,7 +42,7 @@ search_add_to_playlist(const Database &db, const Storage *storage, db.Visit(selection, f); } -void +unsigned SearchInsertIntoPlaylist(const Database &db, const Storage *storage, const DatabaseSelection &selection, PlaylistFileEditor &playlist, @@ -50,9 +50,14 @@ SearchInsertIntoPlaylist(const Database &db, const Storage *storage, { assert(position <= playlist.size()); - db.Visit(selection, [&playlist, &position, storage](const auto &song){ - playlist.Insert(position, + unsigned n = 0; + + db.Visit(selection, [&playlist, &position, &n, storage](const auto &song){ + playlist.Insert(position + n, DatabaseDetachSong(storage, song)); ++position; + ++n; }); + + return n; } diff --git a/src/db/DatabasePlaylist.hxx b/src/db/DatabasePlaylist.hxx index bbe3e2f29..ce6a88d19 100644 --- a/src/db/DatabasePlaylist.hxx +++ b/src/db/DatabasePlaylist.hxx @@ -33,7 +33,10 @@ search_add_to_playlist(const Database &db, const Storage *storage, const char *playlist_path_utf8, const DatabaseSelection &selection); -void +/** + * @return the number of songs added + */ +unsigned SearchInsertIntoPlaylist(const Database &db, const Storage *storage, const DatabaseSelection &selection, PlaylistFileEditor &playlist,