Music metadata is entirely absent: MusicBrainz and AudioDb are both in the box upstream #109
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Four remote providers and two image providers upstream, none here:
MusicBrainzAlbumProvider,MusicBrainzArtistProvider— the identity layer. They resolve an album or an artist to an MBID, which is what everything downstream keys on, and they are the reason two rips of one album merge rather than becoming two albums.AudioDbAlbumProvider,AudioDbArtistProvider— the descriptive layer: biography, album review, year, genre.AudioDbAlbumImageProvider,AudioDbArtistImageProvider— cover art and artist images, which is what a music library looks like at all.Today a music library here has whatever the tags carry and whatever
folder.jpgsits beside it. Given that music is one of the three collection types this server scans, that is the largest single-library-kind gap in the project.MusicBrainz has a rate limit upstream honours (one request a second, and a configurable server) — worth porting deliberately rather than discovering, and worth recording in the cassette so the replay does not depend on it.
ListenBrainzis in the same directory upstream and is not a metadata provider — it is a listen-submission plugin with a similar-artist provider attached. Out of scope with the rest of the plugin ecosystem.Where to start
Six upstream providers, none written here:
MediaBrowser.Providers/Plugins/MusicBrainz/{MusicBrainzAlbumProvider,MusicBrainzArtistProvider}.csand
MediaBrowser.Providers/Plugins/AudioDb/(album, artist, and the two imageproviders).
Order matters here more than anywhere else: MusicBrainz is the identity
layer. It resolves an album or an artist to an MBID, and everything downstream
— AudioDb included — keys on that. It is also why two rips of one album merge
instead of becoming two albums.
Three things to port deliberately rather than discover:
configurable server). Record it in the cassette so a replay does not depend on
the network's manners.
skip because the fixture names ids.
the by-name work in
crates/jellyfin-app/src/scan/by_name.rsalready hasopinions about this and they have to agree.
The fixture needs an album that can be identified; today's music library is
thin, which is also why #91's
albumIds/artistIdsare untested.How to know it is done
An album and an artist scanned here carry what upstream fetched into the
enriched snapshot, MBIDs included, and the cover art matches on bytes. Then the
music pages in the pinned bundle render like upstream's — that last part is the
point of the whole issue and no diff reports it.
House rules
CLAUDE.mdis the short version and these are the parts that bite: tests rununder
cargo nextest; upstream's source is the checkout inupstream/at thepin (
v12.0-rc5,6d501ba4) and not the clone beside the repository;generated files are regenerated rather than edited; a comment says what the code
does, not how it got there; and
Dnreferences stay out of code and comments.ARCHITECTURE.mddecides which crate a thing goes in and which dependency edgesare illegal,
DECISIONS.mdsays why a rule exists.The reference pair is
cargo xtask reference up(andreference provision,which is idempotent); a run is
cargo run -p jellyfin-harness -- replay --upstream URL --ours URL --scenario FILE --out DIR,with
diff-dbfor the two databases.crates/jellyfin-harness/README.mdsayswhat a diff means and what an ignore entry has to carry — every entry needs a
reason and an expiry milestone, and an adds-only history is the smell the risk
table names.
Landed on
mainwith batch E (6c9c399..d83f1ca).Measured the three ways this issue asks for: the cassette regenerated beside
the answer key, an offline chain test against the rows upstream wrote, and
artwork compared on the digest rather than on dimensions. The recording is now
crates/jellyfin-app/corpus/fetched.json— one file for all four databases,argued in D35.
A review round ran over the batch. Seven findings were fixed in
d83f1ca; whatsurvived is filed as #154, #155 and #156.