Merge branch 'queue_loaded_playlist' of https://github.com/jcorporation/MPD

This commit is contained in:
Max Kellermann 2024-10-26 08:15:23 +02:00
commit 17d0cd0abd
7 changed files with 24 additions and 2 deletions

View File

@ -544,6 +544,7 @@ Querying :program:`MPD`'s status
:ref:`audio_output_format` for a detailed explanation. :ref:`audio_output_format` for a detailed explanation.
- ``updating_db``: ``job id`` - ``updating_db``: ``job id``
- ``error``: if there is an error, returns message here - ``error``: if there is an error, returns message here
- ``lastloadedplaylist``: last loaded stored playlist [#since_0_24]_
:program:`MPD` may omit lines which have no (known) value. Older :program:`MPD` may omit lines which have no (known) value. Older
:program:`MPD` versions used to have a "magic" value for :program:`MPD` versions used to have a "magic" value for

View File

@ -44,6 +44,7 @@
#define COMMAND_STATUS_MIXRAMPDELAY "mixrampdelay" #define COMMAND_STATUS_MIXRAMPDELAY "mixrampdelay"
#define COMMAND_STATUS_AUDIO "audio" #define COMMAND_STATUS_AUDIO "audio"
#define COMMAND_STATUS_UPDATING_DB "updating_db" #define COMMAND_STATUS_UPDATING_DB "updating_db"
#define COMMAND_STATUS_LOADED_PLAYLIST "lastloadedplaylist"
CommandResult CommandResult
handle_play(Client &client, Request args, [[maybe_unused]] Response &r) handle_play(Client &client, Request args, [[maybe_unused]] Response &r)
@ -128,7 +129,8 @@ handle_status(Client &client, [[maybe_unused]] Request args, Response &r)
COMMAND_STATUS_PLAYLIST ": {}\n" COMMAND_STATUS_PLAYLIST ": {}\n"
COMMAND_STATUS_PLAYLIST_LENGTH ": {}\n" COMMAND_STATUS_PLAYLIST_LENGTH ": {}\n"
COMMAND_STATUS_MIXRAMPDB ": {}\n" COMMAND_STATUS_MIXRAMPDB ": {}\n"
COMMAND_STATUS_STATE ": {}\n"), COMMAND_STATUS_STATE ": {}\n"
COMMAND_STATUS_LOADED_PLAYLIST ": {}\n"),
(unsigned)playlist.GetRepeat(), (unsigned)playlist.GetRepeat(),
(unsigned)playlist.GetRandom(), (unsigned)playlist.GetRandom(),
SingleToString(playlist.GetSingle()), SingleToString(playlist.GetSingle()),
@ -137,7 +139,8 @@ handle_status(Client &client, [[maybe_unused]] Request args, Response &r)
playlist.GetVersion(), playlist.GetVersion(),
playlist.GetLength(), playlist.GetLength(),
pc.GetMixRampDb(), pc.GetMixRampDb(),
state); state,
playlist.GetLastLoadedPlaylist());
if (pc.GetCrossFade() > FloatDuration::zero()) if (pc.GetCrossFade() > FloatDuration::zero())
r.Fmt(FMT_STRING(COMMAND_STATUS_CROSSFADE ": {}\n"), r.Fmt(FMT_STRING(COMMAND_STATUS_CROSSFADE ": {}\n"),

View File

@ -55,6 +55,7 @@ playlist_load_into_queue(const char *uri, SongEnumerator &e,
dest.AppendSong(pc, std::move(*song)); dest.AppendSong(pc, std::move(*song));
} }
dest.SetLastLoadedPlaylist(uri);
} }
void void

View File

@ -102,6 +102,14 @@ struct playlist {
[[gnu::pure]] [[gnu::pure]]
int GetNextPosition() const noexcept; int GetNextPosition() const noexcept;
const std::string_view GetLastLoadedPlaylist() const noexcept {
return queue.last_loaded_playlist;
}
void SetLastLoadedPlaylist(const char *playlist_name) noexcept {
queue.last_loaded_playlist = playlist_name;
}
/** /**
* Returns the song object which is currently queued. Returns * Returns the song object which is currently queued. Returns
* none if there is none (yet?) or if MPD isn't playing. * none if there is none (yet?) or if MPD isn't playing.

View File

@ -36,6 +36,7 @@
#define PLAYLIST_STATE_FILE_CROSSFADE "crossfade: " #define PLAYLIST_STATE_FILE_CROSSFADE "crossfade: "
#define PLAYLIST_STATE_FILE_MIXRAMPDB "mixrampdb: " #define PLAYLIST_STATE_FILE_MIXRAMPDB "mixrampdb: "
#define PLAYLIST_STATE_FILE_MIXRAMPDELAY "mixrampdelay: " #define PLAYLIST_STATE_FILE_MIXRAMPDELAY "mixrampdelay: "
#define PLAYLIST_STATE_FILE_LOADED_PLAYLIST "lastloadedplaylist: "
#define PLAYLIST_STATE_FILE_PLAYLIST_BEGIN "playlist_begin" #define PLAYLIST_STATE_FILE_PLAYLIST_BEGIN "playlist_begin"
#define PLAYLIST_STATE_FILE_PLAYLIST_END "playlist_end" #define PLAYLIST_STATE_FILE_PLAYLIST_END "playlist_end"
@ -85,6 +86,8 @@ playlist_state_save(BufferedOutputStream &os, const struct playlist &playlist,
pc.GetMixRampDb()); pc.GetMixRampDb());
os.Fmt(FMT_STRING(PLAYLIST_STATE_FILE_MIXRAMPDELAY "{}\n"), os.Fmt(FMT_STRING(PLAYLIST_STATE_FILE_MIXRAMPDELAY "{}\n"),
pc.GetMixRampDelay().count()); pc.GetMixRampDelay().count());
os.Fmt(FMT_STRING(PLAYLIST_STATE_FILE_LOADED_PLAYLIST "{}\n"),
playlist.GetLastLoadedPlaylist());
os.Write(PLAYLIST_STATE_FILE_PLAYLIST_BEGIN "\n"); os.Write(PLAYLIST_STATE_FILE_PLAYLIST_BEGIN "\n");
queue_save(os, playlist.queue); queue_save(os, playlist.queue);
os.Write(PLAYLIST_STATE_FILE_PLAYLIST_END "\n"); os.Write(PLAYLIST_STATE_FILE_PLAYLIST_END "\n");
@ -156,6 +159,8 @@ playlist_state_restore(const StateFileConfig &config,
prior to MPD 0.18 */ prior to MPD 0.18 */
if (IsDigitASCII(*p)) if (IsDigitASCII(*p))
pc.SetMixRampDelay(FloatDuration(ParseFloat(p))); pc.SetMixRampDelay(FloatDuration(ParseFloat(p)));
} else if ((p = StringAfterPrefix(line, PLAYLIST_STATE_FILE_LOADED_PLAYLIST))) {
playlist.SetLastLoadedPlaylist(p);
} else if ((p = StringAfterPrefix(line, PLAYLIST_STATE_FILE_RANDOM))) { } else if ((p = StringAfterPrefix(line, PLAYLIST_STATE_FILE_RANDOM))) {
random_mode = StringIsEqual(p, "1"); random_mode = StringIsEqual(p, "1");
} else if ((p = StringAfterPrefix(line, PLAYLIST_STATE_FILE_CURRENT))) { } else if ((p = StringAfterPrefix(line, PLAYLIST_STATE_FILE_CURRENT))) {

View File

@ -270,6 +270,7 @@ Queue::Clear() noexcept
} }
length = 0; length = 0;
last_loaded_playlist.clear();
} }
static void static void

View File

@ -85,6 +85,9 @@ struct Queue {
/** play back songs in random order? */ /** play back songs in random order? */
bool random = false; bool random = false;
/** Last loaded playlist */
std::string last_loaded_playlist;
/** random number generator for shuffle and random mode */ /** random number generator for shuffle and random mode */
LazyRandomEngine rand; LazyRandomEngine rand;