v1.2.0: Bazarr+ subtitle providers via the Provider Hub#3
Conversation
Code reviewStrict review (6 independent reviewers + per-issue confidence scoring). Found 4 issues, most-confident first:
arrstack/src/wiring/bazarr-providerhub.ts Lines 51 to 58 in 151614a
arrstack/src/wiring/bazarr-providerhub.ts Lines 99 to 104 in 151614a
arrstack/src/wiring/bazarr-providerhub.ts Lines 113 to 118 in 151614a
arrstack/src/usecase/install.ts Lines 550 to 552 in 151614a arrstack/src/usecase/update.ts Lines 136 to 138 in 151614a Filtered out below the confidence bar: manifest |
- Readiness gate: call waitForBazarrApiReady before the Provider Hub calls so the wiring waits out Bazarr+'s post-restart DB-migration 500s (the update path only gates on /api/system/ping) instead of silently no-opping. Switch the catalog GET to fetchWithRetry (forgives transient 500/401) and check res.ok. - Add AbortSignal.timeout to every Provider Hub fetch so a wedged Bazarr can't hang an unattended install/update. - waitForInstalled tolerates a transient GET /providers error mid-build instead of dropping the provider on a single blip. - Only pass flaresolverr_url when flaresolverr is actually enabled. - Export + parameterize waitForBazarrApiReady's poll interval; add a test for the 500-during-migration window. 319 tests pass, typecheck clean.
The POST /installations call blocks while the Hub downloads the provider bundle and builds its venv; heavy providers (opensubtitles) exceed the 15s per-request timeout, which falsely reported them as failed and skipped their enable+config PATCH. Give the install POST a 180s cap; keep 15s for the quick catalog/list/ patch calls. Verified end-to-end on a live Bazarr+ 2.4.0: all 5 providers install + enable and opensubtitles gets its flaresolverr_url.
Migrates arrstack's default Bazarr+ subtitle providers from the built-in providers to the Provider Hub (Bazarr+ 2.4.0's plugin system; the built-in providers are being retired), and drops the standalone opensubtitles-scraper container. FlareSolverr stays as the Cloudflare fallback.
Stacked on the v1.1.1 branch (PR #2), so this diff is only the v1.2.0 commits.
Changes
opensubtitles-scraperservice (catalog + wizard bundle + bazarrdependsOn/env). The OpenSubtitles.org scraper now lives in the catalog'sopensubtitlesprovider (native ai-cloudscraper + FlareSolverr fallback).podnapisi(dead, not in the catalog) fromenabled_providers; remove the deadopensubtitles: { scraper_service_url }block.wiring/bazarr-providerhub.ts: after Bazarr+ is healthy, install + enable the migrated default set via the Provider Hub REST API (GET /catalogfor the manifest,POST /installations, poll,PATCH /providers/<id>). Idempotent + best-effort per provider.opensubtitlesgetsflaresolverr_url;opensubtitlescom/addic7edare enabled but left credential-less for the user.installandupdate.Verification
bun test: 318 pass / 0 failbun run typecheck: cleanDesign/plan: docs/superpowers/specs/2026-07-06-bazarr-provider-hub-migration-design.md (local).