Migration 10: - play_history table (audio_file_id FK, played_at DATETIME, CASCADE delete) - play_count + last_played columns on audio_files (denormalized) - Recreated track_metadata VIEW with play_count and last_played columns Play recording: - queue.recordPlay() inserts play_history row + updates denormalized columns - Called from OnPlaybackFinished after queue advance completes - Mutex released before DB write to avoid MaxOpenConns(1) deadlock - Natural finish only — skip/stop does not count Tests: - TestMigration10PlayHistory: schema, columns, VIEW, round-trip verification - All 49 smart playlist + 15 service + existing DB tests still pass
27 lines
994 B
SQL
27 lines
994 B
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,
|
|
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_recording_id
|
|
ON audio_files(recording_id);
|
|
|
|
-- idx_audio_files_library_id is created by migration 6 (not here) because
|
|
-- on existing databases this schema file is a no-op (CREATE TABLE IF NOT EXISTS)
|
|
-- and the library_id column doesn't exist until the migration adds it.
|