Store last loaded playlist

Stores the last loaded playlist uri in the queue struct.
Last loaded playlist is set on load command and cleared with the clear command.
The last loaded playlist is printed in the status command and saved / restored from the partition state file.

Resolves issue #938
This commit is contained in:
jcorporation 2024-08-18 22:55:57 +02:00
parent a3a07280e8
commit bfbff31860
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;