Skip to content

Releases: Abrechen2/sublarr

v0.36.0-beta — Bazarr Parity Improvements

29 Mar 06:16

Choose a tag to compare

What's New

Scoring

  • video_codec weight — x264/x265/AV1 codec match adds +2 points to episode and movie scores (Bazarr parity)

Language Profile Filters

  • mustContain / mustNotContain — AND-logic filter: only accept subtitles matching ALL mustContain terms; new DB columns on language_profiles
  • cutoff — stop searching for a language once a subtitle is already present on disk
  • audioExclude — skip downloading if audio track is already in the target language

Provider Infrastructure

  • CircuitBreaker persistence — CB OPEN state written to ProviderStats.disabled_until; survives restarts
  • Rate-limit throttle — configurable extended throttle on ProviderRateLimitError via provider_rate_limit_throttle_minutes

Download Quality

  • Upgrade chain trackingupgraded_from_id on subtitle_downloads records which subtitle was replaced
  • Post-download commandpost_download_command config with {subtitle_path}, {language}, {provider}, {score} variable substitution
  • Manual alass syncPOST /api/v1/sync/alass endpoint for on-demand subtitle synchronisation

Bug Fixes

  • mustContain corrected to AND-logic (Bazarr parity)
  • Post-download hook crash guard via getattr(self, 'settings', None)

Deployment

docker pull ghcr.io/abrechen2/sublarr:0.36.0-beta

Sublarr v0.31.0-beta

19 Mar 11:59

Choose a tag to compare

Changed

  • Backend — Test Foundation — added 29 new tests covering WantedSearchService, ProviderManager, and quality-validation logic; total suite now 736 tests at 47.76% coverage
  • Backend — Type Safety + Lint — resolved all ruff errors and mypy type warnings across the entire backend; no new ignores added
  • Backend — File Splits — 8 oversized files (800–2921 lines) decomposed into focused packages: routes/hooks/, routes/library/, routes/wanted/, routes/translate/, routes/system/, routes/tools/; service packages translator/ and wanted_search/; shared batch state extracted to routes/batch_state.py
  • Backend — Architectureproviders/registry.py with PROVIDER_METADATA dict replaces three class-level dicts; nested Settings views (GeneralSettings, TranslationSettings, ProviderSettings, MediaServerSettings, ScanningSettings) with read-only delegation; singleton lifecycle via get_scanner()/get_provider_manager() checking app.extensions
  • Frontend — SyncControls splitSyncControls.tsx decomposed into OffsetTab, SpeedTab, FramerateTab, ChapterTab, StandardActions, SyncTabBar; orchestrator retains all state and handlers
  • Frontend — useApi splituseApi.ts decomposed into six domain files: useLibraryApi, useWantedApi, useTranslationApi, useProvidersApi, useIntegrationApi, useSystemApi; barrel re-exports all public hooks
  • Frontend — Error BoundariesErrorBoundary component wraps Library, Wanted, and Settings routes; runtime errors are caught per-route instead of crashing the full app

Fixed

  • Backend — monkeypatch targets — updated test_wanted_search_reliability.py patch paths to point to the submodule where each function is called after the Phase 3 package split
  • Frontend — verbatimModuleSyntax — added import type to all interface-only imports in VideoPlayer.tsx, PlayerModal.tsx, SubtitleTrackSelector.tsx to satisfy verbatimModuleSyntax: true in tsconfig
  • Frontend — TypeScript strict errors — fixed all errors from tsc --project tsconfig.app.json: toast call signature (toast.success/errortoast(msg, type)), 'warning' toast type (→ 'error'), missing RefreshCw import, handleDeleteSidecar return type, duplicate style JSX attribute, Recharts Formatter type mismatch, duplicate subscene provider key, implicit any in Logs filter callback, useSeriesDetail nullable parameter, missing libass-wasm type declaration

Sublarr v0.30.0-beta

16 Mar 18:35

Choose a tag to compare

Added

  • Standalone — NFO metadata integration — standalone scanner reads .nfo sidecar files to resolve series/movie title, year, TVDB/TMDB ID, and episode metadata without requiring an API lookup; falls back to filename parsing when no NFO is present
  • Standalone — Skip extra files — trailers, featurettes, samples and other non-episode extras are now excluded from subtitle discovery during standalone filesystem scan; follows Jellyfin/Kodi naming convention (-trailer, -featurette, -behindthescenes, -deleted, -interview, -scene, -short, -sample, -theme); configurable via standalone_skip_extras toggle in Settings → Library Sources (advanced)

Fixed

  • Standalone — symlinks and SQLAlchemy text() compatibilityos.walk(followlinks=True) now follows symlinked directories; raw SQL wrapped in sqlalchemy.text() to fix deprecation warnings
  • Standalone — app context — scanner operations that write to DB now correctly run inside Flask app context to avoid RuntimeError: No application context
  • Standalone — library view — standalone series/movies now appear in Library with correct poster URLs and breadcrumb navigation
  • Standalone — series detail fallback — SeriesDetail page gracefully handles episodes without a Sonarr instance; subtitle sidecar endpoint falls back to standalone path resolution
  • Standalone — poster endpoint — path security enforced via is_safe_path(); URL generation updated to use /api/v1/ prefix consistently
  • Standalone — NFO/poster lookup in Season subfolder — scanner now finds poster.jpg and .nfo files inside Season XX/ subdirectories, not only in the series root
  • Settings — nav redirect — Setup page correctly redirects to /settings after initial configuration; NavLink isActive prop removed (invalid in React Router v6)
  • Wanted — scroll list layout — replaced hardcoded calc(100vh - 300px) with flex-1 / min-h-0 chain; list now fills the full remaining viewport at any window size

Changed

  • Dependencies — jsdom 28 → 29; 13 npm minor/patch updates

Sublarr v0.29.0-beta

14 Mar 17:30

Choose a tag to compare

Added

  • Web Player — Streaming endpointGET /api/v1/media/stream?path= serves video files with HTTP 206 range-request support; is_safe_path() enforced; Content-Type resolved by extension; SUBLARR_STREAMING_ENABLED setting (default true) allows disabling the endpoint
  • Web Player — PlayerModal — portal-based HTML5 <video> player with play/pause/seek/volume/fullscreen; opens via "Preview" button on episode cards in SeriesDetail
  • Web Player — ASS/SRT subtitle overlay — SubtitleOctopus (libass WASM) renders styled ASS subtitles natively in-browser; subtitles-octopus-worker.js and .wasm served from /public/
  • Web Player — Subtitle track selector — dropdown to switch between all available sidecar subtitle files for the episode; "Off" option disables overlay
  • Web Player — Seek-to-cue — clicking a cue row in SubtitleEditorModal jumps the player to that timestamp via onSeekRequest bridge
  • Web Player — Settings togglestreaming_enabled toggle in Settings → Automation (advanced section)

Sublarr v0.28.0-beta

14 Mar 14:56

Choose a tag to compare

Sublarr v0.28.0-beta Pre-release
Pre-release

Added

  • AI Glossary Builder — DB schema — adds term_type (character/place/other), confidence (float 0–1), approved (boolean) columns to glossary_entries; Alembic migration f1a2b3c4d5e6
  • AI Glossary Builder — Extractor serviceglossary_extractor.py performs frequency analysis over subtitle sidecar files to surface recurring proper-noun candidates without requiring an LLM
  • AI Glossary Builder — Suggest endpointPOST /api/v1/series/<id>/glossary/suggest triggers auto-detection and returns ranked candidates for human review
  • AI Glossary Builder — TSV exportGET /api/v1/glossary/export downloads all approved glossary terms as a tab-separated file for external use
  • AI Glossary Builder — CRUD extended — existing POST/PUT /api/v1/glossary endpoints accept the new term_type, confidence, and approved fields
  • AI Glossary Builder — ConfigSUBLARR_GLOSSARY_ENABLED (default true) and glossary_max_terms per-series cap (default 100) in Settings → Translation (advanced section)
  • AI Glossary Builder — LLM injection — approved terms injected as <glossary> system prompt prefix during translation; capped at 50 terms; V8-compatible term → translation comma format retained; single-line fast-path added (Translate to German: {line}) when subtitle contains exactly one cue
  • AI Glossary Builder — GlossaryPanel UI — Suggest button (Wand2 icon) triggers candidate detection; candidate list with approve/pre-fill/reject actions; TermTypeBadge (character/place/other); Export TSV button; all wired via new suggestGlossaryTerms and exportGlossaryTsv hooks

Sublarr v0.27.0-beta

14 Mar 13:02

Choose a tag to compare

Sublarr v0.27.0-beta Pre-release
Pre-release

Added

  • NFO Export — Auto sidecarauto_nfo_export config flag (off by default) writes an XML .nfo file alongside every downloaded or translated subtitle; contains provider, source/target language, score, translation backend, BLEU score, timestamp, and Sublarr version
  • NFO Export — API routesPOST /api/v1/subtitles/export-nfo?path=<path> for single-subtitle export; POST /api/v1/series/<id>/subtitles/export-nfo for bulk export of all subtitles in a series; per-file is_safe_path() validation enforced on all paths
  • NFO Export — Settings toggleauto_nfo_export toggle in Settings → Automation (advanced section); expert feature, hidden behind "Show advanced"
  • NFO Export — SeriesDetail buttonFileCode button on each subtitle sidecar badge in SeriesDetail triggers single-file NFO export with toast feedback

Sublarr v0.26.0-beta

14 Mar 11:35

Choose a tag to compare

Sublarr v0.26.0-beta Pre-release
Pre-release

Added

  • Single-Account Login — First-run setup wizard — on first visit, /setup presents two choices: set a password or leave the UI open; no forced registration
  • Single-Account Login — Flask session authbefore_request hook enforces session-or-X-Api-Key on all /api/ routes when enabled; session secret auto-generated and persisted in config_entries; bcrypt password hashing
  • Single-Account Login — Auth APIGET /api/v1/auth/status, POST /auth/setup (first-run), POST /auth/login, POST /auth/logout, POST /auth/change-password, POST /auth/toggle; API key auth (X-Api-Key) remains independent
  • Single-Account Login — React routingAuthGuard component redirects to /setup or /login as needed; auth pages render full-screen without Sidebar
  • Settings → Security tab — toggle UI auth on/off; change-password form (shown only when auth enabled)
  • Sidebar — Logout button — shown when auth.enabled && auth.authenticated; navigates to /login on success

Sublarr v0.25.3-beta

14 Mar 08:19
de75613

Choose a tag to compare

Sublarr v0.25.3-beta Pre-release
Pre-release

Added

  • List Virtualization — Library table view — replaced client-side pagination (25/page) with @tanstack/react-virtual virtual scroll using the padding-row technique; <table>/<tr> DOM structure preserved; sticky header; scroll resets on filter/sort; grid view retains pagination; VirtualLibraryTable + LibraryShared components extracted to frontend/src/components/library/
  • List Virtualization — Wanted list — Wanted now fetches all matching items in a single request (up to 9 999) and renders with virtual scroll; useWantedVirtualizer hook in frontend/src/components/wanted/VirtualWantedTable.tsx; removes multi-page navigation

Sublarr v0.25.2-beta

14 Mar 06:43

Choose a tag to compare

Sublarr v0.25.2-beta Pre-release
Pre-release

Added

  • Subtitle Diff Viewer — Per-cue accept/rejectPOST /tools/diff computes a cue-level diff using pysubs2 + difflib.SequenceMatcher; returns structured diff entries (unchanged/modified/added/removed) with timing in seconds. POST /tools/diff/apply recomputes the diff server-side, merges accepted/rejected changes into the modified SSAFile (preserving header and styles), creates a .bak backup, and writes atomically via os.replace. Frontend SubtitleDiff.tsx rewritten from CodeMirror merge view to a filterable per-cue table; users can accept or reject each change individually or via Accept All / Reject All; applying navigates back to preview and invalidates the subtitle-content cache.

Sublarr v0.25.1-beta

13 Mar 19:29

Choose a tag to compare

Sublarr v0.25.1-beta Pre-release
Pre-release

Added

  • CLI — sublarr search — search subtitle providers for all wanted items in a series via --series-id <id>; calls GET /wanted + POST /wanted/batch-search
  • CLI — sublarr translate — translate a subtitle file via POST /translate/sync; supports --force flag; prints output path (sync) or job ID (queued)
  • CLI — sublarr sync — sync subtitle timing to a video file via POST /tools/auto-sync; --engine ffsubsync|alass
  • CLI — sublarr status — show active translation jobs and background task state; --running to filter in-progress jobs only
  • CLI — Entry pointbackend/sublarr_cli.py; configure via SUBLARR_URL and SUBLARR_API_KEY env vars or --url/--api-key flags