From d738bab732b1ba0773000b8be4870a808b57b9f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Louis=20V=C3=A9zina?= <5130500+morpheus65535@users.noreply.github.com> Date: Fri, 7 Feb 2020 12:40:43 -0500 Subject: [PATCH] WIP --- bazarr/api.py | 219 ++++++++++++++++++++++++++++++++++++-- bazarr/list_subtitles.py | 6 +- views/episodes.html | 12 ++- views/movie.html | 221 +++++++++++++++++++-------------------- 4 files changed, 330 insertions(+), 128 deletions(-) diff --git a/bazarr/api.py b/bazarr/api.py index 9c5fccc66..32e9c9011 100644 --- a/bazarr/api.py +++ b/bazarr/api.py @@ -5,6 +5,7 @@ from datetime import timedelta import datetime import pretty import time +from operator import itemgetter from get_args import args from config import settings, base_url @@ -476,18 +477,24 @@ class Movies(Resource): # Parse subtitles if item['subtitles']: item.update({"subtitles": ast.literal_eval(item['subtitles'])}) - for subs in item['subtitles']: - subs[0] = {"name": language_from_alpha2(subs[0]), - "code2": subs[0], - "code3": alpha3_from_alpha2(subs[0])} + for i, subs in enumerate(item['subtitles']): + language = subs[0].split(':') + item['subtitles'][i] = {"path": subs[1], + "name": language_from_alpha2(language[0]), + "code2": language[0], + "code3": alpha3_from_alpha2(language[0]), + "forced": True if len(language) > 1 else False} + item['subtitles'] = sorted(item['subtitles'], key=itemgetter('name', 'forced')) # Parse missing subtitles if item['missing_subtitles']: item.update({"missing_subtitles": ast.literal_eval(item['missing_subtitles'])}) for i, subs in enumerate(item['missing_subtitles']): - item['missing_subtitles'][i] = {"name": language_from_alpha2(subs), - "code2": subs, - "code3": alpha3_from_alpha2(subs)} + language = subs[0].split(':') + 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} # Provide mapped path mapped_path = path_replace_movie(item['path']) @@ -563,6 +570,196 @@ class MoviesEditSave(Resource): return '', 204 +class MovieSubtitlesDelete(Resource): + def delete(self): + moviePath = request.form.get('moviePath') + language = request.form.get('language') + subtitlesPath = request.form.get('subtitlesPath') + radarrId = request.form.get('radarrId') + + try: + os.remove(path_replace_movie(subtitlesPath)) + result = language_from_alpha3(language) + " subtitles deleted from disk." + history_log_movie(0, radarrId, result, language=alpha2_from_alpha3(language)) + store_subtitles_movie(path_replace_reverse_movie(moviePath), moviePath) + return result, 202 + except OSError as e: + logging.exception('BAZARR cannot delete subtitles file: ' + subtitlesPath) + + store_subtitles_movie(path_replace_reverse_movie(moviePath), moviePath) + return '', 204 + + +class MovieSubtitlesDownload(Resource): + def post(self): + moviePath = request.form.get('moviePath') + sceneName = request.form.get('sceneName') + if sceneName == "null": + sceneName = "None" + language = request.form.get('language') + hi = request.form.get('hi').capitalize() + forced = request.form.get('forced').capitalize() + radarrId = request.form.get('radarrId') + title = request.form.get('title') + providers_list = get_providers() + providers_auth = get_providers_auth() + + try: + result = download_subtitle(moviePath, language, hi, forced, providers_list, providers_auth, sceneName, + title, 'movie') + 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] + history_log_movie(1, radarrId, message, path, language_code, provider, score) + send_notifications_movie(radarrId, message) + store_subtitles_movie(path, moviePath) + return result, 201 + except OSError: + pass + + return '', 204 + + +class MovieSubtitlesManualSearch(Resource): + def post(self): + start = request.args.get('start') or 0 + length = request.args.get('length') or -1 + draw = request.args.get('draw') + + moviePath = request.form.get('moviePath') + sceneName = request.form.get('sceneName') + if sceneName == "null": + sceneName = "None" + language = request.form.get('language') + hi = request.form.get('hi').capitalize() + forced = request.form.get('forced').capitalize() + title = request.form.get('title') + providers_list = get_providers() + providers_auth = get_providers_auth() + + data = manual_search(moviePath, language, hi, forced, providers_list, providers_auth, sceneName, title, + 'movie') + row_count = len(data) + return jsonify(draw=draw, recordsTotal=row_count, recordsFiltered=row_count, data=data) + + +class MovieSubtitlesManualDownload(Resource): + def post(self): + moviePath = request.form.get('moviePath') + sceneName = request.form.get('sceneName') + if sceneName == "null": + sceneName = "None" + language = request.form.get('language') + hi = request.form.get('hi').capitalize() + forced = request.form.get('forced').capitalize() + selected_provider = request.form.get('provider') + subtitle = request.form.get('subtitle') + radarrId = request.form.get('radarrId') + title = request.form.get('title') + providers_auth = get_providers_auth() + + try: + result = manual_download_subtitle(moviePath, language, hi, forced, subtitle, selected_provider, + providers_auth, sceneName, title, 'movie') + 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] + history_log_movie(2, radarrId, message, path, language_code, provider, score) + send_notifications_movie(radarrId, message) + store_subtitles_movie(path, moviePath) + return result, 201 + except OSError: + pass + + return '', 204 + + +class MovieSubtitlesUpload(Resource): + def post(self): + moviePath = request.form.get('moviePath') + sceneName = request.form.get('sceneName') + if sceneName == "null": + sceneName = "None" + language = request.form.get('language') + forced = True if request.form.get('forced') == 'on' else False + upload = request.files.get('upload') + radarrId = request.form.get('radarrId') + title = request.form.get('title') + + _, ext = os.path.splitext(upload.filename) + + if ext not in SUBTITLE_EXTENSIONS: + raise ValueError('A subtitle of an invalid format was uploaded.') + + try: + result = manual_upload_subtitle(path=moviePath, + language=language, + forced=forced, + title=title, + scene_name=sceneName, + media_type='movie', + subtitle=upload) + + if result is not None: + message = result[0] + path = result[1] + language_code = language + ":forced" if forced else language + provider = "manual" + score = 120 + history_log_movie(4, radarrId, message, path, language_code, provider, score) + send_notifications_movie(radarrId, message) + store_subtitles_movie(path, moviePath) + + return result, 201 + except OSError: + pass + + return '', 204 + + +class MovieScanDisk(Resource): + def get(self): + radarrid = request.args.get('radarrid') + movies_scan_subtitles(radarrid) + return '', 200 + + +class MovieSearchMissing(Resource): + def get(self): + radarrid = request.args.get('radarrid') + movies_download_subtitles(radarrid) + return '', 200 + + +class MovieHistory(Resource): + def get(self): + radarrid = request.args.get('radarrid') + + movie_history = database.execute("SELECT action, timestamp, language, provider, score " + "FROM table_history_movie WHERE radarrId=? ORDER BY timestamp DESC", + (radarrid,)) + for item in movie_history: + item['timestamp'] = "