feat: data lifecycle rewrite, download clients, wanted list, and central catalog index
Build & publish Arch package / arch-package (push) Successful in 2m12s
Search index maintenance / maintain-index (push) Successful in 2h22m28s

Ships the fresh-start schema cleanup: rebuilt explore catalog index
pipeline (dump import, artifact fetch/build, incremental listen-count
refresh), a new download subsystem (Lidarr/Prowlarr/qBittorrent/SABnzbd/
slskd/yt-dlp providers, staging, reconciliation, wanted list), and the
supporting schema/query/store changes across backend and frontend.

Also includes two smaller follow-ups: bump the central index's
rebuild-after cadence from 90 to 180 days, and remove the Explore
"library only" online/offline toggle entirely (frontend-only, no
backend counterpart) rather than carry unused UI/state.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y2Agd9af5hE7qzti2ackiS
This commit is contained in:
2026-08-06 17:12:01 -04:00
co-authored by Claude Sonnet 5
parent d0d86f85d5
commit e190fd75b9
165 changed files with 31088 additions and 5192 deletions
+13
View File
@@ -1,6 +1,7 @@
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
import {explore} from '../models';
import {time} from '../models';
import {context} from '../models';
import {jobs} from '../models';
@@ -18,6 +19,8 @@ export function CAALimiter():Promise<explore.RateLimiter>;
export function CheckLibraryMBIDs(arg1:Array<string>):Promise<Record<string, string>>;
export function CoreCatalogImported():Promise<boolean>;
export function CoverArtGroupURL(arg1:string):Promise<string>;
export function CoverArtURL(arg1:string):Promise<string>;
@@ -52,6 +55,12 @@ export function GetTrackThumbnail(arg1:string,arg2:string,arg3:string,arg4:strin
export function GetTrackThumbnails(arg1:Array<explore.TrackThumbnailRequest>):Promise<Record<string, string>>;
export function IndexBaselineSeries():Promise<number>;
export function IndexImportComplete():Promise<boolean>;
export function IndexLastImported():Promise<time.Time>;
export function InvalidateIndexDiscographies():Promise<void>;
export function InvalidateLibrarySync():Promise<void>;
@@ -70,12 +79,16 @@ export function PopulateLocalCrossReferencesIfNeeded():Promise<void>;
export function PrefetchReleases(arg1:Array<string>):Promise<void>;
export function PrepareIndexRebuild():Promise<void>;
export function RebuildLyricsIndex():Promise<void>;
export function RebuildLyricsIndexIfNeeded():Promise<void>;
export function RecordSearchClick(arg1:string,arg2:string,arg3:string):Promise<void>;
export function RefreshIndexNow(arg1:time.Duration):Promise<void>;
export function RefreshListenCounts():Promise<void>;
export function ResolveReleaseGroupMBIDs(arg1:Array<string>):Promise<Record<string, string>>;
+24
View File
@@ -30,6 +30,10 @@ export function CheckLibraryMBIDs(arg1) {
return window['go']['explore']['Service']['CheckLibraryMBIDs'](arg1);
}
export function CoreCatalogImported() {
return window['go']['explore']['Service']['CoreCatalogImported']();
}
export function CoverArtGroupURL(arg1) {
return window['go']['explore']['Service']['CoverArtGroupURL'](arg1);
}
@@ -98,6 +102,18 @@ export function GetTrackThumbnails(arg1) {
return window['go']['explore']['Service']['GetTrackThumbnails'](arg1);
}
export function IndexBaselineSeries() {
return window['go']['explore']['Service']['IndexBaselineSeries']();
}
export function IndexImportComplete() {
return window['go']['explore']['Service']['IndexImportComplete']();
}
export function IndexLastImported() {
return window['go']['explore']['Service']['IndexLastImported']();
}
export function InvalidateIndexDiscographies() {
return window['go']['explore']['Service']['InvalidateIndexDiscographies']();
}
@@ -134,6 +150,10 @@ export function PrefetchReleases(arg1) {
return window['go']['explore']['Service']['PrefetchReleases'](arg1);
}
export function PrepareIndexRebuild() {
return window['go']['explore']['Service']['PrepareIndexRebuild']();
}
export function RebuildLyricsIndex() {
return window['go']['explore']['Service']['RebuildLyricsIndex']();
}
@@ -146,6 +166,10 @@ export function RecordSearchClick(arg1, arg2, arg3) {
return window['go']['explore']['Service']['RecordSearchClick'](arg1, arg2, arg3);
}
export function RefreshIndexNow(arg1) {
return window['go']['explore']['Service']['RefreshIndexNow'](arg1);
}
export function RefreshListenCounts() {
return window['go']['explore']['Service']['RefreshListenCounts']();
}