|
|
|
@ -13,7 +13,6 @@ from app.database import get_exclusion_clause, get_audio_profile_languages, Tabl
|
|
|
|
|
from app.event_handler import show_progress, hide_progress
|
|
|
|
|
from app.get_providers import get_providers
|
|
|
|
|
from app.notifier import send_notifications, send_notifications_movie
|
|
|
|
|
from peewee import fn
|
|
|
|
|
from radarr.history import history_log_movie
|
|
|
|
|
from sonarr.history import history_log
|
|
|
|
|
from subtitles.indexer.movies import store_subtitles_movie
|
|
|
|
@ -23,153 +22,13 @@ from .download import generate_subtitles
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def upgrade_subtitles():
|
|
|
|
|
days_to_upgrade_subs = settings.general.days_to_upgrade_subs
|
|
|
|
|
minimum_timestamp = (datetime.now() - timedelta(days=int(days_to_upgrade_subs)))
|
|
|
|
|
|
|
|
|
|
if settings.general.getboolean('upgrade_manual'):
|
|
|
|
|
query_actions = [1, 2, 3, 4, 6]
|
|
|
|
|
else:
|
|
|
|
|
query_actions = [1, 3]
|
|
|
|
|
|
|
|
|
|
if settings.general.getboolean('use_sonarr'):
|
|
|
|
|
upgradable_episodes_conditions = [(TableHistory.action << query_actions),
|
|
|
|
|
(TableHistory.timestamp > minimum_timestamp),
|
|
|
|
|
(TableHistory.score.is_null(False))]
|
|
|
|
|
upgradable_episodes_conditions += get_exclusion_clause('series')
|
|
|
|
|
upgradable_episodes = TableHistory.select(TableHistory.video_path,
|
|
|
|
|
TableHistory.language,
|
|
|
|
|
TableHistory.score,
|
|
|
|
|
TableShows.tags,
|
|
|
|
|
TableShows.profileId,
|
|
|
|
|
TableEpisodes.audio_language,
|
|
|
|
|
TableEpisodes.sceneName,
|
|
|
|
|
TableEpisodes.title,
|
|
|
|
|
TableEpisodes.sonarrSeriesId,
|
|
|
|
|
TableHistory.action,
|
|
|
|
|
TableHistory.subtitles_path,
|
|
|
|
|
TableEpisodes.sonarrEpisodeId,
|
|
|
|
|
fn.MAX(TableHistory.timestamp).alias('timestamp'),
|
|
|
|
|
TableEpisodes.monitored,
|
|
|
|
|
TableEpisodes.season,
|
|
|
|
|
TableEpisodes.episode,
|
|
|
|
|
TableShows.title.alias('seriesTitle'),
|
|
|
|
|
TableShows.seriesType) \
|
|
|
|
|
.join(TableShows, on=(TableHistory.sonarrSeriesId == TableShows.sonarrSeriesId)) \
|
|
|
|
|
.join(TableEpisodes, on=(TableHistory.sonarrEpisodeId == TableEpisodes.sonarrEpisodeId)) \
|
|
|
|
|
.where(reduce(operator.and_, upgradable_episodes_conditions)) \
|
|
|
|
|
.group_by(TableHistory.video_path,
|
|
|
|
|
TableHistory.language,
|
|
|
|
|
TableHistory.score,
|
|
|
|
|
TableShows.tags,
|
|
|
|
|
TableShows.profileId,
|
|
|
|
|
TableEpisodes.audio_language,
|
|
|
|
|
TableEpisodes.sceneName,
|
|
|
|
|
TableEpisodes.title,
|
|
|
|
|
TableEpisodes.sonarrSeriesId,
|
|
|
|
|
TableHistory.action,
|
|
|
|
|
TableHistory.subtitles_path,
|
|
|
|
|
TableEpisodes.sonarrEpisodeId,
|
|
|
|
|
TableEpisodes.monitored,
|
|
|
|
|
TableEpisodes.season,
|
|
|
|
|
TableEpisodes.episode,
|
|
|
|
|
TableShows.title.alias('seriesTitle'),
|
|
|
|
|
TableShows.seriesType) \
|
|
|
|
|
.dicts()
|
|
|
|
|
upgradable_episodes_not_perfect = []
|
|
|
|
|
for upgradable_episode in upgradable_episodes:
|
|
|
|
|
if upgradable_episode['timestamp'] > minimum_timestamp:
|
|
|
|
|
try:
|
|
|
|
|
int(upgradable_episode['score'])
|
|
|
|
|
except ValueError:
|
|
|
|
|
pass
|
|
|
|
|
else:
|
|
|
|
|
if int(upgradable_episode['score']) < 360 or (settings.general.getboolean('upgrade_manual') and
|
|
|
|
|
upgradable_episode['action'] in [2, 4, 6]):
|
|
|
|
|
#check episode is already in list and replace it is episode have better score
|
|
|
|
|
if upgradable_episode['video_path'] in [x['video_path'] for x in upgradable_episodes_not_perfect]:
|
|
|
|
|
for item in upgradable_episodes_not_perfect:
|
|
|
|
|
if item['video_path'] == upgradable_episode['video_path'] and \
|
|
|
|
|
int(item['score']) <= int(upgradable_episode['score']):
|
|
|
|
|
upgradable_episodes_not_perfect.remove(item)
|
|
|
|
|
upgradable_episodes_not_perfect.append(upgradable_episode)
|
|
|
|
|
else:
|
|
|
|
|
upgradable_episodes_not_perfect.append(upgradable_episode)
|
|
|
|
|
|
|
|
|
|
episodes_to_upgrade = []
|
|
|
|
|
for episode in upgradable_episodes_not_perfect:
|
|
|
|
|
if os.path.exists(path_mappings.path_replace(episode['subtitles_path'])) and \
|
|
|
|
|
os.path.exists(path_mappings.path_replace(episode['video_path'])) and \
|
|
|
|
|
int(episode['score']) < 357:
|
|
|
|
|
episodes_to_upgrade.append(episode)
|
|
|
|
|
use_sonarr = settings.general.getboolean('use_sonarr')
|
|
|
|
|
use_radarr = settings.general.getboolean('use_radarr')
|
|
|
|
|
|
|
|
|
|
if use_sonarr:
|
|
|
|
|
episodes_to_upgrade = get_upgradable_episode_subtitles()
|
|
|
|
|
count_episode_to_upgrade = len(episodes_to_upgrade)
|
|
|
|
|
|
|
|
|
|
if settings.general.getboolean('use_radarr'):
|
|
|
|
|
upgradable_movies_conditions = [(TableHistoryMovie.action << query_actions),
|
|
|
|
|
(TableHistoryMovie.timestamp > minimum_timestamp),
|
|
|
|
|
(TableHistoryMovie.score.is_null(False))]
|
|
|
|
|
upgradable_movies_conditions += get_exclusion_clause('movie')
|
|
|
|
|
upgradable_movies = TableHistoryMovie.select(TableHistoryMovie.video_path,
|
|
|
|
|
TableHistoryMovie.language,
|
|
|
|
|
TableHistoryMovie.score,
|
|
|
|
|
TableMovies.profileId,
|
|
|
|
|
TableHistoryMovie.action,
|
|
|
|
|
TableHistoryMovie.subtitles_path,
|
|
|
|
|
TableMovies.audio_language,
|
|
|
|
|
TableMovies.sceneName,
|
|
|
|
|
fn.MAX(TableHistoryMovie.timestamp).alias('timestamp'),
|
|
|
|
|
TableMovies.monitored,
|
|
|
|
|
TableMovies.tags,
|
|
|
|
|
TableMovies.radarrId,
|
|
|
|
|
TableMovies.title) \
|
|
|
|
|
.join(TableMovies, on=(TableHistoryMovie.radarrId == TableMovies.radarrId)) \
|
|
|
|
|
.where(reduce(operator.and_, upgradable_movies_conditions)) \
|
|
|
|
|
.group_by(TableHistoryMovie.video_path,
|
|
|
|
|
TableHistoryMovie.language,
|
|
|
|
|
TableHistoryMovie.score,
|
|
|
|
|
TableMovies.profileId,
|
|
|
|
|
TableHistoryMovie.action,
|
|
|
|
|
TableHistoryMovie.subtitles_path,
|
|
|
|
|
TableMovies.audio_language,
|
|
|
|
|
TableMovies.sceneName,
|
|
|
|
|
TableMovies.monitored,
|
|
|
|
|
TableMovies.tags,
|
|
|
|
|
TableMovies.radarrId,
|
|
|
|
|
TableMovies.title
|
|
|
|
|
) \
|
|
|
|
|
.dicts()
|
|
|
|
|
upgradable_movies_not_perfect = []
|
|
|
|
|
for upgradable_movie in upgradable_movies:
|
|
|
|
|
if upgradable_movie['timestamp'] > minimum_timestamp:
|
|
|
|
|
try:
|
|
|
|
|
int(upgradable_movie['score'])
|
|
|
|
|
except ValueError:
|
|
|
|
|
pass
|
|
|
|
|
else:
|
|
|
|
|
if int(upgradable_movie['score']) < 120 or (settings.general.getboolean('upgrade_manual') and
|
|
|
|
|
upgradable_movie['action'] in [2, 4, 6]):
|
|
|
|
|
# check episode is already in list and replace it is episode have better score
|
|
|
|
|
if upgradable_movie['video_path'] in [x['video_path'] for x in
|
|
|
|
|
upgradable_movies_not_perfect]:
|
|
|
|
|
for item in upgradable_movies_not_perfect:
|
|
|
|
|
if item['video_path'] == upgradable_movie['video_path'] and \
|
|
|
|
|
int(item['score']) <= int(upgradable_movie['score']):
|
|
|
|
|
upgradable_movies_not_perfect.remove(item)
|
|
|
|
|
upgradable_movies_not_perfect.append(upgradable_movie)
|
|
|
|
|
else:
|
|
|
|
|
upgradable_movies_not_perfect.append(upgradable_movie)
|
|
|
|
|
upgradable_movies_not_perfect.append(upgradable_movie)
|
|
|
|
|
|
|
|
|
|
movies_to_upgrade = []
|
|
|
|
|
for movie in upgradable_movies_not_perfect:
|
|
|
|
|
if os.path.exists(path_mappings.path_replace_movie(movie['subtitles_path'])) and \
|
|
|
|
|
os.path.exists(path_mappings.path_replace_movie(movie['video_path'])) and \
|
|
|
|
|
int(movie['score']) < 117:
|
|
|
|
|
movies_to_upgrade.append(movie)
|
|
|
|
|
|
|
|
|
|
count_movie_to_upgrade = len(movies_to_upgrade)
|
|
|
|
|
|
|
|
|
|
if settings.general.getboolean('use_sonarr'):
|
|
|
|
|
for i, episode in enumerate(episodes_to_upgrade):
|
|
|
|
|
providers_list = get_providers()
|
|
|
|
|
|
|
|
|
@ -185,18 +44,8 @@ def upgrade_subtitles():
|
|
|
|
|
if not providers_list:
|
|
|
|
|
logging.info("BAZARR All providers are throttled")
|
|
|
|
|
return
|
|
|
|
|
if episode['language'].endswith('forced'):
|
|
|
|
|
language = episode['language'].split(':')[0]
|
|
|
|
|
is_forced = "True"
|
|
|
|
|
is_hi = "False"
|
|
|
|
|
elif episode['language'].endswith('hi'):
|
|
|
|
|
language = episode['language'].split(':')[0]
|
|
|
|
|
is_forced = "False"
|
|
|
|
|
is_hi = "True"
|
|
|
|
|
else:
|
|
|
|
|
language = episode['language'].split(':')[0]
|
|
|
|
|
is_forced = "False"
|
|
|
|
|
is_hi = "False"
|
|
|
|
|
|
|
|
|
|
language, is_forced, is_hi = parse_language_string(episode['language'])
|
|
|
|
|
|
|
|
|
|
audio_language_list = get_audio_profile_languages(episode['audio_language'])
|
|
|
|
|
if len(audio_language_list) > 0:
|
|
|
|
@ -215,27 +64,16 @@ def upgrade_subtitles():
|
|
|
|
|
|
|
|
|
|
if result:
|
|
|
|
|
result = result[0]
|
|
|
|
|
message = result[0]
|
|
|
|
|
path = result[1]
|
|
|
|
|
forced = result[5]
|
|
|
|
|
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]
|
|
|
|
|
subs_path = result[7]
|
|
|
|
|
store_subtitles(episode['video_path'], path_mappings.path_replace(episode['video_path']))
|
|
|
|
|
history_log(3, episode['sonarrSeriesId'], episode['sonarrEpisodeId'], message, path,
|
|
|
|
|
language_code, provider, score, subs_id, subs_path)
|
|
|
|
|
send_notifications(episode['sonarrSeriesId'], episode['sonarrEpisodeId'], message)
|
|
|
|
|
history_log(3, episode['sonarrSeriesId'], episode['sonarrEpisodeId'], result)
|
|
|
|
|
send_notifications(episode['sonarrSeriesId'], episode['sonarrEpisodeId'], result.message)
|
|
|
|
|
|
|
|
|
|
hide_progress(id='upgrade_episodes_progress')
|
|
|
|
|
|
|
|
|
|
if settings.general.getboolean('use_radarr'):
|
|
|
|
|
if use_radarr:
|
|
|
|
|
movies_to_upgrade = get_upgradable_movies_subtitles()
|
|
|
|
|
count_movie_to_upgrade = len(movies_to_upgrade)
|
|
|
|
|
|
|
|
|
|
for i, movie in enumerate(movies_to_upgrade):
|
|
|
|
|
providers_list = get_providers()
|
|
|
|
|
|
|
|
|
@ -248,18 +86,8 @@ def upgrade_subtitles():
|
|
|
|
|
if not providers_list:
|
|
|
|
|
logging.info("BAZARR All providers are throttled")
|
|
|
|
|
return
|
|
|
|
|
if movie['language'].endswith('forced'):
|
|
|
|
|
language = movie['language'].split(':')[0]
|
|
|
|
|
is_forced = "True"
|
|
|
|
|
is_hi = "False"
|
|
|
|
|
elif movie['language'].endswith('hi'):
|
|
|
|
|
language = movie['language'].split(':')[0]
|
|
|
|
|
is_forced = "False"
|
|
|
|
|
is_hi = "True"
|
|
|
|
|
else:
|
|
|
|
|
language = movie['language'].split(':')[0]
|
|
|
|
|
is_forced = "False"
|
|
|
|
|
is_hi = "False"
|
|
|
|
|
|
|
|
|
|
language, is_forced, is_hi = parse_language_string(movie['language'])
|
|
|
|
|
|
|
|
|
|
audio_language_list = get_audio_profile_languages(movie['audio_language'])
|
|
|
|
|
if len(audio_language_list) > 0:
|
|
|
|
@ -277,25 +105,152 @@ def upgrade_subtitles():
|
|
|
|
|
is_upgrade=True))
|
|
|
|
|
if result:
|
|
|
|
|
result = result[0]
|
|
|
|
|
message = result[0]
|
|
|
|
|
path = result[1]
|
|
|
|
|
forced = result[5]
|
|
|
|
|
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]
|
|
|
|
|
subs_path = result[7]
|
|
|
|
|
store_subtitles_movie(movie['video_path'],
|
|
|
|
|
path_mappings.path_replace_movie(movie['video_path']))
|
|
|
|
|
history_log_movie(3, movie['radarrId'], message, path, language_code, provider, score, subs_id,
|
|
|
|
|
subs_path)
|
|
|
|
|
send_notifications_movie(movie['radarrId'], message)
|
|
|
|
|
history_log_movie(3, movie['radarrId'], result)
|
|
|
|
|
send_notifications_movie(movie['radarrId'], result.message)
|
|
|
|
|
|
|
|
|
|
hide_progress(id='upgrade_movies_progress')
|
|
|
|
|
|
|
|
|
|
logging.info('BAZARR Finished searching for Subtitles to upgrade. Check History for more information.')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_queries_condition_parameters():
|
|
|
|
|
days_to_upgrade_subs = settings.general.days_to_upgrade_subs
|
|
|
|
|
minimum_timestamp = (datetime.now() - timedelta(days=int(days_to_upgrade_subs)))
|
|
|
|
|
|
|
|
|
|
if settings.general.getboolean('upgrade_manual'):
|
|
|
|
|
query_actions = [1, 2, 3, 4, 6]
|
|
|
|
|
else:
|
|
|
|
|
query_actions = [1, 3]
|
|
|
|
|
|
|
|
|
|
return [minimum_timestamp, query_actions]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def parse_upgradable_list(upgradable_list, perfect_score, media_type):
|
|
|
|
|
if media_type == 'series':
|
|
|
|
|
path_replace_method = path_mappings.path_replace
|
|
|
|
|
else:
|
|
|
|
|
path_replace_method = path_mappings.path_replace_movie
|
|
|
|
|
|
|
|
|
|
items_to_upgrade = []
|
|
|
|
|
|
|
|
|
|
for item in upgradable_list:
|
|
|
|
|
logging.debug(f"Trying to validate eligibility to upgrade for this subtitles: "
|
|
|
|
|
f"{item['subtitles_path']}")
|
|
|
|
|
if (item['video_path'], item['language']) in \
|
|
|
|
|
[(x['video_path'], x['language']) for x in items_to_upgrade]:
|
|
|
|
|
logging.debug("Newer video path and subtitles language combination already in list of subtitles to "
|
|
|
|
|
"upgrade, we skip this one.")
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
if os.path.exists(path_replace_method(item['subtitles_path'])) and \
|
|
|
|
|
os.path.exists(path_replace_method(item['video_path'])):
|
|
|
|
|
logging.debug("Video and subtitles file are still there, we continue the eligibility validation.")
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
items_to_upgrade.append(item)
|
|
|
|
|
|
|
|
|
|
if not settings.general.getboolean('upgrade_manual'):
|
|
|
|
|
logging.debug("Removing history items for manually downloaded or translated subtitles.")
|
|
|
|
|
items_to_upgrade = [x for x in items_to_upgrade if x['action'] in [2, 4, 6]]
|
|
|
|
|
|
|
|
|
|
logging.debug("Removing history items for already perfectly scored subtitles.")
|
|
|
|
|
items_to_upgrade = [x for x in items_to_upgrade if x['score'] < perfect_score]
|
|
|
|
|
|
|
|
|
|
logging.debug(f"Bazarr will try to upgrade {len(items_to_upgrade)} subtitles.")
|
|
|
|
|
|
|
|
|
|
return items_to_upgrade
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def parse_language_string(language_string):
|
|
|
|
|
if language_string.endswith('forced'):
|
|
|
|
|
language = language_string.split(':')[0]
|
|
|
|
|
is_forced = "True"
|
|
|
|
|
is_hi = "False"
|
|
|
|
|
elif language_string.endswith('hi'):
|
|
|
|
|
language = language_string.split(':')[0]
|
|
|
|
|
is_forced = "False"
|
|
|
|
|
is_hi = "True"
|
|
|
|
|
else:
|
|
|
|
|
language = language_string.split(':')[0]
|
|
|
|
|
is_forced = "False"
|
|
|
|
|
is_hi = "False"
|
|
|
|
|
|
|
|
|
|
return [language, is_forced, is_hi]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_upgradable_episode_subtitles():
|
|
|
|
|
minimum_timestamp, query_actions = get_queries_condition_parameters()
|
|
|
|
|
|
|
|
|
|
upgradable_episodes_conditions = [(TableHistory.action << query_actions),
|
|
|
|
|
(TableHistory.timestamp > minimum_timestamp),
|
|
|
|
|
(TableHistory.score.is_null(False))]
|
|
|
|
|
upgradable_episodes_conditions += get_exclusion_clause('series')
|
|
|
|
|
upgradable_episodes = TableHistory.select(TableHistory.video_path,
|
|
|
|
|
TableHistory.language,
|
|
|
|
|
TableHistory.score,
|
|
|
|
|
TableShows.tags,
|
|
|
|
|
TableShows.profileId,
|
|
|
|
|
TableEpisodes.audio_language,
|
|
|
|
|
TableEpisodes.sceneName,
|
|
|
|
|
TableEpisodes.title,
|
|
|
|
|
TableEpisodes.sonarrSeriesId,
|
|
|
|
|
TableHistory.action,
|
|
|
|
|
TableHistory.subtitles_path,
|
|
|
|
|
TableEpisodes.sonarrEpisodeId,
|
|
|
|
|
TableHistory.timestamp.alias('timestamp'),
|
|
|
|
|
TableEpisodes.monitored,
|
|
|
|
|
TableEpisodes.season,
|
|
|
|
|
TableEpisodes.episode,
|
|
|
|
|
TableShows.title.alias('seriesTitle'),
|
|
|
|
|
TableShows.seriesType) \
|
|
|
|
|
.join(TableShows, on=(TableHistory.sonarrSeriesId == TableShows.sonarrSeriesId)) \
|
|
|
|
|
.join(TableEpisodes, on=(TableHistory.sonarrEpisodeId == TableEpisodes.sonarrEpisodeId)) \
|
|
|
|
|
.where(reduce(operator.and_, upgradable_episodes_conditions)) \
|
|
|
|
|
.order_by(TableHistory.timestamp.desc()) \
|
|
|
|
|
.dicts()
|
|
|
|
|
|
|
|
|
|
if not upgradable_episodes:
|
|
|
|
|
return []
|
|
|
|
|
else:
|
|
|
|
|
upgradable_episodes = list(upgradable_episodes)
|
|
|
|
|
logging.debug(f"{len(upgradable_episodes)} potentially upgradable episode subtitles have been found, let's "
|
|
|
|
|
f"filter them...")
|
|
|
|
|
|
|
|
|
|
return parse_upgradable_list(upgradable_list=upgradable_episodes, perfect_score=357, media_type='series')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_upgradable_movies_subtitles():
|
|
|
|
|
minimum_timestamp, query_actions = get_queries_condition_parameters()
|
|
|
|
|
|
|
|
|
|
upgradable_movies_conditions = [(TableHistoryMovie.action << query_actions),
|
|
|
|
|
(TableHistoryMovie.timestamp > minimum_timestamp),
|
|
|
|
|
(TableHistoryMovie.score.is_null(False))]
|
|
|
|
|
upgradable_movies_conditions += get_exclusion_clause('movie')
|
|
|
|
|
upgradable_movies = TableHistoryMovie.select(TableHistoryMovie.video_path,
|
|
|
|
|
TableHistoryMovie.language,
|
|
|
|
|
TableHistoryMovie.score,
|
|
|
|
|
TableMovies.profileId,
|
|
|
|
|
TableHistoryMovie.action,
|
|
|
|
|
TableHistoryMovie.subtitles_path,
|
|
|
|
|
TableMovies.audio_language,
|
|
|
|
|
TableMovies.sceneName,
|
|
|
|
|
TableHistoryMovie.timestamp.alias('timestamp'),
|
|
|
|
|
TableMovies.monitored,
|
|
|
|
|
TableMovies.tags,
|
|
|
|
|
TableMovies.radarrId,
|
|
|
|
|
TableMovies.title) \
|
|
|
|
|
.join(TableMovies, on=(TableHistoryMovie.radarrId == TableMovies.radarrId)) \
|
|
|
|
|
.where(reduce(operator.and_, upgradable_movies_conditions)) \
|
|
|
|
|
.order_by(TableHistoryMovie.timestamp.desc()) \
|
|
|
|
|
.dicts()
|
|
|
|
|
|
|
|
|
|
if not upgradable_movies:
|
|
|
|
|
return []
|
|
|
|
|
else:
|
|
|
|
|
upgradable_movies = list(upgradable_movies)
|
|
|
|
|
logging.debug(f"{len(upgradable_movies)} potentially upgradable movie subtitles have been found, let's filter "
|
|
|
|
|
f"them...")
|
|
|
|
|
|
|
|
|
|
return parse_upgradable_list(upgradable_list=upgradable_movies, perfect_score=117, media_type='movie')
|
|
|
|
|