Add the missing-subtitles queue #202

Closed
opened 2026-08-24 21:28:40 +01:00 by naps62-yolo · 1 comment
Owner

Add a missing-subtitles queue alongside the no-PT-source queue, so subtitle
failures are visible instead of silent.

It lists media files with an unsatisfied wanted language and why, from the
attempt rows (#186): no candidate found, translation failed, waiting on budget
(#197), sync rejected (#194), provider unreachable. Grouped by title, not one
row per episode — a season that failed is one entry, the same restraint §9.5
applies to notifications.

Each entry offers the actions that resolve it: manual search, manual translate,
retry. All of them are #199 calls.

Nothing here notifies. §9.5's three events stand unchanged.

area/web: through the impeccable skill, matching the existing queues view.

Depends on: #196, #199

Add a missing-subtitles queue alongside the no-PT-source queue, so subtitle failures are visible instead of silent. It lists media files with an unsatisfied wanted language and why, from the attempt rows (#186): no candidate found, translation failed, waiting on budget (#197), sync rejected (#194), provider unreachable. Grouped by title, not one row per episode — a season that failed is one entry, the same restraint §9.5 applies to notifications. Each entry offers the actions that resolve it: manual search, manual translate, retry. All of them are #199 calls. Nothing here notifies. §9.5's three events stand unchanged. `area/web`: through the `impeccable` skill, matching the existing queues view. Depends on: #196, #199
naps62-yolo added this to the Subtitles milestone 2026-08-24 21:28:40 +01:00
naps62-yolo added the area/webdifficulty/moderatephase/9-subtitlestype/feature labels 2026-08-24 21:28:40 +01:00
naps62-yolo added a new dependency 2026-08-24 21:29:28 +01:00
naps62-yolo added a new dependency 2026-08-24 21:29:28 +01:00
Author
Owner

Implemented the missing-subtitles queue: GET /api/queues/subtitles, grouped by title like /api/queues/attention — one row per movie, one row per series. Each gap carries language + why, reusing reason_of's vocabulary from #201 (no_candidates, capped, failed + last_failure as detail), plus a sync_rejected gap for a subtitle that exists but whose alass sync was rejected (#194) — read straight off subtitle_files.sync_rejected, not the attempt table. Gaps for a language no longer in wanted_languages are dropped, matching #201's bound. Episodes in a series collapse into one season row when every one of them carries the identical gap (§9.5's restraint applied to subtitles); episodes with differing gaps stay listed individually.

Frontend: a third deck-group lane, "missing subtitles", added to the existing queues view (web/index.html, web/src/main.ts, web/src/queues.ts) alongside "no pt source" and "needs decision", built through the impeccable skill. It reuses the same markup/classes as its two siblings and missingChipLabel for chip text (extended with a sync_rejected → "sync flagged" label). Each row opens the title's own detail page, where the existing #203 fetch/translate panel already carries the resolving actions (manual search, manual translate, retry-by-searching-again) — the queue does not duplicate a candidate picker. Verified live in a browser against seeded gap data: renders correctly, wraps chips cleanly at both desktop and mobile widths, and the OPEN action lands on the panel with the same gap already shown.

Branch: subtitles/202-subs-queue. just ci passed (683/683 tests, lint and token-gate clean) through the gate, run once at the end.

Findings

  • Pre-existing gap, not touched here: nothing deletes a subtitle_attempts row when an operator narrows wanted_languages in /settings (#198) — the row just sits there. I bounded the new queue by the current wanted set (matching #201's missing_for) so it doesn't show stale entries, but the underlying row is still never cleaned up; #201's title-detail page has the same latent staleness if a language is re-added later with old attempt history. Might be worth a follow-up issue for a cleanup step in the settings-update handler or the reconcile loop.
Implemented the missing-subtitles queue: `GET /api/queues/subtitles`, grouped by title like `/api/queues/attention` — one row per movie, one row per series. Each gap carries language + why, reusing `reason_of`'s vocabulary from #201 (`no_candidates`, `capped`, `failed` + `last_failure` as `detail`), plus a `sync_rejected` gap for a subtitle that exists but whose `alass` sync was rejected (#194) — read straight off `subtitle_files.sync_rejected`, not the attempt table. Gaps for a language no longer in `wanted_languages` are dropped, matching #201's bound. Episodes in a series collapse into one season row when every one of them carries the identical gap (§9.5's restraint applied to subtitles); episodes with differing gaps stay listed individually. Frontend: a third `deck-group` lane, "missing subtitles", added to the existing queues view (`web/index.html`, `web/src/main.ts`, `web/src/queues.ts`) alongside "no pt source" and "needs decision", built through the `impeccable` skill. It reuses the same markup/classes as its two siblings and `missingChipLabel` for chip text (extended with a `sync_rejected` → "sync flagged" label). Each row opens the title's own detail page, where the existing #203 fetch/translate panel already carries the resolving actions (manual search, manual translate, retry-by-searching-again) — the queue does not duplicate a candidate picker. Verified live in a browser against seeded gap data: renders correctly, wraps chips cleanly at both desktop and mobile widths, and the OPEN action lands on the panel with the same gap already shown. Branch: `subtitles/202-subs-queue`. `just ci` passed (683/683 tests, lint and token-gate clean) through the gate, run once at the end. ## Findings - Pre-existing gap, not touched here: nothing deletes a `subtitle_attempts` row when an operator narrows `wanted_languages` in `/settings` (#198) — the row just sits there. I bounded the new queue by the current wanted set (matching #201's `missing_for`) so it doesn't show stale entries, but the underlying row is still never cleaned up; #201's title-detail page has the same latent staleness if a language is re-added later with old attempt history. Might be worth a follow-up issue for a cleanup step in the settings-update handler or the reconcile loop.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: yolo/arr#202