-- #198. The runtime-editable half of subtitle configuration (DESIGN.md §15, -- §10). The other half — provider credentials, translator keys, the -- remote-command template, the alass and ffmpeg binary paths — is -- config/env only and never reaches this table. -- -- One row: the wanted set, enabled providers and translation engine are -- global, not per root (§15), so there is nothing to key this on. CREATE TABLE subtitle_settings ( id INTEGER PRIMARY KEY CHECK (id = 1), -- Language tags as `arr_core::Language` spells them, e.g. `pt-PT`, `en`. wanted_languages TEXT NOT NULL DEFAULT '["pt-PT","en"]' CHECK (json_valid(wanted_languages)), -- Provider ids in search order (DESIGN.md §15's ranking runs per -- provider before it runs per candidate). Absent from the array means -- disabled. providers_enabled TEXT NOT NULL DEFAULT '["opensubtitles","podnapisi"]' CHECK (json_valid(providers_enabled)), -- The compiled-in backend in use, or NULL when translation is off. Not -- checked against the running binary's features here — the API does -- that (#198) — so a rebuild with a different feature set never leaves -- an unreadable row. translation_engine TEXT CHECK (translation_engine IN ('openai', 'deepl', 'google', 'command')), -- Provider id / engine name -> a daily allowance (§15's token buckets, -- #197). A missing key means no allowance configured yet, not zero. provider_daily_budgets TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(provider_daily_budgets)), translator_daily_budgets TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(translator_daily_budgets)), -- Only the remote-command backend needs one of these: the HTTP backends -- carry their own client timeout. remote_command_timeout_seconds INTEGER NOT NULL DEFAULT 30 CHECK (remote_command_timeout_seconds > 0), created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')), updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')) ) STRICT; INSERT INTO subtitle_settings (id) VALUES (1);