Faster loading of playlists from the playlist editor

This commit is contained in:
Andrzej Rybczak
2020-12-19 16:54:51 +01:00
parent d724e06262
commit cbc9741e66
4 changed files with 47 additions and 29 deletions

View File

@@ -305,14 +305,13 @@ bool Browser::itemAvailable()
bool Browser::addItemToPlaylist(bool play)
{
bool result = false;
bool success = false;
auto tryToPlay = [] {
// Cheap trick that might fail in presence of multiple
// clients modifying the playlist at the same time, but
// oh well, this approach correctly loads cue playlists
// and is much faster in general as it doesn't require
// fetching song data.
// Cheap trick that might fail in presence of multiple clients modifying the
// playlist at the same time, but oh well, this approach correctly loads cue
// playlists and is much faster in general as it doesn't require fetching
// song data.
try
{
Mpd.Play(Status::State::playlistLength());
@@ -334,31 +333,30 @@ bool Browser::addItemToPlaylist(bool play)
{
std::vector<MPD::Song> songs;
getLocalDirectoryRecursively(songs, item.directory().path());
result = addSongsToPlaylist(songs.begin(), songs.end(), play, -1);
success = addSongsToPlaylist(songs.begin(), songs.end(), play, -1);
}
else
{
Mpd.Add(item.directory().path());
success = Mpd.Add(item.directory().path());
if (play)
tryToPlay();
result = true;
}
Statusbar::printf("Directory \"%1%\" added%2%",
item.directory().path(), withErrors(result));
item.directory().path(), withErrors(success));
break;
}
case MPD::Item::Type::Song:
result = addSongToPlaylist(item.song(), play);
success = addSongToPlaylist(item.song(), play);
break;
case MPD::Item::Type::Playlist:
Mpd.LoadPlaylist(item.playlist().path());
success = Mpd.LoadPlaylist(item.playlist().path());
if (play)
tryToPlay();
Statusbar::printf("Playlist \"%1%\" loaded", item.playlist().path());
result = true;
if (success)
Statusbar::printf("Playlist \"%1%\" loaded", item.playlist().path());
break;
}
return result;
return success;
}
std::vector<MPD::Song> Browser::getSelectedSongs()

View File

@@ -374,17 +374,34 @@ bool PlaylistEditor::itemAvailable()
bool PlaylistEditor::addItemToPlaylist(bool play)
{
bool result = false;
bool success = false;
if (isActiveWindow(Playlists))
{
ScopedUnfilteredMenu<MPD::Song> sunfilter_content(ReapplyFilter::No, Content);
result = addSongsToPlaylist(Content.beginV(), Content.endV(), play, -1);
Statusbar::printf("Playlist \"%1%\" loaded%2%",
Playlists.current()->value().path(), withErrors(result));
const auto &playlist = Playlists.current()->value();
success = Mpd.LoadPlaylist(playlist.path());
if (play)
{
// Cheap trick that might fail in presence of multiple clients modifying the
// playlist at the same time, but oh well, this approach correctly loads cue
// playlists and is much faster in general as it doesn't require fetching
// song data.
try
{
Mpd.Play(Status::State::playlistLength());
}
catch (MPD::ServerError &e)
{
// If not bad index, rethrow.
if (e.code() != MPD_SERVER_ERROR_ARG)
throw;
}
}
if (success)
Statusbar::printf("Playlist \"%1%\" loaded", playlist.path());
}
else if (isActiveWindow(Content))
result = addSongToPlaylist(Content.current()->value(), play);
return result;
success = addSongToPlaylist(Content.current()->value(), play);
return success;
}
std::vector<MPD::Song> PlaylistEditor::getSelectedSongs()