diff --git a/src/browser.cpp b/src/browser.cpp index 62898489..c9462175 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -346,16 +346,14 @@ MPD::SongList Browser::getSelectedSongs() { case MPD::Item::Type::Directory: if (m_local_browser) - { - MPD::ItemList items; getLocalDirectoryRecursively(songs, item.directory().path()); - } else { - MPD::ItemIterator it = Mpd.GetDirectoryRecursive(item.directory().path()), end; - for (; it != end; ++it) - if (it->type() == MPD::Item::Type::Song) - songs.push_back(std::move(it->song())); + std::copy( + std::make_move_iterator(Mpd.GetDirectoryRecursive(item.directory().path())), + std::make_move_iterator(MPD::SongIterator()), + std::back_inserter(songs) + ); } break; case MPD::Item::Type::Song: diff --git a/src/media_library.cpp b/src/media_library.cpp index 07646716..54a5f8e3 100644 --- a/src/media_library.cpp +++ b/src/media_library.cpp @@ -259,24 +259,20 @@ void MediaLibrary::update() Albums.clearSearchResults(); m_albums_update_request = false; std::map, time_t> albums; - MPD::ItemIterator item = Mpd.GetDirectoryRecursive("/"), end; - for (; item != end; ++item) + for (MPD::SongIterator s = Mpd.GetDirectoryRecursive("/"), end; s != end; ++s) { - if (item->type() != MPD::Item::Type::Song) - continue; unsigned idx = 0; - const MPD::Song &s = item->song(); - std::string tag = s.get(Config.media_lib_primary_tag, idx); + std::string tag = s->get(Config.media_lib_primary_tag, idx); do { - auto key = std::make_tuple(tag, s.getAlbum(), s.getDate()); + auto key = std::make_tuple(tag, s->getAlbum(), s->getDate()); auto it = albums.find(key); if (it == albums.end()) - albums[key] = s.getMTime(); + albums[key] = s->getMTime(); else - it->second = s.getMTime(); + it->second = s->getMTime(); } - while (!(tag = s.get(Config.media_lib_primary_tag, ++idx)).empty()); + while (!(tag = s->get(Config.media_lib_primary_tag, ++idx)).empty()); } withUnfilteredMenuReapplyFilter(Albums, [this, &albums]() { size_t idx = 0; @@ -308,23 +304,19 @@ void MediaLibrary::update() std::map tags; if (Config.media_library_sort_by_mtime) { - MPD::ItemIterator item = Mpd.GetDirectoryRecursive("/"), end; - for (; item != end; ++item) + for (MPD::SongIterator s = Mpd.GetDirectoryRecursive("/"), end; s != end; ++s) { - if (item->type() != MPD::Item::Type::Song) - continue; unsigned idx = 0; - const MPD::Song &s = item->song(); - std::string tag = s.get(Config.media_lib_primary_tag, idx); + std::string tag = s->get(Config.media_lib_primary_tag, idx); do { auto it = tags.find(tag); if (it == tags.end()) - tags[tag] = s.getMTime(); + tags[tag] = s->getMTime(); else - it->second = std::max(it->second, s.getMTime()); + it->second = std::max(it->second, s->getMTime()); } - while (!(tag = s.get(Config.media_lib_primary_tag, ++idx)).empty()); + while (!(tag = s->get(Config.media_lib_primary_tag, ++idx)).empty()); } } else diff --git a/src/mpdpp.cpp b/src/mpdpp.cpp index 20f86cd8..d75a1a73 100644 --- a/src/mpdpp.cpp +++ b/src/mpdpp.cpp @@ -43,6 +43,24 @@ bool fetchItem(MPD::ItemIterator::State &state) return false; } +bool fetchItemSong(MPD::SongIterator::State &state) +{ + auto src = mpd_recv_entity(state.connection()); + while (src != nullptr && mpd_entity_get_type(src) != MPD_ENTITY_TYPE_SONG) + { + mpd_entity_free(src); + src = mpd_recv_entity(state.connection()); + } + if (src != nullptr) + { + state.setObject(mpd_song_dup(mpd_entity_get_song(src))); + mpd_entity_free(src); + return true; + } + else + return false; +} + bool fetchPlaylist(MPD::PlaylistIterator::State &state) { auto src = mpd_recv_playlist(state.connection()); @@ -737,12 +755,12 @@ ItemIterator Connection::GetDirectory(const std::string &directory) return ItemIterator(m_connection.get(), fetchItem); } -ItemIterator Connection::GetDirectoryRecursive(const std::string &directory) +SongIterator Connection::GetDirectoryRecursive(const std::string &directory) { prechecksNoCommandsList(); mpd_send_list_all_meta(m_connection.get(), directory.c_str()); checkErrors(); - return ItemIterator(m_connection.get(), fetchItem); + return SongIterator(m_connection.get(), fetchItemSong); } void Connection::GetDirectories(const std::string &directory, StringConsumer f) diff --git a/src/mpdpp.h b/src/mpdpp.h index 972159c6..9a1b4e5d 100644 --- a/src/mpdpp.h +++ b/src/mpdpp.h @@ -547,7 +547,7 @@ public: PlaylistIterator GetPlaylists(); void GetList(mpd_tag_type type, StringConsumer f); ItemIterator GetDirectory(const std::string &directory); - ItemIterator GetDirectoryRecursive(const std::string &directory); + SongIterator GetDirectoryRecursive(const std::string &directory); SongIterator GetSongs(const std::string &directory); void GetDirectories(const std::string &directory, StringConsumer f); diff --git a/src/search_engine.cpp b/src/search_engine.cpp index c6cb637e..e37abda3 100644 --- a/src/search_engine.cpp +++ b/src/search_engine.cpp @@ -447,17 +447,20 @@ void SearchEngine::Search() MPD::SongList list; if (Config.search_in_db) { - MPD::ItemIterator item = Mpd.GetDirectoryRecursive("/"), end; - for (; item != end; ++item) - if (item->type() != MPD::Item::Type::Song) - list.push_back(std::move(item->song())); + std::copy( + std::make_move_iterator(Mpd.GetDirectoryRecursive("/")), + std::make_move_iterator(MPD::SongIterator()), + std::back_inserter(list) + ); } else + { std::copy( myPlaylist->main().beginV(), myPlaylist->main().endV(), std::back_inserter(list) ); + } bool any_found = 1; bool found = 1;