From 7094852c20b8557813b264f051dc1e5842301715 Mon Sep 17 00:00:00 2001 From: James Pike Date: Tue, 31 Dec 2013 02:14:34 +0000 Subject: [PATCH] addSongsToPlaylist: add all valid entries instead of stopping at first failure --- src/helpers.h | 54 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/src/helpers.h b/src/helpers.h index 36af4a05..604b7b29 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -488,31 +488,41 @@ template void ShowTag(BufferT &buf, const std::string &tag) template void addSongsToPlaylist(SongIterator first, SongIterator last, bool play, int position) { + auto addSongNoError = [&](SongIterator song) -> int { + try + { + return Mpd.AddSong(*song, position); + } + catch (...) + { + return -1; + } + }; + if (last-first >= 1) { - int id = Mpd.AddSong(*first, position); - if (id > 0) - { - Mpd.StartCommandsList(); - if (position == -1) - { - ++first; - for(; first != last; ++first) - if (Mpd.AddSong(*first) < 0) - break; - } - else - { - ++position; - --last; - for (; first != last; --last) - if (Mpd.AddSong(*last, position) < 0) - break; - } - Mpd.CommitCommandsList(); - if (play) - Mpd.PlayID(id); + int id = addSongNoError(first); + while (id < 0) { + if (++first == last) + return; + id = addSongNoError(first); } + + if (position == -1) + { + ++first; + for(; first != last; ++first) + addSongNoError(first); + } + else + { + ++position; + --last; + for (; first != last; --last) + addSongNoError(last); + } + if (play) + Mpd.PlayID(id); } }