Releases: Abrechen2/sublarr
Releases · Abrechen2/sublarr
v0.36.0-beta — Bazarr Parity Improvements
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
ProviderRateLimitErrorviaprovider_rate_limit_throttle_minutes
Download Quality
- Upgrade chain tracking —
upgraded_from_idonsubtitle_downloadsrecords which subtitle was replaced - Post-download command —
post_download_commandconfig with{subtitle_path},{language},{provider},{score}variable substitution - Manual alass sync —
POST /api/v1/sync/alassendpoint 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-betaSublarr v0.31.0-beta
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
rufferrors andmypytype 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 packagestranslator/andwanted_search/; shared batch state extracted toroutes/batch_state.py - Backend — Architecture —
providers/registry.pywithPROVIDER_METADATAdict replaces three class-level dicts; nestedSettingsviews (GeneralSettings,TranslationSettings,ProviderSettings,MediaServerSettings,ScanningSettings) with read-only delegation; singleton lifecycle viaget_scanner()/get_provider_manager()checkingapp.extensions - Frontend — SyncControls split —
SyncControls.tsxdecomposed intoOffsetTab,SpeedTab,FramerateTab,ChapterTab,StandardActions,SyncTabBar; orchestrator retains all state and handlers - Frontend — useApi split —
useApi.tsdecomposed into six domain files:useLibraryApi,useWantedApi,useTranslationApi,useProvidersApi,useIntegrationApi,useSystemApi; barrel re-exports all public hooks - Frontend — Error Boundaries —
ErrorBoundarycomponent 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.pypatch paths to point to the submodule where each function is called after the Phase 3 package split - Frontend — verbatimModuleSyntax — added
import typeto all interface-only imports inVideoPlayer.tsx,PlayerModal.tsx,SubtitleTrackSelector.tsxto satisfyverbatimModuleSyntax: truein tsconfig - Frontend — TypeScript strict errors — fixed all errors from
tsc --project tsconfig.app.json: toast call signature (toast.success/error→toast(msg, type)),'warning'toast type (→'error'), missingRefreshCwimport,handleDeleteSidecarreturn type, duplicatestyleJSX attribute, RechartsFormattertype mismatch, duplicatesubsceneprovider key, implicitanyin Logs filter callback,useSeriesDetailnullable parameter, missing libass-wasm type declaration
Sublarr v0.30.0-beta
Added
- Standalone — NFO metadata integration — standalone scanner reads
.nfosidecar 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 viastandalone_skip_extrastoggle in Settings → Library Sources (advanced)
Fixed
- Standalone — symlinks and SQLAlchemy text() compatibility —
os.walk(followlinks=True)now follows symlinked directories; raw SQL wrapped insqlalchemy.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.jpgand.nfofiles insideSeason XX/subdirectories, not only in the series root - Settings — nav redirect — Setup page correctly redirects to
/settingsafter initial configuration;NavLinkisActiveprop removed (invalid in React Router v6) - Wanted — scroll list layout — replaced hardcoded
calc(100vh - 300px)withflex-1 / min-h-0chain; 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
Added
- Web Player — Streaming endpoint —
GET /api/v1/media/stream?path=serves video files with HTTP 206 range-request support;is_safe_path()enforced;Content-Typeresolved by extension;SUBLARR_STREAMING_ENABLEDsetting (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.jsand.wasmserved 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
onSeekRequestbridge - Web Player — Settings toggle —
streaming_enabledtoggle in Settings → Automation (advanced section)
Sublarr v0.28.0-beta
Added
- AI Glossary Builder — DB schema — adds
term_type(character/place/other),confidence(float 0–1),approved(boolean) columns toglossary_entries; Alembic migrationf1a2b3c4d5e6 - AI Glossary Builder — Extractor service —
glossary_extractor.pyperforms frequency analysis over subtitle sidecar files to surface recurring proper-noun candidates without requiring an LLM - AI Glossary Builder — Suggest endpoint —
POST /api/v1/series/<id>/glossary/suggesttriggers auto-detection and returns ranked candidates for human review - AI Glossary Builder — TSV export —
GET /api/v1/glossary/exportdownloads all approved glossary terms as a tab-separated file for external use - AI Glossary Builder — CRUD extended — existing
POST/PUT /api/v1/glossaryendpoints accept the newterm_type,confidence, andapprovedfields - AI Glossary Builder — Config —
SUBLARR_GLOSSARY_ENABLED(default true) andglossary_max_termsper-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-compatibleterm → translationcomma 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 newsuggestGlossaryTermsandexportGlossaryTsvhooks
Sublarr v0.27.0-beta
Added
- NFO Export — Auto sidecar —
auto_nfo_exportconfig flag (off by default) writes an XML.nfofile alongside every downloaded or translated subtitle; contains provider, source/target language, score, translation backend, BLEU score, timestamp, and Sublarr version - NFO Export — API routes —
POST /api/v1/subtitles/export-nfo?path=<path>for single-subtitle export;POST /api/v1/series/<id>/subtitles/export-nfofor bulk export of all subtitles in a series; per-fileis_safe_path()validation enforced on all paths - NFO Export — Settings toggle —
auto_nfo_exporttoggle in Settings → Automation (advanced section); expert feature, hidden behind "Show advanced" - NFO Export — SeriesDetail button —
FileCodebutton on each subtitle sidecar badge in SeriesDetail triggers single-file NFO export with toast feedback
Sublarr v0.26.0-beta
Added
- Single-Account Login — First-run setup wizard — on first visit,
/setuppresents two choices: set a password or leave the UI open; no forced registration - Single-Account Login — Flask session auth —
before_requesthook enforces session-or-X-Api-Keyon all/api/routes when enabled; session secret auto-generated and persisted inconfig_entries; bcrypt password hashing - Single-Account Login — Auth API —
GET /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 routing —
AuthGuardcomponent redirects to/setupor/loginas 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/loginon success
Sublarr v0.25.3-beta
Added
- List Virtualization — Library table view — replaced client-side pagination (25/page) with
@tanstack/react-virtualvirtual scroll using the padding-row technique;<table>/<tr>DOM structure preserved; sticky header; scroll resets on filter/sort; grid view retains pagination;VirtualLibraryTable+LibrarySharedcomponents extracted tofrontend/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;
useWantedVirtualizerhook infrontend/src/components/wanted/VirtualWantedTable.tsx; removes multi-page navigation
Sublarr v0.25.2-beta
Added
- Subtitle Diff Viewer — Per-cue accept/reject —
POST /tools/diffcomputes a cue-level diff using pysubs2 + difflib.SequenceMatcher; returns structured diff entries (unchanged/modified/added/removed) with timing in seconds.POST /tools/diff/applyrecomputes the diff server-side, merges accepted/rejected changes into the modified SSAFile (preserving header and styles), creates a.bakbackup, and writes atomically viaos.replace. FrontendSubtitleDiff.tsxrewritten 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
Added
- CLI —
sublarr search— search subtitle providers for all wanted items in a series via--series-id <id>; callsGET /wanted+POST /wanted/batch-search - CLI —
sublarr translate— translate a subtitle file viaPOST /translate/sync; supports--forceflag; prints output path (sync) or job ID (queued) - CLI —
sublarr sync— sync subtitle timing to a video file viaPOST /tools/auto-sync;--engine ffsubsync|alass - CLI —
sublarr status— show active translation jobs and background task state;--runningto filter in-progress jobs only - CLI — Entry point —
backend/sublarr_cli.py; configure viaSUBLARR_URLandSUBLARR_API_KEYenv vars or--url/--api-keyflags