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
46 lines
1.7 KiB
SQL
46 lines
1.7 KiB
SQL
CREATE TABLE IF NOT EXISTS audio_files (
|
|
id integer PRIMARY KEY,
|
|
file_path text NOT NULL UNIQUE,
|
|
length_milliseconds int NOT NULL,
|
|
file_type_id int NOT NULL,
|
|
recording_id int NOT NULL,
|
|
sample_rate int NOT NULL DEFAULT 0,
|
|
bit_depth int NOT NULL DEFAULT 0,
|
|
channels int NOT NULL DEFAULT 0,
|
|
bitrate int NOT NULL DEFAULT 0,
|
|
file_size int NOT NULL DEFAULT 0,
|
|
basename text NOT NULL DEFAULT '',
|
|
library_id int NOT NULL DEFAULT 0,
|
|
play_count int NOT NULL DEFAULT 0,
|
|
last_played datetime,
|
|
tag_status TEXT NOT NULL DEFAULT 'untagged'
|
|
CHECK(tag_status IN (
|
|
'untagged', 'auto_matched', 'user_confirmed', 'user_skipped_permanent'
|
|
)),
|
|
group_key TEXT NOT NULL DEFAULT '',
|
|
-- File mtime as a Unix timestamp in seconds, captured at import.
|
|
-- Compared against the on-disk mtime during a scan to detect files
|
|
-- another application retagged in place. 0 means "never recorded"
|
|
-- (rows predating migration 47) and is treated as not-stale so an
|
|
-- upgrade does not re-import the whole library.
|
|
modified_at int NOT NULL DEFAULT 0,
|
|
FOREIGN KEY(file_type_id) REFERENCES file_types(id),
|
|
FOREIGN KEY(recording_id) REFERENCES recordings(id),
|
|
FOREIGN KEY(library_id) REFERENCES libraries(id)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_audio_files_basename
|
|
ON audio_files(basename);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_audio_files_group_key
|
|
ON audio_files(group_key) WHERE group_key != '';
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_audio_files_library_id
|
|
ON audio_files(library_id);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_audio_files_recording_id
|
|
ON audio_files(recording_id);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_audio_files_tag_status_untagged
|
|
ON audio_files(library_id) WHERE tag_status = 'untagged';
|