Skip to content

Bazarr+ v2.6.2 (Clockwork)

Latest

Choose a tag to compare

@LavX LavX released this 07 Sep 14:31
6c354d6

Bazarr+ v2.6.2 (Clockwork)

Codename: Clockwork

A stability patch for subtitle uploads, searches, disk scans and translation. Uploaded subtitles appear before automatic sync finishes. Downloads keep their server ownership, sync outputs stay with the correct video, and useful partial OpenRouter translations are saved with an honest incomplete status. OpenRouter routing choices now stay consistent with the model field, and Provider Hub distinguishes a bad subtitle candidate from a provider-wide failure.


Headline: Keep useful subtitle work and continue past unusable candidates

Partial translations are recoverable

The OpenRouter translator service can return useful lines even when some batches fail. Bazarr previously discarded that partial result. It now saves valid translated lines, retains the source text where translation is missing, and marks the result as partially translated in history, job status and the subtitle footer. An empty or malformed result still fails. Saving uses a temporary file, so an unsuccessful write or footer update preserves any existing subtitle.

The host also waits for long-running OpenRouter translation jobs while the service remains reachable, with a 12-hour overall limit and a 10-minute limit without a successful status response. This does not repair a translator service's own model or response-parsing errors.

The separately deployed translator service reference advances to v1.3.4. The included service updates tolerate more malformed model replies, let batch sizes recover after failures, and report how many lines were actually translated. They align the prompt with JSON object mode, retry incomplete replies at the minimum batch size, and account for usage from failed or retried batches. Version 1.3.4 adds provider routing. Updating Bazarr alone does not replace a running translator service.

Uploads stay visible while sync runs

A successful subtitle upload previously waited for automatic synchronization before appearing in the media's subtitle list. It now appears as soon as the upload is finalized, and synchronization runs as a separate progress job. Its completion refreshes the list, including saved outputs from multiple engines. A failed, skipped or cancelled sync leaves the uploaded subtitle available.

Queued and running sync work also checks whether its source was replaced or deleted. An older sync result cannot overwrite a newer upload or restore a subtitle the user removed. Existing synchronization settings, instance ownership and upload history are retained.

If older synchronized outputs cannot be moved aside after a new subtitle is saved, Bazarr reports the cleanup failure separately and keeps the completed save available. Those older outputs may remain listed until cleanup succeeds.

OpenRouter routing matches the saved settings

Settings now offer fastest, cheapest, lowest-latency and OpenRouter-default routing, with separate :nitro and :floor shortcut choices. Typing either shortcut into the model field moves it into the routing selector when editing finishes and keeps the plain model ID for model details. Stacked routing shortcuts adopt the last one; other model variants remain unchanged. Lookalike text such as :floorplan is not rewritten.

When the settings Save bar is visible, Enter, Ctrl+S and Cmd+S now include the focused field's latest edit before saving, including fields that apply changes when focus leaves them. Previously a keyboard save could retain the earlier value even though the field showed the new text. Ctrl+S and Cmd+S still require a pending settings change before starting a save.

Full routing support requires translator service v1.3.4. Older or unrecognized service versions receive compatible plain routing choices where possible. Routing can affect provider selection and cost when a model has multiple providers; it does not guarantee a particular price or completion time.

An unusable archive does not disable the provider

A valid catalog-provider archive can contain no subtitle for the requested episode or language. That now rejects the candidate and lets the search continue, including when only one successful subtitle is requested. Automatic archive selection handles filenames covering multiple episodes and relative or absolute episode numbers. It checks the requested season when filenames provide one. Selector callbacks are limited to the offered subtitle files. Corrupt archives, invalid selectors and unsafe archive paths still follow the provider-failure path.

Provider workers also retain recognized authentication, quota, rate-limit and service errors. These reach Bazarr's matching pause policy instead of all becoming a generic worker error. OpenSubtitles.com download-quota errors use the existing six-hour pause; this change does not claim to know the account's exact quota-reset time.


Other Improvements & Fixes

  • Dropping files into an open movie or series upload dialog no longer opens a second dialog. This also prevents extra dialogs while an archive is being expanded. Existing file selections are retained, and closing once dismisses the upload dialog.
  • Disk scans associate saved sync-engine outputs with their actual video. Case differences, Unicode normalization, language tags and sibling videos with dotted names are handled without duplicating or assigning another video's subtitles. Existing language-tagged files remain discoverable after single-language naming is enabled.
  • History preserves an explicitly supplied Sonarr or Radarr owner when a media lookup fails, avoiding the reported non-null ownership error.
  • Global search shows the owning instance name when multiple Sonarr instances or multiple Radarr instances are configured for that media kind.
  • Movie translation jobs now show the movie title, and Gemini receives its overview. Translations started from a media page use the owning Sonarr or Radarr instance for title and overview lookups, so matching upstream IDs on another server do not supply the wrong context.
  • Cancelling a Gemini translation no longer retries the request. Cancellation at the initial or final progress update also removes temporary progress files, while the existing destination subtitle is preserved.
  • Translator status cards remain visible when idle. Available counts show zero, and unavailable counts keep a placeholder while loading or reconnecting.
  • Automatic translation checks eligibility before logging that a source score is too low, including when automatic translation is disabled.
  • Translation and subtitle modifications retain an existing file's directory. New files use the configured subtitle folder, including relative and absolute custom folders.
  • Four retired OpenRouter model IDs are replaced in saved settings only when one of those known IDs is selected. New installations default to google/gemini-2.5-flash-lite; other custom selections are preserved. The model menu and translation guide are updated too. Grok menu suggestions are refreshed separately; saved Grok model IDs are not automatically migrated.
  • Startup dependency checks now agree with the versions selected in requirements.txt, preventing unnecessary repeated repair-and-restart attempts on otherwise compliant source installations.

Provider catalog updates

Provider bundles have a separate release channel from the application. The stable catalog now includes OpenSubtitles.com 0.1.9 regional-language matching, anonymous OpenSubtitles.org 0.1.12 episode search and Anubis clearance, Titlovi 0.1.8 season-pack eligibility, and SubDL 0.1.4 error classification. These updates were promoted to catalog main alongside this release. Installing this application version alone does not replace those bundles. SubDL distinguishes documented exhausted-quota responses from other HTTP 429 rate limits and ordinary service failures.

Anonymous OpenSubtitles.org and OpenSubtitles.com regional-language searches were verified through search, download-link creation and nonempty subtitle streams. Titlovi's season-pack correction passed local tests, but live download verification remains limited by the configured account's disabled API access. SubDL movie search and download passed; its episode control returned zero results with both the prior and updated versions, so episode downloads remain unverified. Current Subsource catalog searches and downloads passed; the reported failures came from the retired built-in implementation.


CI / Docker

The regression suites run in the standard Python 3.12, 3.13 and 3.14 matrix, including native PostgreSQL checks. Coverage includes upload visibility and synchronization races, settings submission, translation routing, provider error handling, ownership and runtime dependency checks. Release acceptance checks the combined production image, startup, the served UI and release-tour navigation, with provider canaries recorded separately. Frontend builds use Node 24.20.0 LTS, satisfying the installed dependencies' runtime requirements. Existing CI and Docker build workflows read this shared version pin. No Docker base-image change is included.


Dependency Updates

  • Raise the cryptography security floor to 50.0.1 in both installation and runtime checks. Existing encrypted settings and ciphertext compatibility were verified.
  • Update the frontend's transitive Browserslist dependency from 4.28.4 to 4.28.7 with its required metadata packages.
  • Update GuessIt from 3.8.0 to 4.4.0 for subtitle filename parsing, and align its startup version check.
  • Update SQLAlchemy from 2.0.51 to 2.0.52, and align its startup version check.
  • Update Mantine from 9.5.2 to 9.6.0, including its react-dropzone 20 upload dependency.
  • Align the remaining stale runtime declarations with the dependencies already selected by the installation requirements. Version checks also distinguish prereleases from the required final and post-release versions.

Database Migrations

No schema changes. There are no new database migrations in this patch. Existing library and history data are preserved.


Included Pull Requests

  • #407: Update GuessIt and its runtime version check.
  • #409: Update Mantine and verify upload compatibility.
  • #410: Update SQLAlchemy and its runtime version check.
  • #411: Preserve explicit history ownership when media lookup fails.
  • #412: Check automatic-translation eligibility before source-score logging.
  • #413: Show instance names in global search.
  • #414: Preserve Provider Hub semantic errors across the worker boundary.
  • #415: Scope sync-engine output discovery to the owning video.
  • #416: Preserve partial translations, wait for long jobs, and respect subtitle destinations.
  • #417: Update the Browserslist security dependency.
  • #418: Continue past unusable provider archive candidates.
  • #419: Align the cryptography security floor and verify encrypted-setting compatibility.
  • #420: Align startup dependency declarations and correct version comparisons.
  • #421: Update the translator service reference to v1.3.1.
  • #422: Update the translator service reference to v1.3.2.
  • #423: Update the translator service reference to v1.3.4.
  • #424: Keep nested subtitle drops in one upload dialog.
  • #425: Configure OpenRouter provider routing and compatibility with older services.
  • #426: Normalize routing shortcuts and commit edited settings before keyboard saves.
  • #427: Name movie translation jobs and scope media context to the owning server.
  • #428: Show uploaded subtitles immediately and synchronize them in a separate job.
  • #429: Protect subtitle changes during background sync, stop cancelled Gemini requests, keep translator status cards visible, and prepare this release.

Catalog changes: OpenSubtitles.com, Titlovi, SubDL, and OpenSubtitles.org.


Upgrade / Migration Notes

  • Update and restart normally. Back up your configuration and database before upgrading.
  • Review subtitles marked partially translated: some cues may remain in the source language. A saved partial result is not a complete translation.
  • Update the separately deployed translator service to v1.3.4 for the parsing, retry, usage-accounting and routing changes. Updating Bazarr alone does not replace a running translator service.
  • Review Provider Routing in Settings > AI Translator. Fastest remains the default; choosing Cheapest or :floor can select different providers. Existing model variants remain valid, and editing a trailing :nitro or :floor moves that choice into the routing selector.
  • If you used one of the retired OpenRouter model IDs, check the replacement in Settings > AI Translator. Other custom model IDs are retained.
  • Run Scan Disk to refresh existing sync-output entries after upgrading. Keep all engine outputs still intentionally saves one file per engine, and this fix does not delete files. Unrelated videos with identical basenames remain ambiguous in a shared absolute subtitle folder; use separate subtitle folders for those files.
  • Update provider bundles separately through Subtitle Hub when their catalog updates are available. OpenSubtitles.org's scraper supports anonymous downloads; OpenSubtitles.com and Titlovi have their own account requirements.
  • SQLite and PostgreSQL remain supported. Native Windows dependency execution was not part of this release's test-machine checks.

Docker

docker pull ghcr.io/lavx/bazarr:2.6.2
docker pull ghcr.io/lavx/bazarr:latest

After upgrading, confirm that the UI loads and /api/system/status reports 2.6.2.


Full Changelog: v2.6.1...v2.6.2