From c51f5755f3d5655f4059bbfec73ca3561089f230 Mon Sep 17 00:00:00 2001 From: J0J0 Todos Date: Wed, 24 Jun 2026 07:54:37 +0200 Subject: [PATCH] lastgenre: Whitelist/Tree fixes; Default aliases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fixes some inconsistencies in spelling in the data files we ship with the plugin as well as adds some new genres to both files that seem to be returned often by last.fm. - For some changes the default aliases feature helps to streamline inconsistencies that come from last.fm already. - The default aliases file that ships with beets - Tests fixes that prove that most of the alias normalization patterns work as they are supposed to. Co-authored-by: Šarūnas Nejus --- beetsplug/lastgenre/aliases.yaml | 72 ++++++++++++++++++++++++++++ beetsplug/lastgenre/genres-tree.yaml | 24 ++++++---- beetsplug/lastgenre/genres.txt | 44 ++++++++++++----- test/plugins/test_lastgenre.py | 35 ++++++++++---- 4 files changed, 146 insertions(+), 29 deletions(-) create mode 100644 beetsplug/lastgenre/aliases.yaml diff --git a/beetsplug/lastgenre/aliases.yaml b/beetsplug/lastgenre/aliases.yaml new file mode 100644 index 000000000..a76c4f099 --- /dev/null +++ b/beetsplug/lastgenre/aliases.yaml @@ -0,0 +1,72 @@ +# Ampersands / Delimiters +drum and bass: + - d(rum)?[ &n/]*b(ass)? +r&b: + - r(hythm)?[ &n/]*b(lues)? +rock and roll: + - rock[- ‐'&n/]*roll + +# Hyphenation +\1-\2: + - ([ckj])[- ]*(pop) + - (j)[- ]*(rock) + - (post)[- ]*(\w+) + - (g?lo)[- ]*(fi) + - ([pg])[- ]*(funk) + - (synth)[- ]*(pop) +avant-garde: + - avant[- ]*(garde?)? + +# Adding space +\1 \2: + - (nu)[ -]*(disco|jazz|metal|soul) + - (dark)[ -]*(wave) + - (blues|folk|indie|gothic|progressive|alternative|punk)[ -]*(rock) + - (ska)[ -]*(jazz) + - (synth)[- ]*(funk) + - (glitch|hip|trip)y?(?:[ -]*hip)?[ -]*(hop) + +# Removing delimiters +\1\2: + - (synth)[- ]*(wave) + - (psy)[ -]*(trance) + - (chill)[ -]*(out) + +# Old School spellings: old-school death metal, oldschool hip-hop, old-skool-jungle/-hardcore +old school death metal: + - old[ -]*(?:school|skool)[ -]+death[ -]*metal +old school hip hop: + - old[ -]*(?:school|skool)[ -]+hip[ -]*hop +old school \1: + - old[ -]*(?:school|skool)[ -]+(\w+) + +# Terminology / Synonyms +electronic: + - electronic music +world music: + - world +downtempo: + - down[ -]*beat +shoegaze: + - shoegaz(e?r?|ing) +footwork: + - (chicago )?footwork( music)? +juke: + - (chicago )?juke( music| house)? + +# Compound genres +alternative rock: + - alt[ -]*rock +# negative lookahead avoids matching 'gothic metal' +gothic rock: + - goth(?!ic)([ -]*rock)? +# avoids matching 'progressive metal' +progressive rock: + - prog([ -]*rock)? +punk rock: + - punk +# psy folk, psych-pop, psychedelic-rock, psychedelic soul, but not psychedelic (standalone) +psychedelic \1: + - psy(?:ch(?:edelic)?)?[ -]*(folk|pop|rock|soul) +dixieland: + - dixieland[ -]*jazz diff --git a/beetsplug/lastgenre/genres-tree.yaml b/beetsplug/lastgenre/genres-tree.yaml index d7acfbc1f..d97568b21 100644 --- a/beetsplug/lastgenre/genres-tree.yaml +++ b/beetsplug/lastgenre/genres-tree.yaml @@ -257,6 +257,7 @@ - broken beat - florida breaks - nu skool breaks + - breaks - chiptune: - bitpop - game boy music @@ -268,12 +269,12 @@ - disco polo - euro disco - italo disco - - nu-disco + - nu disco - space disco - downtempo: - acid jazz - balearic beat - - chill out + - chillout - dub music - dubtronica - ethnic electronica @@ -293,7 +294,7 @@ - jungle: - darkside jungle - ragga jungle - - oldschool jungle + - old school jungle - raggacore - sambass - techstep @@ -327,7 +328,7 @@ - indietronica - new rave - space rock - - synthpop + - synth-pop - synthpunk - electronica: - berlin school @@ -358,6 +359,7 @@ - happy hardcore - hardstyle - jumpstyle + - old school hardcore - makina - speedcore - terrorcore @@ -426,6 +428,7 @@ - dub techno - free tekno - ghettotech + - industrial techno - minimal - nortec - schranz @@ -437,9 +440,10 @@ - acid trance - classic trance - dream trance - - goa trance: + - psytrance: - dark psytrance - full on + - goa trance - psybreaks - psyprog - suomisaundi @@ -492,8 +496,8 @@ - gangsta rap - glitch hop - golden age hip hop + - hardcore hip hop - hip hop soul - - hip pop - hyphy - industrial hip hop - instrumental hip hop @@ -620,11 +624,13 @@ - turkish pop - vispop - wonky pop -- rhythm and blues: +- r&b: - funk: - deep funk - go-go - p-funk + - synth funk + - minneapolis sound - soul: - blue-eyed soul - neo soul @@ -670,6 +676,7 @@ - death/doom - goregrind - melodic death metal + - old school death metal - technical death metal - doom metal: - epic doom metal @@ -708,6 +715,7 @@ - traditional heavy metal - math rock - new wave: + - synthwave - world fusion - paisley underground - pop rock @@ -786,7 +794,7 @@ - chanson - canción de autor - nueva canción -- world: +- world music: - world dub - world fusion - worldbeat diff --git a/beetsplug/lastgenre/genres.txt b/beetsplug/lastgenre/genres.txt index 571b6f350..c13bf5399 100644 --- a/beetsplug/lastgenre/genres.txt +++ b/beetsplug/lastgenre/genres.txt @@ -1,5 +1,5 @@ 2 tone -2-step garage +2-step 4-beat 4x4 garage 8-bit @@ -12,10 +12,12 @@ acid rock acoustic music acousticana adult contemporary music +african african popular music african rumba afrobeat aleatoric music +alternative alternative country alternative dance alternative hip hop @@ -112,7 +114,7 @@ blue-eyed soul bluegrass blues blues ballad -blues-rock +blues rock boogie boogie woogie boogie-woogie @@ -123,6 +125,7 @@ brazilian jazz breakbeat breakbeat hardcore breakcore +breaks breton music brill building pop britfunk @@ -227,6 +230,7 @@ chicano rap chicha chicken scratch children's music +chill chillout chillwave chimurenga @@ -234,6 +238,7 @@ chinese music chinese pop chinese rock chip music +chiptune cho-kantrum chongak chopera @@ -336,7 +341,6 @@ dabka dadra daina dalauna -dance dance music dance-pop dance-punk @@ -349,10 +353,10 @@ danza danzón dark ambient dark cabaret +dark wave dark pop darkcore darkstep -darkwave de ascultat la servici de codru de dragoste @@ -395,7 +399,6 @@ disney pop diva house divine rock dixieland -dixieland jazz djambadon djent dodompa @@ -415,6 +418,7 @@ drone metal drone music dronology drum and bass +drumfunk dub dub house dubanguthu @@ -497,6 +501,7 @@ folk pop folk punk folk rock folktronica +footwork forró franco-country freak-folk @@ -518,6 +523,7 @@ full on funaná funeral doom funk +funk / soul funk metal funk rock funkcore @@ -679,6 +685,7 @@ impressionist music improvisational incidental music indian pop +indie indie folk indie music indie pop @@ -688,12 +695,13 @@ indo jazz indo rock indonesian pop indoyíftika +industrial industrial death metal industrial hip hop industrial metal -industrial music industrial musical industrial rock +industrial techno instrumental rock intelligent dance music international latin @@ -755,6 +763,8 @@ jtek jug band jujitsu juju +juke +juke/footwork juke joint blues jump blues jumpstyle @@ -968,6 +978,7 @@ min'yo mineras mini compas mini-jazz +minimal minimal techno minimalist music minimalist trance @@ -1063,7 +1074,7 @@ nintendocore nisiótika no wave noh -noise music +noise noise pop noise rock nongak @@ -1074,6 +1085,7 @@ nortec norteño northern soul nota +nu disco nu jazz nu metal nu soul @@ -1083,7 +1095,10 @@ nyatiti néo kýma obscuro oi! +old school death metal +old school hardcore old school hip hop +old school jungle old-time oldies olonkho @@ -1190,11 +1205,13 @@ progressive trance progressive thrash metal protopunk psych folk +psychedelic folk psychedelic music psychedelic pop psychedelic rock -psychedelic trance +psychedelic soul psychobilly +psytrance punk blues punk cabaret punk jazz @@ -1249,8 +1266,7 @@ renaissance music requiem rhapsody rhyming spiritual -rhythm & blues -rhythm and blues +r&b ricercar riot grrrl rock @@ -1314,6 +1330,7 @@ shabad shalako shan'ge shango +shangaan electro shape note shibuya-kei shidaiqu @@ -1328,8 +1345,10 @@ sica siguiriyas silat sinawi +singer-songwriter situational ska +ska jazz ska punk skacore skald @@ -1406,9 +1425,11 @@ symphonic metal symphonic poem symphonic rock symphony +synth-pop +synth funk synthcore -synthpop synthpunk +synthwave t'ong guitar taarab tai tu @@ -1454,6 +1475,7 @@ tinga tinku toeshey togaku +trad trad jazz traditional bluegrass traditional heavy metal diff --git a/test/plugins/test_lastgenre.py b/test/plugins/test_lastgenre.py index 5c1e19f04..32eca9294 100644 --- a/test/plugins/test_lastgenre.py +++ b/test/plugins/test_lastgenre.py @@ -1039,17 +1039,20 @@ class TestAliases: [ ("dnb", "drum and bass"), ("drum n bass", "drum and bass"), - ("r&b", "rhythm and blues"), - ("rnb", "rhythm and blues"), + ("r&b", "r&b"), + ("rnb", "r&b"), ("rock & roll", "rock and roll"), ("rock'n'roll", "rock and roll"), ("kpop", "k-pop"), + ("k -pop", "k-pop"), ("j rock", "j-rock"), ("post rock", "post-rock"), ("lofi", "lo-fi"), ("lo fi", "lo-fi"), ("p funk", "p-funk"), - ("synth pop", "synthpop"), + ("synth funk", "synth funk"), + ("synth pop", "synth-pop"), + ("synth-wave", "synthwave"), ("avantgarde", "avant-garde"), ("avant gard", "avant-garde"), ("nu-jazz", "nu jazz"), @@ -1059,11 +1062,11 @@ class TestAliases: ("nu - disco", "nu disco"), ("electronic music", "electronic"), ("world", "world music"), - ("chill", "chillout"), + ("chill", "chill"), ("chill out", "chillout"), ("chill-out", "chillout"), - ("dark wave", "darkwave"), - ("dark-wave", "darkwave"), + ("dark wave", "dark wave"), + ("dark-wave", "dark wave"), ("blues rock", "blues rock"), ("blues-rock", "blues rock"), ("folk-rock", "folk rock"), @@ -1072,17 +1075,29 @@ class TestAliases: ("shoegazing", "shoegaze"), ("hip-hop", "hip hop"), ("triphop", "trip hop"), - ("alt", "alternative rock"), + ("punk", "punk rock"), + ("alt", "alt"), ("alt rock", "alternative rock"), - ("alternative", "alternative rock"), + ("alternative", "alternative"), ("goth", "gothic rock"), ("goth rock", "gothic rock"), ("gothic rock", "gothic rock"), ("prog", "progressive rock"), ("prog rock", "progressive rock"), ("progressive rock", "progressive rock"), - ("trad", "traditional folk"), - ("traditional", "traditional folk"), + ("trad", "trad"), + ("traditional", "traditional"), + ("indie", "indie"), + ("indie rock", "indie rock"), + ("juke/footwork", "juke/footwork"), + ("Funk / Soul", "funk / soul"), + ("psy-trance", "psytrance"), + ("psy rock", "psychedelic rock"), + ("psych-pop", "psychedelic pop"), + ("disney", "disney"), + ("old-school death-metal", "old school death metal"), + ("old-skool-hip-hop", "old school hip hop"), + ("old school-jungle", "old school jungle"), ], ) def test_default_alias_patterns(self, config, input_genre, expected_genre):