Skip to content

Commit ee45539

Browse files
LavXdavidgut1982claude
authored
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

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.pre-commit-config.yaml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
repos:
2+
- repo: https://github.com/pre-commit/pre-commit-hooks
3+
rev: v4.6.0
4+
hooks:
5+
- id: trailing-whitespace
6+
- id: end-of-file-fixer
7+
- id: check-yaml
8+
- id: check-json
9+
- id: check-added-large-files
10+
args: ['--maxkb=500']
11+
- id: debug-statements
12+
- id: check-merge-conflict
13+
14+
- repo: https://github.com/astral-sh/ruff-pre-commit
15+
rev: v0.11.0
16+
hooks:
17+
- id: ruff
18+
args: [--fix]
19+
- id: ruff-format
20+
21+
- repo: https://github.com/Yelp/detect-secrets
22+
rev: v1.5.0
23+
hooks:
24+
- id: detect-secrets
25+
args: ['--baseline', '.secrets.baseline']
26+
exclude: '(\.lock|requirements.*\.txt|frontend/)$'

0 commit comments

Comments
 (0)