mpd: make GetRecursiveDirectory return SongIterator
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user