From 098d0e55ab8a0cd7149dd4ff7e5da2a66289beee Mon Sep 17 00:00:00 2001 From: JayZed Date: Wed, 18 Mar 2026 22:19:19 -0400 Subject: [PATCH] Fixed file permission is not applied to translated subtitles and other related issues #3239 --- bazarr/api/subtitles/subtitles.py | 55 ++++++++++++------------ bazarr/subtitles/sync.py | 5 ++- bazarr/subtitles/tools/translate/main.py | 6 ++- 3 files changed, 37 insertions(+), 29 deletions(-) diff --git a/bazarr/api/subtitles/subtitles.py b/bazarr/api/subtitles/subtitles.py index ed391bc42..6779b9699 100644 --- a/bazarr/api/subtitles/subtitles.py +++ b/bazarr/api/subtitles/subtitles.py @@ -147,6 +147,7 @@ class Subtitles(Resource): if action == 'sync': try: + postprocess_callback = lambda: postprocess_subtitles(subtitles_path, video_path, media_type, metadata, id) sync_subtitles(video_path=video_path, srt_path=subtitles_path, srt_lang=language, hi=hi, forced=forced, percent_score=0, # make sure to always sync when requested manually reference=args.get('reference') if args.get('reference') not in empty_values else @@ -160,6 +161,7 @@ class Subtitles(Resource): sonarr_episode_id=id if media_type == "episode" else None, radarr_id=id if media_type == "movie" else None, force_sync=True, + callback=postprocess_callback ) except OSError: return 'Unable to edit subtitles file. Check logs.', 409 @@ -185,16 +187,13 @@ class Subtitles(Resource): return 'Invalid source language code', 400 try: - result = translate_subtitles_file(video_path=video_path, source_srt_file=subtitles_path, + translate_subtitles_file(video_path=video_path, source_srt_file=subtitles_path, from_lang=from_language, to_lang=dest_language, forced=forced, hi=hi, media_type="series" if media_type == "episode" else "movies", sonarr_series_id=metadata.sonarrSeriesId if media_type == "episode" else None, sonarr_episode_id=id, - radarr_id=id) - if isinstance(result, str): - subtitles_path = result - elif result is False: - return 'Translation failed. Check logs for more details.', 502 + radarr_id=id, + metadata=metadata) except OSError: return 'Unable to edit subtitles file. Check logs.', 409 @@ -202,33 +201,35 @@ class Subtitles(Resource): try: subtitles_apply_mods(language=language, subtitle_path=subtitles_path, mods=[action], video_path=video_path) + postprocess_subtitles(subtitles_path, video_path, media_type, metadata, id) except OSError: return 'Unable to edit subtitles file. Check logs.', 409 - # apply chmod if required - chmod = int(settings.general.chmod, 8) if not sys.platform.startswith( - 'win') and settings.general.chmod_enabled else None - if chmod: - os.chmod(subtitles_path, chmod) - - if media_type == 'episode': - store_subtitles(path_mappings.path_replace_reverse(video_path), video_path) - event_stream(type='series', payload=metadata.sonarrSeriesId) - event_stream(type='episode', payload=id) - - if settings.general.use_plex and settings.plex.update_series_library: - plex_refresh_item(metadata.imdbId, is_movie=False, season=metadata.season, - episode=metadata.episode) - else: - store_subtitles_movie(path_mappings.path_replace_reverse_movie(video_path), video_path) - event_stream(type='movie', payload=id) - - if settings.general.use_plex and settings.plex.update_movie_library: - plex_refresh_item(metadata.imdbId, is_movie=True) - return '', 204 +def postprocess_subtitles(subtitles_path, video_path, media_type, metadata, id): + # apply chmod if required + chmod = int(settings.general.chmod, 8) if not sys.platform.startswith('win') and settings.general.chmod_enabled else None + if chmod: + os.chmod(subtitles_path, chmod) + + if media_type == 'episode': + store_subtitles(path_mappings.path_replace_reverse(video_path), video_path) + event_stream(type='series', payload=metadata.sonarrSeriesId) + event_stream(type='episode', payload=id) + + if settings.general.use_plex and settings.plex.update_series_library: + plex_refresh_item(metadata.imdbId, is_movie=False, season=metadata.season, + episode=metadata.episode) + else: + store_subtitles_movie(path_mappings.path_replace_reverse_movie(video_path), video_path) + event_stream(type='movie', payload=id) + + if settings.general.use_plex and settings.plex.update_movie_library: + plex_refresh_item(metadata.imdbId, is_movie=True) + + def subtitles_lang_from_filename(path): split_extensionless_path = os.path.splitext(path.lower())[0].rsplit(".", 2) diff --git a/bazarr/subtitles/sync.py b/bazarr/subtitles/sync.py index ca098d6db..ef1403943 100644 --- a/bazarr/subtitles/sync.py +++ b/bazarr/subtitles/sync.py @@ -23,7 +23,8 @@ def sync_subtitles(video_path, gss=settings.subsync.gss, no_fix_framerate=settings.subsync.no_fix_framerate, reference=None, - force_sync=False): + force_sync=False, + callback=None): if not settings.subsync.use_subsync and not force_sync: logging.debug('BAZARR automatic syncing is disabled in settings. Skipping sync routine.') return False @@ -66,6 +67,8 @@ def sync_subtitles(video_path, } try: subsync.sync(**sync_kwargs) + if callback: + callback() except Exception: logging.exception(f'BAZARR an unhandled exception occurs during the synchronization process for this ' f'subtitle file: {srt_path}') diff --git a/bazarr/subtitles/tools/translate/main.py b/bazarr/subtitles/tools/translate/main.py index 8201b4718..ab0829bb3 100644 --- a/bazarr/subtitles/tools/translate/main.py +++ b/bazarr/subtitles/tools/translate/main.py @@ -3,6 +3,7 @@ import logging import os + from subliminal_patch.core import get_subtitle_path from subzero.language import Language @@ -15,7 +16,7 @@ from subtitles.indexer.utils import get_external_subtitles_path def translate_subtitles_file(video_path, source_srt_file, from_lang, to_lang, forced, hi, - media_type, sonarr_series_id, sonarr_episode_id, radarr_id, job_id=None): + media_type, sonarr_series_id, sonarr_episode_id, radarr_id, metadata, job_id=None): if not job_id: jobs_queue.add_job_from_function(f'Translating from {from_lang.upper()} to {to_lang.upper()} using ' f'{settings.translator.translator_type.replace("_", " ").title()}', @@ -69,6 +70,9 @@ def translate_subtitles_file(video_path, source_srt_file, from_lang, to_lang, fo logging.debug(f'Created translator instance: {translator.__class__.__name__}') result = translator.translate(job_id=job_id) logging.debug(f'BAZARR saved translated subtitles to {dest_srt_file}') + from api.subtitles.subtitles import postprocess_subtitles + # Call postprocess_subtitles after translation + postprocess_subtitles(dest_srt_file, video_path, media_type, metadata, sonarr_episode_id if media_type == 'series' else radarr_id) return result except Exception as e: