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:
parent
a3a07280e8
commit
bfbff31860
|
@ -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
|
||||||
|
|
|
@ -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"),
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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))) {
|
||||||
|
|
|
@ -270,6 +270,7 @@ Queue::Clear() noexcept
|
||||||
}
|
}
|
||||||
|
|
||||||
length = 0;
|
length = 0;
|
||||||
|
last_loaded_playlist.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue