-- Persistent download queue: jobs survive API restarts, per-user scoping BEGIN TRANSACTION; CREATE TABLE IF NOT EXISTS download_jobs ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL, provider TEXT NOT NULL, video_id TEXT NOT NULL, title TEXT, state TEXT NOT NULL DEFAULT 'queued', -- queued|running|merging|completed|failed|interrupted progress REAL NOT NULL DEFAULT 0, format_id TEXT, audio_only INTEGER NOT NULL DEFAULT 0, url TEXT, file_name TEXT, file_ext TEXT, file_size INTEGER, file_path TEXT, error TEXT, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL, completed_at INTEGER ); CREATE INDEX IF NOT EXISTS idx_download_jobs_user ON download_jobs(user_id, created_at DESC); CREATE INDEX IF NOT EXISTS idx_download_jobs_state ON download_jobs(state); COMMIT;