Skip to content

Commit 30de1fc

Browse files
Merge pull request #1612 from jonstahl/feature/musicmagic-genre-filter
MusicMagic: add genre exclusion filter for MusicIP mixes
2 parents 7a25e01 + dd179a5 commit 30de1fc

6 files changed

Lines changed: 117 additions & 3 deletions

File tree

Slim/Plugin/MusicMagic/ClientSettings.pm

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,20 @@ sub handler {
5050
return undef;
5151
}
5252

53+
my $cprefs = $prefs->client($client);
5354

54-
$params->{'filters'} = Slim::Plugin::MusicMagic::Common->getFilterList();
55+
if ( $params->{'saveSettings'} ) {
56+
57+
my $selected = $params->{'pref_mix_genre_filter'};
58+
my @genres = ref $selected eq 'ARRAY' ? @$selected : (defined $selected ? ($selected) : ());
59+
60+
$cprefs->set('mix_genre_filter', \@genres);
61+
}
62+
63+
$params->{'filters'} = Slim::Plugin::MusicMagic::Common->getFilterList();
64+
$params->{'genre_list'} = Slim::Plugin::MusicMagic::Common::getGenreList();
65+
66+
$params->{'prefs'}->{'pref_mix_genre_filter'} = { map { $_ => 1 } @{ $cprefs->get('mix_genre_filter') || [] } };
5567

5668
return $class->SUPER::handler($client, $params);
5769
}

Slim/Plugin/MusicMagic/Common.pm

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ sub checkDefaults {
6464
mix_style => 20,
6565
mix_variety => 0,
6666
mix_genre => 0,
67+
mix_genre_filter => [],
6768
mix_size => 12,
6869
reject_size => 12,
6970
reject_type => 0,
@@ -74,6 +75,12 @@ sub checkDefaults {
7475
}, 'Slim::Plugin::MusicMagic::Prefs');
7576
}
7677

78+
sub getGenreList {
79+
my @genres = map { $_->name } Slim::Schema->rs('Genre')->search(undef, { order_by => 'me.namesort' })->all;
80+
81+
return \@genres;
82+
}
83+
7784
sub getBaseUrl {
7885
my $host = $prefs->get('host') || 'localhost';
7986
my $port = $prefs->get('port');

Slim/Plugin/MusicMagic/HTML/EN/plugins/MusicMagic/settings/musicmagic.html

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,18 @@
7878
</select>
7979
[% END %]
8080

81+
[% WRAPPER settingGroup title="SETUP_MIX_GENRE_FILTER" desc="SETUP_MIX_GENRE_FILTER_DESC" %]
82+
<select class="stdedit" name="pref_mix_genre_filter" id="mix_genre_filter" multiple="multiple" size="8">
83+
84+
[% FOREACH genre = genre_list %]
85+
86+
<option [% IF prefs.pref_mix_genre_filter.item(genre) %]selected [% END %]value="[% genre | html %]">[% genre | html %]</option>
87+
88+
[%- END -%]
89+
90+
</select>
91+
[% END %]
92+
8193
[% END %]
8294

8395
[% WRAPPER settingSection %]

Slim/Plugin/MusicMagic/Plugin.pm

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -865,6 +865,19 @@ sub getMix {
865865
$args{'filter'} = Slim::Plugin::MusicMagic::Common::escape($filter);
866866
}
867867

868+
my $genreFilter = defined $client ?
869+
($prefs->client($client)->get('mix_genre_filter') || $prefs->get('mix_genre_filter')) :
870+
$prefs->get('mix_genre_filter');
871+
872+
my %genreFilterHash = map { lc($_) => 1 } @{ $genreFilter || [] };
873+
874+
# genre exclusion happens after MusicIP has already picked the mix, so it can leave us
875+
# short of the requested size - ask for extra up front so we've got a top-up pool to draw from
876+
my $requestedSize = $args{'size'};
877+
my $canTopUp = %genreFilterHash && $requestedSize && $args{'sizetype'} eq 'tracks';
878+
879+
$args{'size'} = $requestedSize * 3 if $canTopUp;
880+
868881
my $argString = join( '&', map { "$_=$args{$_}" } keys %args );
869882

870883
if (!$validMixTypes{$for}) {
@@ -920,15 +933,38 @@ sub getMix {
920933
}
921934

922935
if ( -e $songs[$j] || -e Slim::Utils::Unicode::utf8encode_locale($songs[$j]) ) {
923-
push @mix, Slim::Utils::Misc::fileURLFromPath($songs[$j]);
936+
937+
my $url = Slim::Utils::Misc::fileURLFromPath($songs[$j]);
938+
939+
if (%genreFilterHash && _trackHasExcludedGenre($url, \%genreFilterHash)) {
940+
next;
941+
}
942+
943+
push @mix, $url;
924944
} else {
925945
$log->error('MIP attempted to mix in a song at ' . $songs[$j] . ' that can\'t be found at that location');
926946
}
947+
948+
last if $canTopUp && scalar(@mix) >= $requestedSize;
927949
}
928950

929951
return \@mix;
930952
}
931953

954+
sub _trackHasExcludedGenre {
955+
my ($url, $genreFilterHash) = @_;
956+
957+
my $trackObj = Slim::Schema->objectForUrl($url);
958+
959+
return 0 unless blessed($trackObj) && $trackObj->can('genres');
960+
961+
for my $genre ($trackObj->genres) {
962+
return 1 if $genreFilterHash->{lc $genre->name};
963+
}
964+
965+
return 0;
966+
}
967+
932968
sub musicmagic_moods {
933969
my ($client, $params) = @_;
934970

Slim/Plugin/MusicMagic/Settings.pm

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,18 @@ sub handler {
4545
return undef;
4646
}
4747

48-
$params->{'filters'} = Slim::Plugin::MusicMagic::Common->getFilterList();
48+
if ( $params->{'saveSettings'} ) {
49+
50+
my $selected = $params->{'pref_mix_genre_filter'};
51+
my @genres = ref $selected eq 'ARRAY' ? @$selected : (defined $selected ? ($selected) : ());
52+
53+
$prefs->set('mix_genre_filter', \@genres);
54+
}
55+
56+
$params->{'filters'} = Slim::Plugin::MusicMagic::Common->getFilterList();
57+
$params->{'genre_list'} = Slim::Plugin::MusicMagic::Common::getGenreList();
58+
59+
$params->{'prefs'}->{'pref_mix_genre_filter'} = { map { $_ => 1 } @{ $prefs->get('mix_genre_filter') || [] } };
4960

5061
return $class->SUPER::handler($client, $params);
5162
}

Slim/Plugin/MusicMagic/strings.txt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,42 @@ SETUP_MIX_FILTER_DESC
158158
SV Du kan skapa olika uppsättningar filtervilkor i MusicIP och sedan använda dem med MusicIP Mix i Lyrion Music Server. Välj filter i listan.
159159
ZH_CN 您可以利用MusicIP设立过滤器,并且从这表中选择应用在Lyrion Music Server内MusicIP混音的那些过滤器。
160160

161+
SETUP_MIX_GENRE_FILTER
162+
CS Vyloučené žánry
163+
DA Udelukkede genrer
164+
DE Ausgeschlossene Musikstile
165+
EN Excluded Genres
166+
ES Géneros excluidos
167+
FI Poissuljetut genret
168+
FR Genres exclus
169+
HE סגנונות מוחרגים
170+
HU Kizárt műfajok
171+
IT Generi esclusi
172+
NL Uitgesloten genres
173+
NO Ekskluderte sjangre
174+
PL Wykluczone gatunki
175+
RU Исключённые жанры
176+
SV Exkluderade genrer
177+
ZH_CN 排除的曲风
178+
179+
SETUP_MIX_GENRE_FILTER_DESC
180+
CS Vyberte jeden nebo více žánrů z vaší hudební knihovny, které chcete vyloučit z MusicIP mixů. Pokud nevyberete žádný, budou povoleny všechny žánry.
181+
DA Vælg en eller flere genrer fra dit musikbibliotek, som skal udelukkes fra MusicIP-miks. Lad intet være valgt for at tillade alle genrer.
182+
DE Wählen Sie eine oder mehrere Musikstile aus Ihrer Musikbibliothek aus, die aus MusicIP-Mixes ausgeschlossen werden sollen. Wenn nichts ausgewählt ist, sind alle Musikstile zulässig.
183+
EN Select one or more genres from your music library to exclude from MusicIP Mixes. Leave nothing selected to allow all genres.
184+
ES Seleccione uno o más géneros de su biblioteca musical para excluirlos de las mezclas de MusicIP. Si no selecciona ninguno, se permitirán todos los géneros.
185+
FI Valitse musiikkikirjastostasi yksi tai useampi genre, jotka suljetaan pois MusicIP-mikseistä. Jos et valitse mitään, kaikki genret ovat sallittuja.
186+
FR Sélectionnez un ou plusieurs genres de votre bibliothèque musicale à exclure des mix MusicIP. Ne sélectionnez rien pour autoriser tous les genres.
187+
HE בחר סגנון אחד או יותר מספריית המוזיקה שלך שיוחרגו ממיקסים של MusicIP. אם לא תבחר דבר, כל הסגנונות יהיו מותרים.
188+
HU Válasszon ki egy vagy több műfajt a zenei könyvtárából, amelyeket ki szeretne zárni a MusicIP-keverékekből. Ha nem választ ki semmit, minden műfaj engedélyezett lesz.
189+
IT Selezionare uno o più generi dalla libreria musicale da escludere dalle raccolte MusicIP. Se non si seleziona nulla, saranno consentiti tutti i generi.
190+
NL Selecteer een of meer genres uit je muziekbibliotheek die je wilt uitsluiten van MusicIP-mixen. Als je niets selecteert, zijn alle genres toegestaan.
191+
NO Velg én eller flere sjangre fra musikkbiblioteket ditt som skal ekskluderes fra MusicIP-mikser. La ingenting være valgt for å tillate alle sjangre.
192+
PL Wybierz jeden lub kilka gatunków z biblioteki muzycznej, które mają być wykluczone ze składanek MusicIP. Jeśli nic nie zostanie wybrane, dozwolone będą wszystkie gatunki.
193+
RU Выберите один или несколько жанров из вашей музыкальной библиотеки, которые нужно исключить из миксов MusicIP. Если ничего не выбрано, разрешены все жанры.
194+
SV Välj en eller flera genrer från ditt musikbibliotek som ska exkluderas från MusicIP-mix. Lämna inget markerat om du vill tillåta alla genrer.
195+
ZH_CN 从您的音乐库中选择一个或多个要从MusicIP混音中排除的曲风。如果不选择任何曲风,则允许所有曲风。
196+
161197
SETUP_MIX_GENRE
162198
CS Mix žánru
163199
DA Miks: Genre

0 commit comments

Comments
 (0)