mpd: make GetRecursiveDirectory return SongIterator

master
Andrzej Rybczak 12 years ago
parent afa8a34340
commit e5b0c7a357
  1. 12
      src/browser.cpp
  2. 30
      src/media_library.cpp
  3. 22
      src/mpdpp.cpp
  4. 2
      src/mpdpp.h
  5. 11
      src/search_engine.cpp

@ -346,16 +346,14 @@ MPD::SongList Browser::getSelectedSongs()
{ {
case MPD::Item::Type::Directory: case MPD::Item::Type::Directory:
if (m_local_browser) if (m_local_browser)
{
MPD::ItemList items;
getLocalDirectoryRecursively(songs, item.directory().path()); getLocalDirectoryRecursively(songs, item.directory().path());
}
else else
{ {
MPD::ItemIterator it = Mpd.GetDirectoryRecursive(item.directory().path()), end; std::copy(
for (; it != end; ++it) std::make_move_iterator(Mpd.GetDirectoryRecursive(item.directory().path())),
if (it->type() == MPD::Item::Type::Song) std::make_move_iterator(MPD::SongIterator()),
songs.push_back(std::move(it->song())); std::back_inserter(songs)
);
} }
break; break;
case MPD::Item::Type::Song: case MPD::Item::Type::Song:

@ -259,24 +259,20 @@ void MediaLibrary::update()
Albums.clearSearchResults(); Albums.clearSearchResults();
m_albums_update_request = false; m_albums_update_request = false;
std::map<std::tuple<std::string, std::string, std::string>, time_t> albums; std::map<std::tuple<std::string, std::string, std::string>, time_t> albums;
MPD::ItemIterator item = Mpd.GetDirectoryRecursive("/"), end; for (MPD::SongIterator s = Mpd.GetDirectoryRecursive("/"), end; s != end; ++s)
for (; item != end; ++item)
{ {
if (item->type() != MPD::Item::Type::Song)
continue;
unsigned idx = 0; 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 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); auto it = albums.find(key);
if (it == albums.end()) if (it == albums.end())
albums[key] = s.getMTime(); albums[key] = s->getMTime();
else 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]() { withUnfilteredMenuReapplyFilter(Albums, [this, &albums]() {
size_t idx = 0; size_t idx = 0;
@ -308,23 +304,19 @@ void MediaLibrary::update()
std::map<std::string, time_t> tags; std::map<std::string, time_t> tags;
if (Config.media_library_sort_by_mtime) if (Config.media_library_sort_by_mtime)
{ {
MPD::ItemIterator item = Mpd.GetDirectoryRecursive("/"), end; for (MPD::SongIterator s = Mpd.GetDirectoryRecursive("/"), end; s != end; ++s)
for (; item != end; ++item)
{ {
if (item->type() != MPD::Item::Type::Song)
continue;
unsigned idx = 0; 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 do
{ {
auto it = tags.find(tag); auto it = tags.find(tag);
if (it == tags.end()) if (it == tags.end())
tags[tag] = s.getMTime(); tags[tag] = s->getMTime();
else 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 else

@ -43,6 +43,24 @@ bool fetchItem(MPD::ItemIterator::State &state)
return false; 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) bool fetchPlaylist(MPD::PlaylistIterator::State &state)
{ {
auto src = mpd_recv_playlist(state.connection()); auto src = mpd_recv_playlist(state.connection());
@ -737,12 +755,12 @@ ItemIterator Connection::GetDirectory(const std::string &directory)
return ItemIterator(m_connection.get(), fetchItem); return ItemIterator(m_connection.get(), fetchItem);
} }
ItemIterator Connection::GetDirectoryRecursive(const std::string &directory) SongIterator Connection::GetDirectoryRecursive(const std::string &directory)
{ {
prechecksNoCommandsList(); prechecksNoCommandsList();
mpd_send_list_all_meta(m_connection.get(), directory.c_str()); mpd_send_list_all_meta(m_connection.get(), directory.c_str());
checkErrors(); checkErrors();
return ItemIterator(m_connection.get(), fetchItem); return SongIterator(m_connection.get(), fetchItemSong);
} }
void Connection::GetDirectories(const std::string &directory, StringConsumer f) void Connection::GetDirectories(const std::string &directory, StringConsumer f)

@ -547,7 +547,7 @@ public:
PlaylistIterator GetPlaylists(); PlaylistIterator GetPlaylists();
void GetList(mpd_tag_type type, StringConsumer f); void GetList(mpd_tag_type type, StringConsumer f);
ItemIterator GetDirectory(const std::string &directory); ItemIterator GetDirectory(const std::string &directory);
ItemIterator GetDirectoryRecursive(const std::string &directory); SongIterator GetDirectoryRecursive(const std::string &directory);
SongIterator GetSongs(const std::string &directory); SongIterator GetSongs(const std::string &directory);
void GetDirectories(const std::string &directory, StringConsumer f); void GetDirectories(const std::string &directory, StringConsumer f);

@ -447,17 +447,20 @@ void SearchEngine::Search()
MPD::SongList list; MPD::SongList list;
if (Config.search_in_db) if (Config.search_in_db)
{ {
MPD::ItemIterator item = Mpd.GetDirectoryRecursive("/"), end; std::copy(
for (; item != end; ++item) std::make_move_iterator(Mpd.GetDirectoryRecursive("/")),
if (item->type() != MPD::Item::Type::Song) std::make_move_iterator(MPD::SongIterator()),
list.push_back(std::move(item->song())); std::back_inserter(list)
);
} }
else else
{
std::copy( std::copy(
myPlaylist->main().beginV(), myPlaylist->main().beginV(),
myPlaylist->main().endV(), myPlaylist->main().endV(),
std::back_inserter(list) std::back_inserter(list)
); );
}
bool any_found = 1; bool any_found = 1;
bool found = 1; bool found = 1;

Loading…
Cancel
Save