Add random_exclude_pattern option for random songs

This commit is contained in:
Laurent Arnoud
2018-12-01 14:55:03 +01:00
parent 20d660177d
commit 69f49d558d
6 changed files with 17 additions and 5 deletions

View File

@@ -34,6 +34,10 @@
# #
#mpd_crossfade_time = 5 #mpd_crossfade_time = 5
# #
# Exclude pattern for random song action
# http://www.boost.org/doc/libs/1_46_1/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html
#random_exclude_pattern = "^(temp|midi_songs).*"
#
##### music visualizer ##### ##### music visualizer #####
## ##
## Note: In order to make music visualizer work you'll need to use mpd fifo ## Note: In order to make music visualizer work you'll need to use mpd fifo

View File

@@ -2208,7 +2208,7 @@ void AddRandomItems::run()
{ {
bool success; bool success;
if (rnd_type == 's') if (rnd_type == 's')
success = Mpd.AddRandomSongs(number, Global::RNG); success = Mpd.AddRandomSongs(number, Config.random_exclude_pattern, Global::RNG);
else else
success = Mpd.AddRandomTag(tag_type, number, Global::RNG); success = Mpd.AddRandomTag(tag_type, number, Global::RNG);
if (success) if (success)

View File

@@ -22,6 +22,7 @@
#include <cstdlib> #include <cstdlib>
#include <algorithm> #include <algorithm>
#include <map> #include <map>
#include <boost/regex.hpp>
#include "charset.h" #include "charset.h"
#include "mpdpp.h" #include "mpdpp.h"
@@ -601,7 +602,7 @@ bool Connection::AddRandomTag(mpd_tag_type tag, size_t number, std::mt19937 &rng
return true; return true;
} }
bool Connection::AddRandomSongs(size_t number, std::mt19937 &rng) bool Connection::AddRandomSongs(size_t number, std::string random_exclude_pattern, std::mt19937 &rng)
{ {
prechecksNoCommandsList(); prechecksNoCommandsList();
std::vector<std::string> files; std::vector<std::string> files;
@@ -625,8 +626,13 @@ bool Connection::AddRandomSongs(size_t number, std::mt19937 &rng)
std::shuffle(files.begin(), files.end(), rng); std::shuffle(files.begin(), files.end(), rng);
StartCommandsList(); StartCommandsList();
auto it = files.begin(); auto it = files.begin();
for (size_t i = 0; i < number && it != files.end(); ++i, ++it) boost::regex re(random_exclude_pattern);
AddSong(*it); for (size_t i = 0; i < number && it != files.end(); ++it) {
if (random_exclude_pattern.empty() || !boost::regex_match((*it), re)) {
AddSong(*it);
i++;
}
}
CommitCommandsList(); CommitCommandsList();
} }
return true; return true;

View File

@@ -546,7 +546,7 @@ struct Connection
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, std::mt19937 &rng); bool AddRandomTag(mpd_tag_type, size_t, std::mt19937 &rng);
bool AddRandomSongs(size_t number, std::mt19937 &rng); bool AddRandomSongs(size_t number, std::string random_exclude_pattern, std::mt19937 &rng);
void Add(const std::string &path); void Add(const std::string &path);
void Delete(unsigned int pos); void Delete(unsigned int pos);
void PlaylistDelete(const std::string &playlist, unsigned int pos); void PlaylistDelete(const std::string &playlist, unsigned int pos);

View File

@@ -275,6 +275,7 @@ bool Configuration::read(const std::vector<std::string> &config_paths, bool igno
p.add("mpd_music_dir", &mpd_music_dir, "~/music", adjust_directory); p.add("mpd_music_dir", &mpd_music_dir, "~/music", adjust_directory);
p.add("mpd_connection_timeout", &mpd_connection_timeout, "5"); p.add("mpd_connection_timeout", &mpd_connection_timeout, "5");
p.add("mpd_crossfade_time", &crossfade_time, "5"); p.add("mpd_crossfade_time", &crossfade_time, "5");
p.add("random_exclude_pattern", &random_exclude_pattern, "");
p.add("visualizer_fifo_path", &visualizer_fifo_path, "/tmp/mpd.fifo", adjust_path); p.add("visualizer_fifo_path", &visualizer_fifo_path, "/tmp/mpd.fifo", adjust_path);
p.add("visualizer_output_name", &visualizer_output_name, "Visualizer feed"); p.add("visualizer_output_name", &visualizer_output_name, "Visualizer feed");
p.add("visualizer_in_stereo", &visualizer_in_stereo, "yes", yes_no); p.add("visualizer_in_stereo", &visualizer_in_stereo, "yes", yes_no);

View File

@@ -178,6 +178,7 @@ struct Configuration
unsigned mpd_connection_timeout; unsigned mpd_connection_timeout;
unsigned crossfade_time; unsigned crossfade_time;
std::string random_exclude_pattern;
unsigned seek_time; unsigned seek_time;
unsigned volume_change_step; unsigned volume_change_step;
unsigned message_delay_time; unsigned message_delay_time;