Commit ee45539
Release v2.3.1 Keystone (#157)
* feat: port auto-translate from language profile (PR morpheus65535#3335) to LavX
- Add translator.min_source_score config validator (default 90%)
- Add translate_from field migration in upgrade_languages_profile_values
- Add _trigger_auto_translation hook in processing.py
- Add translate_from_map logic to wanted/movies.py and series.py
* feat: port translate_from UI (PR morpheus65535#3335) and score/provider/status columns (PR morpheus65535#3337) to LavX
- Add translate_from field to Language.ProfileItem type
- Add TranslateFromCell selector in ProfileEditForm
- Add min_source_score Number control in Translator settings
- Add history prop + Score/Provider/Status columns to Movies/Details/table
- Preserve all LavX-specific SubtitleToolsMenu and navigation code
* fix: treat missing history as at-threshold for auto-translate
When a source-language subtitle exists on disk but has no
TableHistory/TableHistoryMovie row (manual placement or pre-tracking
era), source_score_pct was 0 and auto-translation was silently
skipped. Set source_score_pct = min_score in that case so
translation proceeds instead of silently blocking.
* fix: auto-translate forced guard, double-translate prevention, shared util
- Fix forced-subtitle guard in _trigger_auto_translation: inspect the
forced bool parameter instead of string-scanning downloaded_lang which
never contains ':forced'
- Write history entry before translate_subtitles_file in wanted-scan
paths to prevent double-translation when async job has not completed
before next scan cycle
- Extract _find_existing_subtitle_path to shared wanted/utils.py to
eliminate copy-paste divergence risk between series and movies paths
- Hoist check_missing_languages() above profile-items loop in
_trigger_auto_translation (called once instead of N times per item)
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
* fix: wire double-translate guard query to correct language column
The previous commit wrote history entries with language=target_lang but
the guard query checked language=source_lang, so the guard could never
find the written entry. Add explicit guard queries on TableHistory /
TableHistoryMovie for action=6 AND language=target_lang before queuing
translation, so post-restart re-queuing for completed translations is
actually blocked.
Also remove duplicate store_subtitles import in wanted/series.py.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
* fix: guard query matches hi/forced language suffixes in translate dedup
TableHistory.language stores 'fr:hi' or 'fr:forced' for hearing-impaired
and forced-subtitle targets. The previous guard used an equality check on
the bare lang_code ('fr') which never matched suffixed rows, allowing
re-queuing of HI/forced auto-translations on every scan cycle. Change to
.like(f'{lang_code}%') to match all suffix variants.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
* fix: source score lookup matches :hi/:forced language suffixes (closes #142)
The history query for source subtitle score used exact equality on the
language column (e.g. 'en') but the DB stores 'en:hi' or 'en:forced'
for HI/forced subtitle tracks. The query returned no rows for those
cases, silently falling back to min_score instead of validating actual
source quality.
Change to .like(f"{translate_cfg['from']}%") to match all suffix
variants, consistent with the identical pattern already used in the
deduplication guard queries in the same files.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
* chore: add pre-commit hooks (ruff, detect-secrets, standard checks)
Adds .pre-commit-config.yaml with:
- pre-commit-hooks: trailing whitespace, EOF fixer, YAML/JSON check,
large-file guard (500 KB), debug-statement and merge-conflict detection
- ruff (lint --fix) and ruff-format, respecting existing ruff.toml ruleset
- detect-secrets with baseline covering 159 known findings in 52 files;
future commits will only fail on *new* secrets
Chains with the existing husky/pretty-quick frontend hook by appending
a call to frontend/.husky/pre-commit after pre-commit runs in
.git/hooks/pre-commit (required because core.hooksPath was pointing to
husky's shim directory).
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
* fix: address LavX PR #137 review feedback
- Remove pre-logging of history action=6 before async translation job
completes; translate services already write history on success, so
pre-logging caused the duplicate guard to permanently skip failed jobs
- Add path_replace_fn parameter to _find_existing_subtitle_path so
caller passes path_mappings.path_replace / path_replace_movie; raw
os.path.exists on DB-stored paths breaks Docker path-mapped setups
- Convert f-string logging to % formatting to fix G004 lint failures
in series.py, movies.py, and processing.py
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
* fix: guard translate re-queue with jobs_queue pending check, clean up logging
- Add jobs_queue in-memory dedup check before translate_subtitles_file
so wanted-scan doesn't re-queue the same translation while an async
job is already pending (complements the history guard which only fires
after successful completion)
- Remove redundant str(e) from logging.exception calls (traceback is
already included automatically)
- Use %.1f%% for min_score to match source_score_percent formatting
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
* Add per-provider language settings
* Invert provider language selection
* Fix auto-translate media type and variant matching
Follow-up to #137. Queues series translations as episodes and matches Translate From profile targets by exact language variant.
* Fix embedded subtitle history upgrade handling (#154)
Co-authored-by: david <david.gutowsky@gmail.com>
* chore: prepare v2.3.1 draft release
* docs: revise v2.3.1 draft notes
* docs: add v2.3.1 codename
* fix: track per-provider apply state and add Apply all in updates panel (#155)
Applying one provider update used to flip every card's spinner because
all cards shared a single useMutation isPending boolean. Track applying
provider ids in local state so each card spins independently.
Also add an Apply all button to the Available now header that fans out
mutateAsync calls in parallel and settles once every apply finishes.
* docs: rename v2.3.1 codename to Keystone, add hero sketch and PNG
Drop the redundant "Bridge" suffix so v2.3.1 shares the Keystone
codename with v2.3.0. New hero sketch (keystone-v2.3.1.html) varies
seed and adds a teal accent for the auto-translate headline.
---------
Co-authored-by: david <david.gutowsky@gmail.com>
Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>1 parent 4879655 commit ee45539
41 files changed
Lines changed: 3879 additions & 60 deletions
File tree
- bazarr
- api/subtitles
- app
- compat
- subtitles
- indexer
- wanted
- custom_libs/subliminal_patch
- docs/release-notes
- frontend/src
- components
- bazarr
- forms
- pages
- Movies/Details
- Settings
- Providers
- hub
- __tests__
- Translator
- types
- screenshot
- site/hero
- tests
- bazarr
- compat/unit
- subliminal_patch
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
0 commit comments