diff --git a/bazarr/api.py b/bazarr/api.py index c28178474..dcbda42fb 100644 --- a/bazarr/api.py +++ b/bazarr/api.py @@ -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) diff --git a/bazarr/embedded_subs_reader.py b/bazarr/embedded_subs_reader.py index b4467fe74..129f9df77 100644 --- a/bazarr/embedded_subs_reader.py +++ b/bazarr/embedded_subs_reader.py @@ -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 diff --git a/bazarr/get_subtitle.py b/bazarr/get_subtitle.py index 7ef841614..2f9e80111 100644 --- a/bazarr/get_subtitle.py +++ b/bazarr/get_subtitle.py @@ -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] diff --git a/bazarr/list_subtitles.py b/bazarr/list_subtitles.py index 0a2374f86..6798b1856 100644 --- a/bazarr/list_subtitles.py +++ b/bazarr/list_subtitles.py @@ -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 diff --git a/bazarr/utils.py b/bazarr/utils.py index 97f5a2cbc..b32810e92 100644 --- a/bazarr/utils.py +++ b/bazarr/utils.py @@ -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': diff --git a/libs/subliminal_patch/core.py b/libs/subliminal_patch/core.py index 7c4f06c92..a00d3ab5b 100644 --- a/libs/subliminal_patch/core.py +++ b/libs/subliminal_patch/core.py @@ -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]) diff --git a/libs/subliminal_patch/providers/addic7ed.py b/libs/subliminal_patch/providers/addic7ed.py index 0dc9d4c04..5bed2c95d 100644 --- a/libs/subliminal_patch/providers/addic7ed.py +++ b/libs/subliminal_patch/providers/addic7ed.py @@ -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) diff --git a/libs/subliminal_patch/providers/opensubtitles.py b/libs/subliminal_patch/providers/opensubtitles.py index bcda1db85..78330c59e 100644 --- a/libs/subliminal_patch/providers/opensubtitles.py +++ b/libs/subliminal_patch/providers/opensubtitles.py @@ -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 diff --git a/libs/subliminal_patch/providers/podnapisi.py b/libs/subliminal_patch/providers/podnapisi.py index b388f8560..b3d761411 100644 --- a/libs/subliminal_patch/providers/podnapisi.py +++ b/libs/subliminal_patch/providers/podnapisi.py @@ -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 diff --git a/libs/subliminal_patch/providers/subscene.py b/libs/subliminal_patch/providers/subscene.py index a377813f7..69d94f9b9 100644 --- a/libs/subliminal_patch/providers/subscene.py +++ b/libs/subliminal_patch/providers/subscene.py @@ -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) diff --git a/libs/subliminal_patch/providers/yifysubtitles.py b/libs/subliminal_patch/providers/yifysubtitles.py index e41dc6c69..3ec6a9e7b 100644 --- a/libs/subliminal_patch/providers/yifysubtitles.py +++ b/libs/subliminal_patch/providers/yifysubtitles.py @@ -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)] diff --git a/libs/subliminal_patch/subtitle.py b/libs/subliminal_patch/subtitle.py index 5429004eb..a2459bb39 100644 --- a/libs/subliminal_patch/subtitle.py +++ b/libs/subliminal_patch/subtitle.py @@ -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 diff --git a/libs/subzero/language.py b/libs/subzero/language.py index 12d41d26e..43dc29754 100644 --- a/libs/subzero/language.py +++ b/libs/subzero/language.py @@ -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) diff --git a/views/blacklistmovies.html b/views/blacklistmovies.html index 5e188d2d4..6d12ec710 100644 --- a/views/blacklistmovies.html +++ b/views/blacklistmovies.html @@ -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"}, diff --git a/views/blacklistseries.html b/views/blacklistseries.html index 112e96d0a..212ce500e 100644 --- a/views/blacklistseries.html +++ b/views/blacklistseries.html @@ -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"}, diff --git a/views/episodes.html b/views/episodes.html index 0fa3509e9..ab39dd6a9 100644 --- a/views/episodes.html +++ b/views/episodes.html @@ -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 + '' + value[0].code2 + ((value[0].forced) ? ':forced' : '') + ' '; + languages = languages + '' + value[0].code2 + advtag + ' '; } else { - languages = languages + '' + value[0].code2 + ((value[0].forced) ? ':forced' : '') + ' '; + languages = languages + '' + value[0].code2 + advtag + ' '; } } } @@ -615,7 +623,15 @@ } function appendFunc(value) { - languages = languages + '' + value.code2 + ((value.forced) ? ':forced' : '') + ' '; + if (value.forced) { + var advtag = ':forced'; + } else if (value.hi) { + var advtag = ':HI'; + } else { + var advtag = ''; + } + + languages = languages + '' + value.code2 + advtag + ' '; } } }, @@ -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 = '
' + lng.toUpperCase() + '
'; - if (data.hearing_impaired == "True") { + if (data.forced == "True") { + text += '
Forced
'; + } + if (data.hearing_impaired == "True") { text += '
HI
'; } @@ -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 'undefined' } @@ -1107,7 +1133,7 @@ data: null, render: function (data) { if (data.subs_id && data.subtitles_path && !data.blacklisted) { - return ''; + return ''; } 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({ diff --git a/views/historymovies.html b/views/historymovies.html index ee4e651b4..ffd9a7375 100644 --- a/views/historymovies.html +++ b/views/historymovies.html @@ -80,7 +80,7 @@ data: null, render: function (data) { if (data.subs_id && data.subtitles_path && !data.blacklisted) { - return ''; + return ''; } 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') }; diff --git a/views/historyseries.html b/views/historyseries.html index 1d761656f..1544ac137 100644 --- a/views/historyseries.html +++ b/views/historyseries.html @@ -84,7 +84,7 @@ data: null, render: function (data) { if (data.subs_id && data.subtitles_path && !data.blacklisted) { - return ''; + return ''; } 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') }; diff --git a/views/movie.html b/views/movie.html index 26b53612c..aa0810d0c 100644 --- a/views/movie.html +++ b/views/movie.html @@ -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 = '
' + lng.toUpperCase() + '
'; - if (data.hearing_impaired == "True") { + if (data.forced == "True") { + text += '
Forced
'; + } + if (data.hearing_impaired == "True") { text += '
HI
'; } @@ -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 'undefined' } @@ -912,7 +922,7 @@ data: null, render: function (data) { if (data.subs_id && data.subtitles_path && !data.blacklisted) { - return ''; + return ''; } 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 += ' '; + } else if (value.hi) { + missing_languages += ' '; } else { missing_languages += ' '; } @@ -1283,6 +1296,8 @@ "render": function(data) { if (data['forced']) { return '' + data['name'] + ' forced'; + } else if (data['hi']) { + return '' + data['name'] + ' HI'; } else { return '' + data['name'] + ''; } @@ -1291,7 +1306,7 @@ { "data" : null, "render": function(data) { if (data['path']) { - return ''; + return ''; } else { return ''; } diff --git a/views/wantedmovies.html b/views/wantedmovies.html index a63dbbd66..a1b8872e1 100644 --- a/views/wantedmovies.html +++ b/views/wantedmovies.html @@ -59,7 +59,15 @@ } function appendFunc(value) { - languages = languages + '' + value.code2 + ((value.forced) ? ':forced' : '') + ' '; + if (value.forced) { + var advtag = ':forced'; + } else if (value.hi) { + var advtag = ':HI'; + } else { + var advtag = ''; + } + + languages = languages + '' + value.code2 + advtag + ' '; } } } diff --git a/views/wantedseries.html b/views/wantedseries.html index 50e14daa0..050668c40 100644 --- a/views/wantedseries.html +++ b/views/wantedseries.html @@ -63,7 +63,15 @@ } function appendFunc(value) { - languages = languages + '' + value.code2 + ((value.forced) ? ':forced' : '') + ' '; + if (value.forced) { + var advtag = ':forced'; + } else if (value.hi) { + var advtag = ':HI'; + } else { + var advtag = ''; + } + + languages = languages + '' + value.code2 + advtag + ' '; } } }