From 3464497880649a16bb5c44f06d6be10a9a0089de Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 9 Nov 2021 21:17:50 +0100 Subject: [PATCH] command/database: add optional position parameter to "searchaddpl" Closes https://github.com/MusicPlayerDaemon/MPD/issues/1328 --- NEWS | 2 ++ doc/protocol.rst | 6 +++++- meson.build | 2 +- src/command/DatabaseCommands.cxx | 11 +++++++++-- src/db/DatabasePlaylist.cxx | 20 ++++++++++++++++++++ src/db/DatabasePlaylist.hxx | 6 ++++++ 6 files changed, 43 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 4e93c8926..4d7da8827 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,6 @@ ver 0.23.4 (not yet released) +* protocol + - add optional position parameter to "searchaddpl" * decoder - ffmpeg: support libavcodec 59 * output diff --git a/doc/protocol.rst b/doc/protocol.rst index 68ca19244..69516dc72 100644 --- a/doc/protocol.rst +++ b/doc/protocol.rst @@ -1225,7 +1225,7 @@ The music database .. _command_searchaddpl: -:command:`searchaddpl {NAME} {FILTER} [sort {TYPE}] [window {START:END}]` +:command:`searchaddpl {NAME} {FILTER} [sort {TYPE}] [window {START:END}] [position POS]` Search the database for songs matching ``FILTER`` (see :ref:`Filters `) and add them to the playlist named ``NAME``. @@ -1234,6 +1234,9 @@ The music database Parameters have the same meaning as for :ref:`search `. + The ``position`` parameter specifies where the songs will be + inserted. [#since_0_23_4]_ + .. _command_update: :command:`update [URI]` @@ -1655,3 +1658,4 @@ client-to-client messages are local to the current partition. .. [#since_0_23] Since :program:`MPD` 0.23 .. [#since_0_23_1] Since :program:`MPD` 0.23.1 .. [#since_0_23_3] Since :program:`MPD` 0.23.3 +.. [#since_0_23_4] Since :program:`MPD` 0.23.4 diff --git a/meson.build b/meson.build index a3b941bef..ac65fcaec 100644 --- a/meson.build +++ b/meson.build @@ -44,7 +44,7 @@ version_conf = configuration_data() version_conf.set_quoted('PACKAGE', meson.project_name()) version_conf.set_quoted('PACKAGE_NAME', meson.project_name()) version_conf.set_quoted('VERSION', meson.project_version()) -version_conf.set_quoted('PROTOCOL_VERSION', '0.23.3') +version_conf.set_quoted('PROTOCOL_VERSION', '0.23.4') configure_file(output: 'Version.h', configuration: version_conf) conf = configuration_data() diff --git a/src/command/DatabaseCommands.cxx b/src/command/DatabaseCommands.cxx index a7664907d..8a96b92ce 100644 --- a/src/command/DatabaseCommands.cxx +++ b/src/command/DatabaseCommands.cxx @@ -199,13 +199,20 @@ handle_searchaddpl(Client &client, Request args, Response &) { const char *playlist = args.shift(); + const unsigned position = ParseQueuePosition(args, UINT_MAX); + SongFilter filter; const auto selection = ParseDatabaseSelection(args, true, filter); const Database &db = client.GetDatabaseOrThrow(); - search_add_to_playlist(db, client.GetStorage(), - playlist, selection); + if (position == UINT_MAX) + search_add_to_playlist(db, client.GetStorage(), + playlist, selection); + else + SearchInsertIntoPlaylist(db, client.GetStorage(), selection, + playlist, position); + return CommandResult::OK; } diff --git a/src/db/DatabasePlaylist.cxx b/src/db/DatabasePlaylist.cxx index 931507c61..0e14a97fc 100644 --- a/src/db/DatabasePlaylist.cxx +++ b/src/db/DatabasePlaylist.cxx @@ -22,6 +22,7 @@ #include "PlaylistFile.hxx" #include "Interface.hxx" #include "song/DetachedSong.hxx" +#include "protocol/Ack.hxx" #include @@ -61,3 +62,22 @@ SearchInsertIntoPlaylist(const Database &db, const Storage *storage, return n; } + +void +SearchInsertIntoPlaylist(const Database &db, const Storage *storage, + const DatabaseSelection &selection, + const char *playlist_name, + unsigned position) +{ + PlaylistFileEditor editor{ + playlist_name, + PlaylistFileEditor::LoadMode::TRY, + }; + + if (position > editor.size()) + throw ProtocolError{ACK_ERROR_ARG, "Bad position"}; + + if (SearchInsertIntoPlaylist(db, storage, selection, + editor, position) > 0) + editor.Save(); +} diff --git a/src/db/DatabasePlaylist.hxx b/src/db/DatabasePlaylist.hxx index ce6a88d19..936324b22 100644 --- a/src/db/DatabasePlaylist.hxx +++ b/src/db/DatabasePlaylist.hxx @@ -42,4 +42,10 @@ SearchInsertIntoPlaylist(const Database &db, const Storage *storage, PlaylistFileEditor &playlist, unsigned position); +void +SearchInsertIntoPlaylist(const Database &db, const Storage *storage, + const DatabaseSelection &selection, + const char *playlist_name, + unsigned position); + #endif