-- 0061_fingerprint_settings.up.sql — fingerprinting's knobs, in admin Settings -- (Scribe #3913, milestone #400). Rule 25: anything an operator might tune is a -- database row, changed without a restart. Singleton in the style of -- reacquisition_settings (0056). CREATE TABLE fingerprint_settings ( id boolean PRIMARY KEY DEFAULT true, -- Fingerprinting new files, the backfill, and the duplicate sweep. Off stops -- the decode work entirely — the reason to turn it off is a slow NAS, and -- that is the operator's call. On by default: a library that cannot tell its -- duplicates apart is what milestone #400 exists to end. enabled boolean NOT NULL DEFAULT true, -- Seconds of audio fpcalc fingerprints. Chromaprints taken at different -- lengths cannot be compared, which is why track_fingerprints records the -- length each row was taken at (below): change this and every chromaprint is -- re-derived, and until then only rows at the new length are compared. chromaprint_length_sec integer NOT NULL DEFAULT 120, -- The most disagreement two aligned fingerprints may show and still be -- proposed as one recording. Unrelated audio sits near 0.5, so the ceiling -- stays well clear of it. acoustic_max_bit_error_rate double precision NOT NULL DEFAULT 0.15, -- Files the backfill decodes at once. Decoding competes with playback -- transcoding for CPU and with streaming for the mount. backfill_concurrency integer NOT NULL DEFAULT 2, -- The least time between duplicate sweeps. A sweep still runs only when -- fingerprints have changed since the last one. sweep_interval_hours integer NOT NULL DEFAULT 1, -- When the settings were last saved. A new threshold or length can change -- what a sweep finds, so a save makes a sweep due. updated_at timestamptz NOT NULL DEFAULT now(), CONSTRAINT fingerprint_settings_singleton CHECK (id = true), CONSTRAINT fingerprint_settings_length_range CHECK (chromaprint_length_sec >= 30 AND chromaprint_length_sec <= 600), CONSTRAINT fingerprint_settings_threshold_range CHECK (acoustic_max_bit_error_rate >= 0.01 AND acoustic_max_bit_error_rate <= 0.35), CONSTRAINT fingerprint_settings_concurrency_range CHECK (backfill_concurrency >= 1 AND backfill_concurrency <= 8), CONSTRAINT fingerprint_settings_sweep_interval_range CHECK (sweep_interval_hours >= 1 AND sweep_interval_hours <= 168) ); INSERT INTO fingerprint_settings (id) VALUES (true) ON CONFLICT (id) DO NOTHING; -- Every row written so far was taken at fpcalc's default length. ALTER TABLE track_fingerprints ADD COLUMN chromaprint_length_sec integer NOT NULL DEFAULT 120;