Build and publish container / build (pull_request) Successful in 6m37s
Stage four, read-only. An album is cold when it has files, not one of its tracks has ever been scrobbled across the whole nine-year history, and its newest file landed over a year ago. The age floor is measured from the file rather than the release date: what matters is how long a record has been available to play, not how old it is. Album-level rather than track-level. A record with two played tracks is a record that gets played, and picking the other ten off it leaves gaps in an album rather than reclaiming anything worth having. Track file sizes are now indexed so the report can rank by the disk actually recoverable, which is the point of the exercise. That needed a column on a table that already exists, so the store gained an in-place column migration; a full rebuild would mean re-downloading sixty thousand scrobbles. The report refuses to produce anything when the backfill is unfinished, when any artist failed to index, when any artist has no albums, or when there is no history to judge against. Each of those makes played music look unplayed, which is the one failure that costs a library, and they are checked rather than trusted because the report they gate is the one that ends in deletion. Nothing is written to Lidarr. Every call there remains a GET, and unmonitoring waits until the list this produces has been looked at -- no flag protects against a list that is wrong. Also prunes playlists no longer produced, which #12 made necessary by renaming moods: high-energy-rock would otherwise have stayed on the device for ever. It is driven by a record of what was written last time rather than by deleting every M3U that is not currently ours, so a playlist put in that directory by hand is left alone.