From dd266b0103b5cd05e509c209503d46bbcdcc97b0 Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Sun, 24 May 2009 22:30:02 +0200 Subject: [PATCH] new feature: add random songs to playlist --- src/help.cpp | 1 + src/misc.cpp | 5 +++++ src/misc.h | 1 + src/mpdpp.cpp | 37 +++++++++++++++++++++++++++++++++++++ src/mpdpp.h | 1 + src/ncmpcpp.cpp | 15 ++++++++++++++- 6 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/help.cpp b/src/help.cpp index 0cd05f43..af4fd319 100644 --- a/src/help.cpp +++ b/src/help.cpp @@ -191,6 +191,7 @@ void Help::GetKeybindings() *w << " " << fmtBold << "Keys - Playlist screen\n -----------------------------------------\n" << fmtBoldEnd; *w << DisplayKeys(Key.Enter) << "Play\n"; + *w << DisplayKeys(Key.SwitchTagTypeList) << "Add random songs to playlist\n"; *w << DisplayKeys(Key.Delete) << "Delete item/selected items from playlist\n"; *w << DisplayKeys(Key.Clear) << "Clear playlist\n"; *w << DisplayKeys(Key.Crop) << "Clear playlist but hold currently playing/selected items\n"; diff --git a/src/misc.cpp b/src/misc.cpp index b5c543a2..c360a8d7 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -33,6 +33,11 @@ int StrToInt(const std::string &str) return atoi(str.c_str()); } +long StrToLong(const std::string &str) +{ + return atol(str.c_str()); +} + std::string IntoStr(int l) { std::ostringstream ss; diff --git a/src/misc.h b/src/misc.h index c345c347..4653a8e8 100644 --- a/src/misc.h +++ b/src/misc.h @@ -29,6 +29,7 @@ void ToLower(std::string &); int StrToInt(const std::string &); +long StrToLong(const std::string &); std::string IntoStr(int); diff --git a/src/mpdpp.cpp b/src/mpdpp.cpp index a85f763f..0f5e229f 100644 --- a/src/mpdpp.cpp +++ b/src/mpdpp.cpp @@ -18,6 +18,9 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ +#include +#include + #include "charset.h" #include "mpdpp.h" @@ -560,6 +563,40 @@ int Connection::AddSong(const Song &s) return !s.Empty() ? (AddSong((!s.IsFromDB() ? "file://" : "") + (s.Localized() ? locale_to_utf_cpy(s.GetFile()) : s.GetFile()))) : -1; } +bool Connection::AddRandomSongs(size_t number) +{ + if (!isConnected && !number) + return false; + + TagList files; + + mpd_sendListallCommand(itsConnection, "/"); + while (char *file = mpd_getNextTag(itsConnection, MPD_TAG_ITEM_FILENAME)) + { + files.push_back(file); + delete [] file; + } + mpd_finishCommand(itsConnection); + + if (number > files.size()) + { + if (itsErrorHandler) + itsErrorHandler(this, 0, "Requested number of random songs is bigger than size of your library!", itsErrorHandlerUserdata); + return false; + } + else + { + srand(time(0)); + std::random_shuffle(files.begin(), files.end()); + StartCommandsList(); + TagList::const_iterator it = files.begin()+rand()%(files.size()-number); + for (size_t i = 0; i < number && it != files.end(); i++) + AddSong(*it++); + CommitCommandsList(); + } + return true; +} + void Connection::Delete(int pos) const { if (isConnected) diff --git a/src/mpdpp.h b/src/mpdpp.h index 3cbb0750..b4cb374e 100644 --- a/src/mpdpp.h +++ b/src/mpdpp.h @@ -148,6 +148,7 @@ namespace MPD int AddSong(const std::string &); // returns id of added song int AddSong(const Song &); // returns id of added song + bool AddRandomSongs(size_t); void Delete(int) const; void DeleteID(int) const; void Delete(const std::string &, int) const; diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index 669de687..ce2abe23 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -309,6 +309,10 @@ int main(int argc, char *argv[]) { myScreen->Scroll(wUp, Key.Up); } + else if (input == 'v') + { + Mpd->AddRandomSongs(10); + } else if (Keypressed(input, Key.Down)) { myScreen->Scroll(wDown, Key.Down); @@ -1716,7 +1720,16 @@ int main(int argc, char *argv[]) } else if (Keypressed(input, Key.SwitchTagTypeList)) { - if (myScreen == myBrowser) + if (myScreen == myPlaylist) + { + LockStatusbar(); + Statusbar() << "Number of random songs: "; + size_t number = StrToLong(wFooter->GetString()); + UnlockStatusbar(); + if (number && Mpd->AddRandomSongs(number)) + ShowMessage("%lu random song%s added to playlist!", number, number == 1 ? "" : "s"); + } + else if (myScreen == myBrowser) { myBrowser->ChangeBrowseMode(); }