release / govulncheck (push) Successful in 21s
release / web (push) Successful in 1m7s
release / go (push) Successful in 1m29s
release / integration (push) Successful in 4m11s
release / Attach APK to the Release (tag releases only) (push) Canceled after 0s
release / Build + push container image (push) Canceled after 0s
release / Verify release artifacts (tag releases only) (push) Canceled after 0s
release / android (push) Canceled after 5m58s
release / Build signed APK (releases and dev) (push) Canceled after 5m59s
A single and the album it is on stay two files, since each fulfils its own
release in Lidarr, but they are one song to the listener.
- tracks.song_id links copies; the generated song_key (song_id, else the
track's own id) is what they share (migration 0076).
- The resolver links each cross-release group every pass (idempotent; only
with auto-resolve on) and, when a link is new, shares existing likes across
the song and logs them for sync.
- A like or unlike (web and Subsonic) reaches every copy; each change is
logged and published so clients update every heart.
- The Liked list and its count show the song once; Shuffle and the mix writer
take one copy per song.
- A merge keeps the removed copy's song link; "Not the same song" on the
Across releases tab dismisses the group and undoes the link.
Shared plays ("heard via another copy") are left for a later step.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
16 lines
899 B
SQL
16 lines
899 B
SQL
-- 0076_track_song_link.up.sql — the same song on several releases counts as
|
|
-- one song (Scribe milestone #498, #5438; operator decision D-b).
|
|
--
|
|
-- A single and the album it came from each hold the song, and Lidarr keeps
|
|
-- both: each fulfils its own release. Minstrel keeps both files and links
|
|
-- them, so a like on one is a like on the song, and a mix or radio picks the
|
|
-- song once rather than once per release.
|
|
--
|
|
-- song_id is set only on a linked track, to the song_key the link chose.
|
|
-- song_key is what everything reads: the track's own id until it is linked.
|
|
-- No foreign key: the track whose id names a song may itself be merged away
|
|
-- later, and the key still groups the copies left.
|
|
ALTER TABLE tracks ADD COLUMN song_id uuid;
|
|
ALTER TABLE tracks ADD COLUMN song_key uuid GENERATED ALWAYS AS (COALESCE(song_id, id)) STORED;
|
|
CREATE INDEX tracks_song_key_idx ON tracks (song_key);
|