Hearing impaired (#1102)

This commit is contained in:
morpheus65535 2020-09-10 14:26:37 -04:00 committed by GitHub
parent 35ee6fb6f6
commit 5658a7a359
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 424 additions and 97 deletions

View File

@ -506,7 +506,13 @@ class Episodes(Resource):
subs[0] = {"name": language_from_alpha2(subtitle[0]),
"code2": subtitle[0],
"code3": alpha3_from_alpha2(subtitle[0]),
"forced": True if len(subtitle) > 1 else False}
"forced": False,
"hi": False}
if len(subtitle) > 1:
subs[0].update({
"forced": True if subtitle[1] == 'forced' else False,
"hi": True if subtitle[1] == 'hi' else False
})
if settings.general.getboolean('embedded_subs_show_desired'):
item['subtitles'] = [x for x in item['subtitles'] if
@ -522,7 +528,13 @@ class Episodes(Resource):
item['missing_subtitles'][i] = {"name": language_from_alpha2(subtitle[0]),
"code2": subtitle[0],
"code3": alpha3_from_alpha2(subtitle[0]),
"forced": True if len(subtitle) > 1 else False}
"forced": False,
"hi": False}
if len(subtitle) > 1:
item['missing_subtitles'][i].update({
"forced": True if subtitle[1] == 'forced' else False,
"hi": True if subtitle[1] == 'hi' else False
})
else:
item.update({"missing_subtitles": []})
@ -544,6 +556,7 @@ class EpisodesSubtitlesDelete(Resource):
episodePath = request.form.get('episodePath')
language = request.form.get('language')
forced = request.form.get('forced')
hi = request.form.get('hi')
subtitlesPath = request.form.get('subtitlesPath')
sonarrSeriesId = request.form.get('sonarrSeriesId')
sonarrEpisodeId = request.form.get('sonarrEpisodeId')
@ -551,6 +564,7 @@ class EpisodesSubtitlesDelete(Resource):
result = delete_subtitles(media_type='series',
language=language,
forced=forced,
hi=hi,
media_path=episodePath,
subtitles_path=subtitlesPath,
sonarr_series_id=sonarrSeriesId,
@ -586,7 +600,12 @@ class EpisodesSubtitlesDownload(Resource):
message = result[0]
path = result[1]
forced = result[5]
language_code = result[2] + ":forced" if forced else result[2]
if result[8]:
language_code = result[2] + ":hi"
elif forced:
language_code = result[2] + ":forced"
else:
language_code = result[2]
provider = result[3]
score = result[4]
subs_id = result[6]
@ -655,7 +674,12 @@ class EpisodesSubtitlesManualDownload(Resource):
message = result[0]
path = result[1]
forced = result[5]
language_code = result[2] + ":forced" if forced else result[2]
if result[8]:
language_code = result[2] + ":hi"
elif forced:
language_code = result[2] + ":forced"
else:
language_code = result[2]
provider = result[3]
score = result[4]
subs_id = result[6]
@ -705,7 +729,10 @@ class EpisodesSubtitlesUpload(Resource):
message = result[0]
path = result[1]
subs_path = result[2]
language_code = language + ":forced" if forced else language
if forced:
language_code = result[2] + ":forced"
else:
language_code = result[2]
provider = "manual"
score = 360
history_log(4, sonarrSeriesId, sonarrEpisodeId, message, path, language_code, provider, score, subtitles_path=subs_path)
@ -755,7 +782,8 @@ class EpisodesHistory(Resource):
item['language'] = {"name": language_from_alpha2(language[0]),
"code2": language[0],
"code3": alpha3_from_alpha2(language[0]),
"forced": True if len(language) > 1 else False}
"forced": True if item['language'].endswith(':forced') else False,
"hi": True if item['language'].endswith(':hi') else False}
if item['score']:
item['score'] = str(round((int(item['score']) * 100 / 360), 2)) + "%"
@ -874,7 +902,13 @@ class Movies(Resource):
"name": language_from_alpha2(language[0]),
"code2": language[0],
"code3": alpha3_from_alpha2(language[0]),
"forced": True if len(language) > 1 else False}
"forced": False,
"hi": False}
if len(language) > 1:
item['subtitles'][i].update({
"forced": True if language[1] == 'forced' else False,
"hi": True if language[1] == 'hi' else False
})
if settings.general.getboolean('embedded_subs_show_desired'):
desired_lang_list = []
@ -894,7 +928,13 @@ class Movies(Resource):
item['missing_subtitles'][i] = {"name": language_from_alpha2(language[0]),
"code2": language[0],
"code3": alpha3_from_alpha2(language[0]),
"forced": True if len(language) > 1 else False}
"forced": False,
"hi": False}
if len(language) > 1:
item['missing_subtitles'][i].update({
"forced": True if language[1] == 'forced' else False,
"hi": True if language[1] == 'hi' else False
})
else:
item.update({"missing_subtitles": []})
@ -1034,12 +1074,14 @@ class MovieSubtitlesDelete(Resource):
moviePath = request.form.get('moviePath')
language = request.form.get('language')
forced = request.form.get('forced')
hi = request.form.get('hi')
subtitlesPath = request.form.get('subtitlesPath')
radarrId = request.form.get('radarrId')
result = delete_subtitles(media_type='movie',
language=language,
forced=forced,
hi=hi,
media_path=moviePath,
subtitles_path=subtitlesPath,
radarr_id=radarrId)
@ -1073,7 +1115,12 @@ class MovieSubtitlesDownload(Resource):
message = result[0]
path = result[1]
forced = result[5]
language_code = result[2] + ":forced" if forced else result[2]
if result[8]:
language_code = result[2] + ":hi"
elif forced:
language_code = result[2] + ":forced"
else:
language_code = result[2]
provider = result[3]
score = result[4]
subs_id = result[6]
@ -1141,7 +1188,12 @@ class MovieSubtitlesManualDownload(Resource):
message = result[0]
path = result[1]
forced = result[5]
language_code = result[2] + ":forced" if forced else result[2]
if result[8]:
language_code = result[2] + ":hi"
elif forced:
language_code = result[2] + ":forced"
else:
language_code = result[2]
provider = result[3]
score = result[4]
subs_id = result[6]
@ -1190,7 +1242,10 @@ class MovieSubtitlesUpload(Resource):
message = result[0]
path = result[1]
subs_path = result[2]
language_code = language + ":forced" if forced else language
if forced:
language_code = language + ":forced"
else:
language_code = language
provider = "manual"
score = 120
history_log_movie(4, radarrId, message, path, language_code, provider, score, subtitles_path=subs_path)
@ -1240,7 +1295,8 @@ class MovieHistory(Resource):
item['language'] = {"name": language_from_alpha2(language[0]),
"code2": language[0],
"code3": alpha3_from_alpha2(language[0]),
"forced": True if len(language) > 1 else False}
"forced": True if item['language'].endswith(':forced') else False,
"hi": True if item['language'].endswith(':hi') else False}
if item['score']:
item['score'] = str(round((int(item['score']) * 100 / 120), 2)) + "%"
@ -1371,7 +1427,8 @@ class HistorySeries(Resource):
item['language'] = {"name": language_from_alpha2(splitted_language[0]),
"code2": splitted_language[0],
"code3": alpha3_from_alpha2(splitted_language[0]),
"forced": True if len(splitted_language) > 1 else False}
"forced": True if item['language'].endswith(':forced') else False,
"hi": True if item['language'].endswith(':hi') else False}
# Make timestamp pretty
if item['timestamp']:
@ -1594,7 +1651,13 @@ class WantedSeries(Resource):
item['missing_subtitles'][i] = {"name": language_from_alpha2(splitted_subs[0]),
"code2": splitted_subs[0],
"code3": alpha3_from_alpha2(splitted_subs[0]),
"forced": True if len(splitted_subs) > 1 else False}
"forced": False,
"hi": False}
if len(splitted_subs) > 1:
item['missing_subtitles'][i].update({
"forced": True if splitted_subs[1] == 'forced' else False,
"hi": True if splitted_subs[1] == 'hi' else False
})
else:
item.update({"missing_subtitles": []})
@ -1632,7 +1695,13 @@ class WantedMovies(Resource):
item['missing_subtitles'][i] = {"name": language_from_alpha2(splitted_subs[0]),
"code2": splitted_subs[0],
"code3": alpha3_from_alpha2(splitted_subs[0]),
"forced": True if len(splitted_subs) > 1 else False}
"forced": False,
"hi": False}
if len(splitted_subs) > 1:
item['missing_subtitles'][i].update({
"forced": True if splitted_subs[1] == 'forced' else False,
"hi": True if splitted_subs[1] == 'hi' else False
})
else:
item.update({"missing_subtitles": []})
@ -1688,7 +1757,8 @@ class BlacklistSeries(Resource):
item['language'] = {"name": language_from_alpha2(language[0]),
"code2": language[0],
"code3": alpha3_from_alpha2(language[0]),
"forced": True if len(language) > 1 else False}
"forced": True if item['language'].endswith(':forced') else False,
"hi": True if item['language'].endswith(':hi') else False}
return jsonify(draw=draw, recordsTotal=row_count, recordsFiltered=row_count, data=data)
@ -1702,7 +1772,13 @@ class BlacklistEpisodeSubtitlesAdd(Resource):
subs_id = request.form.get('subs_id')
language = request.form.get('language')
forced = request.form.get('forced')
language_str = language + ':forced' if forced == 'true' else language
hi = request.form.get('hi')
if hi == 'true':
language_str = language + ':hi'
elif forced == 'true':
language_str = language + ':forced'
else:
language_str = language
media_path = request.form.get('video_path')
subtitles_path = request.form.get('subtitles_path')
@ -1714,6 +1790,7 @@ class BlacklistEpisodeSubtitlesAdd(Resource):
delete_subtitles(media_type='series',
language=alpha3_from_alpha2(language),
forced=forced,
hi=hi,
media_path=path_mappings.path_replace(media_path),
subtitles_path=path_mappings.path_replace(subtitles_path),
sonarr_series_id=sonarr_series_id,
@ -1766,7 +1843,8 @@ class BlacklistMovies(Resource):
item['language'] = {"name": language_from_alpha2(language[0]),
"code2": language[0],
"code3": alpha3_from_alpha2(language[0]),
"forced": True if len(language) > 1 else False}
"forced": True if item['language'].endswith(':forced') else False,
"hi": True if item['language'].endswith(':hi') else False}
return jsonify(draw=draw, recordsTotal=row_count, recordsFiltered=row_count, data=data)
@ -1779,7 +1857,13 @@ class BlacklistMovieSubtitlesAdd(Resource):
subs_id = request.form.get('subs_id')
language = request.form.get('language')
forced = request.form.get('forced')
language_str = language + ':forced' if forced == 'true' else language
hi = request.form.get('hi')
if hi == 'true':
language_str = language + ':hi'
elif forced == 'true':
language_str = language + ':forced'
else:
language_str = language
media_path = request.form.get('video_path')
subtitles_path = request.form.get('subtitles_path')
@ -1790,6 +1874,7 @@ class BlacklistMovieSubtitlesAdd(Resource):
delete_subtitles(media_type='movie',
language=alpha3_from_alpha2(language),
forced=forced,
hi=hi,
media_path=path_mappings.path_replace_movie(media_path),
subtitles_path=path_mappings.path_replace_movie(subtitles_path),
radarr_id=radarr_id)

View File

@ -14,8 +14,8 @@ class EmbeddedSubsReader:
self.ffprobe = get_binary("ffprobe")
subtitles_list = []
if self.ffprobe:
toto = False
if self.ffprobe and toto:
api.initialize({'provider': 'ffmpeg', 'ffmpeg': self.ffprobe})
data = api.know(file)
@ -23,9 +23,11 @@ class EmbeddedSubsReader:
for detected_language in data['subtitle']:
if 'language' in detected_language:
language = detected_language['language'].alpha3
forced = detected_language['forced'] if 'forced' in detected_language else None
forced = detected_language['forced'] if 'forced' in detected_language else False
hearing_impaired = detected_language['hearing_impaired'] if 'hearing_impaired' in \
detected_language else False
codec = detected_language['format'] if 'format' in detected_language else None
subtitles_list.append([language, forced, codec])
subtitles_list.append([language, forced, hearing_impaired, codec])
else:
continue
else:
@ -37,7 +39,12 @@ class EmbeddedSubsReader:
logging.error('BAZARR cannot analyze this MKV with our built-in MKV parser, you should install ffmpeg: ' + file)
else:
for subtitle_track in mkv.subtitle_tracks:
subtitles_list.append([subtitle_track.language, subtitle_track.forced, subtitle_track.codec_id])
hearing_impaired = False
if subtitle_track.name:
if 'sdh' in subtitle_track.name.lower():
hearing_impaired = True
subtitles_list.append([subtitle_track.language, subtitle_track.forced, hearing_impaired,
subtitle_track.codec_id])
return subtitles_list

View File

@ -131,10 +131,14 @@ def download_subtitle(path, language, audio_language, hi, forced, providers, pro
lang_obj = Language('por', 'BR')
if forced == "True":
lang_obj = Language.rebuild(lang_obj, forced=True)
if hi == "force HI":
lang_obj = Language.rebuild(lang_obj, hi=True)
else:
lang_obj = Language(l)
if forced == "True":
lang_obj = Language.rebuild(lang_obj, forced=True)
if hi == "force HI":
lang_obj = Language.rebuild(lang_obj, hi=True)
language_set.add(lang_obj)
minimum_score = settings.general.minimum_score
@ -215,14 +219,19 @@ def download_subtitle(path, language, audio_language, hi, forced, providers, pro
audio_language_code2 = alpha2_from_language(audio_language)
audio_language_code3 = alpha3_from_language(audio_language)
downloaded_path = subtitle.storage_path
is_forced_string = " forced" if subtitle.language.forced else ""
if subtitle.language.hi:
modifier_string = " HI"
elif subtitle.language.forced:
modifier_string = " forced"
else:
modifier_string = ""
logging.debug('BAZARR Subtitles file saved to disk: ' + downloaded_path)
if is_upgrade:
action = "upgraded"
else:
action = "downloaded"
percent_score = round(subtitle.score * 100 / max_score, 2)
message = downloaded_language + is_forced_string + " subtitles " + action + " from " + \
message = downloaded_language + modifier_string + " subtitles " + action + " from " + \
downloaded_provider + " with a score of " + str(percent_score) + "%."
if media_type == 'series':
@ -278,7 +287,7 @@ def download_subtitle(path, language, audio_language, hi, forced, providers, pro
track_event(category=downloaded_provider, action=action, label=downloaded_language)
return message, reversed_path, downloaded_language_code2, downloaded_provider, subtitle.score, \
subtitle.language.forced, subtitle.id, reversed_subtitles_path
subtitle.language.forced, subtitle.id, reversed_subtitles_path, subtitle.language.hi
if not saved_any:
logging.debug('BAZARR No Subtitles were found for this file: ' + path)
@ -312,6 +321,7 @@ def manual_search(path, language, hi, forced, providers, providers_auth, sceneNa
for lang in ast.literal_eval(language):
lang = alpha3_from_alpha2(lang)
if lang == 'pob':
lang_obj = Language('por', 'BR')
if forced == "True":
@ -320,8 +330,13 @@ def manual_search(path, language, hi, forced, providers, providers_auth, sceneNa
lang_obj = Language(lang)
if forced == "True":
lang_obj = Language.rebuild(lang_obj, forced=True)
language_set.add(lang_obj)
if forced != "True":
lang_obj_hi = Language.rebuild(lang_obj, hi=True)
language_set.add(lang_obj_hi)
minimum_score = settings.general.minimum_score
minimum_score_movie = settings.general.minimum_score_movie
use_postprocessing = settings.general.getboolean('use_postprocessing')
@ -394,8 +409,8 @@ def manual_search(path, language, hi, forced, providers, providers_auth, sceneNa
subtitles_list.append(
dict(score=round((score / max_score * 100), 2),
orig_score=score,
score_without_hash=score_without_hash,
language=str(s.language), hearing_impaired=str(s.hearing_impaired),
score_without_hash=score_without_hash, forced=str(s.language.forced),
language=str(s.language.basename), hearing_impaired=str(s.hearing_impaired),
provider=s.provider_name,
subtitle=codecs.encode(pickle.dumps(s.make_picklable()), "base64").decode(),
url=s.page_link, matches=list(matches), dont_matches=list(not_matched),
@ -477,8 +492,13 @@ def manual_download_subtitle(path, language, audio_language, hi, forced, subtitl
audio_language_code3 = alpha3_from_language(audio_language)
downloaded_path = saved_subtitle.storage_path
logging.debug('BAZARR Subtitles file saved to disk: ' + downloaded_path)
is_forced_string = " forced" if subtitle.language.forced else ""
message = downloaded_language + is_forced_string + " subtitles downloaded from " + \
if subtitle.language.hi:
modifier_string = " HI"
elif subtitle.language.forced:
modifier_string = " forced"
else:
modifier_string = ""
message = downloaded_language + modifier_string + " subtitles downloaded from " + \
downloaded_provider + " with a score of " + str(score) + "% using manual search."
if media_type == 'series':
@ -533,7 +553,7 @@ def manual_download_subtitle(path, language, audio_language, hi, forced, subtitl
label=downloaded_language)
return message, reversed_path, downloaded_language_code2, downloaded_provider, subtitle.score, \
subtitle.language.forced, subtitle.id, reversed_subtitles_path
subtitle.language.forced, subtitle.id, reversed_subtitles_path, subtitle.language.hi
else:
logging.error(
"BAZARR Tried to manually download a Subtitles for file: " + path + " but we weren't able to do (probably throttled by " + str(
@ -668,7 +688,7 @@ def series_download_subtitles(no):
str(alpha3_from_alpha2(language.split(':')[0])),
episode['audio_language'],
series_details['hearing_impaired'],
"True" if len(language.split(':')) > 1 else "False",
"True" if language.endswith(':forced') else "False",
providers_list,
providers_auth,
str(episode['scene_name']),
@ -678,7 +698,12 @@ def series_download_subtitles(no):
message = result[0]
path = result[1]
forced = result[5]
language_code = result[2] + ":forced" if forced else result[2]
if result[8]:
language_code = result[2] + ":hi"
elif forced:
language_code = result[2] + ":forced"
else:
language_code = result[2]
provider = result[3]
score = result[4]
subs_id = result[6]
@ -715,7 +740,7 @@ def episode_download_subtitles(no):
str(alpha3_from_alpha2(language.split(':')[0])),
episode['audio_language'],
episode['hearing_impaired'],
"True" if len(language.split(':')) > 1 else "False",
"True" if language.endswith(':forced') else "False",
providers_list,
providers_auth,
str(episode['scene_name']),
@ -725,7 +750,12 @@ def episode_download_subtitles(no):
message = result[0]
path = result[1]
forced = result[5]
language_code = result[2] + ":forced" if forced else result[2]
if result[8]:
language_code = result[2] + ":hi"
elif forced:
language_code = result[2] + ":forced"
else:
language_code = result[2]
provider = result[3]
score = result[4]
subs_id = result[6]
@ -764,7 +794,7 @@ def movies_download_subtitles(no):
str(alpha3_from_alpha2(language.split(':')[0])),
movie['audio_language'],
movie['hearing_impaired'],
"True" if len(language.split(':')) > 1 else "False",
"True" if language.endswith(':forced') else "False",
providers_list,
providers_auth,
str(movie['sceneName']),
@ -774,7 +804,12 @@ def movies_download_subtitles(no):
message = result[0]
path = result[1]
forced = result[5]
language_code = result[2] + ":forced" if forced else result[2]
if result[8]:
language_code = result[2] + ":hi"
elif forced:
language_code = result[2] + ":forced"
else:
language_code = result[2]
provider = result[3]
score = result[4]
subs_id = result[6]
@ -823,7 +858,7 @@ def wanted_download_subtitles(path, l, count_episodes):
str(alpha3_from_alpha2(language.split(':')[0])),
episode['audio_language'],
episode['hearing_impaired'],
"True" if len(language.split(':')) > 1 else "False",
"True" if language.endswith(':forced') else "False",
providers_list,
providers_auth,
str(episode['scene_name']),
@ -833,7 +868,12 @@ def wanted_download_subtitles(path, l, count_episodes):
message = result[0]
path = result[1]
forced = result[5]
language_code = result[2] + ":forced" if forced else result[2]
if result[8]:
language_code = result[2] + ":hi"
elif forced:
language_code = result[2] + ":forced"
else:
language_code = result[2]
provider = result[3]
score = result[4]
subs_id = result[6]
@ -880,7 +920,7 @@ def wanted_download_subtitles_movie(path, l, count_movies):
str(alpha3_from_alpha2(language.split(':')[0])),
movie['audio_language'],
movie['hearing_impaired'],
"True" if len(language.split(':')) > 1 else "False",
"True" if language.endswith(':forced') else "False",
providers_list,
providers_auth,
str(movie['sceneName']),
@ -890,7 +930,12 @@ def wanted_download_subtitles_movie(path, l, count_movies):
message = result[0]
path = result[1]
forced = result[5]
language_code = result[2] + ":forced" if forced else result[2]
if result[8]:
language_code = result[2] + ":hi"
elif forced:
language_code = result[2] + ":forced"
else:
language_code = result[2]
provider = result[3]
score = result[4]
subs_id = result[6]
@ -1172,7 +1217,12 @@ def upgrade_subtitles():
message = result[0]
path = result[1]
forced = result[5]
language_code = result[2] + ":forced" if forced else result[2]
if result[8]:
language_code = result[2] + ":hi"
elif forced:
language_code = result[2] + ":forced"
else:
language_code = result[2]
provider = result[3]
score = result[4]
subs_id = result[6]

View File

@ -4,6 +4,7 @@ import gc
import os
import logging
import ast
import re
from guess_language import guess_language
from subliminal_patch import core, search_external_subtitles
from subzero.language import Language
@ -20,6 +21,7 @@ import chardet
gc.enable()
def store_subtitles(original_path, reversed_path):
logging.debug('BAZARR started subtitles indexing for this file: ' + reversed_path)
actual_subtitles = []
@ -28,7 +30,7 @@ def store_subtitles(original_path, reversed_path):
logging.debug("BAZARR is trying to index embedded subtitles.")
try:
subtitle_languages = embedded_subs_reader.list_languages(reversed_path)
for subtitle_language, subtitle_forced, subtitle_codec in subtitle_languages:
for subtitle_language, subtitle_forced, subtitle_hi, subtitle_codec in subtitle_languages:
try:
if (settings.general.getboolean("ignore_pgs_subs") and subtitle_codec.lower() == "pgs") or \
(settings.general.getboolean("ignore_vobsub_subs") and subtitle_codec.lower() ==
@ -40,6 +42,8 @@ def store_subtitles(original_path, reversed_path):
lang = str(alpha2_from_alpha3(subtitle_language))
if subtitle_forced:
lang = lang + ":forced"
if subtitle_hi:
lang = lang + ":hi"
logging.debug("BAZARR embedded subtitles detected: " + lang)
actual_subtitles.append([lang, None])
except:
@ -72,12 +76,12 @@ def store_subtitles(original_path, reversed_path):
logging.debug("BAZARR external subtitles detected: " + "pb:forced")
actual_subtitles.append(
[str("pb:forced"), path_mappings.path_replace_reverse(subtitle_path)])
elif not language:
elif not language.basename:
continue
elif str(language) != 'und':
logging.debug("BAZARR external subtitles detected: " + str(language))
actual_subtitles.append(
[str(language), path_mappings.path_replace_reverse(subtitle_path)])
elif str(language.basename) != 'und':
logging.debug("BAZARR external subtitles detected: " + str(language.basename))
actual_subtitles.append([str(language.basename + (':hi' if language.hi else '')),
path_mappings.path_replace_reverse(subtitle_path)])
database.execute("UPDATE table_episodes SET subtitles=? WHERE path=?",
(str(actual_subtitles), original_path))
@ -106,7 +110,7 @@ def store_subtitles_movie(original_path, reversed_path):
logging.debug("BAZARR is trying to index embedded subtitles.")
try:
subtitle_languages = embedded_subs_reader.list_languages(reversed_path)
for subtitle_language, subtitle_forced, subtitle_codec in subtitle_languages:
for subtitle_language, subtitle_forced, subtitle_hi, subtitle_codec in subtitle_languages:
try:
if (settings.general.getboolean("ignore_pgs_subs") and subtitle_codec.lower() == "pgs") or \
(settings.general.getboolean("ignore_vobsub_subs") and subtitle_codec.lower() ==
@ -118,6 +122,8 @@ def store_subtitles_movie(original_path, reversed_path):
lang = str(alpha2_from_alpha3(subtitle_language))
if subtitle_forced:
lang = lang + ':forced'
if subtitle_hi:
lang = lang + ':hi'
logging.debug("BAZARR embedded subtitles detected: " + lang)
actual_subtitles.append([lang, None])
except:
@ -147,11 +153,12 @@ def store_subtitles_movie(original_path, reversed_path):
elif str(os.path.splitext(subtitle)[0]).lower().endswith(tuple(brazilian_portuguese_forced)):
logging.debug("BAZARR external subtitles detected: " + "pb:forced")
actual_subtitles.append([str("pb:forced"), path_mappings.path_replace_reverse_movie(subtitle_path)])
elif not language:
elif not language.basename:
continue
elif str(language) != 'und':
logging.debug("BAZARR external subtitles detected: " + str(language))
actual_subtitles.append([str(language), path_mappings.path_replace_reverse_movie(subtitle_path)])
elif str(language.basename) != 'und':
logging.debug("BAZARR external subtitles detected: " + str(language.basename))
actual_subtitles.append([str(language) + (':hi' if language.hi else ''),
path_mappings.path_replace_reverse_movie(subtitle_path)])
database.execute("UPDATE table_movies SET subtitles=? WHERE path=?",
(str(actual_subtitles), original_path))
@ -179,8 +186,8 @@ def list_missing_subtitles(no=None, epno=None, send_event=True):
else:
episodes_subtitles_clause = ""
episodes_subtitles = database.execute("SELECT table_shows.sonarrSeriesId, table_episodes.sonarrEpisodeId, "
"table_episodes.subtitles, table_shows.languages, table_shows.forced "
"FROM table_episodes LEFT JOIN table_shows "
"table_episodes.subtitles, table_shows.languages, table_shows.forced, "
"table_shows.hearing_impaired FROM table_episodes LEFT JOIN table_shows "
"on table_episodes.sonarrSeriesId = table_shows.sonarrSeriesId" +
episodes_subtitles_clause)
if isinstance(episodes_subtitles, str):
@ -205,8 +212,16 @@ def list_missing_subtitles(no=None, epno=None, send_event=True):
actual_subtitles.append(subtitle)
if episode_subtitles['languages'] is not None:
desired_subtitles = ast.literal_eval(episode_subtitles['languages'])
if episode_subtitles['forced'] == "True" and desired_subtitles is not None:
for i, desired_subtitle in enumerate(desired_subtitles):
if desired_subtitles:
desired_subtitles_enum = enumerate(desired_subtitles)
else:
desired_subtitles_enum = None
if episode_subtitles['hearing_impaired'] == "True" and desired_subtitles is not None:
for i, desired_subtitle in desired_subtitles_enum:
desired_subtitles[i] = desired_subtitle + ":hi"
elif episode_subtitles['forced'] == "True" and desired_subtitles is not None:
for i, desired_subtitle in desired_subtitles_enum:
desired_subtitles[i] = desired_subtitle + ":forced"
elif episode_subtitles['forced'] == "Both" and desired_subtitles is not None:
for desired_subtitle in desired_subtitles:
@ -226,6 +241,10 @@ def list_missing_subtitles(no=None, epno=None, send_event=True):
else:
actual_subtitles_list.append(item[0])
missing_subtitles = list(set(desired_subtitles) - set(actual_subtitles_list))
if episode_subtitles['hearing_impaired'] == "False":
for item in missing_subtitles:
if item in actual_subtitles_list or (item + ':hi') in actual_subtitles_list:
missing_subtitles.remove(item)
missing_subtitles_global.append(tuple([str(missing_subtitles), episode_subtitles['sonarrEpisodeId'],
episode_subtitles['sonarrSeriesId']]))
@ -245,8 +264,8 @@ def list_missing_subtitles_movies(no=None, send_event=True):
else:
movies_subtitles_clause = ""
movies_subtitles = database.execute("SELECT radarrId, subtitles, languages, forced FROM table_movies" +
movies_subtitles_clause)
movies_subtitles = database.execute("SELECT radarrId, subtitles, languages, forced, hearing_impaired FROM "
"table_movies" + movies_subtitles_clause)
if isinstance(movies_subtitles, str):
logging.error("BAZARR list missing subtitles query to DB returned this instead of rows: " + movies_subtitles)
return
@ -269,8 +288,16 @@ def list_missing_subtitles_movies(no=None, send_event=True):
actual_subtitles.append(subtitle)
if movie_subtitles['languages'] is not None:
desired_subtitles = ast.literal_eval(movie_subtitles['languages'])
if movie_subtitles['forced'] == "True" and desired_subtitles is not None:
for i, desired_subtitle in enumerate(desired_subtitles):
if desired_subtitles:
desired_subtitles_enum = enumerate(desired_subtitles)
else:
desired_subtitles_enum = None
if movie_subtitles['hearing_impaired'] == "True" and desired_subtitles is not None:
for i, desired_subtitle in desired_subtitles_enum:
desired_subtitles[i] = desired_subtitle + ":hi"
elif movie_subtitles['forced'] == "True" and desired_subtitles is not None:
for i, desired_subtitle in desired_subtitles_enum:
desired_subtitles[i] = desired_subtitle + ":forced"
elif movie_subtitles['forced'] == "Both" and desired_subtitles is not None:
for desired_subtitle in desired_subtitles:
@ -289,6 +316,10 @@ def list_missing_subtitles_movies(no=None, send_event=True):
else:
actual_subtitles_list.append(item[0])
missing_subtitles = list(set(desired_subtitles) - set(actual_subtitles_list))
if movie_subtitles['hearing_impaired'] == "False":
for item in missing_subtitles:
if item in actual_subtitles_list or (item + ':hi') in actual_subtitles_list:
missing_subtitles.remove(item)
missing_subtitles_global.append(tuple([str(missing_subtitles), movie_subtitles['radarrId']]))
for missing_subtitles_item in missing_subtitles_global:
@ -397,4 +428,32 @@ def guess_external_subtitles(dest_folder, subtitles):
subtitles[subtitle] = Language.rebuild(Language.fromietf(detected_language))
except:
pass
# Detect hearing-impaired external subtitles not identified in filename
if not language.hi:
subtitle_path = os.path.join(dest_folder, subtitle)
with open(subtitle_path, 'rb') as f:
text = f.read()
try:
guess = chardet.detect(text)
logging.debug('BAZARR detected encoding %r', guess)
text = text.decode(guess["encoding"])
except (UnicodeDecodeError, TypeError):
logging.exception("BAZARR subtitles file doesn't seems to be text based. Skipping this file: " +
subtitle_path)
else:
TAG = r"(?:\s*{\\[iusb][0-1]}\s*)*"
music = re.compile(r'[-\s>~]*[*¶♫♪]+\s*.+|.+\s*[*¶♫♪]+\s*')
caps = re.compile(r'[A-ZÀ-Ž&+]{5,}')
brackets = re.compile(r'-?%(t)s["\']*[([][^([)\]]+?(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+[)\]]["\']*[\s:]*%(t)s'
% {"t": TAG})
HI_list = [music, caps, brackets]
for item in HI_list:
if bool(re.search(item, text)):
subtitles[subtitle] = Language.rebuild(subtitles[subtitle], hi=True)
break
return subtitles

View File

@ -215,13 +215,20 @@ def notify_radarr(radarr_id):
logging.debug('BAZARR notify Radarr')
def delete_subtitles(media_type, language, forced, media_path, subtitles_path, sonarr_series_id=None,
def delete_subtitles(media_type, language, forced, hi, media_path, subtitles_path, sonarr_series_id=None,
sonarr_episode_id=None, radarr_id=None):
if not subtitles_path.endswith('.srt'):
logging.error('BAZARR can only delete .srt files.')
return False
language_log = alpha2_from_alpha3(language) + ':forced' if forced in [True, 'true'] else alpha2_from_alpha3(language)
language_string = language_from_alpha3(language) + ' forced' if forced in [True, 'true'] else language_from_alpha3(language)
if hi in [True, 'true', 'True']:
language_log = alpha2_from_alpha3(language) + ':hi'
language_string = language_from_alpha3(language) + ' HI'
elif forced in [True, 'true', 'True']:
language_log = alpha2_from_alpha3(language) + ':forced'
language_string = language_from_alpha3(language) + ' forced'
else:
language_log = alpha2_from_alpha3(language)
language_string = language_from_alpha3(language)
result = language_string + " subtitles deleted from disk."
if media_type == 'series':

View File

@ -352,7 +352,7 @@ class SZProviderPool(ProviderPool):
for s in subtitles:
# get the matches
if s.language not in languages:
if s.language.basename not in languages:
logger.debug("%r: Skipping, language not searched for", s)
continue
@ -381,12 +381,12 @@ class SZProviderPool(ProviderPool):
break
# stop when all languages are downloaded
if set(s.language for s in downloaded_subtitles) == languages:
if set(s.language.basename for s in downloaded_subtitles) == languages:
logger.debug('All languages downloaded')
break
# check downloaded languages
if subtitle.language in set(s.language for s in downloaded_subtitles):
if subtitle.language in set(s.language.basename for s in downloaded_subtitles):
logger.debug('%r: Skipping subtitle: already downloaded', subtitle.language)
continue
@ -615,19 +615,24 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen
subtitles[p] = None
continue
# extract potential forced/normal/default tag
# extract potential forced/normal/default/hi tag
# fixme: duplicate from subtitlehelpers
split_tag = p_root.rsplit('.', 1)
adv_tag = None
if len(split_tag) > 1:
adv_tag = split_tag[1].lower()
if adv_tag in ['forced', 'normal', 'default', 'embedded', 'embedded-forced', 'custom']:
if adv_tag in ['forced', 'normal', 'default', 'embedded', 'embedded-forced', 'custom', 'hi', 'cc', 'sdh']:
p_root = split_tag[0]
forced = False
if adv_tag:
forced = "forced" in adv_tag
hi = False
if adv_tag:
hi_tag = ["hi", "cc", "sdh"]
hi = any(i for i in hi_tag if i in adv_tag)
# remove possible language code for matching
p_root_bare = ENDSWITH_LANGUAGECODE_RE.sub(
lambda m: "" if str(m.group(1)).lower() in FULL_LANGUAGE_LIST else m.group(0), p_root)
@ -649,6 +654,7 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen
try:
language = Language.fromietf(language_code)
language.forced = forced
language.hi = hi
except (ValueError, LanguageReverseError):
logger.error('Cannot parse language code %r', language_code)
language_code = None
@ -656,7 +662,7 @@ def _search_external_subtitles(path, languages=None, only_one=False, scandir_gen
language_code = None
if not language and not language_code and only_one:
language = Language.rebuild(list(languages)[0], forced=forced)
language = Language.rebuild(list(languages)[0], forced=forced, hi=hi)
subtitles[p] = language
@ -801,7 +807,7 @@ def download_best_subtitles(videos, languages, min_score=0, hearing_impaired=Fal
return downloaded_subtitles
def get_subtitle_path(video_path, language=None, extension='.srt', forced_tag=False, tags=None):
def get_subtitle_path(video_path, language=None, extension='.srt', forced_tag=False, hi_tag=False, tags=None):
"""Get the subtitle path using the `video_path` and `language`.
:param str video_path: path to the video.
@ -817,6 +823,10 @@ def get_subtitle_path(video_path, language=None, extension='.srt', forced_tag=Fa
if forced_tag:
tags.append("forced")
# fixme when we'll be ready to add .hi to filename when saving a subtitles
# elif hi_tag:
# tags.append("hi")
if language:
subtitle_root += '.' + str(language.basename)
@ -858,13 +868,13 @@ def save_subtitles(file_path, subtitles, single=False, directory=None, chmod=Non
continue
# check language
if subtitle.language in set(s.language for s in saved_subtitles):
if subtitle.language in set(s.language.basename for s in saved_subtitles):
logger.debug('Skipping subtitle %r: language already saved', subtitle)
continue
# create subtitle path
subtitle_path = get_subtitle_path(file_path, None if single else subtitle.language,
forced_tag=subtitle.language.forced, tags=tags)
forced_tag=subtitle.language.forced, hi_tag=subtitle.language.hi, tags=tags)
if directory is not None:
subtitle_path = os.path.join(directory, os.path.split(subtitle_path)[1])

View File

@ -63,6 +63,7 @@ class Addic7edProvider(_Addic7edProvider):
'heb', 'hrv', 'hun', 'hye', 'ind', 'ita', 'jpn', 'kor', 'mkd', 'msa', 'nld', 'nor', 'pol', 'por', 'ron', 'rus',
'slk', 'slv', 'spa', 'sqi', 'srp', 'swe', 'tha', 'tur', 'ukr', 'vie', 'zho'
]} | {Language.fromietf(l) for l in ["sr-Latn", "sr-Cyrl"]}
languages.update(set(Language.rebuild(l, hi=True) for l in languages))
USE_ADDICTED_RANDOM_AGENTS = False
hearing_impaired_verifiable = True
@ -381,6 +382,10 @@ class Addic7edProvider(_Addic7edProvider):
version = cells[4].text
download_link = cells[9].a['href'][1:]
# set subtitle language to hi if it's hearing_impaired
if hearing_impaired:
language = Language.rebuild(language, hi=True)
subtitle = self.subtitle_class(language, hearing_impaired, page_link, series, season, episode, title,
year,
version, download_link)

View File

@ -109,6 +109,7 @@ class OpenSubtitlesProvider(ProviderRetryMixin, _OpenSubtitlesProvider):
languages = {Language.fromopensubtitles(l) for l in language_converters['szopensubtitles'].codes}
languages.update(set(Language.rebuild(l, forced=True) for l in languages))
languages.update(set(Language.rebuild(l, hi=True) for l in languages))
def __init__(self, username=None, password=None, use_tag_search=False, only_foreign=False, also_foreign=False,
skip_wrong_fps=True, is_vip=False, use_ssl=True, timeout=15):
@ -313,6 +314,10 @@ class OpenSubtitlesProvider(ProviderRetryMixin, _OpenSubtitlesProvider):
elif (also_foreign or only_foreign) and foreign_parts_only:
language = Language.rebuild(language, forced=True)
# set subtitle language to hi if it's hearing_impaired
if hearing_impaired:
language = Language.rebuild(language, hi=True)
if language not in languages:
continue

View File

@ -107,6 +107,7 @@ class PodnapisiProvider(_PodnapisiProvider, ProviderSubtitleArchiveMixin):
languages = ({Language('por', 'BR'), Language('srp', script='Latn'), Language('srp', script='Cyrl')} |
{Language.fromalpha2(l) for l in language_converters['alpha2'].codes})
languages.update(set(Language.rebuild(l, forced=True) for l in languages))
languages.update(set(Language.rebuild(l, hi=True) for l in languages))
server_url = 'https://podnapisi.net/subtitles/'
only_foreign = False
@ -204,6 +205,10 @@ class PodnapisiProvider(_PodnapisiProvider, ProviderSubtitleArchiveMixin):
elif also_foreign and foreign:
_language = Language.rebuild(_language, forced=True)
# set subtitle language to hi if it's hearing_impaired
if hearing_impaired:
_language = Language.rebuild(_language, hi=True)
if language != _language:
continue

View File

@ -119,6 +119,7 @@ class SubsceneProvider(Provider, ProviderSubtitleArchiveMixin):
subtitle_class = SubsceneSubtitle
languages = supported_languages
languages.update(set(Language.rebuild(l, forced=True) for l in languages))
languages.update(set(Language.rebuild(l, hi=True) for l in languages))
session = None
skip_wrong_fps = False
@ -278,6 +279,10 @@ class SubsceneProvider(Provider, ProviderSubtitleArchiveMixin):
if self.only_foreign:
subtitle.language = Language.rebuild(subtitle.language, forced=True)
# set subtitle language to hi if it's hearing_impaired
if subtitle.hearing_impaired:
subtitle.language = Language.rebuild(subtitle.language, hi=True)
subtitles.append(subtitle)
logger.debug('Found subtitle %r', subtitle)

View File

@ -95,6 +95,7 @@ class YifySubtitlesProvider(Provider):
]
languages = {Language(l, c) for (_, l, c) in YifyLanguages}
languages.update(set(Language.rebuild(l, hi=True) for l in languages))
server_urls = ['https://yifysubtitles.org', 'https://www.yifysubtitles.com']
video_types = (Movie,)
@ -125,6 +126,11 @@ class YifySubtitlesProvider(Provider):
_, l, c = next(x for x in self.YifyLanguages if x[0] == sub_lang)
lang = Language(l, c)
# set subtitle language to hi if it's hearing_impaired
if hi:
lang = Language.rebuild(lang, hi=True)
if languages & {lang}:
return [YifySubtitle(lang, page_link, release, uploader, sub_link, rating, hi)]

View File

@ -16,6 +16,7 @@ from pysubs2 import SSAStyle
from pysubs2.subrip import parse_tags, MAX_REPRESENTABLE_TIME
from pysubs2.time import ms_to_times
from subzero.modification import SubtitleModifications
from subzero.language import Language
from subliminal import Subtitle as Subtitle_
from subliminal.subtitle import Episode, Movie, sanitize_release_group, get_equivalent_release_groups
from subliminal_patch.utils import sanitize
@ -62,6 +63,10 @@ class Subtitle(Subtitle_):
_is_valid = False
def __init__(self, language, hearing_impaired=False, page_link=None, encoding=None, mods=None):
# set subtitle language to hi if it's hearing_impaired
if hearing_impaired:
language = Language.rebuild(language, hi=True)
super(Subtitle, self).__init__(language, hearing_impaired=hearing_impaired, page_link=page_link,
encoding=encoding)
self.mods = mods

View File

@ -62,6 +62,7 @@ def wrap_forced(f):
args = args[1:]
s = args.pop(0)
forced = None
hi = None
if isinstance(s, (str,)):
base, forced = s.split(":") if ":" in s else (s, False)
else:
@ -70,6 +71,7 @@ def wrap_forced(f):
instance = f(cls, base, *args, **kwargs)
if isinstance(instance, Language):
instance.forced = forced == "forced"
instance.hi = hi == "hi"
return instance
return inner
@ -77,16 +79,18 @@ def wrap_forced(f):
class Language(Language_):
forced = False
hi = False
def __init__(self, language, country=None, script=None, unknown=None, forced=False):
def __init__(self, language, country=None, script=None, unknown=None, forced=False, hi=False):
self.forced = forced
self.hi = hi
super(Language, self).__init__(language, country=country, script=script, unknown=unknown)
def __getstate__(self):
return self.alpha3, self.country, self.script, self.forced
return self.alpha3, self.country, self.script, self.hi, self.forced
def __setstate__(self, state):
self.alpha3, self.country, self.script, self.forced = state
def __setstate__(self, forced):
self.alpha3, self.country, self.script, self.hi, self.forced = forced
def __hash__(self):
return hash(str(self))
@ -99,7 +103,8 @@ class Language(Language_):
return (self.alpha3 == other.alpha3 and
self.country == other.country and
self.script == other.script and
bool(self.forced) == bool(other.forced))
bool(self.forced) == bool(other.forced) and
bool(self.hi) == bool(other.hi))
def __str__(self):
return super(Language, self).__str__() + (":forced" if self.forced else "")
@ -112,12 +117,13 @@ class Language(Language_):
ret = super(Language, self).__getattr__(name)
if isinstance(ret, Language):
ret.forced = self.forced
ret.hi = self.hi
return ret
@classmethod
def rebuild(cls, instance, **replkw):
state = instance.__getstate__()
attrs = ("country", "script", "forced")
attrs = ("country", "script", "hi", "forced")
language = state[0]
kwa = dict(list(zip(attrs, state[1:])))
kwa.update(replkw)

View File

@ -53,7 +53,13 @@
{
data: 'language',
render: function (value) {
return value.name + ((value.forced) ? ' forced' : '')
var language_string = '';
if (value.hi) {
language_string = ' HI';
} else if (value.forced) {
language_string = ' forced';
}
return value.name + language_string;
}
},
{data: "provider"},

View File

@ -57,7 +57,13 @@
{
data: 'language',
render: function (value) {
return value.name + ((value.forced) ? ' forced' : '')
var language_string = '';
if (value.hi) {
language_string = ' HI';
} else if (value.forced) {
language_string = ' forced';
}
return value.name + language_string;
}
},
{data: "provider"},

View File

@ -595,10 +595,18 @@
}
function appendFunc(value) {
if (value[0].forced) {
var advtag = ':forced';
} else if (value[0].hi) {
var advtag = ':HI';
} else {
var advtag = '';
}
if (value[1] === null) {
languages = languages + '<span class="badge badge-secondary" data-toggle="tooltip" data-placement="right" title="' + value[0].name + ((value[0].forced) ? ' forced' : '') + '">' + value[0].code2 + ((value[0].forced) ? ':forced' : '') + '</span> ';
languages = languages + '<span class="badge badge-secondary" data-toggle="tooltip" data-placement="right" title="' + value[0].name + advtag + '">' + value[0].code2 + advtag + '</span> ';
} else {
languages = languages + '<a href="" class="remove_subtitles badge badge-secondary" data-toggle="tooltip" data-placement="right" title="' + value[0].name + ((value[0].forced) ? ' forced' : '') + '" data-episodePath="' + data.mapped_path + '" data-language="' + value[0].code3 + '" data-forced="' + value[0].forced + '" data-subtitlesPath="' + value[1] + '" data-sonarrEpisodeId=' + data.sonarrEpisodeId + '>' + value[0].code2 + ((value[0].forced) ? ':forced' : '') + ' <i class="far fa-trash-alt"></i></a> ';
languages = languages + '<a href="" class="remove_subtitles badge badge-secondary" data-toggle="tooltip" data-placement="right" title="' + value[0].name + advtag + '" data-episodePath="' + data.mapped_path + '" data-language="' + value[0].code3 + '" data-forced="' + value[0].forced + '" data-hi="' + value[0].hi + '" data-subtitlesPath="' + value[1] + '" data-sonarrEpisodeId=' + data.sonarrEpisodeId + '>' + value[0].code2 + advtag + ' <i class="far fa-trash-alt"></i></a> ';
}
}
}
@ -615,7 +623,15 @@
}
function appendFunc(value) {
languages = languages + '<a href="" class="get_subtitle badge badge-secondary" data-toggle="tooltip" data-placement="right" title="' + value.name + ((value.forced) ? ' forced' : '') + '" data-episodepath="' + data.mapped_path + '" data-scenename="' + data.scene_name + '" data-title="' + data.title + '" data-language="' + value.code3 + '" data-hi="' + seriesDetails.hearing_impaired + '" data-forced="' + value.forced + '" data-sonarrepisodeid=' + data.sonarrEpisodeId + '>' + value.code2 + ((value.forced) ? ':forced' : '') + ' <i class="fas fa-search"></i></a> ';
if (value.forced) {
var advtag = ':forced';
} else if (value.hi) {
var advtag = ':HI';
} else {
var advtag = '';
}
languages = languages + '<a href="" class="get_subtitle badge badge-secondary" data-toggle="tooltip" data-placement="right" title="' + value.name + advtag + '" data-episodepath="' + data.mapped_path + '" data-scenename="' + data.scene_name + '" data-title="' + data.title + '" data-language="' + value.code3 + '" data-hi="' + seriesDetails.hearing_impaired + '" data-forced="' + value.forced + '" data-sonarrepisodeid=' + data.sonarrEpisodeId + '>' + value.code2 + advtag + ' <i class="fas fa-search"></i></a> ';
}
}
},
@ -661,6 +677,7 @@
episodePath: $(this).attr("data-episodePath"),
language: $(this).attr("data-language"),
forced: $(this).attr("data-forced"),
hi: $(this).attr("data-hi"),
subtitlesPath: $(this).attr("data-subtitlesPath"),
sonarrSeriesId: seriesDetails['sonarrSeriesId'],
sonarrEpisodeId: $(this).attr("data-sonarrEpisodeId"),
@ -768,7 +785,10 @@
}
let text = '<div class="badge badge-secondary" style="margin:1px;">' + lng.toUpperCase() + '</div>';
if (data.hearing_impaired == "True") {
if (data.forced == "True") {
text += '<div class="badge badge-dark" style="margin:1px;">Forced</div>';
}
if (data.hearing_impaired == "True") {
text += '<div class="badge badge-dark" style="margin:1px;">HI</div>';
}
@ -1094,7 +1114,13 @@
data: 'language',
render: function (value) {
if (value) {
return value.name + ((value.forced) ? ' forced' : '')
var language_string = '';
if (value.hi) {
language_string = ' HI';
} else if (value.forced) {
language_string = ' forced';
}
return value.name + language_string;
} else {
return '<i>undefined</i>'
}
@ -1107,7 +1133,7 @@
data: null,
render: function (data) {
if (data.subs_id && data.subtitles_path && !data.blacklisted) {
return '<a href="" class="blacklist_subtitles badge badge-secondary" data-toggle="tooltip" data-placement="right" title="Blacklist this subtitles" data-sonarrSeriesId="' + data.sonarrSeriesId + '" data-sonarrEpisodeId="' + data.sonarrEpisodeId + '" data-language="' + data.language.code2 + '" data-forced="' + data.language.forced + '" data-provider="' + data.provider + '" data-subs_id="' + data.subs_id + '" data-video_path="' + data.video_path + '" data-subtitles_path="' + data.mapped_subtitles_path + '"><i class="far fa-file-excel"></i></a>';
return '<a href="" class="blacklist_subtitles badge badge-secondary" data-toggle="tooltip" data-placement="right" title="Blacklist this subtitles" data-sonarrSeriesId="' + data.sonarrSeriesId + '" data-sonarrEpisodeId="' + data.sonarrEpisodeId + '" data-language="' + data.language.code2 + '" data-forced="' + data.language.forced + '" data-hi="' + data.language.hi + '" data-provider="' + data.provider + '" data-subs_id="' + data.subs_id + '" data-video_path="' + data.video_path + '" data-subtitles_path="' + data.mapped_subtitles_path + '"><i class="far fa-file-excel"></i></a>';
} else {
return null;
}
@ -1133,7 +1159,8 @@
language: $(this).attr('data-language'),
forced: $(this).attr('data-forced'),
video_path: $(this).attr('data-video_path'),
subtitles_path: $(this).attr('data-subtitles_path')
subtitles_path: $(this).attr('data-subtitles_path'),
hi: $(this).attr('data-hi')
};
var cell = $(this).parent();
$.ajax({

View File

@ -80,7 +80,7 @@
data: null,
render: function (data) {
if (data.subs_id && data.subtitles_path && !data.blacklisted) {
return '<a href="" class="blacklist_subtitles badge badge-secondary" data-toggle="tooltip" data-placement="right" title="Blacklist this subtitles" data-radarrid="' + data.radarrId + '" data-language="' + data.language.code2 + '" data-forced="' + data.language.forced + '" data-provider="' + data.provider + '" data-subs_id="' + data.subs_id + '" data-video_path="' + data.video_path + '" data-subtitles_path="' + data.subtitles_path + '"><i class="far fa-file-excel"></i></a>';
return '<a href="" class="blacklist_subtitles badge badge-secondary" data-toggle="tooltip" data-placement="right" title="Blacklist this subtitles" data-radarrid="' + data.radarrId + '" data-language="' + data.language.code2 + '" data-forced="' + data.language.forced + '" data-hi="' + data.language.hi + '" data-provider="' + data.provider + '" data-subs_id="' + data.subs_id + '" data-video_path="' + data.video_path + '" data-subtitles_path="' + data.subtitles_path + '"><i class="far fa-file-excel"></i></a>';
} else {
return null;
}
@ -98,6 +98,7 @@
subs_id: $(this).attr('data-subs_id'),
language: $(this).attr('data-language'),
forced: $(this).attr('data-forced'),
hi: $(this).attr('data-hi'),
video_path: $(this).attr('data-video_path'),
subtitles_path: $(this).attr('data-subtitles_path')
};

View File

@ -84,7 +84,7 @@
data: null,
render: function (data) {
if (data.subs_id && data.subtitles_path && !data.blacklisted) {
return '<a href="" class="blacklist_subtitles badge badge-secondary" data-toggle="tooltip" data-placement="right" title="Blacklist this subtitles" data-sonarrSeriesId="' + data.sonarrSeriesId + '" data-sonarrEpisodeId="' + data.sonarrEpisodeId + '" data-language="' + data.language.code2 + '" data-forced="' + data.language.forced + '" data-provider="' + data.provider + '" data-subs_id="' + data.subs_id + '" data-video_path="' + data.path + '" data-subtitles_path="' + data.mapped_subtitles_path + '"><i class="far fa-file-excel"></i></a>';
return '<a href="" class="blacklist_subtitles badge badge-secondary" data-toggle="tooltip" data-placement="right" title="Blacklist this subtitles" data-sonarrSeriesId="' + data.sonarrSeriesId + '" data-sonarrEpisodeId="' + data.sonarrEpisodeId + '" data-language="' + data.language.code2 + '" data-forced="' + data.language.forced + '" data-hi="' + data.language.hi + '" data-provider="' + data.provider + '" data-subs_id="' + data.subs_id + '" data-video_path="' + data.path + '" data-subtitles_path="' + data.mapped_subtitles_path + '"><i class="far fa-file-excel"></i></a>';
} else {
return null;
}
@ -103,6 +103,7 @@
subs_id: $(this).attr('data-subs_id'),
language: $(this).attr('data-language'),
forced: $(this).attr('data-forced'),
hi: $(this).attr('data-hi'),
video_path: $(this).attr('data-video_path'),
subtitles_path: $(this).attr('data-subtitles_path')
};

View File

@ -520,6 +520,7 @@
moviePath: movieDetails['mapped_path'],
language: $(this).data("language"),
forced: $(this).data("forced"),
hi: $(this).data("hi"),
subtitlesPath: $(this).data("subtitlespath"),
radarrId: movieDetails['radarrId'],
tmdbid: movieDetails['tmdbId']
@ -621,7 +622,10 @@
}
let text = '<div class="badge badge-secondary" style="margin:1px;">' + lng.toUpperCase() + '</div>';
if (data.hearing_impaired == "True") {
if (data.forced == "True") {
text += '<div class="badge badge-dark" style="margin:1px;">Forced</div>';
}
if (data.hearing_impaired == "True") {
text += '<div class="badge badge-dark" style="margin:1px;">HI</div>';
}
@ -899,7 +903,13 @@
data: 'language',
render: function (value) {
if (value) {
return value.name + ((value.forced) ? ' forced' : '')
var language_string = '';
if (value.hi) {
language_string = ' HI';
} else if (value.forced) {
language_string = ' forced';
}
return value.name + language_string;
} else {
return '<i>undefined</i>'
}
@ -912,7 +922,7 @@
data: null,
render: function (data) {
if (data.subs_id && data.subtitles_path && !data.blacklisted) {
return '<a href="" class="blacklist_subtitles badge badge-secondary" data-toggle="tooltip" data-placement="right" title="Blacklist this subtitles" data-radarrid="' + data.radarrId + '" data-language="' + data.language.code2 + '" data-forced="' + data.language.forced + '" data-provider="' + data.provider + '" data-subs_id="' + data.subs_id + '" data-video_path="' + data.video_path + '" data-subtitles_path="' + data.subtitles_path + '"><i class="far fa-file-excel"></i></a>';
return '<a href="" class="blacklist_subtitles badge badge-secondary" data-toggle="tooltip" data-placement="right" title="Blacklist this subtitles" data-radarrid="' + data.radarrId + '" data-language="' + data.language.code2 + '" data-forced="' + data.language.forced + '" data-hi="' + data.language.hi + '" data-provider="' + data.provider + '" data-subs_id="' + data.subs_id + '" data-video_path="' + data.video_path + '" data-subtitles_path="' + data.subtitles_path + '"><i class="far fa-file-excel"></i></a>';
} else {
return null;
}
@ -936,6 +946,7 @@
subs_id: $(this).attr('data-subs_id'),
language: $(this).attr('data-language'),
forced: $(this).attr('data-forced'),
hi: $(this).attr('data-hi'),
video_path: $(this).attr('data-video_path'),
subtitles_path: $(this).attr('data-subtitles_path')
};
@ -1237,6 +1248,8 @@
function missingAppendFunc(value) {
if (value.forced) {
missing_languages += '<button class="get_subtitle btn btn-secondary btn-sm" type="button" data-toggle="tooltip" data-placement="right" data-original-title="' + value.name + '" data-language="' + value.code3 + '" data-forced=' + value.forced + '>' + value.code2 + ':forced <i class="fas fa-search"></i></button> ';
} else if (value.hi) {
missing_languages += '<button class="get_subtitle btn btn-secondary btn-sm" type="button" data-toggle="tooltip" data-placement="right" data-original-title="' + value.name + '" data-language="' + value.code3 + '" data-forced=' + value.forced + '>' + value.code2 + ':HI <i class="fas fa-search"></i></button> ';
} else {
missing_languages += '<button class="get_subtitle btn btn-secondary btn-sm" type="button" data-toggle="tooltip" data-placement="right" data-original-title="' + value.name + '" data-language="' + value.code3 + '" data-forced=' + value.forced + '>' + value.code2 + ' <i class="fas fa-search"></i></button> ';
}
@ -1283,6 +1296,8 @@
"render": function(data) {
if (data['forced']) {
return '<span class="badge badge-secondary">' + data['name'] + ' forced</span>';
} else if (data['hi']) {
return '<span class="badge badge-secondary">' + data['name'] + ' HI</span>';
} else {
return '<span class="badge badge-secondary">' + data['name'] + '</span>';
}
@ -1291,7 +1306,7 @@
{ "data" : null,
"render": function(data) {
if (data['path']) {
return '<button type="button" class="remove_subtitles close" aria-label="Close" data-toggle="tooltip" data-placement="right" title="Delete Subtitles File" data-language='+data['code3']+' data-forced='+data['forced']+' data-subtitlesPath="'+data['path']+'"><span aria-hidden="true">&times;</span></button>';
return '<button type="button" class="remove_subtitles close" aria-label="Close" data-toggle="tooltip" data-placement="right" title="Delete Subtitles File" data-language='+data['code3']+' data-forced='+data['forced']+' data-hi='+data['hi']+' data-subtitlesPath="'+data['path']+'"><span aria-hidden="true">&times;</span></button>';
} else {
return '';
}

View File

@ -59,7 +59,15 @@
}
function appendFunc(value) {
languages = languages + '<a href="" class="get_subtitle badge badge-secondary" data-toggle="tooltip" data-placement="right" title="' + value.name + ((value.forced) ? ' forced' : '') + '" data-moviepath="' + data.mapped_path + '" data-scenename="' + data.sceneName + '" data-movietitle="' + data.title + '" data-language="' + value.code3 + '" data-hi="' + data.hearing_impaired + '" data-forced="' + value.forced + '" data-radarrid=' + data.radarrId + '>' + value.code2 + ((value.forced) ? ':forced' : '') + ' <i class="fas fa-search"></i></a> ';
if (value.forced) {
var advtag = ':forced';
} else if (value.hi) {
var advtag = ':HI';
} else {
var advtag = '';
}
languages = languages + '<a href="" class="get_subtitle badge badge-secondary" data-toggle="tooltip" data-placement="right" title="' + value.name + advtag + '" data-moviepath="' + data.mapped_path + '" data-scenename="' + data.sceneName + '" data-movietitle="' + data.title + '" data-language="' + value.code3 + '" data-hi="' + data.hearing_impaired + '" data-forced="' + value.forced + '" data-radarrid=' + data.radarrId + '>' + value.code2 + advtag + ' <i class="fas fa-search"></i></a> ';
}
}
}

View File

@ -63,7 +63,15 @@
}
function appendFunc(value) {
languages = languages + '<a href="" class="get_subtitle badge badge-secondary" data-toggle="tooltip" data-placement="right" title="' + value.name + ((value.forced) ? ' forced' : '') + '" data-episodepath="' + data.mapped_path + '" data-scenename="' + data.scene_name + '" data-seriestitle="' + data.seriesTitle + '" data-language="' + value.code3 + '" data-hi="' + data.hearing_impaired + '" data-forced="' + value.forced + '" data-sonarrseriesid=' + data.sonarrSeriesId + ' data-sonarrepisodeid=' + data.sonarrEpisodeId + '>' + value.code2 + ((value.forced) ? ':forced' : '') + ' <i class="fas fa-search"></i></a> ';
if (value.forced) {
var advtag = ':forced';
} else if (value.hi) {
var advtag = ':HI';
} else {
var advtag = '';
}
languages = languages + '<a href="" class="get_subtitle badge badge-secondary" data-toggle="tooltip" data-placement="right" title="' + value.name + advtag + '" data-episodepath="' + data.mapped_path + '" data-scenename="' + data.scene_name + '" data-seriestitle="' + data.seriesTitle + '" data-language="' + value.code3 + '" data-hi="' + data.hearing_impaired + '" data-forced="' + value.forced + '" data-sonarrseriesid=' + data.sonarrSeriesId + ' data-sonarrepisodeid=' + data.sonarrEpisodeId + '>' + value.code2 + advtag + ' <i class="fas fa-search"></i></a> ';
}
}
}