Six more playlists, selecting by genre and mood rather than by play history.
Mood
Selected on
80s-synths
synthpop, new wave, synthwave — released 1975-1992
high-energy-rock
hard rock, punk, pop punk, alternative
screamo
screamo, post-hardcore, metalcore, emo
drum-and-bass
drum and bass, liquid funk, neurofunk, jungle
dance
house, big room, hardstyle, trance, dubstep
classic-rock
classic rock, prog, psychedelic, blues rock
Chosen for this library, not as a general taxonomy.
Last.fm tags, not MusicBrainz genres
MusicBrainz genres arrive free with the Lidarr index, which makes them the
obvious choice and the wrong one. They are sparse and formal, and will not tell
you a record is screamo or synthwave. Crowd tags will, because people typed
them.
Cost is one artist.getTopTags per library artist — 694 here — by MusicBrainz
id where Lidarr has one, refreshed every ninety days. --tag-limit spreads the
first sweep over several passes if you would rather not pay it in one.
An artist Last.fm has never heard of is recorded as fetched with no tags,
rather than left unmarked, so the pass does not spend a request on it forever.
Two judgement calls
Weights. The documented sample response carries only a name and a URL; a
live response also carries a 0-100 count. I cannot verify which without your
key, so the count is used when present and the documented ordering — by
popularity — stands in when it is not. Both paths are tested.
Threshold. An artist qualifies when their tag weights inside a mood sum to
at least 30. One low-weight tag is not a genre, it is somebody's stray opinion.
Override per mood with min_score.
Defining your own
--vibes replaces the built-in set wholesale, so a new mood needs no release:
Names are validated when the file is read, not when a playlist is written. An
invalid one would otherwise only surface as a file created somewhere
unintended.
Testing
94 tests, green locally and in docker build --target test. New ones cover
both weight paths, a lone tag arriving unwrapped, an unknown artist not being
re-queried, stale tags being refetched, tag selection, the score threshold, the
year window, and five shapes of malformed vibes file.
## Mood playlists
Six more playlists, selecting by genre and mood rather than by play history.
| Mood | Selected on |
| ------------------ | -------------------------------------------------- |
| `80s-synths` | synthpop, new wave, synthwave — released 1975-1992 |
| `high-energy-rock` | hard rock, punk, pop punk, alternative |
| `screamo` | screamo, post-hardcore, metalcore, emo |
| `drum-and-bass` | drum and bass, liquid funk, neurofunk, jungle |
| `dance` | house, big room, hardstyle, trance, dubstep |
| `classic-rock` | classic rock, prog, psychedelic, blues rock |
Chosen for this library, not as a general taxonomy.
## Last.fm tags, not MusicBrainz genres
MusicBrainz genres arrive free with the Lidarr index, which makes them the
obvious choice and the wrong one. They are sparse and formal, and will not tell
you a record is screamo or synthwave. Crowd tags will, because people typed
them.
Cost is one `artist.getTopTags` per library artist — 694 here — by MusicBrainz
id where Lidarr has one, refreshed every ninety days. `--tag-limit` spreads the
first sweep over several passes if you would rather not pay it in one.
An artist Last.fm has never heard of is recorded as fetched **with no tags**,
rather than left unmarked, so the pass does not spend a request on it forever.
## Two judgement calls
**Weights.** The documented sample response carries only a name and a URL; a
live response also carries a 0-100 `count`. I cannot verify which without your
key, so the count is used when present and the documented ordering — by
popularity — stands in when it is not. Both paths are tested.
**Threshold.** An artist qualifies when their tag weights inside a mood sum to
at least 30. One low-weight tag is not a genre, it is somebody's stray opinion.
Override per mood with `min_score`.
## Defining your own
`--vibes` replaces the built-in set wholesale, so a new mood needs no release:
```json
[{ "name": "shoegaze", "tags": ["shoegaze", "dream pop"], "min_score": 40 }]
```
Names are validated when the file is read, not when a playlist is written. An
invalid one would otherwise only surface as a file created somewhere
unintended.
## Testing
94 tests, green locally and in `docker build --target test`. New ones cover
both weight paths, a lone tag arriving unwrapped, an unknown artist not being
re-queried, stale tags being refetched, tag selection, the score threshold, the
year window, and five shapes of malformed vibes file.
A second set of playlists selecting by genre and mood rather than by play
history: eighties synths, high energy rock, screamo, drum and bass, dance,
classic rock.
The tags come from Last.fm rather than MusicBrainz. MusicBrainz genres arrive
free with the Lidarr index, which makes them the obvious choice and the wrong
one: they are sparse and formal, and will not tell you a record is screamo or
synthwave. Crowd tags will, because people typed them.
One request per artist, by MusicBrainz id where Lidarr has one, refreshed every
ninety days. An artist Last.fm has never heard of is recorded as fetched with no
tags rather than left unmarked, so it is not asked about again on every pass
forever. The tag table is keyed on the normalised artist name, not the Lidarr
id, so it survives an artist being removed and re-added there.
Weights are taken from the response's count where it has one. The documented
sample carries only a name and a URL, a live response also carries a 0-100
count, and depending on either alone would be a guess -- so the count is used
when present and the documented ordering by popularity stands in when it is not.
An artist qualifies for a mood when their weights inside it sum to at least
thirty. A single low-weight tag is not a genre, it is somebody's stray opinion.
A mood may also restrict release years, which is what separates eighties synth
records from everything else a synthpop tag drags in.
The built-in set is chosen for this library rather than as a taxonomy, and
--vibes replaces it wholesale with a JSON file so a new mood does not need a new
release. Names are validated when that file is read: an invalid one would
otherwise only surface as a playlist written somewhere unintended.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Mood playlists
Six more playlists, selecting by genre and mood rather than by play history.
80s-synthshigh-energy-rockscreamodrum-and-bassdanceclassic-rockChosen for this library, not as a general taxonomy.
Last.fm tags, not MusicBrainz genres
MusicBrainz genres arrive free with the Lidarr index, which makes them the
obvious choice and the wrong one. They are sparse and formal, and will not tell
you a record is screamo or synthwave. Crowd tags will, because people typed
them.
Cost is one
artist.getTopTagsper library artist — 694 here — by MusicBrainzid where Lidarr has one, refreshed every ninety days.
--tag-limitspreads thefirst sweep over several passes if you would rather not pay it in one.
An artist Last.fm has never heard of is recorded as fetched with no tags,
rather than left unmarked, so the pass does not spend a request on it forever.
Two judgement calls
Weights. The documented sample response carries only a name and a URL; a
live response also carries a 0-100
count. I cannot verify which without yourkey, so the count is used when present and the documented ordering — by
popularity — stands in when it is not. Both paths are tested.
Threshold. An artist qualifies when their tag weights inside a mood sum to
at least 30. One low-weight tag is not a genre, it is somebody's stray opinion.
Override per mood with
min_score.Defining your own
--vibesreplaces the built-in set wholesale, so a new mood needs no release:Names are validated when the file is read, not when a playlist is written. An
invalid one would otherwise only surface as a file created somewhere
unintended.
Testing
94 tests, green locally and in
docker build --target test. New ones coverboth weight paths, a lone tag arriving unwrapped, an unknown artist not being
re-queried, stale tags being refetched, tag selection, the score threshold, the
year window, and five shapes of malformed vibes file.