From f6d9be350cfce0bc994eeabe056b21ca803238f3 Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Wed, 10 Jun 2009 18:09:58 +0200 Subject: [PATCH] new feature: add local directories recursively --- src/browser.cpp | 71 +++++++++++++++++++++++++++++++------------------ src/browser.h | 3 +-- 2 files changed, 46 insertions(+), 28 deletions(-) diff --git a/src/browser.cpp b/src/browser.cpp index fd60de32..49565e7d 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -177,30 +177,43 @@ void Browser::SpacePressed() if (itsBrowsedDir != "/" && !w->Choice()) break; // do not let add parent dir. + bool everything_was_added = 1; if (Config.local_browser) { - ShowMessage("Adding whole directories from local browser is not supported!"); - break; + ItemList list; + + ShowMessage("Scanning \"%s\"...", item.name.c_str()); + myBrowser->GetLocalDirectory(list, item.name, 1); + + Mpd->StartCommandsList(); + for (ItemList::const_iterator it = list.begin(); it != list.end(); ++it) + { + if (everything_was_added && Mpd->AddSong(*it->song) < 0) + everything_was_added = 0; + delete it->song; + } + Mpd->CommitCommandsList(); } - - SongList list; - Mpd->GetDirectoryRecursive(locale_to_utf_cpy(item.name), list); - - Mpd->StartCommandsList(); - SongList::const_iterator it = list.begin(); - for (; it != list.end(); it++) - if (Mpd->AddSong(**it) < 0) - break; - Mpd->CommitCommandsList(); - - if (it != list.begin()) + else { - ShowMessage("Added folder: %s", item.name.c_str()); - Song &s = myPlaylist->Main()->at(myPlaylist->Main()->Size()-list.size()); - if (s.GetHash() != list[0]->GetHash()) - ShowMessage("%s", MPD::Message::PartOfSongsAdded); + SongList list; + Mpd->GetDirectoryRecursive(locale_to_utf_cpy(item.name), list); + Mpd->StartCommandsList(); + for (SongList::const_iterator it = list.begin(); it != list.end(); it++) + { + if (Mpd->AddSong(**it) < 0) + { + everything_was_added = 0; + break; + } + } + Mpd->CommitCommandsList(); + FreeSongList(list); } - FreeSongList(list); + + if (everything_was_added) + ShowMessage("Added folder: %s", item.name.c_str()); + break; } case itSong: @@ -367,9 +380,9 @@ bool Browser::hasSupportedExtension(const string &file) return false; } -void Browser::GetLocalDirectory(ItemList &v) +void Browser::GetLocalDirectory(ItemList &v, const std::string &directory, bool recursively) const { - DIR *dir = opendir(itsBrowsedDir.c_str()); + DIR *dir = opendir((directory.empty() ? itsBrowsedDir : directory).c_str()); if (!dir) return; @@ -395,16 +408,21 @@ void Browser::GetLocalDirectory(ItemList &v) if (!Config.local_browser_show_hidden_files && file->d_name[0] == '.') continue; Item new_item; - full_path = itsBrowsedDir; + full_path = directory.empty() ? itsBrowsedDir : directory; if (itsBrowsedDir != "/") full_path += "/"; full_path += file->d_name; stat(full_path.c_str(), &file_stat); if (S_ISDIR(file_stat.st_mode)) { - new_item.type = itDirectory; - new_item.name = full_path; - v.push_back(new_item); + if (recursively) + GetLocalDirectory(v, full_path, 1); + else + { + new_item.type = itDirectory; + new_item.name = full_path; + v.push_back(new_item); + } } else if (hasSupportedExtension(file->d_name)) { @@ -412,7 +430,8 @@ void Browser::GetLocalDirectory(ItemList &v) mpd_Song *s = mpd_newSong(); s->file = str_pool_get(full_path.c_str()); # ifdef HAVE_TAGLIB_H - TagEditor::ReadTags(s); + if (!recursively) + TagEditor::ReadTags(s); # endif // HAVE_TAGLIB_H new_item.song = new Song(s); v.push_back(new_item); diff --git a/src/browser.h b/src/browser.h index cb02f79c..1f938770 100644 --- a/src/browser.h +++ b/src/browser.h @@ -53,13 +53,12 @@ class Browser : public Screen< Menu > void LocateSong(const MPD::Song &); void GetDirectory(std::string, std::string = "/"); + void GetLocalDirectory(MPD::ItemList &, const std::string & = "", bool = 0) const; void ClearDirectory(const std::string &) const; void ChangeBrowseMode(); void UpdateItemList(); private: - void GetLocalDirectory(MPD::ItemList &); - static bool hasSupportedExtension(const std::string &); static std::string ItemToString(const MPD::Item &, void *);