mirror of
https://github.com/morpheus65535/bazarr.git
synced 2025-04-24 22:57:13 -04:00
182 lines
7.3 KiB
Python
182 lines
7.3 KiB
Python
# coding=utf-8
|
|
# fmt: off
|
|
|
|
import os
|
|
import sys
|
|
import logging
|
|
|
|
from subzero.language import Language
|
|
from subliminal_patch.core import save_subtitles
|
|
from subliminal_patch.subtitle import Subtitle
|
|
from pysubs2.formats import get_format_identifier
|
|
|
|
from languages.get_languages import language_from_alpha3, alpha2_from_alpha3, alpha3_from_alpha2
|
|
from app.config import settings, get_array_from
|
|
from utilities.helper import get_target_folder, force_unicode
|
|
from utilities.post_processing import pp_replace, set_chmod
|
|
from utilities.path_mappings import path_mappings
|
|
from radarr.notify import notify_radarr
|
|
from sonarr.notify import notify_sonarr
|
|
from languages.custom_lang import CustomLanguage
|
|
from app.database import TableEpisodes, TableMovies, TableShows, get_profiles_list, database, select
|
|
from app.event_handler import event_stream
|
|
from subtitles.processing import ProcessSubtitlesResult
|
|
|
|
from .sync import sync_subtitles
|
|
from .post_processing import postprocessing
|
|
|
|
|
|
def manual_upload_subtitle(path, language, forced, hi, media_type, subtitle, audio_language):
|
|
logging.debug(f'BAZARR Manually uploading subtitles for this file: {path}')
|
|
|
|
single = settings.general.single_language
|
|
|
|
use_postprocessing = settings.general.use_postprocessing
|
|
postprocessing_cmd = settings.general.postprocessing_cmd
|
|
|
|
chmod = int(settings.general.chmod, 8) if not sys.platform.startswith(
|
|
'win') and settings.general.chmod_enabled else None
|
|
|
|
language = alpha3_from_alpha2(language)
|
|
|
|
custom = CustomLanguage.from_value(language, "alpha3")
|
|
if custom is None:
|
|
lang_obj = Language(language)
|
|
else:
|
|
lang_obj = custom.subzero_language()
|
|
|
|
if hi:
|
|
lang_obj = Language.rebuild(lang_obj, hi=True)
|
|
|
|
if forced:
|
|
lang_obj = Language.rebuild(lang_obj, forced=True)
|
|
|
|
if media_type == 'series':
|
|
episode_metadata = database.execute(
|
|
select(TableEpisodes.sonarrSeriesId,
|
|
TableEpisodes.sonarrEpisodeId,
|
|
TableShows.profileId)
|
|
.select_from(TableEpisodes)
|
|
.join(TableShows)
|
|
.where(TableEpisodes.path == path_mappings.path_replace_reverse(path))) \
|
|
.first()
|
|
|
|
if episode_metadata:
|
|
use_original_format = bool(get_profiles_list(episode_metadata.profileId)["originalFormat"])
|
|
else:
|
|
use_original_format = False
|
|
else:
|
|
movie_metadata = database.execute(
|
|
select(TableMovies.radarrId, TableMovies.profileId)
|
|
.where(TableMovies.path == path_mappings.path_replace_reverse_movie(path))) \
|
|
.first()
|
|
|
|
if movie_metadata:
|
|
use_original_format = bool(get_profiles_list(movie_metadata.profileId)["originalFormat"])
|
|
else:
|
|
use_original_format = False
|
|
|
|
sub = Subtitle(
|
|
lang_obj,
|
|
mods=get_array_from(settings.general.subzero_mods),
|
|
original_format=use_original_format
|
|
)
|
|
|
|
sub.content = subtitle.read()
|
|
if not sub.is_valid():
|
|
logging.exception(f'BAZARR Invalid subtitle file: {subtitle.filename}')
|
|
sub.mods = None
|
|
|
|
if settings.general.utf8_encode:
|
|
sub.set_encoding("utf-8")
|
|
|
|
try:
|
|
sub.format = (get_format_identifier(os.path.splitext(subtitle.filename)[1]),)
|
|
except Exception:
|
|
pass
|
|
|
|
saved_subtitles = []
|
|
try:
|
|
saved_subtitles = save_subtitles(path,
|
|
[sub],
|
|
single=single,
|
|
tags=None, # fixme
|
|
directory=get_target_folder(path),
|
|
chmod=chmod,
|
|
formats=(sub.format,) if use_original_format else ("srt",),
|
|
path_decoder=force_unicode)
|
|
except Exception:
|
|
logging.exception(f'BAZARR Error saving Subtitles file to disk for this file: {path}')
|
|
return
|
|
|
|
if len(saved_subtitles) < 1:
|
|
logging.exception(f'BAZARR Error saving Subtitles file to disk for this file: {path}')
|
|
return
|
|
|
|
subtitle_path = saved_subtitles[0].storage_path
|
|
|
|
if hi:
|
|
modifier_string = " HI"
|
|
elif forced:
|
|
modifier_string = " forced"
|
|
else:
|
|
modifier_string = ""
|
|
|
|
if hi:
|
|
modifier_code = ":hi"
|
|
elif forced:
|
|
modifier_code = ":forced"
|
|
else:
|
|
modifier_code = ""
|
|
uploaded_language_code3 = language + modifier_code
|
|
uploaded_language = language_from_alpha3(language) + modifier_string
|
|
uploaded_language_code2 = alpha2_from_alpha3(language) + modifier_code
|
|
|
|
if media_type == 'series':
|
|
if not episode_metadata:
|
|
return
|
|
series_id = episode_metadata.sonarrSeriesId
|
|
episode_id = episode_metadata.sonarrEpisodeId
|
|
sync_subtitles(video_path=path, srt_path=subtitle_path, srt_lang=uploaded_language_code2, percent_score=100,
|
|
sonarr_series_id=episode_metadata.sonarrSeriesId, forced=forced,
|
|
sonarr_episode_id=episode_metadata.sonarrEpisodeId)
|
|
else:
|
|
if not movie_metadata:
|
|
return
|
|
series_id = ""
|
|
episode_id = movie_metadata.radarrId
|
|
sync_subtitles(video_path=path, srt_path=subtitle_path, srt_lang=uploaded_language_code2, percent_score=100,
|
|
radarr_id=movie_metadata.radarrId, forced=forced)
|
|
|
|
if use_postprocessing:
|
|
command = pp_replace(postprocessing_cmd, path, subtitle_path, uploaded_language, uploaded_language_code2,
|
|
uploaded_language_code3, audio_language['name'], audio_language['code2'],
|
|
audio_language['code3'], 100, "1", "manual", "user", "unknown", series_id, episode_id)
|
|
postprocessing(command, path)
|
|
set_chmod(subtitles_path=subtitle_path)
|
|
|
|
if media_type == 'series':
|
|
reversed_path = path_mappings.path_replace_reverse(path)
|
|
reversed_subtitles_path = path_mappings.path_replace_reverse(subtitle_path)
|
|
notify_sonarr(episode_metadata.sonarrSeriesId)
|
|
event_stream(type='series', action='update', payload=episode_metadata.sonarrSeriesId)
|
|
event_stream(type='episode-wanted', action='delete', payload=episode_metadata.sonarrEpisodeId)
|
|
else:
|
|
reversed_path = path_mappings.path_replace_reverse_movie(path)
|
|
reversed_subtitles_path = path_mappings.path_replace_reverse_movie(subtitle_path)
|
|
notify_radarr(movie_metadata.radarrId)
|
|
event_stream(type='movie', action='update', payload=movie_metadata.radarrId)
|
|
event_stream(type='movie-wanted', action='delete', payload=movie_metadata.radarrId)
|
|
|
|
result = ProcessSubtitlesResult(message=f"{language_from_alpha3(language)}{modifier_string} Subtitles manually "
|
|
"uploaded.",
|
|
reversed_path=reversed_path,
|
|
downloaded_language_code2=uploaded_language_code2,
|
|
downloaded_provider=None,
|
|
score=None,
|
|
forced=None,
|
|
subtitle_id=None,
|
|
reversed_subtitles_path=reversed_subtitles_path,
|
|
hearing_impaired=None)
|
|
|
|
return result
|