diff --git a/src/api/subsonic/SubsonicResource.cpp b/src/api/subsonic/SubsonicResource.cpp index 79ca1386..41ef9dae 100644 --- a/src/api/subsonic/SubsonicResource.cpp +++ b/src/api/subsonic/SubsonicResource.cpp @@ -1226,9 +1226,7 @@ handleUpdatePlaylistRequest(RequestContext& context) if (!std::all_of(std::cbegin(trackIdsToAdd), std::cend(trackIdsToAdd), [](const Id& id) { return id.type == Id::Type::Track; })) throw Error {Error::CustomType::BadId}; - std::vector trackIdsToRemove {getMultiParametersAs(context.parameters, "songIdToRemove")}; - if (!std::all_of(std::cbegin(trackIdsToRemove), std::cend(trackIdsToRemove), [](const Id& id) { return id.type == Id::Type::Track; })) - throw Error {Error::CustomType::BadId}; + std::vector trackPositionsToRemove {getMultiParametersAs(context.parameters, "songIndexToRemove")}; Wt::Dbo::Transaction transaction {context.db.getSession()}; @@ -1250,25 +1248,16 @@ handleUpdatePlaylistRequest(RequestContext& context) if (isPublic) tracklist.modify()->setIsPublic(*isPublic); - // Remove tracks (remove all the instances found, since it is not position based) { - auto entries {tracklist->getEntries()}; + // Remove from end to make indexes stable + std::sort(std::begin(trackPositionsToRemove), std::end(trackPositionsToRemove), std::greater()); - for (const Id& trackIdToRemove : trackIdsToRemove) + for (std::size_t trackPositionToRemove : trackPositionsToRemove) { - auto it {std::remove_if(std::begin(entries), std::end(entries), [&trackIdToRemove](const auto& entry) - { - return entry->getTrack().id() == trackIdToRemove.value; - })}; - - std::for_each(it, std::end(entries), [](auto entry) - { - entry.remove(); - }); - - entries.erase(it, std::end(entries)); + auto entry {tracklist->getEntry(trackPositionToRemove)}; + if (entry) + entry.remove(); } - } // Add tracks