add support for adding random artists/albums to playlist
This commit is contained in:
@@ -125,6 +125,8 @@ mpd_tag_type IntoTagItem(char c)
|
|||||||
{
|
{
|
||||||
case 'a':
|
case 'a':
|
||||||
return MPD_TAG_ARTIST;
|
return MPD_TAG_ARTIST;
|
||||||
|
case 'b':
|
||||||
|
return MPD_TAG_ALBUM;
|
||||||
case 'y':
|
case 'y':
|
||||||
return MPD_TAG_DATE;
|
return MPD_TAG_DATE;
|
||||||
case 'g':
|
case 'g':
|
||||||
|
|||||||
@@ -864,6 +864,41 @@ void MPD::Connection::Add(const std::string &path)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MPD::Connection::AddRandomTag(mpd_tag_type tag, size_t number)
|
||||||
|
{
|
||||||
|
if (!itsConnection && !number)
|
||||||
|
return false;
|
||||||
|
assert(!isCommandsListEnabled);
|
||||||
|
|
||||||
|
TagList tags;
|
||||||
|
GetList(tags, tag);
|
||||||
|
|
||||||
|
if (number > tags.size())
|
||||||
|
{
|
||||||
|
if (itsErrorHandler)
|
||||||
|
itsErrorHandler(this, 0, "Requested number is out of range!", itsErrorHandlerUserdata);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
srand(time(0));
|
||||||
|
std::random_shuffle(tags.begin(), tags.end());
|
||||||
|
TagList::const_iterator it = tags.begin()+rand()%(tags.size()-number);
|
||||||
|
for (size_t i = 0; i < number && it != tags.end(); ++i)
|
||||||
|
{
|
||||||
|
StartSearch(1);
|
||||||
|
AddSearch(tag, *it++);
|
||||||
|
SongList list;
|
||||||
|
CommitSearch(list);
|
||||||
|
StartCommandsList();
|
||||||
|
for (SongList::const_iterator j = list.begin(); j != list.end(); ++j)
|
||||||
|
AddSong(**j);
|
||||||
|
CommitCommandsList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool MPD::Connection::AddRandomSongs(size_t number)
|
bool MPD::Connection::AddRandomSongs(size_t number)
|
||||||
{
|
{
|
||||||
if (!itsConnection && !number)
|
if (!itsConnection && !number)
|
||||||
|
|||||||
@@ -173,6 +173,7 @@ namespace MPD
|
|||||||
|
|
||||||
int AddSong(const std::string &, int = -1); // returns id of added song
|
int AddSong(const std::string &, int = -1); // returns id of added song
|
||||||
int AddSong(const Song &, int = -1); // returns id of added song
|
int AddSong(const Song &, int = -1); // returns id of added song
|
||||||
|
bool AddRandomTag(mpd_tag_type, size_t);
|
||||||
bool AddRandomSongs(size_t);
|
bool AddRandomSongs(size_t);
|
||||||
void Add(const std::string &path);
|
void Add(const std::string &path);
|
||||||
bool Delete(unsigned);
|
bool Delete(unsigned);
|
||||||
|
|||||||
@@ -1844,11 +1844,27 @@ int main(int argc, char *argv[])
|
|||||||
if (myScreen == myPlaylist)
|
if (myScreen == myPlaylist)
|
||||||
{
|
{
|
||||||
LockStatusbar();
|
LockStatusbar();
|
||||||
Statusbar() << "Number of random songs: ";
|
Statusbar() << "Add random ? [" << fmtBold << 's' << fmtBoldEnd << "ongs/" << fmtBold << 'a' << fmtBoldEnd << "rtists/al" << fmtBold << 'b' << fmtBoldEnd << "ums] ";
|
||||||
|
wFooter->Refresh();
|
||||||
|
int answer = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
TraceMpdStatus();
|
||||||
|
wFooter->ReadKey(answer);
|
||||||
|
}
|
||||||
|
while (answer != 's' && answer != 'a' && answer != 'b');
|
||||||
|
UnlockStatusbar();
|
||||||
|
|
||||||
|
mpd_tag_type tag_type = IntoTagItem(answer);
|
||||||
|
std::string tag_type_str = answer == 's' ? "song" : IntoStr(tag_type);
|
||||||
|
ToLower(tag_type_str);
|
||||||
|
|
||||||
|
LockStatusbar();
|
||||||
|
Statusbar() << "Number of random " << tag_type_str << "s: ";
|
||||||
size_t number = StrToLong(wFooter->GetString());
|
size_t number = StrToLong(wFooter->GetString());
|
||||||
UnlockStatusbar();
|
UnlockStatusbar();
|
||||||
if (number && Mpd.AddRandomSongs(number))
|
if (number && (answer == 's' ? Mpd.AddRandomSongs(number) : Mpd.AddRandomTag(tag_type, number)))
|
||||||
ShowMessage("%zu random song%s added to playlist!", number, number == 1 ? "" : "s");
|
ShowMessage("%zu random %s%s added to playlist!", number, tag_type_str.c_str(), number == 1 ? "" : "s");
|
||||||
}
|
}
|
||||||
else if (myScreen == myBrowser && !myBrowser->isLocal())
|
else if (myScreen == myBrowser && !myBrowser->isLocal())
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user