diff --git a/bazarr/app/config.py b/bazarr/app/config.py index 0106aacf9..eebd5729b 100644 --- a/bazarr/app/config.py +++ b/bazarr/app/config.py @@ -293,6 +293,9 @@ validators = [ Validator('subsync.subsync_movie_threshold', must_exist=True, default=70, is_type_of=int, gte=0, lte=100), Validator('subsync.debug', must_exist=True, default=False, is_type_of=bool), Validator('subsync.force_audio', must_exist=True, default=False, is_type_of=bool), + Validator('subsync.checker', must_exist=True, default={}, is_type_of=dict), + Validator('subsync.checker.blacklisted_providers', must_exist=True, default=[], is_type_of=list), + Validator('subsync.checker.blacklisted_languages', must_exist=True, default=[], is_type_of=list), # series_scores section Validator('series_scores.hash', must_exist=True, default=359, is_type_of=int), @@ -402,7 +405,9 @@ array_keys = ['excluded_tags', 'enabled_providers', 'path_mappings', 'path_mappings_movie', - 'language_equals'] + 'language_equals', + 'blacklisted_languages', + 'blacklisted_providers'] empty_values = ['', 'None', 'null', 'undefined', None, []] @@ -628,7 +633,10 @@ def save_settings(settings_items): reset_throttled_providers(only_auth_or_conf_error=True) if settings_keys[0] == 'settings': - settings[settings_keys[1]][settings_keys[2]] = value + if len(settings_keys) == 3: + settings[settings_keys[1]][settings_keys[2]] = value + elif len(settings_keys) == 4: + settings[settings_keys[1]][settings_keys[2]][settings_keys[3]] = value if settings_keys[0] == 'subzero': mod = settings_keys[1] @@ -775,3 +783,31 @@ def configure_proxy_func(): def get_scores(): settings = get_settings() return {"movie": settings["movie_scores"], "episode": settings["series_scores"]} + + +def sync_checker(subtitle): + " This function can be extended with settings. It only takes a Subtitle argument" + + logging.debug("Checker data [%s] for %s", settings.subsync.checker, subtitle) + + bl_providers = settings.subsync.checker.blacklisted_providers + + # TODO + # bl_languages = settings.subsync.checker.blacklisted_languages + + verdicts = set() + + # You can add more inner checkers. The following is a verfy basic one for providers, + # but you can make your own functions, etc to handle more complex stuff. You have + # subtitle data to compare. + + verdicts.add(subtitle.provider_name not in bl_providers) + + met = False not in verdicts + + if met is True: + logging.debug("BAZARR Sync checker passed.") + return True + else: + logging.debug("BAZARR Sync checker not passed. Won't sync.") + return False diff --git a/bazarr/subtitles/processing.py b/bazarr/subtitles/processing.py index 9325d1904..34538b147 100644 --- a/bazarr/subtitles/processing.py +++ b/bazarr/subtitles/processing.py @@ -3,7 +3,7 @@ import logging -from app.config import settings +from app.config import settings, sync_checker as _defaul_sync_checker from utilities.path_mappings import path_mappings from utilities.post_processing import pp_replace, set_chmod from languages.get_languages import alpha2_from_alpha3, alpha2_from_language, alpha3_from_language, language_from_alpha3 @@ -69,6 +69,9 @@ def process_subtitle(subtitle, media_type, audio_language, path, max_score, is_u message = (f"{downloaded_language}{modifier_string} subtitles {action} from {downloaded_provider} with a score of " f"{percent_score}%.") + sync_checker = _defaul_sync_checker + logging.debug("Sync checker: %s", sync_checker) + if media_type == 'series': episode_metadata = database.execute( select(TableEpisodes.sonarrSeriesId, TableEpisodes.sonarrEpisodeId) @@ -79,13 +82,14 @@ def process_subtitle(subtitle, media_type, audio_language, path, max_score, is_u series_id = episode_metadata.sonarrSeriesId episode_id = episode_metadata.sonarrEpisodeId - from .sync import sync_subtitles - sync_subtitles(video_path=path, srt_path=downloaded_path, - forced=subtitle.language.forced, - srt_lang=downloaded_language_code2, media_type=media_type, - percent_score=percent_score, - sonarr_series_id=episode_metadata.sonarrSeriesId, - sonarr_episode_id=episode_metadata.sonarrEpisodeId) + if sync_checker(subtitle) is True: + from .sync import sync_subtitles + sync_subtitles(video_path=path, srt_path=downloaded_path, + forced=subtitle.language.forced, + srt_lang=downloaded_language_code2, media_type=media_type, + percent_score=percent_score, + sonarr_series_id=episode_metadata.sonarrSeriesId, + sonarr_episode_id=episode_metadata.sonarrEpisodeId) else: movie_metadata = database.execute( select(TableMovies.radarrId) @@ -96,12 +100,13 @@ def process_subtitle(subtitle, media_type, audio_language, path, max_score, is_u series_id = "" episode_id = movie_metadata.radarrId - from .sync import sync_subtitles - sync_subtitles(video_path=path, srt_path=downloaded_path, - forced=subtitle.language.forced, - srt_lang=downloaded_language_code2, media_type=media_type, - percent_score=percent_score, - radarr_id=movie_metadata.radarrId) + if sync_checker(subtitle) is True: + from .sync import sync_subtitles + sync_subtitles(video_path=path, srt_path=downloaded_path, + forced=subtitle.language.forced, + srt_lang=downloaded_language_code2, media_type=media_type, + percent_score=percent_score, + radarr_id=movie_metadata.radarrId) if use_postprocessing is True: command = pp_replace(postprocessing_cmd, path, downloaded_path, downloaded_language, downloaded_language_code2, diff --git a/frontend/src/pages/Settings/Subtitles/index.tsx b/frontend/src/pages/Settings/Subtitles/index.tsx index 0d0337201..ee0dda2ce 100644 --- a/frontend/src/pages/Settings/Subtitles/index.tsx +++ b/frontend/src/pages/Settings/Subtitles/index.tsx @@ -5,6 +5,7 @@ import { CollapseBox, Layout, Message, + MultiSelector, Password, Section, Selector, @@ -23,6 +24,7 @@ import { embeddedSubtitlesParserOption, folderOptions, hiExtensionOptions, + providerOptions, } from "./options"; interface CommandOption { @@ -405,6 +407,13 @@ const SettingsSubtitlesView: FunctionComponent = () => { subtitles. + Do not actually sync the subtitles but generate a .tar.gz file to be diff --git a/frontend/src/pages/Settings/Subtitles/options.ts b/frontend/src/pages/Settings/Subtitles/options.ts index 62c4f60b2..2c57584fe 100644 --- a/frontend/src/pages/Settings/Subtitles/options.ts +++ b/frontend/src/pages/Settings/Subtitles/options.ts @@ -1,4 +1,5 @@ import { SelectorOption } from "@/components"; +import { ProviderList } from "../Providers/list"; export const hiExtensionOptions: SelectorOption[] = [ { @@ -165,3 +166,10 @@ export const colorOptions: SelectorOption[] = [ value: buildColor("dark-grey"), }, ]; + +export const providerOptions: SelectorOption[] = ProviderList.map( + (v) => ({ + label: v.key, + value: v.key, + }) +);