feat: rebuild the moods from the library's measured tag distribution
Build and publish container / build (pull_request) Successful in 2m40s
Build and publish container / build (pull_request) Successful in 2m40s
The first set of moods was guessed at, and a tag census of the real library shows how badly. Four tags in the dance mood -- edm, big room, hardstyle, electronic dance music -- carry nothing whatsoever, while techno, electro, big beat, rave and progressive house together carry over seven thousand plays and were all absent. The drum and bass mood missed four of the six spellings the taggers actually use, plus techstep, darkstep and hospital records. The eighties mood was the worst of it. It leaned on the bare `80s` tag, which is the eleventh most-played tag here and sits on Def Leppard, Bon Jovi and AC/DC rather than on anything with a synthesiser in it. Removing it and adding a hair-metal mood -- glam rock, hair metal, glam metal, arena rock, AOR, windowed to 1975-1994 -- puts roughly eight thousand plays somewhere sensible and stops the synth playlist being a stadium rock playlist. Whole clusters had no mood at all: metal at around twenty-five thousand plays across heavy, thrash, speed, power, death and NWOBHM, and pop punk and emo at a similar figure. Both now exist, along with bass, nu-metal and indie. Three kinds of tag are excluded on principle, with a test enforcing it, because each produces a playlist that looks reasonable and is not. Nationality describes a passport rather than a sound, and `american` alone spans 241 artists. `rock` and `electronic` span 340 and 275, which is most of the collection. And Last.fm's most popular tag for an artist is frequently the artist's own name, so selecting on `green day` yields a Green Day playlist wearing a genre's clothes.
This commit is contained in:
@@ -1198,3 +1198,37 @@ def test_a_real_failure_is_not_recorded_so_the_next_pass_retries(tmp_path):
|
||||
|
||||
# One artist failed hard and must still be pending.
|
||||
assert store.scalar("SELECT COUNT(*) FROM artist_tag_fetched") == 1
|
||||
|
||||
|
||||
# Tags that carry real weight in a real library, against tags that describe a
|
||||
# passport, span most of the collection, or are somebody's artist name.
|
||||
USELESS_TAGS = {
|
||||
"american", "british", "australian", "canadian", "swedish", "dutch", "german",
|
||||
"scottish", "english", "uk", "usa", "canada",
|
||||
"rock", "electronic", "pop", "alternative", "metal ", "all", "heavy",
|
||||
"female vocalists", "male vocalists", "female vocalist",
|
||||
"my top songs", "cover", "covers", "not emo",
|
||||
"green day", "paramore", "queen", "bon jovi", "shinedown", "aerosmith",
|
||||
"journey", "fleetwood mac",
|
||||
}
|
||||
|
||||
|
||||
def test_no_mood_selects_on_a_useless_tag():
|
||||
"""Nationality is not a sound; `rock` and `electronic` span most of the
|
||||
library; and Last.fm's top tag for an artist is often their own name."""
|
||||
for vibe in music_curator.DEFAULT_VIBES:
|
||||
overlap = {tag.casefold() for tag in vibe["tags"]} & USELESS_TAGS
|
||||
assert not overlap, f"{vibe['name']} selects on {overlap}"
|
||||
|
||||
|
||||
def test_mood_names_are_unique():
|
||||
names = [vibe["name"] for vibe in music_curator.DEFAULT_VIBES]
|
||||
assert len(names) == len(set(names))
|
||||
|
||||
|
||||
def test_the_eighties_mood_does_not_lean_on_the_bare_decade_tag():
|
||||
"""In this library `80s` sits on Def Leppard and Bon Jovi, not on
|
||||
synthesisers. The hair-metal mood is where those belong."""
|
||||
synths = next(v for v in music_curator.DEFAULT_VIBES if v["name"] == "80s-synths")
|
||||
assert "80s" not in synths["tags"]
|
||||
assert synths["years"] == [1975, 1992]
|
||||
|
||||
Reference in New Issue
Block a user