feat: autotag scoring overhaul, dump-based explore index, and lyrics search

Consolidates in-progress work across autotag, explore, and library:

- autotag: beets/Picard-informed scoring engine — ID-first matching, VA
  handling, recommendation tiers, and a merged distance/rank cascade, with
  an eval harness for regression tracking.
- explore: offline MusicBrainz dump import/incremental refresh replaces the
  legacy tier crawl; index-first local search with fuzzy matching and a
  dedicated ranker; disk-free guards for dump downloads.
- library: artist-credit extraction and matching.
- lyrics: owned-library lyric search (FTS) with LRCLIB backfill.

Also: rewrite README to be user-focused, and migrate upstream to
git.ljones.me/yonlu/yellowjacket.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-24 12:14:20 -04:00
co-authored by Claude Opus 4.8
parent d5140395da
commit 65048401e8
117 changed files with 17033 additions and 4767 deletions
+4
View File
@@ -38,12 +38,16 @@ export function GetPlaylistTracks(arg1:number):Promise<Array<playlist.Track>>;
export function GetSmartPlaylistRules(arg1:number):Promise<string>;
export function GetSmartPlaylistTracks(arg1:number):Promise<Array<playlist.Track>>;
export function ImportPlaylist(arg1:string):Promise<playlist.Summary>;
export function ImportPlaylists(arg1:Array<string>):Promise<Array<playlist.Summary>>;
export function PreviewSmartPlaylist(arg1:string):Promise<Array<library.Track>>;
export function RefreshSmartPlaylist(arg1:number):Promise<void>;
export function RemoveFromDefaultPlaylist(arg1:Array<string>):Promise<void>;
export function RemovePhantomTracks(arg1:number,arg2:Array<string>):Promise<void>;
+8
View File
@@ -70,6 +70,10 @@ export function GetSmartPlaylistRules(arg1) {
return window['go']['playlist']['Service']['GetSmartPlaylistRules'](arg1);
}
export function GetSmartPlaylistTracks(arg1) {
return window['go']['playlist']['Service']['GetSmartPlaylistTracks'](arg1);
}
export function ImportPlaylist(arg1) {
return window['go']['playlist']['Service']['ImportPlaylist'](arg1);
}
@@ -82,6 +86,10 @@ export function PreviewSmartPlaylist(arg1) {
return window['go']['playlist']['Service']['PreviewSmartPlaylist'](arg1);
}
export function RefreshSmartPlaylist(arg1) {
return window['go']['playlist']['Service']['RefreshSmartPlaylist'](arg1);
}
export function RemoveFromDefaultPlaylist(arg1) {
return window['go']['playlist']['Service']['RemoveFromDefaultPlaylist'](arg1);
}