bazarr/bazarr/get_subtitle.py

1054 lines
54 KiB
Python
Raw Normal View History

# coding=utf-8
2017-09-17 00:11:47 +00:00
import os
import sys
2017-10-16 23:27:19 +00:00
import sqlite3
import ast
2017-12-06 04:07:37 +00:00
import logging
2018-03-24 00:00:50 +00:00
import subprocess
import time
import cPickle as pickle
import codecs
import types
import re
2018-10-31 16:33:19 +00:00
import subliminal
2019-08-13 17:46:29 +00:00
import platform
from datetime import datetime, timedelta
from subzero.language import Language
from subzero.video import parse_video
from subliminal import region, score as subliminal_scores, \
list_subtitles, Episode, Movie
from subliminal_patch.core import SZAsyncProviderPool, download_best_subtitles, save_subtitles, download_subtitles, \
list_all_subtitles
from subliminal_patch.score import compute_score
2019-03-20 21:20:10 +00:00
from subliminal.refiners.tvdb import series_re
2019-01-01 03:37:25 +00:00
from get_languages import language_from_alpha3, alpha2_from_alpha3, alpha3_from_alpha2, language_from_alpha2
2018-12-15 00:36:28 +00:00
from config import settings
from helper import path_replace, path_replace_movie, path_replace_reverse, \
path_replace_reverse_movie, pp_replace, get_target_folder, force_unicode
2018-08-15 20:51:46 +00:00
from list_subtitles import store_subtitles, list_missing_subtitles, store_subtitles_movie, list_missing_subtitles_movies
from utils import history_log, history_log_movie, get_binary
2018-04-24 14:48:52 +00:00
from notifier import send_notifications, send_notifications_movie
from get_providers import get_providers, get_providers_auth, provider_throttle, provider_pool
from get_args import args
from queueconfig import notifications
from pymediainfo import MediaInfo
2017-09-17 00:11:47 +00:00
def get_video(path, title, sceneName, use_scenename, use_mediainfo, providers=None, media_type="movie"):
"""
Construct `Video` instance
:param path: path to video
:param title: series/movie title
:param sceneName: sceneName
:param use_scenename: use sceneName
:param use_mediainfo: use media info to refine the video
:param providers: provider list for selective hashing
:param media_type: movie/series
:return: `Video` instance
"""
hints = {"title": title, "type": "movie" if media_type == "movie" else "episode"}
used_scene_name = False
original_path = path
original_name = os.path.basename(path)
hash_from = None
if sceneName != "None" and use_scenename:
# use the sceneName but keep the folder structure for better guessing
path = os.path.join(os.path.dirname(path), sceneName + os.path.splitext(path)[1])
used_scene_name = True
hash_from = original_path
2019-07-28 19:49:19 +00:00
try:
video = parse_video(path, hints=hints, providers=providers, dry_run=used_scene_name,
hash_from=hash_from)
video.used_scene_name = used_scene_name
video.original_name = original_name
video.original_path = original_path
refine_from_db(original_path, video)
2019-08-13 17:46:29 +00:00
if platform.system() != "Linux" and use_mediainfo:
2019-07-28 19:49:19 +00:00
refine_from_mediainfo(original_path, video)
logging.debug('BAZARR is using those video object properties: %s', vars(video))
return video
except:
logging.exception("BAZARR Error trying to get video information for this file: " + path)
def get_scores(video, media_type, min_score_movie_perc=60 * 100 / 120.0, min_score_series_perc=240 * 100 / 360.0,
min_score_special_ep=180 * 100 / 360.0):
"""
Get score range for a video.
:param video: `Video` instance
:param media_type: movie/series
:param min_score_movie_perc: Percentage of max score for min score of movies
:param min_score_series_perc: Percentage of max score for min score of series
:param min_score_special_ep: Percentage of max score for min score of series special episode
:return: tuple(min_score, max_score, set(scores))
"""
max_score = 120.0
min_score = max_score * min_score_movie_perc / 100.0
scores = subliminal_scores.movie_scores.keys()
if media_type == "series":
max_score = 360.0
min_score = max_score * min_score_series_perc / 100.0
scores = subliminal_scores.episode_scores.keys()
if video.is_special:
min_score = max_score * min_score_special_ep / 100.0
2019-01-15 16:25:13 +00:00
return min_score, max_score, set(scores)
2019-06-11 18:45:48 +00:00
def download_subtitle(path, language, hi, forced, providers, providers_auth, sceneName, title, media_type,
forced_minimum_score=None, is_upgrade=False):
# fixme: supply all missing languages, not only one, to hit providers only once who support multiple languages in
# one query
2019-06-11 18:45:48 +00:00
if settings.general.getboolean('utf8_encode'):
os.environ["SZ_KEEP_ENCODING"] = ""
else:
2019-08-16 01:29:21 +00:00
os.environ["SZ_KEEP_ENCODING"] = "True"
2019-06-11 18:45:48 +00:00
logging.debug('BAZARR Searching subtitles for this file: ' + path)
if hi == "True":
2019-05-03 17:37:29 +00:00
hi = "force HI"
else:
2019-05-03 17:37:29 +00:00
hi = "force non-HI"
2018-10-09 20:33:18 +00:00
language_set = set()
2019-06-11 18:45:48 +00:00
if not isinstance(language, types.ListType):
language = [language]
2019-06-11 18:45:48 +00:00
if forced == "True":
2019-07-28 19:49:19 +00:00
providers_auth['podnapisi']['only_foreign'] = True ## fixme: This is also in get_providers_auth()
providers_auth['subscene']['only_foreign'] = True ## fixme: This is also in get_providers_auth()
providers_auth['opensubtitles']['only_foreign'] = True ## fixme: This is also in get_providers_auth()
else:
providers_auth['podnapisi']['only_foreign'] = False
providers_auth['subscene']['only_foreign'] = False
providers_auth['opensubtitles']['only_foreign'] = False
2019-06-11 18:45:48 +00:00
for l in language:
if l == 'pob':
lang_obj = Language('por', 'BR')
2019-08-16 01:55:21 +00:00
if forced == "True":
lang_obj = Language.rebuild(lang_obj, forced=True)
else:
lang_obj = Language(l)
2019-08-16 01:55:21 +00:00
if forced == "True":
lang_obj = Language.rebuild(lang_obj, forced=True)
language_set.add(lang_obj)
2019-01-15 16:25:13 +00:00
use_scenename = settings.general.getboolean('use_scenename')
use_mediainfo = settings.general.getboolean('use_mediainfo')
2018-12-15 00:36:28 +00:00
minimum_score = settings.general.minimum_score
minimum_score_movie = settings.general.minimum_score_movie
use_postprocessing = settings.general.getboolean('use_postprocessing')
2018-12-15 00:36:28 +00:00
postprocessing_cmd = settings.general.postprocessing_cmd
single = settings.general.getboolean('single_language')
2019-01-15 16:25:13 +00:00
# todo:
"""
AsyncProviderPool:
implement:
blacklist=None,
pre_download_hook=None,
post_download_hook=None,
language_hook=None
"""
2019-07-28 19:49:19 +00:00
video = get_video(force_unicode(path), title, sceneName, use_scenename, use_mediainfo, providers=providers,
media_type=media_type)
if video:
min_score, max_score, scores = get_scores(video, media_type, min_score_movie_perc=int(minimum_score_movie),
min_score_series_perc=int(minimum_score))
2019-06-11 18:45:48 +00:00
if providers:
2019-03-16 19:30:06 +00:00
if forced_minimum_score:
min_score = int(forced_minimum_score) + 1
downloaded_subtitles = download_best_subtitles({video}, language_set, int(min_score), hi,
providers=providers,
provider_configs=providers_auth,
pool_class=provider_pool(),
compute_score=compute_score,
throttle_time=None, # fixme
blacklist=None, # fixme
throttle_callback=provider_throttle,
pre_download_hook=None, # fixme
post_download_hook=None, # fixme
language_hook=None) # fixme
else:
downloaded_subtitles = None
logging.info("BAZARR All providers are throttled")
2019-07-28 19:49:19 +00:00
return None
2019-01-15 16:25:13 +00:00
saved_any = False
if downloaded_subtitles:
for video, subtitles in downloaded_subtitles.iteritems():
if not subtitles:
continue
2019-01-15 16:25:13 +00:00
try:
fld = get_target_folder(path)
2019-06-11 18:45:48 +00:00
chmod = int(settings.general.chmod, 8) if not sys.platform.startswith(
'win') and settings.general.getboolean('chmod_enabled') else None
saved_subtitles = save_subtitles(video.original_path, subtitles, single=single,
tags=None, # fixme
directory=fld,
2019-02-27 20:55:06 +00:00
chmod=chmod,
# formats=("srt", "vtt")
path_decoder=force_unicode
)
except Exception as e:
logging.exception('BAZARR Error saving subtitles file to disk for this file:' + path)
pass
else:
saved_any = True
for subtitle in saved_subtitles:
downloaded_provider = subtitle.provider_name
2019-03-20 00:16:19 +00:00
if subtitle.language == 'pt-BR':
downloaded_language_code3 = 'pob'
else:
2019-03-20 03:44:50 +00:00
downloaded_language_code3 = subtitle.language.alpha3
2019-03-20 00:16:19 +00:00
downloaded_language = language_from_alpha3(downloaded_language_code3)
downloaded_language_code2 = alpha2_from_alpha3(downloaded_language_code3)
downloaded_path = subtitle.storage_path
2019-05-02 00:26:48 +00:00
is_forced_string = " forced" if subtitle.language.forced else ""
logging.debug('BAZARR Subtitles file saved to disk: ' + downloaded_path)
2019-03-20 10:33:11 +00:00
if is_upgrade:
action = "upgraded"
else:
action = "downloaded"
if video.used_scene_name:
2019-05-02 00:26:48 +00:00
message = downloaded_language + is_forced_string + " subtitles " + action + " from " + downloaded_provider + " with a score of " + unicode(
round(subtitle.score * 100 / max_score, 2)) + "% using this scene name: " + sceneName
else:
2019-05-02 00:26:48 +00:00
message = downloaded_language + is_forced_string + " subtitles " + action + " from " + downloaded_provider + " with a score of " + unicode(
round(subtitle.score * 100 / max_score, 2)) + "% using filename guessing."
2019-01-15 16:25:13 +00:00
if use_postprocessing is True:
command = pp_replace(postprocessing_cmd, path, downloaded_path, downloaded_language,
2019-06-11 18:45:48 +00:00
downloaded_language_code2, downloaded_language_code3,
subtitle.language.forced)
try:
if os.name == 'nt':
codepage = subprocess.Popen("chcp", shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
2018-10-12 02:24:27 +00:00
# wait for the process to terminate
out_codepage, err_codepage = codepage.communicate()
encoding = out_codepage.split(':')[-1].strip()
2019-01-15 16:25:13 +00:00
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
# wait for the process to terminate
out, err = process.communicate()
2019-01-15 16:25:13 +00:00
if os.name == 'nt':
out = out.decode(encoding)
2019-01-15 16:25:13 +00:00
except:
if out == "":
logging.error(
'BAZARR Post-processing result for file ' + path + ' : Nothing returned from command execution')
else:
logging.error('BAZARR Post-processing result for file ' + path + ' : ' + out)
else:
if out == "":
logging.info(
'BAZARR Post-processing result for file ' + path + ' : Nothing returned from command execution')
2018-10-12 02:24:27 +00:00
else:
logging.info('BAZARR Post-processing result for file ' + path + ' : ' + out)
2019-01-15 16:25:13 +00:00
# fixme: support multiple languages at once
if media_type == 'series':
reversed_path = path_replace_reverse(path)
else:
reversed_path = path_replace_reverse_movie(path)
2019-06-11 18:45:48 +00:00
2019-05-02 00:26:48 +00:00
return message, reversed_path, downloaded_language_code2, downloaded_provider, subtitle.score, subtitle.language.forced
2019-01-15 16:25:13 +00:00
if not saved_any:
logging.debug('BAZARR No subtitles were found for this file: ' + path)
return None
2019-07-28 19:49:19 +00:00
subliminal.region.backend.sync()
2019-07-28 19:49:19 +00:00
logging.debug('BAZARR Ended searching subtitles for file: ' + path)
2017-10-16 23:27:19 +00:00
def manual_search(path, language, hi, forced, providers, providers_auth, sceneName, title, media_type):
logging.debug('BAZARR Manually searching subtitles for this file: ' + path)
2019-06-11 18:45:48 +00:00
final_subtitles = []
2019-01-15 16:25:13 +00:00
if hi == "True":
2019-05-03 17:37:29 +00:00
hi = "force HI"
else:
2019-05-03 17:37:29 +00:00
hi = "force non-HI"
language_set = set()
2019-06-11 18:45:48 +00:00
if forced == "True":
providers_auth['podnapisi']['only_foreign'] = True
providers_auth['subscene']['only_foreign'] = True
providers_auth['opensubtitles']['only_foreign'] = True
else:
providers_auth['podnapisi']['only_foreign'] = False
providers_auth['subscene']['only_foreign'] = False
providers_auth['opensubtitles']['only_foreign'] = False
2019-06-11 18:45:48 +00:00
for lang in ast.literal_eval(language):
2018-10-12 03:44:34 +00:00
lang = alpha3_from_alpha2(lang)
if lang == 'pob':
lang_obj = Language('por', 'BR')
if forced == "True":
lang_obj = Language.rebuild(lang_obj, forced=True)
else:
lang_obj = Language(lang)
if forced == "True":
lang_obj = Language.rebuild(lang_obj, forced=True)
language_set.add(lang_obj)
2019-01-15 16:25:13 +00:00
use_scenename = settings.general.getboolean('use_scenename')
use_mediainfo = settings.general.getboolean('use_mediainfo')
minimum_score = settings.general.minimum_score
minimum_score_movie = settings.general.minimum_score_movie
use_postprocessing = settings.general.getboolean('use_postprocessing')
2018-12-15 00:36:28 +00:00
postprocessing_cmd = settings.general.postprocessing_cmd
2019-07-28 19:49:19 +00:00
if providers:
video = get_video(force_unicode(path), title, sceneName, use_scenename, use_mediainfo, providers=providers,
media_type=media_type)
else:
logging.info("BAZARR All providers are throttled")
return None
if video:
min_score, max_score, scores = get_scores(video, media_type, min_score_movie_perc=int(minimum_score_movie),
min_score_series_perc=int(minimum_score))
2019-01-15 16:25:13 +00:00
try:
if providers:
subtitles = list_all_subtitles([video], language_set,
providers=providers,
provider_configs=providers_auth,
throttle_callback=provider_throttle,
language_hook=None) # fixme
else:
subtitles = []
logging.info("BAZARR All providers are throttled")
2019-07-28 19:49:19 +00:00
return None
except Exception as e:
logging.exception("BAZARR Error trying to get subtitle list from provider for this file: " + path)
else:
subtitles_list = []
2019-01-15 16:25:13 +00:00
for s in subtitles[video]:
try:
matches = s.get_matches(video)
except AttributeError:
continue
2019-01-15 16:25:13 +00:00
# skip wrong season/episodes
if media_type == "series":
can_verify_series = True
if not s.hash_verifiable and "hash" in matches:
can_verify_series = False
2019-01-15 16:25:13 +00:00
if can_verify_series and not {"series", "season", "episode"}.issubset(matches):
logging.debug(u"BAZARR Skipping %s, because it doesn't match our series/episode", s)
continue
2019-06-11 18:45:48 +00:00
score = compute_score(matches, s, video, hearing_impaired=hi)
not_matched = scores - matches
s.score = score
2019-01-15 16:25:13 +00:00
subtitles_list.append(
dict(score=round((score / max_score * 100), 2),
2019-04-04 11:11:53 +00:00
language=str(s.language), 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)))
2019-01-15 16:25:13 +00:00
final_subtitles = sorted(subtitles_list, key=lambda x: x['score'], reverse=True)
logging.debug('BAZARR ' + str(len(final_subtitles)) + " subtitles have been found for this file: " + path)
logging.debug('BAZARR Ended searching subtitles for this file: ' + path)
2019-07-28 19:49:19 +00:00
subliminal.region.backend.sync()
2019-07-28 19:49:19 +00:00
return final_subtitles
2019-06-11 18:45:48 +00:00
def manual_download_subtitle(path, language, hi, forced, subtitle, provider, providers_auth, sceneName, title,
media_type):
logging.debug('BAZARR Manually downloading subtitles for this file: ' + path)
2019-06-11 18:45:48 +00:00
if settings.general.getboolean('utf8_encode'):
os.environ["SZ_KEEP_ENCODING"] = ""
else:
2019-08-16 02:01:42 +00:00
os.environ["SZ_KEEP_ENCODING"] = "True"
2019-06-11 18:45:48 +00:00
subtitle = pickle.loads(codecs.decode(subtitle.encode(), "base64"))
use_scenename = settings.general.getboolean('use_scenename')
use_mediainfo = settings.general.getboolean('use_mediainfo')
use_postprocessing = settings.general.getboolean('use_postprocessing')
2018-12-15 00:36:28 +00:00
postprocessing_cmd = settings.general.postprocessing_cmd
single = settings.general.getboolean('single_language')
2019-07-28 19:49:19 +00:00
video = get_video(force_unicode(path), title, sceneName, use_scenename, use_mediainfo, providers={provider},
media_type=media_type)
if video:
min_score, max_score, scores = get_scores(video, media_type)
try:
if provider:
download_subtitles([subtitle], providers={provider}, provider_configs=providers_auth,
pool_class=provider_pool(), throttle_callback=provider_throttle)
logging.debug('BAZARR Subtitles file downloaded for this file:' + path)
else:
logging.info("BAZARR All providers are throttled")
return None
except Exception as e:
logging.exception('BAZARR Error downloading subtitles for this file ' + path)
return None
else:
if not subtitle.is_valid():
logging.exception('BAZARR No valid subtitles file found for this file: ' + path)
return
logging.debug('BAZARR Subtitles file downloaded for this file:' + path)
try:
score = round(subtitle.score / max_score * 100, 2)
fld = get_target_folder(path)
2019-06-11 18:45:48 +00:00
chmod = int(settings.general.chmod, 8) if not sys.platform.startswith(
'win') and settings.general.getboolean('chmod_enabled') else None
saved_subtitles = save_subtitles(video.original_path, [subtitle], single=single,
tags=None, # fixme
directory=fld,
chmod=chmod,
# formats=("srt", "vtt")
path_decoder=force_unicode)
2019-01-15 16:25:13 +00:00
except Exception as e:
logging.exception('BAZARR Error saving subtitles file to disk for this file:' + path)
return
else:
if saved_subtitles:
for saved_subtitle in saved_subtitles:
downloaded_provider = saved_subtitle.provider_name
2019-03-20 00:16:19 +00:00
if saved_subtitle.language == 'pt-BR':
downloaded_language_code3 = 'pob'
else:
2019-03-20 03:44:50 +00:00
downloaded_language_code3 = subtitle.language.alpha3
2019-03-20 00:16:19 +00:00
downloaded_language = language_from_alpha3(downloaded_language_code3)
downloaded_language_code2 = alpha2_from_alpha3(downloaded_language_code3)
downloaded_path = saved_subtitle.storage_path
logging.debug('BAZARR Subtitles file saved to disk: ' + downloaded_path)
2019-05-02 00:26:48 +00:00
is_forced_string = " forced" if subtitle.language.forced else ""
message = downloaded_language + is_forced_string + " subtitles downloaded from " + downloaded_provider + " with a score of " + unicode(
score) + "% using manual search."
2019-01-15 16:25:13 +00:00
if use_postprocessing is True:
command = pp_replace(postprocessing_cmd, path, downloaded_path, downloaded_language,
2019-06-11 18:45:48 +00:00
downloaded_language_code2, downloaded_language_code3,
subtitle.language.forced)
try:
if os.name == 'nt':
codepage = subprocess.Popen("chcp", shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
# wait for the process to terminate
out_codepage, err_codepage = codepage.communicate()
encoding = out_codepage.split(':')[-1].strip()
2019-01-15 16:25:13 +00:00
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
# wait for the process to terminate
out, err = process.communicate()
2019-01-15 16:25:13 +00:00
if os.name == 'nt':
out = out.decode(encoding)
2019-01-15 16:25:13 +00:00
except:
if out == "":
logging.error(
'BAZARR Post-processing result for file ' + path + ' : Nothing returned from command execution')
else:
logging.error('BAZARR Post-processing result for file ' + path + ' : ' + out)
2018-10-12 02:24:27 +00:00
else:
if out == "":
logging.info(
'BAZARR Post-processing result for file ' + path + ' : Nothing returned from command execution')
else:
logging.info('BAZARR Post-processing result for file ' + path + ' : ' + out)
2019-06-11 18:45:48 +00:00
if media_type == 'series':
reversed_path = path_replace_reverse(path)
else:
reversed_path = path_replace_reverse_movie(path)
2019-06-11 18:45:48 +00:00
2019-05-02 00:26:48 +00:00
return message, reversed_path, downloaded_language_code2, downloaded_provider, subtitle.score, subtitle.language.forced
2018-10-12 02:24:27 +00:00
else:
logging.error(
"BAZARR Tried to manually download a subtitles for file: " + path + " but we weren't able to do (probably throttled by " + str(
subtitle.provider_name) + ". Please retry later or select a subtitles from another provider.")
2018-10-12 02:24:27 +00:00
return None
2019-07-28 19:49:19 +00:00
subliminal.region.backend.sync()
2019-07-28 19:49:19 +00:00
logging.debug('BAZARR Ended manually downloading subtitles for file: ' + path)
2017-10-16 23:27:19 +00:00
def series_download_subtitles(no):
2019-01-06 17:15:43 +00:00
if settings.sonarr.getboolean('only_monitored'):
monitored_only_query_string = ' AND monitored = "True"'
else:
monitored_only_query_string = ""
2019-01-15 16:25:13 +00:00
conn_db = sqlite3.connect(os.path.join(args.config_dir, 'db', 'bazarr.db'), timeout=30)
2017-10-16 23:27:19 +00:00
c_db = conn_db.cursor()
episodes_details = c_db.execute(
'SELECT path, missing_subtitles, sonarrEpisodeId, scene_name FROM table_episodes WHERE sonarrSeriesId = ? AND missing_subtitles != "[]"' + monitored_only_query_string,
(no,)).fetchall()
series_details = c_db.execute("SELECT hearing_impaired, title, forced FROM table_shows WHERE sonarrSeriesId = ?",
2019-01-15 16:25:13 +00:00
(no,)).fetchone()
2017-10-16 23:27:19 +00:00
c_db.close()
2019-01-15 16:25:13 +00:00
2018-09-22 22:07:46 +00:00
providers_list = get_providers()
providers_auth = get_providers_auth()
2019-01-15 16:25:13 +00:00
2019-04-04 22:33:49 +00:00
count_episodes_details = len(episodes_details)
2019-06-11 18:45:48 +00:00
2019-04-04 22:33:49 +00:00
for i, episode in enumerate(episodes_details, 1):
2019-07-28 19:49:19 +00:00
if providers_list:
for language in ast.literal_eval(episode[1]):
if language is not None:
notifications.write(msg='Searching for series subtitles...', queue='get_subtitle', item=i,
length=count_episodes_details)
2019-08-16 02:10:28 +00:00
result = download_subtitle(path_replace(episode[0]),
str(alpha3_from_alpha2(language.split(':')[0])),
series_details[0],
"True" if len(language.split(':')) > 1 else "False",
providers_list,
providers_auth,
str(episode[3]),
series_details[1],
2019-07-28 19:49:19 +00:00
'series')
if result is not None:
message = result[0]
path = result[1]
forced = result[5]
language_code = result[2] + ":forced" if forced else result[2]
provider = result[3]
score = result[4]
store_subtitles(path_replace(episode[0]))
history_log(1, no, episode[2], message, path, language_code, provider, score)
send_notifications(no, episode[2], message)
else:
notifications.write(msg='BAZARR All providers are throttled', queue='get_subtitle', duration='long')
logging.info("BAZARR All providers are throttled")
break
2017-11-16 18:42:23 +00:00
list_missing_subtitles(no)
2019-06-11 18:45:48 +00:00
2019-04-23 01:08:26 +00:00
if count_episodes_details:
2019-06-11 18:45:48 +00:00
notifications.write(msg='Searching completed. Please reload the page.', type='success', duration='permanent',
button='refresh', queue='get_subtitle')
2018-04-24 14:48:52 +00:00
def episode_download_subtitles(no):
if settings.sonarr.getboolean('only_monitored'):
monitored_only_query_string = ' AND monitored = "True"'
else:
monitored_only_query_string = ""
2019-06-11 18:45:48 +00:00
conn_db = sqlite3.connect(os.path.join(args.config_dir, 'db', 'bazarr.db'), timeout=30)
c_db = conn_db.cursor()
episodes_details = c_db.execute(
2019-06-11 18:45:48 +00:00
'SELECT table_episodes.path, table_episodes.missing_subtitles, table_episodes.sonarrEpisodeId, table_episodes.scene_name, table_shows.hearing_impaired, table_shows.title, table_shows.sonarrSeriesId, table_shows.forced FROM table_episodes INNER JOIN table_shows on table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE table_episodes.sonarrEpisodeId = ?' + monitored_only_query_string,
(no,)).fetchall()
c_db.close()
2019-06-11 18:45:48 +00:00
providers_list = get_providers()
providers_auth = get_providers_auth()
2019-06-11 18:45:48 +00:00
for episode in episodes_details:
2019-07-28 19:49:19 +00:00
if providers_list:
for language in ast.literal_eval(episode[1]):
if language is not None:
notifications.write(msg='Searching for ' + str(
language_from_alpha2(language)) + ' subtitles for this episode: ' + path_replace(episode[0]),
queue='get_subtitle')
2019-08-15 20:36:53 +00:00
result = download_subtitle(path_replace(episode[0]),
str(alpha3_from_alpha2(language.split(':')[0])),
episode[4],
2019-08-16 01:55:21 +00:00
"True" if len(language.split(':')) > 1 else "False",
2019-08-15 20:36:53 +00:00
providers_list,
providers_auth,
str(episode[3]),
episode[5],
'series')
2019-07-28 19:49:19 +00:00
if result is not None:
message = result[0]
path = result[1]
forced = result[5]
language_code = result[2] + ":forced" if forced else result[2]
provider = result[3]
score = result[4]
store_subtitles(path_replace(episode[0]))
history_log(1, episode[6], episode[2], message, path, language_code, provider, score)
send_notifications(episode[6], episode[2], message)
2019-07-28 20:26:02 +00:00
list_missing_subtitles(episode[6])
2019-07-28 19:49:19 +00:00
else:
notifications.write(msg='BAZARR All providers are throttled', queue='get_subtitle', duration='long')
logging.info("BAZARR All providers are throttled")
break
2018-04-24 14:48:52 +00:00
def movies_download_subtitles(no):
conn_db = sqlite3.connect(os.path.join(args.config_dir, 'db', 'bazarr.db'), timeout=30)
2018-04-24 14:48:52 +00:00
c_db = conn_db.cursor()
movie = c_db.execute(
"SELECT path, missing_subtitles, radarrId, sceneName, hearing_impaired, title, forced FROM table_movies WHERE radarrId = ?",
(no,)).fetchone()
2018-04-24 14:48:52 +00:00
c_db.close()
2019-06-11 18:45:48 +00:00
2018-09-22 22:07:46 +00:00
providers_list = get_providers()
providers_auth = get_providers_auth()
2019-01-15 16:25:13 +00:00
2019-04-04 22:33:49 +00:00
count_movie = len(ast.literal_eval(movie[1]))
2019-06-11 18:45:48 +00:00
2019-04-04 22:33:49 +00:00
for i, language in enumerate(ast.literal_eval(movie[1]), 1):
2019-07-28 19:49:19 +00:00
if providers_list:
if language is not None:
notifications.write(msg='Searching for movies subtitles', queue='get_subtitle', item=i,
length=count_movie)
2019-08-15 20:36:53 +00:00
result = download_subtitle(path_replace_movie(movie[0]),
str(alpha3_from_alpha2(language.split(':')[0])),
movie[4],
2019-08-16 01:55:21 +00:00
"True" if len(language.split(':')) > 1 else "False",
2019-08-15 20:36:53 +00:00
providers_list,
providers_auth,
str(movie[3]),
movie[5],
'movie')
2019-07-28 19:49:19 +00:00
if result is not None:
message = result[0]
path = result[1]
forced = result[5]
language_code = result[2] + ":forced" if forced else result[2]
provider = result[3]
score = result[4]
store_subtitles_movie(path_replace_movie(movie[0]))
history_log_movie(1, no, message, path, language_code, provider, score)
send_notifications_movie(no, message)
else:
notifications.write(msg='BAZARR All providers are throttled', queue='get_subtitle', duration='long')
logging.info("BAZARR All providers are throttled")
break
2018-04-24 14:48:52 +00:00
list_missing_subtitles_movies(no)
2019-06-11 18:45:48 +00:00
2019-04-23 01:08:26 +00:00
if count_movie:
2019-06-11 18:45:48 +00:00
notifications.write(msg='Searching completed. Please reload the page.', type='success', duration='permanent',
button='refresh', queue='get_subtitle')
2018-04-24 14:48:52 +00:00
2019-04-04 22:33:49 +00:00
def wanted_download_subtitles(path, l, count_episodes):
conn_db = sqlite3.connect(os.path.join(args.config_dir, 'db', 'bazarr.db'), timeout=30)
2017-11-16 19:09:40 +00:00
c_db = conn_db.cursor()
episodes_details = c_db.execute(
"SELECT table_episodes.path, table_episodes.missing_subtitles, table_episodes.sonarrEpisodeId, table_episodes.sonarrSeriesId, table_shows.hearing_impaired, table_episodes.scene_name, table_episodes.failedAttempts, table_shows.title, table_shows.forced FROM table_episodes INNER JOIN table_shows on table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE table_episodes.path = ? AND missing_subtitles != '[]'",
(path_replace_reverse(path),)).fetchall()
2017-11-16 19:09:40 +00:00
c_db.close()
2019-01-15 16:25:13 +00:00
2018-09-22 22:07:46 +00:00
providers_list = get_providers()
providers_auth = get_providers_auth()
2019-01-15 16:25:13 +00:00
2017-11-16 19:09:40 +00:00
for episode in episodes_details:
attempt = episode[6]
if type(attempt) == unicode:
attempt = ast.literal_eval(attempt)
2017-11-16 19:09:40 +00:00
for language in ast.literal_eval(episode[1]):
if attempt is None:
attempt = []
attempt.append([language, time.time()])
else:
att = zip(*attempt)[0]
if language not in att:
attempt.append([language, time.time()])
2019-01-15 16:25:13 +00:00
conn_db = sqlite3.connect(os.path.join(args.config_dir, 'db', 'bazarr.db'), timeout=30)
c_db = conn_db.cursor()
c_db.execute('UPDATE table_episodes SET failedAttempts = ? WHERE sonarrEpisodeId = ?',
(unicode(attempt), episode[2]))
conn_db.commit()
c_db.close()
2019-01-15 16:25:13 +00:00
for i in range(len(attempt)):
if attempt[i][0] == language:
if search_active(attempt[i][1]):
2019-06-11 18:45:48 +00:00
notifications.write(msg='Searching for series subtitles...', queue='get_subtitle', item=l,
length=count_episodes)
2019-08-15 20:36:53 +00:00
result = download_subtitle(path_replace(episode[0]),
str(alpha3_from_alpha2(language.split(':')[0])),
episode[4],
2019-08-16 01:55:21 +00:00
"True" if len(language.split(':')) > 1 else "False",
2019-08-15 20:36:53 +00:00
providers_list,
providers_auth,
str(episode[5]),
episode[7],
'series')
if result is not None:
message = result[0]
path = result[1]
2019-05-02 00:26:48 +00:00
forced = result[5]
2019-06-16 19:24:47 +00:00
language_code = result[2] + ":forced" if forced else result[2]
provider = result[3]
score = result[4]
store_subtitles(path_replace(episode[0]))
list_missing_subtitles(episode[3])
history_log(1, episode[3], episode[2], message, path, language_code, provider, score)
send_notifications(episode[3], episode[2], message)
else:
logging.debug(
'BAZARR Search is not active for episode ' + episode[0] + ' Language: ' + attempt[i][0])
2017-11-16 17:04:20 +00:00
2019-04-04 22:33:49 +00:00
def wanted_download_subtitles_movie(path, l, count_movies):
conn_db = sqlite3.connect(os.path.join(args.config_dir, 'db', 'bazarr.db'), timeout=30)
c_db = conn_db.cursor()
movies_details = c_db.execute(
"SELECT path, missing_subtitles, radarrId, radarrId, hearing_impaired, sceneName, failedAttempts, title, forced FROM table_movies WHERE path = ? AND missing_subtitles != '[]'",
(path_replace_reverse_movie(path),)).fetchall()
c_db.close()
2019-01-15 16:25:13 +00:00
2018-09-22 22:07:46 +00:00
providers_list = get_providers()
providers_auth = get_providers_auth()
2019-01-15 16:25:13 +00:00
for movie in movies_details:
attempt = movie[6]
if type(attempt) == unicode:
attempt = ast.literal_eval(attempt)
for language in ast.literal_eval(movie[1]):
if attempt is None:
attempt = []
attempt.append([language, time.time()])
else:
att = zip(*attempt)[0]
if language not in att:
attempt.append([language, time.time()])
2019-01-15 16:25:13 +00:00
conn_db = sqlite3.connect(os.path.join(args.config_dir, 'db', 'bazarr.db'), timeout=30)
c_db = conn_db.cursor()
c_db.execute('UPDATE table_movies SET failedAttempts = ? WHERE radarrId = ?', (unicode(attempt), movie[2]))
conn_db.commit()
c_db.close()
2019-01-15 16:25:13 +00:00
for i in range(len(attempt)):
if attempt[i][0] == language:
if search_active(attempt[i][1]) is True:
2019-06-11 18:45:48 +00:00
notifications.write(msg='Searching for movies subtitles...', queue='get_subtitle', item=l,
length=count_movies)
2019-08-15 20:36:53 +00:00
result = download_subtitle(path_replace_movie(movie[0]),
str(alpha3_from_alpha2(language.split(':')[0])),
movie[4],
2019-08-16 01:55:21 +00:00
"True" if len(language.split(':')) > 1 else "False",
2019-08-15 20:36:53 +00:00
providers_list,
providers_auth,
str(movie[5]),
movie[7],
'movie')
if result is not None:
message = result[0]
path = result[1]
2019-05-02 00:26:48 +00:00
forced = result[5]
2019-06-16 23:29:28 +00:00
language_code = result[2] + ":forced" if forced else result[2]
provider = result[3]
score = result[4]
store_subtitles_movie(path_replace_movie(movie[0]))
list_missing_subtitles_movies(movie[3])
history_log_movie(1, movie[3], message, path, language_code, provider, score)
send_notifications_movie(movie[3], message)
else:
logging.info(
'BAZARR Search is not active for movie ' + movie[0] + ' Language: ' + attempt[i][0])
2017-10-23 03:00:11 +00:00
def wanted_search_missing_subtitles():
db = sqlite3.connect(os.path.join(args.config_dir, 'db', 'bazarr.db'), timeout=30)
2017-10-23 03:00:11 +00:00
db.create_function("path_substitution", 1, path_replace)
db.create_function("path_substitution_movie", 1, path_replace_movie)
2017-10-23 03:00:11 +00:00
c = db.cursor()
2019-06-11 18:45:48 +00:00
2019-01-06 17:15:43 +00:00
if settings.sonarr.getboolean('only_monitored'):
2019-01-10 17:14:25 +00:00
monitored_only_query_string_sonarr = ' AND monitored = "True"'
else:
2019-01-10 17:14:25 +00:00
monitored_only_query_string_sonarr = ""
if settings.radarr.getboolean('only_monitored'):
monitored_only_query_string_radarr = ' AND monitored = "True"'
else:
monitored_only_query_string_radarr = ""
2019-06-11 18:45:48 +00:00
c.execute(
"SELECT path_substitution(path) FROM table_episodes WHERE missing_subtitles != '[]'" + monitored_only_query_string_sonarr)
2018-05-02 10:25:42 +00:00
episodes = c.fetchall()
2019-01-15 16:25:13 +00:00
c.execute(
"SELECT path_substitution_movie(path) FROM table_movies WHERE missing_subtitles != '[]'" + monitored_only_query_string_radarr)
2018-05-02 10:25:42 +00:00
movies = c.fetchall()
2019-01-15 16:25:13 +00:00
2017-10-23 03:00:11 +00:00
c.close()
if settings.general.getboolean('use_sonarr'):
2019-07-28 19:49:19 +00:00
count_episodes = len(episodes)
for i, episode in enumerate(episodes, 1):
providers = get_providers()
if providers:
2019-04-04 22:33:49 +00:00
wanted_download_subtitles(episode[0], i, count_episodes)
2019-07-28 19:49:19 +00:00
else:
notifications.write(msg='BAZARR All providers are throttled', queue='get_subtitle', duration='long')
logging.info("BAZARR All providers are throttled")
return
2019-01-15 16:25:13 +00:00
if settings.general.getboolean('use_radarr'):
2019-07-28 19:49:19 +00:00
count_movies = len(movies)
for i, movie in enumerate(movies, 1):
providers = get_providers()
if providers:
2019-04-04 22:33:49 +00:00
wanted_download_subtitles_movie(movie[0], i, count_movies)
2019-07-28 19:49:19 +00:00
else:
notifications.write(msg='BAZARR All providers are throttled', queue='get_subtitle', duration='long')
logging.info("BAZARR All providers are throttled")
return
2019-01-15 16:25:13 +00:00
logging.info('BAZARR Finished searching for missing subtitles. Check histories for more information.')
2019-06-11 18:45:48 +00:00
notifications.write(msg='Searching completed. Please reload the page.', type='success', duration='permanent',
button='refresh', queue='get_subtitle')
def search_active(timestamp):
2019-01-06 17:15:43 +00:00
if settings.general.getboolean('adaptive_searching'):
search_deadline = timedelta(weeks=3)
search_delta = timedelta(weeks=1)
aa = datetime.fromtimestamp(float(timestamp))
attempt_datetime = datetime.strptime(str(aa).split(".")[0], '%Y-%m-%d %H:%M:%S')
attempt_search_deadline = attempt_datetime + search_deadline
today = datetime.today()
attempt_age_in_days = (today.date() - attempt_search_deadline.date()).days
if today.date() <= attempt_search_deadline.date():
return True
elif attempt_age_in_days % search_delta.days == 0:
return True
else:
return False
else:
return True
def refine_from_db(path, video):
if isinstance(video, Episode):
db = sqlite3.connect(os.path.join(args.config_dir, 'db', 'bazarr.db'), timeout=30)
c = db.cursor()
2019-06-11 18:45:48 +00:00
data = c.execute(
"SELECT table_shows.title, table_episodes.season, table_episodes.episode, table_episodes.title, table_shows.year, table_shows.tvdbId, table_shows.alternateTitles, table_episodes.format, table_episodes.resolution, table_episodes.video_codec, table_episodes.audio_codec FROM table_episodes INNER JOIN table_shows on table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE table_episodes.path = ?",
(unicode(path_replace_reverse(path)),)).fetchone()
db.close()
2019-02-08 03:34:54 +00:00
if data:
2019-03-20 21:20:10 +00:00
video.series, year, country = series_re.match(data[0]).groups()
video.season = int(data[1])
video.episode = int(data[2])
video.title = data[3]
2019-03-13 17:28:59 +00:00
if data[4]:
if int(data[4]) > 0: video.year = int(data[4])
video.series_tvdb_id = int(data[5])
video.alternative_series = ast.literal_eval(data[6])
2019-02-06 11:51:19 +00:00
if not video.format:
video.format = str(data[7])
2019-02-06 03:49:58 +00:00
if not video.resolution:
2019-02-06 11:51:19 +00:00
video.resolution = str(data[8])
2019-02-06 03:49:58 +00:00
if not video.video_codec:
2019-02-08 03:34:54 +00:00
if data[9]: video.video_codec = data[9]
2019-02-06 03:49:58 +00:00
if not video.audio_codec:
2019-02-06 11:51:19 +00:00
if data[10]: video.audio_codec = data[10]
elif isinstance(video, Movie):
db = sqlite3.connect(os.path.join(args.config_dir, 'db', 'bazarr.db'), timeout=30)
c = db.cursor()
2019-06-11 18:45:48 +00:00
data = c.execute(
"SELECT title, year, alternativeTitles, format, resolution, video_codec, audio_codec, imdbId FROM table_movies WHERE path = ?",
(unicode(path_replace_reverse_movie(path)),)).fetchone()
db.close()
2019-02-08 03:34:54 +00:00
if data:
2019-06-11 18:45:48 +00:00
video.title = re.sub(r'(\(\d\d\d\d\))', '', data[0])
2019-03-13 17:28:59 +00:00
if data[1]:
if int(data[1]) > 0: video.year = int(data[1])
2019-02-11 03:42:42 +00:00
if data[7]: video.imdb_id = data[7]
video.alternative_titles = ast.literal_eval(data[2])
2019-02-06 11:51:19 +00:00
if not video.format:
if data[3]: video.format = data[3]
2019-02-06 03:49:58 +00:00
if not video.resolution:
2019-02-06 11:51:19 +00:00
if data[4]: video.resolution = data[4]
2019-02-06 03:49:58 +00:00
if not video.video_codec:
2019-02-06 11:51:19 +00:00
if data[5]: video.video_codec = data[5]
2019-02-06 03:49:58 +00:00
if not video.audio_codec:
2019-02-06 11:51:19 +00:00
if data[6]: video.audio_codec = data[6]
2019-06-11 18:45:48 +00:00
return video
def refine_from_mediainfo(path, video):
if video.fps:
return
2019-07-28 19:49:19 +00:00
exe = get_binary('mediainfo')
if not exe:
logging.debug('BAZARR MediaInfo library not found!')
return
else:
logging.debug('BAZARR MediaInfo library used is %s', exe)
2019-07-28 19:49:19 +00:00
media_info = MediaInfo.parse(path, library_file=exe)
2019-07-28 19:49:19 +00:00
video_track = next((t for t in media_info.tracks if t.track_type == 'Video'), None)
if not video_track:
logging.debug('BAZARR MediaInfo was unable to find video tracks in the file!')
return
2019-07-28 19:49:19 +00:00
logging.debug('MediaInfo found: %s', video_track.to_data())
2019-07-28 19:49:19 +00:00
if not video.fps:
if video_track.frame_rate:
video.fps = float(video_track.frame_rate)
elif video_track.framerate_num and video_track.framerate_den:
video.fps = round(float(video_track.framerate_num) / float(video_track.framerate_den), 3)
def upgrade_subtitles():
days_to_upgrade_subs = settings.general.days_to_upgrade_subs
2019-03-17 14:29:38 +00:00
minimum_timestamp = ((datetime.now() - timedelta(days=int(days_to_upgrade_subs))) -
datetime(1970, 1, 1)).total_seconds()
2019-06-11 18:45:48 +00:00
2019-03-19 04:08:53 +00:00
if settings.general.getboolean('upgrade_manual'):
query_actions = [1, 2, 3]
else:
query_actions = [1, 3]
2019-06-11 18:45:48 +00:00
db = sqlite3.connect(os.path.join(args.config_dir, 'db', 'bazarr.db'), timeout=30)
c = db.cursor()
2019-03-17 14:29:38 +00:00
episodes_list = c.execute("""SELECT table_history.video_path, table_history.language, table_history.score,
table_shows.hearing_impaired, table_episodes.scene_name, table_episodes.title,
table_episodes.sonarrSeriesId, table_episodes.sonarrEpisodeId,
MAX(table_history.timestamp), table_shows.languages, table_shows.forced
2019-03-17 14:29:38 +00:00
FROM table_history
INNER JOIN table_shows on table_shows.sonarrSeriesId = table_history.sonarrSeriesId
INNER JOIN table_episodes on table_episodes.sonarrEpisodeId = table_history.sonarrEpisodeId
2019-03-19 04:08:53 +00:00
WHERE action IN (""" + ','.join(map(str, query_actions)) + """) AND timestamp > ? AND
2019-03-20 03:44:50 +00:00
score is not null
2019-03-17 21:44:40 +00:00
GROUP BY table_history.video_path, table_history.language""",
(minimum_timestamp,)).fetchall()
movies_list = c.execute("""SELECT table_history_movie.video_path, table_history_movie.language,
table_history_movie.score, table_movies.hearing_impaired, table_movies.sceneName,
2019-03-19 04:08:53 +00:00
table_movies.title, table_movies.radarrId, MAX(table_history_movie.timestamp),
table_movies.languages, table_movies.forced
2019-03-17 21:44:40 +00:00
FROM table_history_movie
INNER JOIN table_movies on table_movies.radarrId = table_history_movie.radarrId
2019-03-19 04:08:53 +00:00
WHERE action IN (""" + ','.join(map(str, query_actions)) + """) AND timestamp > ? AND
2019-03-20 03:44:50 +00:00
score is not null
2019-03-17 21:44:40 +00:00
GROUP BY table_history_movie.video_path, table_history_movie.language""",
(minimum_timestamp,)).fetchall()
db.close()
2019-06-11 18:45:48 +00:00
2019-03-16 19:30:06 +00:00
episodes_to_upgrade = []
if settings.general.getboolean('use_sonarr'):
for episode in episodes_list:
if os.path.exists(path_replace(episode[0])) and int(episode[2]) < 357:
episodes_to_upgrade.append(episode)
2019-06-11 18:45:48 +00:00
2019-03-17 21:44:40 +00:00
movies_to_upgrade = []
if settings.general.getboolean('use_radarr'):
for movie in movies_list:
if os.path.exists(path_replace_movie(movie[0])) and int(movie[2]) < 117:
movies_to_upgrade.append(movie)
2019-06-11 18:45:48 +00:00
2019-03-16 19:30:06 +00:00
providers_list = get_providers()
providers_auth = get_providers_auth()
2019-04-04 13:29:08 +00:00
count_episode_to_upgrade = len(episodes_to_upgrade)
count_movie_to_upgrade = len(movies_to_upgrade)
2019-06-11 18:45:48 +00:00
if settings.general.getboolean('use_sonarr'):
for i, episode in enumerate(episodes_to_upgrade, 1):
2019-07-28 19:49:19 +00:00
providers = get_providers()
if not providers:
notifications.write(msg='BAZARR All providers are throttled', queue='get_subtitle', duration='long')
logging.info("BAZARR All providers are throttled")
return
if episode[9] != "None":
2019-05-10 13:24:11 +00:00
desired_languages = ast.literal_eval(str(episode[9]))
if episode[10] == "True":
forced_languages = [l + ":forced" for l in desired_languages]
elif episode[10] == "Both":
forced_languages = [l + ":forced" for l in desired_languages] + desired_languages
else:
forced_languages = desired_languages
2019-06-11 18:45:48 +00:00
2019-05-10 13:24:11 +00:00
if episode[1] in forced_languages:
notifications.write(msg='Upgrading series subtitles...',
queue='upgrade_subtitle', item=i, length=count_episode_to_upgrade)
2019-06-11 18:45:48 +00:00
2019-05-10 13:24:11 +00:00
if episode[1].endswith('forced'):
language = episode[1].split(':')[0]
is_forced = "True"
else:
language = episode[1]
is_forced = "False"
2019-06-11 18:45:48 +00:00
2019-05-10 13:24:11 +00:00
result = download_subtitle(path_replace(episode[0]), str(alpha3_from_alpha2(language)),
episode[3], is_forced, providers_list, providers_auth, str(episode[4]),
episode[5], 'series', forced_minimum_score=int(episode[2]),
is_upgrade=True)
if result is not None:
message = result[0]
path = result[1]
2019-05-02 00:26:48 +00:00
forced = result[5]
2019-06-16 19:24:47 +00:00
language_code = result[2] + ":forced" if forced else result[2]
provider = result[3]
score = result[4]
store_subtitles(path_replace(episode[0]))
history_log(3, episode[6], episode[7], message, path, language_code, provider, score)
send_notifications(episode[6], episode[7], message)
2019-06-11 18:45:48 +00:00
if settings.general.getboolean('use_radarr'):
for i, movie in enumerate(movies_to_upgrade, 1):
2019-07-28 19:49:19 +00:00
providers = get_providers()
if not providers:
notifications.write(msg='BAZARR All providers are throttled', queue='get_subtitle', duration='long')
logging.info("BAZARR All providers are throttled")
return
if movie[8] != "None":
2019-05-10 13:24:11 +00:00
desired_languages = ast.literal_eval(str(movie[8]))
if movie[9] == "True":
forced_languages = [l + ":forced" for l in desired_languages]
elif movie[9] == "Both":
forced_languages = [l + ":forced" for l in desired_languages] + desired_languages
else:
forced_languages = desired_languages
2019-06-11 18:45:48 +00:00
2019-05-10 13:24:11 +00:00
if movie[1] in forced_languages:
notifications.write(msg='Upgrading movie subtitles...',
2019-06-11 18:45:48 +00:00
queue='upgrade_subtitle', item=i, length=count_movie_to_upgrade)
2019-05-10 13:24:11 +00:00
if movie[1].endswith('forced'):
language = movie[1].split(':')[0]
is_forced = "True"
else:
language = movie[1]
is_forced = "False"
2019-06-11 18:45:48 +00:00
2019-05-10 13:24:11 +00:00
result = download_subtitle(path_replace_movie(movie[0]), str(alpha3_from_alpha2(language)),
movie[3], is_forced, providers_list, providers_auth, str(movie[4]),
movie[5], 'movie', forced_minimum_score=int(movie[2]), is_upgrade=True)
if result is not None:
message = result[0]
path = result[1]
2019-05-02 00:26:48 +00:00
forced = result[5]
2019-06-16 23:29:28 +00:00
language_code = result[2] + ":forced" if forced else result[2]
provider = result[3]
score = result[4]
store_subtitles_movie(path_replace_movie(movie[0]))
history_log_movie(3, movie[6], message, path, language_code, provider, score)
send_notifications_movie(movie[6], message)