2019-01-26 21:12:19 +00:00
|
|
|
# coding=utf-8
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2020-01-29 11:53:29 +00:00
|
|
|
bazarr_version = '0.9'
|
2019-02-11 11:46:04 +00:00
|
|
|
|
2019-10-28 20:16:33 +00:00
|
|
|
import os
|
|
|
|
os.environ["SZ_USER_AGENT"] = "Bazarr/1"
|
|
|
|
os.environ["BAZARR_VERSION"] = bazarr_version
|
2019-09-18 15:30:46 +00:00
|
|
|
|
2019-09-28 16:38:26 +00:00
|
|
|
import gc
|
|
|
|
import sys
|
|
|
|
import libs
|
2020-01-30 01:30:30 +00:00
|
|
|
import io
|
2019-09-28 16:38:26 +00:00
|
|
|
|
2019-09-13 19:12:26 +00:00
|
|
|
import six
|
|
|
|
from six.moves import zip
|
|
|
|
from functools import reduce
|
2019-02-11 11:46:04 +00:00
|
|
|
|
2018-11-28 11:45:39 +00:00
|
|
|
import itertools
|
|
|
|
import operator
|
|
|
|
import pretty
|
|
|
|
import math
|
|
|
|
import ast
|
|
|
|
import hashlib
|
2019-09-13 19:12:26 +00:00
|
|
|
import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error
|
2018-11-28 11:45:39 +00:00
|
|
|
import warnings
|
2019-01-01 20:15:12 +00:00
|
|
|
import queueconfig
|
2019-01-01 20:31:01 +00:00
|
|
|
import platform
|
|
|
|
import apprise
|
2019-07-29 17:04:29 +00:00
|
|
|
import operator
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-11-28 11:34:37 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
from get_args import args
|
2019-11-06 05:08:17 +00:00
|
|
|
from logger import empty_log
|
2019-10-28 14:38:57 +00:00
|
|
|
from config import settings, url_sonarr, url_radarr, url_radarr_short, url_sonarr_short, base_url
|
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
from init import *
|
2019-11-06 05:08:17 +00:00
|
|
|
import logging
|
2019-10-26 18:52:22 +00:00
|
|
|
from database import database, dict_mapper
|
2019-02-24 03:21:40 +00:00
|
|
|
|
2018-10-22 16:39:11 +00:00
|
|
|
from notifier import update_notifier
|
2019-02-24 03:21:40 +00:00
|
|
|
|
2019-07-28 19:32:30 +00:00
|
|
|
from cherrypy.wsgiserver import CherryPyWSGIServer
|
2019-02-24 03:21:40 +00:00
|
|
|
|
2018-11-28 11:45:39 +00:00
|
|
|
from io import BytesIO
|
2020-01-29 11:53:29 +00:00
|
|
|
from six import text_type
|
2020-02-02 13:36:28 +00:00
|
|
|
from datetime import timedelta, datetime
|
2019-11-20 03:02:59 +00:00
|
|
|
from get_languages import load_language_in_db, language_from_alpha3, language_from_alpha2, alpha2_from_alpha3
|
2020-01-21 00:35:55 +00:00
|
|
|
from flask import make_response, request, redirect, abort, render_template, Response, session, flash, url_for, \
|
2019-12-31 22:09:04 +00:00
|
|
|
send_file, stream_with_context
|
2019-11-20 03:02:59 +00:00
|
|
|
|
2019-03-21 15:32:58 +00:00
|
|
|
from get_providers import get_providers, get_providers_auth, list_throttled_providers
|
2018-11-28 11:45:39 +00:00
|
|
|
from get_series import *
|
|
|
|
from get_episodes import *
|
2019-09-03 03:22:38 +00:00
|
|
|
from get_movies import *
|
2018-11-28 11:45:39 +00:00
|
|
|
|
|
|
|
from list_subtitles import store_subtitles, store_subtitles_movie, series_scan_subtitles, movies_scan_subtitles, \
|
|
|
|
list_missing_subtitles, list_missing_subtitles_movies
|
|
|
|
from get_subtitle import download_subtitle, series_download_subtitles, movies_download_subtitles, \
|
2019-08-23 00:02:11 +00:00
|
|
|
manual_search, manual_download_subtitle, manual_upload_subtitle
|
2019-09-03 03:22:38 +00:00
|
|
|
from utils import history_log, history_log_movie, get_sonarr_version, get_radarr_version
|
2020-01-04 05:55:44 +00:00
|
|
|
from helper import path_replace, path_replace_movie, path_replace_reverse, path_replace_reverse_movie
|
2020-02-01 00:54:17 +00:00
|
|
|
from scheduler import Scheduler
|
2018-11-28 11:45:39 +00:00
|
|
|
from notifier import send_notifications, send_notifications_movie
|
2019-01-02 19:43:40 +00:00
|
|
|
from subliminal_patch.extensions import provider_registry as provider_manager
|
2019-08-26 02:20:42 +00:00
|
|
|
from subliminal_patch.core import SUBTITLE_EXTENSIONS
|
2019-12-29 21:17:39 +00:00
|
|
|
from functools import wraps
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2020-01-21 00:35:55 +00:00
|
|
|
from app import create_app, socketio
|
|
|
|
app = create_app()
|
2019-12-16 13:58:10 +00:00
|
|
|
|
|
|
|
from api import api_bp
|
|
|
|
app.register_blueprint(api_bp)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
2020-02-01 02:54:53 +00:00
|
|
|
scheduler = Scheduler()
|
2019-12-10 20:39:17 +00:00
|
|
|
|
2019-06-02 23:19:51 +00:00
|
|
|
# Check and install update on startup when running on Windows from installer
|
|
|
|
if args.release_update:
|
|
|
|
check_and_apply_update()
|
|
|
|
|
2018-12-15 00:36:28 +00:00
|
|
|
if settings.proxy.type != 'None':
|
|
|
|
if settings.proxy.username != '' and settings.proxy.password != '':
|
2019-01-02 19:19:31 +00:00
|
|
|
proxy = settings.proxy.type + '://' + settings.proxy.username + ':' + settings.proxy.password + '@' + \
|
|
|
|
settings.proxy.url + ':' + settings.proxy.port
|
2018-10-03 10:53:22 +00:00
|
|
|
else:
|
2018-12-15 00:36:28 +00:00
|
|
|
proxy = settings.proxy.type + '://' + settings.proxy.url + ':' + settings.proxy.port
|
2018-10-03 10:53:22 +00:00
|
|
|
os.environ['HTTP_PROXY'] = str(proxy)
|
|
|
|
os.environ['HTTPS_PROXY'] = str(proxy)
|
2018-12-15 00:36:28 +00:00
|
|
|
os.environ['NO_PROXY'] = str(settings.proxy.exclude)
|
2018-10-03 10:53:22 +00:00
|
|
|
|
|
|
|
# Reset restart required warning on start
|
2019-10-22 02:13:37 +00:00
|
|
|
database.execute("UPDATE system SET configured='0', updated='0'")
|
2018-10-03 10:53:22 +00:00
|
|
|
|
|
|
|
# Load languages in database
|
|
|
|
load_language_in_db()
|
|
|
|
|
2018-12-15 00:36:28 +00:00
|
|
|
login_auth = settings.auth.type
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2019-08-09 00:39:30 +00:00
|
|
|
update_notifier()
|
|
|
|
|
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
def check_credentials(user, pw):
|
2018-12-15 00:36:28 +00:00
|
|
|
username = settings.auth.username
|
|
|
|
password = settings.auth.password
|
2019-12-03 23:45:06 +00:00
|
|
|
if hashlib.md5(pw.encode('utf-8')).hexdigest() == password and user == username:
|
2018-10-03 10:53:22 +00:00
|
|
|
return True
|
|
|
|
return False
|
|
|
|
|
2019-12-29 21:17:39 +00:00
|
|
|
def login_required(f):
|
|
|
|
@wraps(f)
|
|
|
|
def wrap(*args, **kwargs):
|
|
|
|
test = request
|
|
|
|
if settings.auth.type == 'basic':
|
|
|
|
auth = request.authorization
|
|
|
|
if not (auth and check_credentials(request.authorization.username, request.authorization.password)):
|
|
|
|
return ('Unauthorized', 401, {
|
|
|
|
'WWW-Authenticate': 'Basic realm="Login Required"'
|
|
|
|
})
|
|
|
|
|
|
|
|
return f(*args, **kwargs)
|
2019-12-30 13:16:12 +00:00
|
|
|
elif settings.auth.type == 'form':
|
2019-12-29 21:17:39 +00:00
|
|
|
if 'logged_in' in session:
|
|
|
|
return f(*args, **kwargs)
|
|
|
|
else:
|
|
|
|
flash("You need to login first")
|
|
|
|
return redirect(url_for('login_page'))
|
|
|
|
else:
|
|
|
|
return f(*args, **kwargs)
|
|
|
|
return wrap
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/login/', methods=["GET", "POST"])
|
|
|
|
def login_page():
|
|
|
|
error = ''
|
|
|
|
try:
|
|
|
|
if request.method == "POST":
|
|
|
|
if check_credentials(request.form['username'], request.form['password']):
|
|
|
|
session['logged_in'] = True
|
|
|
|
session['username'] = request.form['username']
|
|
|
|
|
|
|
|
flash("You are now logged in")
|
|
|
|
return redirect(url_for("redirect_root"))
|
|
|
|
else:
|
|
|
|
error = "Invalid credentials, try again."
|
|
|
|
gc.collect()
|
|
|
|
|
|
|
|
return render_template("login.html", error=error)
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
# flash(e)
|
|
|
|
error = "Invalid credentials, try again."
|
|
|
|
return render_template("login.html", error=error)
|
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2019-12-13 14:46:24 +00:00
|
|
|
@app.context_processor
|
|
|
|
def restart_processor():
|
|
|
|
def restart_required():
|
2019-12-16 13:58:10 +00:00
|
|
|
restart_required = database.execute("SELECT configured, updated FROM system", only_one=True)
|
2019-12-13 14:46:24 +00:00
|
|
|
return restart_required
|
2019-12-27 22:15:56 +00:00
|
|
|
return dict(restart_required=restart_required()['configured'], update_required=restart_required()['updated'], ast=ast, settings=settings, locals=locals(), args=args, os=os)
|
2019-12-13 14:46:24 +00:00
|
|
|
|
|
|
|
|
2019-11-27 03:12:16 +00:00
|
|
|
def api_authorize():
|
|
|
|
if 'apikey' in request.GET.dict:
|
|
|
|
if request.GET.dict['apikey'][0] == settings.auth.apikey:
|
|
|
|
return
|
|
|
|
else:
|
|
|
|
abort(401, 'Unauthorized')
|
|
|
|
else:
|
|
|
|
abort(401, 'Unauthorized')
|
|
|
|
|
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
def post_get(name, default=''):
|
|
|
|
return request.POST.get(name, default).strip()
|
|
|
|
|
|
|
|
|
2019-12-29 21:17:39 +00:00
|
|
|
@app.route("/logout/")
|
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def logout():
|
2019-12-29 21:17:39 +00:00
|
|
|
if settings.auth.type == 'basic':
|
|
|
|
return abort(401)
|
|
|
|
elif settings.auth.type == 'form':
|
|
|
|
session.clear()
|
|
|
|
flash("You have been logged out!")
|
|
|
|
gc.collect()
|
|
|
|
return redirect(url_for('redirect_root'))
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/shutdown/')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def shutdown():
|
2020-02-09 09:32:02 +00:00
|
|
|
doShutdown()
|
|
|
|
|
|
|
|
def doShutdown():
|
2018-10-11 01:23:30 +00:00
|
|
|
try:
|
2019-09-14 01:53:12 +00:00
|
|
|
server.stop()
|
2019-11-06 11:50:35 +00:00
|
|
|
except:
|
|
|
|
logging.error('BAZARR Cannot stop CherryPy.')
|
|
|
|
else:
|
2019-08-22 15:42:52 +00:00
|
|
|
database.close()
|
2019-11-06 11:50:35 +00:00
|
|
|
try:
|
2020-01-30 01:30:30 +00:00
|
|
|
stop_file = io.open(os.path.join(args.config_dir, "bazarr.stop"), "w", encoding='UTF-8')
|
2019-11-06 11:50:35 +00:00
|
|
|
except Exception as e:
|
|
|
|
logging.error('BAZARR Cannot create bazarr.stop file.')
|
|
|
|
else:
|
2020-01-30 01:30:30 +00:00
|
|
|
stop_file.write(six.text_type(''))
|
2019-11-06 11:50:35 +00:00
|
|
|
stop_file.close()
|
2019-11-12 01:53:46 +00:00
|
|
|
sys.exit(0)
|
2019-12-16 13:58:10 +00:00
|
|
|
return ''
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/restart/')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def restart():
|
2018-10-11 01:23:30 +00:00
|
|
|
try:
|
2019-09-14 01:53:12 +00:00
|
|
|
server.stop()
|
2019-11-06 11:50:35 +00:00
|
|
|
except:
|
|
|
|
logging.error('BAZARR Cannot stop CherryPy.')
|
|
|
|
else:
|
2019-09-14 01:53:12 +00:00
|
|
|
database.close()
|
2019-11-06 11:50:35 +00:00
|
|
|
try:
|
2020-01-30 01:30:30 +00:00
|
|
|
restart_file = io.open(os.path.join(args.config_dir, "bazarr.restart"), "w", encoding='UTF-8')
|
2019-11-06 11:50:35 +00:00
|
|
|
except Exception as e:
|
|
|
|
logging.error('BAZARR Cannot create bazarr.restart file.')
|
|
|
|
else:
|
|
|
|
logging.info('Bazarr is being restarted...')
|
2020-01-30 01:30:30 +00:00
|
|
|
restart_file.write(six.text_type(''))
|
2019-11-06 11:50:35 +00:00
|
|
|
restart_file.close()
|
2019-11-12 01:53:46 +00:00
|
|
|
sys.exit(0)
|
2019-12-16 13:58:10 +00:00
|
|
|
return ''
|
2018-10-11 01:23:30 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/wizard/')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-18 21:28:38 +00:00
|
|
|
def wizard():
|
2019-07-31 10:09:08 +00:00
|
|
|
# Get languages list
|
2019-10-22 02:13:37 +00:00
|
|
|
settings_languages = database.execute("SELECT * FROM table_settings_languages ORDER BY name")
|
2019-07-31 10:09:08 +00:00
|
|
|
# Get providers list
|
2019-01-02 02:03:23 +00:00
|
|
|
settings_providers = sorted(provider_manager.names())
|
2019-07-31 10:09:08 +00:00
|
|
|
|
2019-11-28 11:34:37 +00:00
|
|
|
return render_template('wizard.html', bazarr_version=bazarr_version, settings=settings,
|
2018-10-18 21:28:38 +00:00
|
|
|
settings_languages=settings_languages, settings_providers=settings_providers,
|
2019-11-28 11:34:37 +00:00
|
|
|
base_url=base_url, ast=ast)
|
2018-10-18 21:28:38 +00:00
|
|
|
|
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/save_wizard', methods=['POST'])
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-22 16:39:11 +00:00
|
|
|
def save_wizard():
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_ip = request.form.get('settings_general_ip')
|
|
|
|
settings_general_port = request.form.get('settings_general_port')
|
|
|
|
settings_general_baseurl = request.form.get('settings_general_baseurl')
|
2018-10-31 19:34:40 +00:00
|
|
|
if not settings_general_baseurl.endswith('/'):
|
2018-10-18 21:28:38 +00:00
|
|
|
settings_general_baseurl += '/'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_sourcepath = request.form.getlist('settings_general_sourcepath[]')
|
|
|
|
settings_general_destpath = request.form.getlist('settings_general_destpath[]')
|
2018-10-18 21:28:38 +00:00
|
|
|
settings_general_pathmapping = []
|
|
|
|
settings_general_pathmapping.extend([list(a) for a in zip(settings_general_sourcepath, settings_general_destpath)])
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_sourcepath_movie = request.form.getlist('settings_general_sourcepath_movie[]')
|
|
|
|
settings_general_destpath_movie = request.form.getlist('settings_general_destpath_movie[]')
|
2018-10-18 21:28:38 +00:00
|
|
|
settings_general_pathmapping_movie = []
|
|
|
|
settings_general_pathmapping_movie.extend(
|
|
|
|
[list(a) for a in zip(settings_general_sourcepath_movie, settings_general_destpath_movie)])
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_single_language = request.form.get('settings_general_single_language')
|
2018-10-18 21:28:38 +00:00
|
|
|
if settings_general_single_language is None:
|
|
|
|
settings_general_single_language = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_single_language = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_use_sonarr = request.form.get('settings_general_use_sonarr')
|
2018-10-18 21:28:38 +00:00
|
|
|
if settings_general_use_sonarr is None:
|
|
|
|
settings_general_use_sonarr = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_use_sonarr = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_use_radarr = request.form.get('settings_general_use_radarr')
|
2018-10-18 21:28:38 +00:00
|
|
|
if settings_general_use_radarr is None:
|
|
|
|
settings_general_use_radarr = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_use_radarr = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_embedded = request.form.get('settings_general_embedded')
|
2019-01-24 20:39:23 +00:00
|
|
|
if settings_general_embedded is None:
|
|
|
|
settings_general_embedded = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_embedded = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_subfolder = request.form.get('settings_subfolder')
|
|
|
|
settings_subfolder_custom = request.form.get('settings_subfolder_custom')
|
|
|
|
settings_upgrade_subs = request.form.get('settings_upgrade_subs')
|
2019-03-18 02:43:30 +00:00
|
|
|
if settings_upgrade_subs is None:
|
|
|
|
settings_upgrade_subs = 'False'
|
|
|
|
else:
|
|
|
|
settings_upgrade_subs = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_days_to_upgrade_subs = request.form.get('settings_days_to_upgrade_subs')
|
|
|
|
settings_upgrade_manual = request.form.get('settings_upgrade_manual')
|
2019-03-19 04:08:53 +00:00
|
|
|
if settings_upgrade_manual is None:
|
|
|
|
settings_upgrade_manual = 'False'
|
|
|
|
else:
|
|
|
|
settings_upgrade_manual = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.ip = text_type(settings_general_ip)
|
|
|
|
settings.general.port = text_type(settings_general_port)
|
|
|
|
settings.general.base_url = text_type(settings_general_baseurl)
|
|
|
|
settings.general.path_mappings = text_type(settings_general_pathmapping)
|
|
|
|
settings.general.single_language = text_type(settings_general_single_language)
|
|
|
|
settings.general.use_sonarr = text_type(settings_general_use_sonarr)
|
|
|
|
settings.general.use_radarr = text_type(settings_general_use_radarr)
|
|
|
|
settings.general.path_mappings_movie = text_type(settings_general_pathmapping_movie)
|
2019-01-24 20:39:23 +00:00
|
|
|
settings.general.subfolder = text_type(settings_subfolder)
|
|
|
|
settings.general.subfolder_custom = text_type(settings_subfolder_custom)
|
|
|
|
settings.general.use_embedded_subs = text_type(settings_general_embedded)
|
2019-03-18 02:43:30 +00:00
|
|
|
settings.general.upgrade_subs = text_type(settings_upgrade_subs)
|
|
|
|
settings.general.days_to_upgrade_subs = text_type(settings_days_to_upgrade_subs)
|
2019-03-19 04:08:53 +00:00
|
|
|
settings.general.upgrade_manual = text_type(settings_upgrade_manual)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_sonarr_ip = request.form.get('settings_sonarr_ip')
|
|
|
|
settings_sonarr_port = request.form.get('settings_sonarr_port')
|
|
|
|
settings_sonarr_baseurl = request.form.get('settings_sonarr_baseurl')
|
|
|
|
settings_sonarr_ssl = request.form.get('settings_sonarr_ssl')
|
2018-10-18 21:28:38 +00:00
|
|
|
if settings_sonarr_ssl is None:
|
|
|
|
settings_sonarr_ssl = 'False'
|
|
|
|
else:
|
|
|
|
settings_sonarr_ssl = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_sonarr_apikey = request.form.get('settings_sonarr_apikey')
|
|
|
|
settings_sonarr_only_monitored = request.form.get('settings_sonarr_only_monitored')
|
2019-01-06 17:15:43 +00:00
|
|
|
if settings_sonarr_only_monitored is None:
|
|
|
|
settings_sonarr_only_monitored = 'False'
|
|
|
|
else:
|
|
|
|
settings_sonarr_only_monitored = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.sonarr.ip = text_type(settings_sonarr_ip)
|
|
|
|
settings.sonarr.port = text_type(settings_sonarr_port)
|
|
|
|
settings.sonarr.base_url = text_type(settings_sonarr_baseurl)
|
|
|
|
settings.sonarr.ssl = text_type(settings_sonarr_ssl)
|
|
|
|
settings.sonarr.apikey = text_type(settings_sonarr_apikey)
|
2019-01-06 17:15:43 +00:00
|
|
|
settings.sonarr.only_monitored = text_type(settings_sonarr_only_monitored)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_radarr_ip = request.form.get('settings_radarr_ip')
|
|
|
|
settings_radarr_port = request.form.get('settings_radarr_port')
|
|
|
|
settings_radarr_baseurl = request.form.get('settings_radarr_baseurl')
|
|
|
|
settings_radarr_ssl = request.form.get('settings_radarr_ssl')
|
2018-10-18 21:28:38 +00:00
|
|
|
if settings_radarr_ssl is None:
|
|
|
|
settings_radarr_ssl = 'False'
|
|
|
|
else:
|
|
|
|
settings_radarr_ssl = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_radarr_apikey = request.form.get('settings_radarr_apikey')
|
|
|
|
settings_radarr_only_monitored = request.form.get('settings_radarr_only_monitored')
|
2019-01-06 17:15:43 +00:00
|
|
|
if settings_radarr_only_monitored is None:
|
|
|
|
settings_radarr_only_monitored = 'False'
|
2018-10-18 21:28:38 +00:00
|
|
|
else:
|
2019-01-06 17:15:43 +00:00
|
|
|
settings_radarr_only_monitored = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.radarr.ip = text_type(settings_radarr_ip)
|
|
|
|
settings.radarr.port = text_type(settings_radarr_port)
|
|
|
|
settings.radarr.base_url = text_type(settings_radarr_baseurl)
|
|
|
|
settings.radarr.ssl = text_type(settings_radarr_ssl)
|
|
|
|
settings.radarr.apikey = text_type(settings_radarr_apikey)
|
2019-01-06 17:15:43 +00:00
|
|
|
settings.radarr.only_monitored = text_type(settings_radarr_only_monitored)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_subliminal_providers = request.form.getlist('settings_subliminal_providers')
|
2019-01-15 16:25:13 +00:00
|
|
|
settings.general.enabled_providers = u'' if not settings_subliminal_providers else ','.join(
|
|
|
|
settings_subliminal_providers)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_addic7ed_random_agents = request.form.get('settings_addic7ed_random_agents')
|
2019-01-16 21:49:44 +00:00
|
|
|
if settings_addic7ed_random_agents is None:
|
|
|
|
settings_addic7ed_random_agents = 'False'
|
|
|
|
else:
|
|
|
|
settings_addic7ed_random_agents = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_opensubtitles_vip = request.form.get('settings_opensubtitles_vip')
|
2019-01-16 21:49:44 +00:00
|
|
|
if settings_opensubtitles_vip is None:
|
|
|
|
settings_opensubtitles_vip = 'False'
|
|
|
|
else:
|
|
|
|
settings_opensubtitles_vip = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_opensubtitles_ssl = request.form.get('settings_opensubtitles_ssl')
|
2019-01-16 21:49:44 +00:00
|
|
|
if settings_opensubtitles_ssl is None:
|
|
|
|
settings_opensubtitles_ssl = 'False'
|
|
|
|
else:
|
|
|
|
settings_opensubtitles_ssl = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_opensubtitles_skip_wrong_fps = request.form.get('settings_opensubtitles_skip_wrong_fps')
|
2019-01-16 21:49:44 +00:00
|
|
|
if settings_opensubtitles_skip_wrong_fps is None:
|
|
|
|
settings_opensubtitles_skip_wrong_fps = 'False'
|
|
|
|
else:
|
|
|
|
settings_opensubtitles_skip_wrong_fps = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings.addic7ed.username = request.form.get('settings_addic7ed_username') or ''
|
|
|
|
settings.addic7ed.password = request.form.get('settings_addic7ed_password') or ''
|
|
|
|
settings.addic7ed.random_agents = text_type(settings_addic7ed_random_agents) or ''
|
|
|
|
settings.assrt.token = request.form.get('settings_assrt_token') or ''
|
2020-01-30 15:33:58 +00:00
|
|
|
settings.legendasdivx.username = request.form.get('settings_legendasdivx_username') or ''
|
|
|
|
settings.legendasdivx.password = request.form.get('settings_legendasdivx_password') or ''
|
2019-11-28 11:34:37 +00:00
|
|
|
settings.legendastv.username = request.form.get('settings_legendastv_username') or ''
|
|
|
|
settings.legendastv.password = request.form.get('settings_legendastv_password') or ''
|
|
|
|
settings.opensubtitles.username = request.form.get('settings_opensubtitles_username') or ''
|
|
|
|
settings.opensubtitles.password = request.form.get('settings_opensubtitles_password') or ''
|
2019-01-16 21:49:44 +00:00
|
|
|
settings.opensubtitles.vip = text_type(settings_opensubtitles_vip)
|
|
|
|
settings.opensubtitles.ssl = text_type(settings_opensubtitles_ssl)
|
|
|
|
settings.opensubtitles.skip_wrong_fps = text_type(settings_opensubtitles_skip_wrong_fps)
|
2019-11-28 11:34:37 +00:00
|
|
|
settings.xsubs.username = request.form.get('settings_xsubs_username') or ''
|
|
|
|
settings.xsubs.password = request.form.get('settings_xsubs_password') or ''
|
|
|
|
settings.napisy24.username = request.form.get('settings_napisy24_username') or ''
|
|
|
|
settings.napisy24.password = request.form.get('settings_napisy24_password') or ''
|
|
|
|
settings.subscene.username = request.form.get('settings_subscene_username') or ''
|
|
|
|
settings.subscene.password = request.form.get('settings_subscene_password') or ''
|
|
|
|
settings.titlovi.username = request.form.get('settings_titlovi_username') or ''
|
|
|
|
settings.titlovi.password = request.form.get('settings_titlovi_password') or ''
|
|
|
|
settings.betaseries.token = request.form.get('settings_betaseries_token') or ''
|
|
|
|
|
|
|
|
settings_subliminal_languages = request.form.getlist('settings_subliminal_languages')
|
2019-07-31 10:09:08 +00:00
|
|
|
# Disable all languages in DB
|
2019-10-22 02:13:37 +00:00
|
|
|
database.execute("UPDATE table_settings_languages SET enabled=0")
|
2018-10-18 21:28:38 +00:00
|
|
|
for item in settings_subliminal_languages:
|
2019-07-31 10:09:08 +00:00
|
|
|
# Enable each desired language in DB
|
2019-12-05 19:43:48 +00:00
|
|
|
database.execute("UPDATE table_settings_languages SET enabled=1 WHERE code2=?", (item,))
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_serie_default_enabled = request.form.get('settings_serie_default_enabled')
|
2018-10-18 21:28:38 +00:00
|
|
|
if settings_serie_default_enabled is None:
|
|
|
|
settings_serie_default_enabled = 'False'
|
|
|
|
else:
|
|
|
|
settings_serie_default_enabled = 'True'
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.serie_default_enabled = text_type(settings_serie_default_enabled)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_serie_default_languages = str(request.form.getlist('settings_serie_default_languages'))
|
2018-10-18 21:28:38 +00:00
|
|
|
if settings_serie_default_languages == "['None']":
|
|
|
|
settings_serie_default_languages = 'None'
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.serie_default_language = text_type(settings_serie_default_languages)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_serie_default_hi = request.form.get('settings_serie_default_hi')
|
2018-10-18 21:28:38 +00:00
|
|
|
if settings_serie_default_hi is None:
|
|
|
|
settings_serie_default_hi = 'False'
|
|
|
|
else:
|
|
|
|
settings_serie_default_hi = 'True'
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.serie_default_hi = text_type(settings_serie_default_hi)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_movie_default_enabled = request.form.get('settings_movie_default_enabled')
|
2018-10-18 21:28:38 +00:00
|
|
|
if settings_movie_default_enabled is None:
|
|
|
|
settings_movie_default_enabled = 'False'
|
|
|
|
else:
|
|
|
|
settings_movie_default_enabled = 'True'
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.movie_default_enabled = text_type(settings_movie_default_enabled)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_movie_default_languages = str(request.form.getlist('settings_movie_default_languages'))
|
2018-10-18 21:28:38 +00:00
|
|
|
if settings_movie_default_languages == "['None']":
|
|
|
|
settings_movie_default_languages = 'None'
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.movie_default_language = text_type(settings_movie_default_languages)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_movie_default_hi = request.form.get('settings_movie_default_hi')
|
2018-10-18 21:28:38 +00:00
|
|
|
if settings_movie_default_hi is None:
|
|
|
|
settings_movie_default_hi = 'False'
|
|
|
|
else:
|
|
|
|
settings_movie_default_hi = 'True'
|
2019-01-15 16:25:13 +00:00
|
|
|
settings.general.movie_default_hi = text_type(settings_movie_default_hi)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_movie_default_forced = str(request.form.get('settings_movie_default_forced'))
|
2019-05-24 17:42:54 +00:00
|
|
|
settings.general.movie_default_forced = text_type(settings_movie_default_forced)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
2019-01-02 19:43:40 +00:00
|
|
|
with open(os.path.join(args.config_dir, 'config', 'config.ini'), 'w+') as handle:
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.write(handle)
|
2019-08-26 02:20:42 +00:00
|
|
|
|
2018-10-18 21:28:38 +00:00
|
|
|
configured()
|
2019-11-28 11:34:37 +00:00
|
|
|
return redirect(base_url)
|
2018-10-18 21:28:38 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/emptylog')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def emptylog():
|
|
|
|
ref = request.environ['HTTP_REFERER']
|
2019-11-28 11:34:37 +00:00
|
|
|
|
2018-10-25 10:06:33 +00:00
|
|
|
empty_log()
|
2018-10-19 03:33:01 +00:00
|
|
|
logging.info('BAZARR Log file emptied')
|
2019-11-28 11:34:37 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
redirect(ref)
|
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/bazarr.log')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def download_log():
|
2019-12-29 21:17:39 +00:00
|
|
|
return send_file(os.path.join(args.config_dir, 'log/'),
|
|
|
|
attachment_filename='bazarr.log')
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/image_proxy/<path:url>', methods=['GET'])
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def image_proxy(url):
|
2018-12-15 00:36:28 +00:00
|
|
|
apikey = settings.sonarr.apikey
|
2020-01-02 06:16:00 +00:00
|
|
|
url_image = (url_sonarr() + '/' + url + '?apikey=' + apikey).replace('poster-250', 'poster-500')
|
2018-10-03 10:53:22 +00:00
|
|
|
try:
|
2020-01-02 06:16:00 +00:00
|
|
|
req = requests.get(url_image, stream=True, timeout=15, verify=False)
|
2018-10-03 10:53:22 +00:00
|
|
|
except:
|
|
|
|
return None
|
|
|
|
else:
|
2019-12-31 22:09:04 +00:00
|
|
|
return Response(stream_with_context(req.iter_content(2048)), content_type=req.headers['content-type'])
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/image_proxy_movies/<path:url>', methods=['GET'])
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def image_proxy_movies(url):
|
2018-12-15 00:36:28 +00:00
|
|
|
apikey = settings.radarr.apikey
|
2020-02-09 14:44:40 +00:00
|
|
|
url_image = url_radarr() + '/' + url + '?apikey=' + apikey
|
2018-10-03 10:53:22 +00:00
|
|
|
try:
|
2020-02-06 11:40:39 +00:00
|
|
|
req = requests.get(url_image, stream=True, timeout=15, verify=False)
|
2018-10-03 10:53:22 +00:00
|
|
|
except:
|
2020-02-09 14:44:40 +00:00
|
|
|
return None
|
2018-10-03 10:53:22 +00:00
|
|
|
else:
|
2019-12-31 22:09:04 +00:00
|
|
|
return Response(stream_with_context(req.iter_content(2048)), content_type=req.headers['content-type'])
|
2018-10-03 10:53:22 +00:00
|
|
|
|
|
|
|
|
2019-12-29 21:17:39 +00:00
|
|
|
@app.route("/")
|
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def redirect_root():
|
2018-12-27 19:19:59 +00:00
|
|
|
if settings.general.getboolean('use_sonarr'):
|
2019-12-30 19:18:42 +00:00
|
|
|
return redirect(url_for('series'))
|
2018-12-27 19:19:59 +00:00
|
|
|
elif settings.general.getboolean('use_radarr'):
|
2019-12-30 19:18:42 +00:00
|
|
|
return redirect(url_for('movies'))
|
2019-01-02 08:58:20 +00:00
|
|
|
elif not settings.general.enabled_providers:
|
2019-12-16 13:58:10 +00:00
|
|
|
return redirect('/wizard')
|
2018-10-03 10:53:22 +00:00
|
|
|
else:
|
2019-12-16 13:58:10 +00:00
|
|
|
return redirect('/settings')
|
2018-10-03 10:53:22 +00:00
|
|
|
|
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/series/')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def series():
|
2020-01-02 06:16:00 +00:00
|
|
|
return render_template('series.html')
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2018-10-22 11:23:45 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/serieseditor/')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def serieseditor():
|
2020-01-27 05:07:35 +00:00
|
|
|
return render_template('serieseditor.html')
|
2018-10-03 10:53:22 +00:00
|
|
|
|
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/search_json/<query>', methods=['GET'])
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def search_json(query):
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2019-07-31 10:09:08 +00:00
|
|
|
|
|
|
|
query = '%' + query + '%'
|
2018-10-03 10:53:22 +00:00
|
|
|
search_list = []
|
2019-07-31 10:09:08 +00:00
|
|
|
|
2018-12-27 19:19:59 +00:00
|
|
|
if settings.general.getboolean('use_sonarr'):
|
2019-07-31 10:09:08 +00:00
|
|
|
# Get matching series
|
2019-10-22 02:13:37 +00:00
|
|
|
series = database.execute("SELECT title, sonarrSeriesId, year FROM table_shows WHERE title LIKE ? ORDER BY "
|
|
|
|
"title ASC", (query,))
|
2018-10-03 10:53:22 +00:00
|
|
|
for serie in series:
|
2019-10-22 02:13:37 +00:00
|
|
|
search_list.append(dict([('name', re.sub(r'\ \(\d{4}\)', '', serie['title']) + ' (' + serie['year'] + ')'),
|
2019-12-16 13:58:10 +00:00
|
|
|
('url', '/episodes/' + str(serie['sonarrSeriesId']))]))
|
2019-11-28 11:34:37 +00:00
|
|
|
|
2018-12-27 19:19:59 +00:00
|
|
|
if settings.general.getboolean('use_radarr'):
|
2019-07-31 10:09:08 +00:00
|
|
|
# Get matching movies
|
2019-10-27 03:17:14 +00:00
|
|
|
movies = database.execute("SELECT title, radarrId, year FROM table_movies WHERE title LIKE ? ORDER BY "
|
2019-10-22 02:13:37 +00:00
|
|
|
"title ASC", (query,))
|
2018-10-03 10:53:22 +00:00
|
|
|
for movie in movies:
|
2019-10-22 02:13:37 +00:00
|
|
|
search_list.append(dict([('name', re.sub(r'\ \(\d{4}\)', '', movie['title']) + ' (' + movie['year'] + ')'),
|
2019-12-16 13:58:10 +00:00
|
|
|
('url', '/movie/' + str(movie['radarrId']))]))
|
2019-07-31 10:09:08 +00:00
|
|
|
|
2019-11-28 11:34:37 +00:00
|
|
|
request.content_type = 'application/json'
|
2018-10-03 10:53:22 +00:00
|
|
|
return dict(items=search_list)
|
|
|
|
|
|
|
|
|
2020-02-05 03:50:35 +00:00
|
|
|
@app.route('/episodes/<no>')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def episodes(no):
|
2020-01-02 06:16:00 +00:00
|
|
|
return render_template('episodes.html', id=str(no))
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/movies')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def movies():
|
2019-12-28 05:52:00 +00:00
|
|
|
return render_template('movies.html')
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/movieseditor')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def movieseditor():
|
2020-02-05 03:50:35 +00:00
|
|
|
return render_template('movieseditor.html')
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2020-02-05 03:50:35 +00:00
|
|
|
@app.route('/movie/<no>')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def movie(no):
|
2020-02-05 03:50:35 +00:00
|
|
|
return render_template('movie.html', id=str(no))
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/scan_disk_movie/<int:no>', methods=['GET'])
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def scan_disk_movie(no):
|
|
|
|
movies_scan_subtitles(no)
|
2020-01-14 04:37:54 +00:00
|
|
|
return '', 200
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/search_missing_subtitles_movie/<int:no>', methods=['GET'])
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def search_missing_subtitles_movie(no):
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
ref = request.environ['HTTP_REFERER']
|
2019-11-28 11:34:37 +00:00
|
|
|
|
2020-02-01 00:54:17 +00:00
|
|
|
scheduler.add_job(movies_download_subtitles, args=[no], name=('movies_download_subtitles_' + str(no)))
|
2018-10-03 10:53:22 +00:00
|
|
|
redirect(ref)
|
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-29 10:56:34 +00:00
|
|
|
@app.route('/historyseries/')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def historyseries():
|
2019-12-28 16:43:48 +00:00
|
|
|
return render_template('historyseries.html')
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2019-12-29 10:56:34 +00:00
|
|
|
@app.route('/historymovies/')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def historymovies():
|
2019-12-28 16:43:48 +00:00
|
|
|
return render_template('historymovies.html')
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2020-02-12 17:41:40 +00:00
|
|
|
@app.route('/wantedseries/')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def wantedseries():
|
2020-02-12 17:41:40 +00:00
|
|
|
return render_template('wantedseries.html')
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2019-08-08 10:33:00 +00:00
|
|
|
|
2020-02-12 17:41:40 +00:00
|
|
|
@app.route('/wantedmovies/')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def wantedmovies():
|
2020-02-12 17:41:40 +00:00
|
|
|
return render_template('wantedmovies.html')
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-01-15 16:25:13 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/wanted_search_missing_subtitles')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def wanted_search_missing_subtitles_list():
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
ref = request.environ['HTTP_REFERER']
|
2019-11-28 11:34:37 +00:00
|
|
|
|
2020-02-01 00:54:17 +00:00
|
|
|
scheduler.add_job(wanted_search_missing_subtitles, name='manual_wanted_search_missing_subtitles')
|
2018-10-03 10:53:22 +00:00
|
|
|
redirect(ref)
|
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/settings/')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-12-15 00:36:28 +00:00
|
|
|
def _settings():
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2019-08-08 10:33:00 +00:00
|
|
|
|
2019-10-23 10:59:04 +00:00
|
|
|
settings_languages = database.execute("SELECT * FROM table_settings_languages ORDER BY name")
|
2019-01-01 07:32:40 +00:00
|
|
|
settings_providers = sorted(provider_manager.names())
|
2019-10-23 10:59:04 +00:00
|
|
|
settings_notifier = database.execute("SELECT * FROM table_settings_notifier ORDER BY name")
|
2019-08-08 10:33:00 +00:00
|
|
|
|
2019-11-28 11:34:37 +00:00
|
|
|
return render_template('settings.html', bazarr_version=bazarr_version, settings=settings, settings_languages=settings_languages,
|
2019-01-15 16:25:13 +00:00
|
|
|
settings_providers=settings_providers, settings_notifier=settings_notifier, base_url=base_url,
|
2019-11-28 11:34:37 +00:00
|
|
|
current_port=settings.general.port, ast=ast, args=args, sys=sys)
|
2018-12-15 00:36:28 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/save_settings', methods=['POST'])
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def save_settings():
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
ref = request.environ['HTTP_REFERER']
|
2019-08-26 02:20:42 +00:00
|
|
|
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_ip = request.form.get('settings_general_ip')
|
|
|
|
settings_general_port = request.form.get('settings_general_port')
|
|
|
|
settings_general_baseurl = request.form.get('settings_general_baseurl')
|
2018-10-31 19:34:40 +00:00
|
|
|
if not settings_general_baseurl.endswith('/'):
|
2018-10-03 10:53:22 +00:00
|
|
|
settings_general_baseurl += '/'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_debug = request.form.get('settings_general_debug')
|
2018-10-30 18:06:30 +00:00
|
|
|
if settings_general_debug is None:
|
|
|
|
settings_general_debug = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_debug = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_chmod_enabled = request.form.get('settings_general_chmod_enabled')
|
2019-03-26 19:49:03 +00:00
|
|
|
if settings_general_chmod_enabled is None:
|
|
|
|
settings_general_chmod_enabled = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_chmod_enabled = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_chmod = request.form.get('settings_general_chmod')
|
|
|
|
settings_general_sourcepath = request.form.getlist('settings_general_sourcepath')
|
|
|
|
settings_general_destpath = request.form.getlist('settings_general_destpath')
|
2018-10-03 10:53:22 +00:00
|
|
|
settings_general_pathmapping = []
|
|
|
|
settings_general_pathmapping.extend([list(a) for a in zip(settings_general_sourcepath, settings_general_destpath)])
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_sourcepath_movie = request.form.getlist('settings_general_sourcepath_movie')
|
|
|
|
settings_general_destpath_movie = request.form.getlist('settings_general_destpath_movie')
|
2018-10-03 10:53:22 +00:00
|
|
|
settings_general_pathmapping_movie = []
|
2018-10-31 19:34:40 +00:00
|
|
|
settings_general_pathmapping_movie.extend(
|
|
|
|
[list(a) for a in zip(settings_general_sourcepath_movie, settings_general_destpath_movie)])
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_branch = request.form.get('settings_general_branch')
|
|
|
|
settings_general_automatic = request.form.get('settings_general_automatic')
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_general_automatic is None:
|
|
|
|
settings_general_automatic = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_automatic = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_update_restart = request.form.get('settings_general_update_restart')
|
2019-03-14 17:01:33 +00:00
|
|
|
if settings_general_update_restart is None:
|
|
|
|
settings_general_update_restart = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_update_restart = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_analytics_enabled = request.form.get('settings_analytics_enabled')
|
2019-09-03 03:22:38 +00:00
|
|
|
if settings_analytics_enabled is None:
|
|
|
|
settings_analytics_enabled = 'False'
|
|
|
|
else:
|
|
|
|
settings_analytics_enabled = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_single_language = request.form.get('settings_general_single_language')
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_general_single_language is None:
|
|
|
|
settings_general_single_language = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_single_language = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_wanted_search_frequency = request.form.get('settings_general_wanted_search_frequency')
|
|
|
|
settings_general_scenename = request.form.get('settings_general_scenename')
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_general_scenename is None:
|
|
|
|
settings_general_scenename = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_scenename = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_embedded = request.form.get('settings_general_embedded')
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_general_embedded is None:
|
|
|
|
settings_general_embedded = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_embedded = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_utf8_encode = request.form.get('settings_general_utf8_encode')
|
2019-06-04 00:16:37 +00:00
|
|
|
if settings_general_utf8_encode is None:
|
|
|
|
settings_general_utf8_encode = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_utf8_encode = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_ignore_pgs = request.form.get('settings_general_ignore_pgs')
|
2019-05-06 04:27:41 +00:00
|
|
|
if settings_general_ignore_pgs is None:
|
|
|
|
settings_general_ignore_pgs = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_ignore_pgs = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_adaptive_searching = request.form.get('settings_general_adaptive_searching')
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_general_adaptive_searching is None:
|
|
|
|
settings_general_adaptive_searching = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_adaptive_searching = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_multithreading = request.form.get('settings_general_multithreading')
|
2019-01-24 14:00:03 +00:00
|
|
|
if settings_general_multithreading is None:
|
|
|
|
settings_general_multithreading = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_multithreading = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_minimum_score = request.form.get('settings_general_minimum_score')
|
|
|
|
settings_general_minimum_score_movies = request.form.get('settings_general_minimum_score_movies')
|
|
|
|
settings_general_use_postprocessing = request.form.get('settings_general_use_postprocessing')
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_general_use_postprocessing is None:
|
|
|
|
settings_general_use_postprocessing = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_use_postprocessing = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_postprocessing_cmd = request.form.get('settings_general_postprocessing_cmd')
|
|
|
|
settings_general_use_sonarr = request.form.get('settings_general_use_sonarr')
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_general_use_sonarr is None:
|
|
|
|
settings_general_use_sonarr = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_use_sonarr = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_general_use_radarr = request.form.get('settings_general_use_radarr')
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_general_use_radarr is None:
|
|
|
|
settings_general_use_radarr = 'False'
|
|
|
|
else:
|
|
|
|
settings_general_use_radarr = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_page_size = request.form.get('settings_page_size')
|
|
|
|
settings_subfolder = request.form.get('settings_subfolder')
|
|
|
|
settings_subfolder_custom = request.form.get('settings_subfolder_custom')
|
|
|
|
settings_upgrade_subs = request.form.get('settings_upgrade_subs')
|
2019-03-18 02:43:30 +00:00
|
|
|
if settings_upgrade_subs is None:
|
|
|
|
settings_upgrade_subs = 'False'
|
|
|
|
else:
|
|
|
|
settings_upgrade_subs = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_upgrade_subs_frequency = request.form.get('settings_upgrade_subs_frequency')
|
|
|
|
settings_days_to_upgrade_subs = request.form.get('settings_days_to_upgrade_subs')
|
|
|
|
settings_upgrade_manual = request.form.get('settings_upgrade_manual')
|
2019-03-19 04:08:53 +00:00
|
|
|
if settings_upgrade_manual is None:
|
|
|
|
settings_upgrade_manual = 'False'
|
|
|
|
else:
|
|
|
|
settings_upgrade_manual = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_anti_captcha_provider = request.form.get('settings_anti_captcha_provider')
|
|
|
|
settings_anti_captcha_key = request.form.get('settings_anti_captcha_key')
|
|
|
|
settings_death_by_captcha_username = request.form.get('settings_death_by_captcha_username')
|
|
|
|
settings_death_by_captcha_password = request.form.get('settings_death_by_captcha_password')
|
|
|
|
|
2019-09-13 19:12:26 +00:00
|
|
|
before = (six.text_type(settings.general.ip), int(settings.general.port), six.text_type(settings.general.base_url),
|
|
|
|
six.text_type(settings.general.path_mappings), six.text_type(settings.general.getboolean('use_sonarr')),
|
|
|
|
six.text_type(settings.general.getboolean('use_radarr')), six.text_type(settings.general.path_mappings_movie))
|
|
|
|
after = (six.text_type(settings_general_ip), int(settings_general_port), six.text_type(settings_general_baseurl),
|
|
|
|
six.text_type(settings_general_pathmapping), six.text_type(settings_general_use_sonarr),
|
|
|
|
six.text_type(settings_general_use_radarr), six.text_type(settings_general_pathmapping_movie))
|
2019-11-28 11:34:37 +00:00
|
|
|
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.ip = text_type(settings_general_ip)
|
|
|
|
settings.general.port = text_type(settings_general_port)
|
|
|
|
settings.general.base_url = text_type(settings_general_baseurl)
|
|
|
|
settings.general.path_mappings = text_type(settings_general_pathmapping)
|
|
|
|
settings.general.debug = text_type(settings_general_debug)
|
2019-03-26 19:49:03 +00:00
|
|
|
settings.general.chmod_enabled = text_type(settings_general_chmod_enabled)
|
2019-01-24 14:00:03 +00:00
|
|
|
settings.general.chmod = text_type(settings_general_chmod)
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.branch = text_type(settings_general_branch)
|
|
|
|
settings.general.auto_update = text_type(settings_general_automatic)
|
2019-03-14 17:01:33 +00:00
|
|
|
settings.general.update_restart = text_type(settings_general_update_restart)
|
2019-09-03 03:22:38 +00:00
|
|
|
settings.analytics.enabled = text_type(settings_analytics_enabled)
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.single_language = text_type(settings_general_single_language)
|
|
|
|
settings.general.minimum_score = text_type(settings_general_minimum_score)
|
2019-09-11 10:50:33 +00:00
|
|
|
settings.general.wanted_search_frequency = text_type(settings_general_wanted_search_frequency)
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.use_scenename = text_type(settings_general_scenename)
|
|
|
|
settings.general.use_postprocessing = text_type(settings_general_use_postprocessing)
|
|
|
|
settings.general.postprocessing_cmd = text_type(settings_general_postprocessing_cmd)
|
|
|
|
settings.general.use_sonarr = text_type(settings_general_use_sonarr)
|
|
|
|
settings.general.use_radarr = text_type(settings_general_use_radarr)
|
|
|
|
settings.general.path_mappings_movie = text_type(settings_general_pathmapping_movie)
|
|
|
|
settings.general.page_size = text_type(settings_page_size)
|
2019-01-24 20:39:23 +00:00
|
|
|
settings.general.subfolder = text_type(settings_subfolder)
|
2019-04-14 07:29:48 +00:00
|
|
|
if settings.general.subfolder == 'current':
|
|
|
|
settings.general.subfolder_custom = ''
|
|
|
|
else:
|
|
|
|
settings.general.subfolder_custom = text_type(settings_subfolder_custom)
|
2019-03-18 02:43:30 +00:00
|
|
|
settings.general.upgrade_subs = text_type(settings_upgrade_subs)
|
2019-09-11 10:50:33 +00:00
|
|
|
settings.general.upgrade_frequency = text_type(settings_upgrade_subs_frequency)
|
2019-03-18 02:43:30 +00:00
|
|
|
settings.general.days_to_upgrade_subs = text_type(settings_days_to_upgrade_subs)
|
2019-03-19 04:08:53 +00:00
|
|
|
settings.general.upgrade_manual = text_type(settings_upgrade_manual)
|
2019-04-07 21:54:31 +00:00
|
|
|
settings.general.anti_captcha_provider = text_type(settings_anti_captcha_provider)
|
|
|
|
settings.anticaptcha.anti_captcha_key = text_type(settings_anti_captcha_key)
|
|
|
|
settings.deathbycaptcha.username = text_type(settings_death_by_captcha_username)
|
|
|
|
settings.deathbycaptcha.password = text_type(settings_death_by_captcha_password)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
2019-04-08 02:29:11 +00:00
|
|
|
# set anti-captcha provider and key
|
|
|
|
if settings.general.anti_captcha_provider == 'anti-captcha':
|
|
|
|
os.environ["ANTICAPTCHA_CLASS"] = 'AntiCaptchaProxyLess'
|
2019-11-07 00:46:38 +00:00
|
|
|
os.environ["ANTICAPTCHA_ACCOUNT_KEY"] = str(settings.anticaptcha.anti_captcha_key)
|
2019-04-12 01:56:50 +00:00
|
|
|
elif settings.general.anti_captcha_provider == 'death-by-captcha':
|
2019-04-12 02:07:43 +00:00
|
|
|
os.environ["ANTICAPTCHA_CLASS"] = 'DeathByCaptchaProxyLess'
|
2019-11-07 00:46:38 +00:00
|
|
|
os.environ["ANTICAPTCHA_ACCOUNT_KEY"] = str(':'.join(
|
|
|
|
{settings.deathbycaptcha.username, settings.deathbycaptcha.password}))
|
2019-04-08 02:29:11 +00:00
|
|
|
else:
|
|
|
|
os.environ["ANTICAPTCHA_CLASS"] = ''
|
2019-11-28 11:34:37 +00:00
|
|
|
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.minimum_score_movie = text_type(settings_general_minimum_score_movies)
|
|
|
|
settings.general.use_embedded_subs = text_type(settings_general_embedded)
|
2019-06-04 00:16:37 +00:00
|
|
|
settings.general.utf8_encode = text_type(settings_general_utf8_encode)
|
2019-05-06 04:27:41 +00:00
|
|
|
settings.general.ignore_pgs_subs = text_type(settings_general_ignore_pgs)
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.adaptive_searching = text_type(settings_general_adaptive_searching)
|
2019-01-24 14:00:03 +00:00
|
|
|
settings.general.multithreading = text_type(settings_general_multithreading)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
if after != before:
|
|
|
|
configured()
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_proxy_type = request.form.get('settings_proxy_type')
|
|
|
|
settings_proxy_url = request.form.get('settings_proxy_url')
|
|
|
|
settings_proxy_port = request.form.get('settings_proxy_port')
|
|
|
|
settings_proxy_username = request.form.get('settings_proxy_username')
|
|
|
|
settings_proxy_password = request.form.get('settings_proxy_password')
|
|
|
|
settings_proxy_exclude = request.form.get('settings_proxy_exclude')
|
|
|
|
|
2019-09-13 19:12:26 +00:00
|
|
|
before_proxy_password = (six.text_type(settings.proxy.type), six.text_type(settings.proxy.exclude))
|
2018-10-03 10:53:22 +00:00
|
|
|
if before_proxy_password[0] != settings_proxy_type:
|
|
|
|
configured()
|
|
|
|
if before_proxy_password[1] == settings_proxy_password:
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.proxy.type = text_type(settings_proxy_type)
|
|
|
|
settings.proxy.url = text_type(settings_proxy_url)
|
|
|
|
settings.proxy.port = text_type(settings_proxy_port)
|
|
|
|
settings.proxy.username = text_type(settings_proxy_username)
|
|
|
|
settings.proxy.exclude = text_type(settings_proxy_exclude)
|
2018-10-03 10:53:22 +00:00
|
|
|
else:
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.proxy.type = text_type(settings_proxy_type)
|
|
|
|
settings.proxy.url = text_type(settings_proxy_url)
|
|
|
|
settings.proxy.port = text_type(settings_proxy_port)
|
|
|
|
settings.proxy.username = text_type(settings_proxy_username)
|
|
|
|
settings.proxy.password = text_type(settings_proxy_password)
|
|
|
|
settings.proxy.exclude = text_type(settings_proxy_exclude)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_auth_type = request.form.get('settings_auth_type')
|
|
|
|
settings_auth_username = request.form.get('settings_auth_username')
|
|
|
|
settings_auth_password = request.form.get('settings_auth_password')
|
|
|
|
|
2018-12-15 00:36:28 +00:00
|
|
|
if settings.auth.type != settings_auth_type:
|
2018-10-03 10:53:22 +00:00
|
|
|
configured()
|
2018-12-15 00:36:28 +00:00
|
|
|
if settings.auth.password == settings_auth_password:
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.auth.type = text_type(settings_auth_type)
|
|
|
|
settings.auth.username = text_type(settings_auth_username)
|
2018-10-03 10:53:22 +00:00
|
|
|
else:
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.auth.type = text_type(settings_auth_type)
|
|
|
|
settings.auth.username = text_type(settings_auth_username)
|
2019-12-05 11:56:33 +00:00
|
|
|
settings.auth.password = hashlib.md5(settings_auth_password.encode('utf-8')).hexdigest()
|
2019-11-28 11:34:37 +00:00
|
|
|
settings.auth.apikey = request.form.get('settings_auth_apikey')
|
2019-11-27 03:12:16 +00:00
|
|
|
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_sonarr_ip = request.form.get('settings_sonarr_ip')
|
|
|
|
settings_sonarr_port = request.form.get('settings_sonarr_port')
|
|
|
|
settings_sonarr_baseurl = request.form.get('settings_sonarr_baseurl')
|
|
|
|
settings_sonarr_ssl = request.form.get('settings_sonarr_ssl')
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_sonarr_ssl is None:
|
|
|
|
settings_sonarr_ssl = 'False'
|
|
|
|
else:
|
|
|
|
settings_sonarr_ssl = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_sonarr_apikey = request.form.get('settings_sonarr_apikey')
|
|
|
|
settings_sonarr_only_monitored = request.form.get('settings_sonarr_only_monitored')
|
2019-01-06 17:15:43 +00:00
|
|
|
if settings_sonarr_only_monitored is None:
|
|
|
|
settings_sonarr_only_monitored = 'False'
|
|
|
|
else:
|
|
|
|
settings_sonarr_only_monitored = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_sonarr_sync = request.form.get('settings_sonarr_sync')
|
|
|
|
settings_sonarr_sync_day = request.form.get('settings_sonarr_sync_day')
|
|
|
|
settings_sonarr_sync_hour = request.form.get('settings_sonarr_sync_hour')
|
2019-09-11 10:50:33 +00:00
|
|
|
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.sonarr.ip = text_type(settings_sonarr_ip)
|
|
|
|
settings.sonarr.port = text_type(settings_sonarr_port)
|
|
|
|
settings.sonarr.base_url = text_type(settings_sonarr_baseurl)
|
|
|
|
settings.sonarr.ssl = text_type(settings_sonarr_ssl)
|
|
|
|
settings.sonarr.apikey = text_type(settings_sonarr_apikey)
|
2019-01-06 17:15:43 +00:00
|
|
|
settings.sonarr.only_monitored = text_type(settings_sonarr_only_monitored)
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.sonarr.full_update = text_type(settings_sonarr_sync)
|
2019-09-11 10:50:33 +00:00
|
|
|
settings.sonarr.full_update_day = text_type(settings_sonarr_sync_day)
|
|
|
|
settings.sonarr.full_update_hour = text_type(settings_sonarr_sync_hour)
|
|
|
|
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_radarr_ip = request.form.get('settings_radarr_ip')
|
|
|
|
settings_radarr_port = request.form.get('settings_radarr_port')
|
|
|
|
settings_radarr_baseurl = request.form.get('settings_radarr_baseurl')
|
|
|
|
settings_radarr_ssl = request.form.get('settings_radarr_ssl')
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_radarr_ssl is None:
|
|
|
|
settings_radarr_ssl = 'False'
|
|
|
|
else:
|
|
|
|
settings_radarr_ssl = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_radarr_apikey = request.form.get('settings_radarr_apikey')
|
|
|
|
settings_radarr_only_monitored = request.form.get('settings_radarr_only_monitored')
|
2019-01-06 17:15:43 +00:00
|
|
|
if settings_radarr_only_monitored is None:
|
|
|
|
settings_radarr_only_monitored = 'False'
|
|
|
|
else:
|
|
|
|
settings_radarr_only_monitored = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_radarr_sync = request.form.get('settings_radarr_sync')
|
|
|
|
settings_radarr_sync_day = request.form.get('settings_radarr_sync_day')
|
|
|
|
settings_radarr_sync_hour = request.form.get('settings_radarr_sync_hour')
|
2019-09-11 10:50:33 +00:00
|
|
|
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.radarr.ip = text_type(settings_radarr_ip)
|
|
|
|
settings.radarr.port = text_type(settings_radarr_port)
|
|
|
|
settings.radarr.base_url = text_type(settings_radarr_baseurl)
|
|
|
|
settings.radarr.ssl = text_type(settings_radarr_ssl)
|
|
|
|
settings.radarr.apikey = text_type(settings_radarr_apikey)
|
2019-01-06 17:15:43 +00:00
|
|
|
settings.radarr.only_monitored = text_type(settings_radarr_only_monitored)
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.radarr.full_update = text_type(settings_radarr_sync)
|
2019-09-11 10:50:33 +00:00
|
|
|
settings.radarr.full_update_day = text_type(settings_radarr_sync_day)
|
|
|
|
settings.radarr.full_update_hour = text_type(settings_radarr_sync_hour)
|
|
|
|
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_subliminal_providers = request.form.getlist('settings_subliminal_providers')
|
2019-01-15 16:25:13 +00:00
|
|
|
settings.general.enabled_providers = u'' if not settings_subliminal_providers else ','.join(
|
|
|
|
settings_subliminal_providers)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_addic7ed_random_agents = request.form.get('settings_addic7ed_random_agents')
|
2019-01-16 21:49:44 +00:00
|
|
|
if settings_addic7ed_random_agents is None:
|
|
|
|
settings_addic7ed_random_agents = 'False'
|
|
|
|
else:
|
|
|
|
settings_addic7ed_random_agents = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_opensubtitles_vip = request.form.get('settings_opensubtitles_vip')
|
2019-01-16 21:49:44 +00:00
|
|
|
if settings_opensubtitles_vip is None:
|
|
|
|
settings_opensubtitles_vip = 'False'
|
|
|
|
else:
|
|
|
|
settings_opensubtitles_vip = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_opensubtitles_ssl = request.form.get('settings_opensubtitles_ssl')
|
2019-01-16 21:49:44 +00:00
|
|
|
if settings_opensubtitles_ssl is None:
|
|
|
|
settings_opensubtitles_ssl = 'False'
|
|
|
|
else:
|
|
|
|
settings_opensubtitles_ssl = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_opensubtitles_skip_wrong_fps = request.form.get('settings_opensubtitles_skip_wrong_fps')
|
2019-01-16 21:49:44 +00:00
|
|
|
if settings_opensubtitles_skip_wrong_fps is None:
|
|
|
|
settings_opensubtitles_skip_wrong_fps = 'False'
|
|
|
|
else:
|
|
|
|
settings_opensubtitles_skip_wrong_fps = 'True'
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings.addic7ed.username = request.form.get('settings_addic7ed_username')
|
|
|
|
settings.addic7ed.password = request.form.get('settings_addic7ed_password')
|
2019-01-16 21:49:44 +00:00
|
|
|
settings.addic7ed.random_agents = text_type(settings_addic7ed_random_agents)
|
2019-11-28 11:34:37 +00:00
|
|
|
settings.assrt.token = request.form.get('settings_assrt_token')
|
2020-01-30 15:33:58 +00:00
|
|
|
settings.legendasdivx.username = request.form.get('settings_legendasdivx_username')
|
|
|
|
settings.legendasdivx.password = request.form.get('settings_legendasdivx_password')
|
2019-11-28 11:34:37 +00:00
|
|
|
settings.legendastv.username = request.form.get('settings_legendastv_username')
|
|
|
|
settings.legendastv.password = request.form.get('settings_legendastv_password')
|
|
|
|
settings.opensubtitles.username = request.form.get('settings_opensubtitles_username')
|
|
|
|
settings.opensubtitles.password = request.form.get('settings_opensubtitles_password')
|
2019-01-16 21:49:44 +00:00
|
|
|
settings.opensubtitles.vip = text_type(settings_opensubtitles_vip)
|
|
|
|
settings.opensubtitles.ssl = text_type(settings_opensubtitles_ssl)
|
|
|
|
settings.opensubtitles.skip_wrong_fps = text_type(settings_opensubtitles_skip_wrong_fps)
|
2019-11-28 11:34:37 +00:00
|
|
|
settings.xsubs.username = request.form.get('settings_xsubs_username')
|
|
|
|
settings.xsubs.password = request.form.get('settings_xsubs_password')
|
|
|
|
settings.napisy24.username = request.form.get('settings_napisy24_username')
|
|
|
|
settings.napisy24.password = request.form.get('settings_napisy24_password')
|
|
|
|
settings.subscene.username = request.form.get('settings_subscene_username')
|
|
|
|
settings.subscene.password = request.form.get('settings_subscene_password')
|
|
|
|
settings.titlovi.username = request.form.get('settings_titlovi_username')
|
|
|
|
settings.titlovi.password = request.form.get('settings_titlovi_password')
|
|
|
|
settings.betaseries.token = request.form.get('settings_betaseries_token')
|
|
|
|
|
|
|
|
settings_subliminal_languages = request.form.getlist('settings_subliminal_languages')
|
2019-10-24 02:05:55 +00:00
|
|
|
database.execute("UPDATE table_settings_languages SET enabled=0")
|
2018-10-03 10:53:22 +00:00
|
|
|
for item in settings_subliminal_languages:
|
2019-10-24 02:05:55 +00:00
|
|
|
database.execute("UPDATE table_settings_languages SET enabled=1 WHERE code2=?", (item,))
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_serie_default_enabled = request.form.get('settings_serie_default_enabled')
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_serie_default_enabled is None:
|
|
|
|
settings_serie_default_enabled = 'False'
|
|
|
|
else:
|
|
|
|
settings_serie_default_enabled = 'True'
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.serie_default_enabled = text_type(settings_serie_default_enabled)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_serie_default_languages = str(request.form.getlist('settings_serie_default_languages'))
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_serie_default_languages == "['None']":
|
|
|
|
settings_serie_default_languages = 'None'
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.serie_default_language = text_type(settings_serie_default_languages)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_serie_default_hi = request.form.get('settings_serie_default_hi')
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_serie_default_hi is None:
|
|
|
|
settings_serie_default_hi = 'False'
|
|
|
|
else:
|
|
|
|
settings_serie_default_hi = 'True'
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.serie_default_hi = text_type(settings_serie_default_hi)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_serie_default_forced = str(request.form.get('settings_serie_default_forced'))
|
2019-05-24 17:42:54 +00:00
|
|
|
settings.general.serie_default_forced = text_type(settings_serie_default_forced)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_movie_default_enabled = request.form.get('settings_movie_default_enabled')
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_movie_default_enabled is None:
|
|
|
|
settings_movie_default_enabled = 'False'
|
|
|
|
else:
|
|
|
|
settings_movie_default_enabled = 'True'
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.movie_default_enabled = text_type(settings_movie_default_enabled)
|
2019-11-28 11:34:37 +00:00
|
|
|
|
|
|
|
settings_movie_default_languages = str(request.form.getlist('settings_movie_default_languages'))
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_movie_default_languages == "['None']":
|
|
|
|
settings_movie_default_languages = 'None'
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.general.movie_default_language = text_type(settings_movie_default_languages)
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_movie_default_hi = request.form.get('settings_movie_default_hi')
|
2018-10-03 10:53:22 +00:00
|
|
|
if settings_movie_default_hi is None:
|
|
|
|
settings_movie_default_hi = 'False'
|
|
|
|
else:
|
|
|
|
settings_movie_default_hi = 'True'
|
2019-01-15 16:25:13 +00:00
|
|
|
settings.general.movie_default_hi = text_type(settings_movie_default_hi)
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2019-11-28 11:34:37 +00:00
|
|
|
settings_movie_default_forced = str(request.form.get('settings_movie_default_forced'))
|
2019-05-24 17:42:54 +00:00
|
|
|
settings.general.movie_default_forced = text_type(settings_movie_default_forced)
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2019-01-02 19:43:40 +00:00
|
|
|
with open(os.path.join(args.config_dir, 'config', 'config.ini'), 'w+') as handle:
|
2018-12-27 19:19:59 +00:00
|
|
|
settings.write(handle)
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2019-01-26 21:12:19 +00:00
|
|
|
configure_logging(settings.general.getboolean('debug') or args.debug)
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2019-10-23 10:59:04 +00:00
|
|
|
notifiers = database.execute("SELECT * FROM table_settings_notifier ORDER BY name")
|
2018-10-22 16:39:11 +00:00
|
|
|
for notifier in notifiers:
|
2019-11-28 11:34:37 +00:00
|
|
|
enabled = request.form.get('settings_notifier_' + notifier['name'] + '_enabled')
|
2018-10-22 16:39:11 +00:00
|
|
|
if enabled == 'on':
|
|
|
|
enabled = 1
|
|
|
|
else:
|
|
|
|
enabled = 0
|
2019-11-28 11:34:37 +00:00
|
|
|
notifier_url = request.form.get('settings_notifier_' + notifier['name'] + '_url')
|
2019-10-24 02:05:55 +00:00
|
|
|
database.execute("UPDATE table_settings_notifier SET enabled=?, url=? WHERE name=?",
|
2019-10-23 10:59:04 +00:00
|
|
|
(enabled,notifier_url,notifier['name']))
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2020-02-01 00:54:17 +00:00
|
|
|
scheduler.update_configurable_tasks()
|
2018-10-19 03:33:01 +00:00
|
|
|
logging.info('BAZARR Settings saved succesfully.')
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2019-01-12 04:23:53 +00:00
|
|
|
if ref.find('saved=true') > 0:
|
2019-12-16 13:58:10 +00:00
|
|
|
return redirect(ref)
|
2019-01-12 04:23:53 +00:00
|
|
|
else:
|
2019-12-16 13:58:10 +00:00
|
|
|
return redirect(ref + "?saved=true")
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/check_update')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def check_update():
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
ref = request.environ['HTTP_REFERER']
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
if not args.no_update:
|
2018-10-03 10:53:22 +00:00
|
|
|
check_and_apply_update()
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
redirect(ref)
|
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/system')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def system():
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2019-09-11 10:50:33 +00:00
|
|
|
|
2020-02-01 00:54:17 +00:00
|
|
|
task_list = scheduler.get_task_list()
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2019-03-21 15:32:58 +00:00
|
|
|
throttled_providers = list_throttled_providers()
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2019-03-26 18:09:22 +00:00
|
|
|
try:
|
2020-01-30 01:30:30 +00:00
|
|
|
with io.open(os.path.join(args.config_dir, 'config', 'releases.txt'), 'r', encoding='UTF-8') as f:
|
2019-03-26 18:09:22 +00:00
|
|
|
releases = ast.literal_eval(f.read())
|
|
|
|
except Exception as e:
|
|
|
|
releases = []
|
2019-06-11 18:45:48 +00:00
|
|
|
logging.exception(
|
|
|
|
'BAZARR cannot parse releases caching file: ' + os.path.join(args.config_dir, 'config', 'releases.txt'))
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2019-09-03 03:22:38 +00:00
|
|
|
sonarr_version = get_sonarr_version()
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2019-09-03 03:22:38 +00:00
|
|
|
radarr_version = get_radarr_version()
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2019-03-25 04:02:14 +00:00
|
|
|
page_size = int(settings.general.page_size)
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2019-12-13 14:46:24 +00:00
|
|
|
return render_template('system.html', bazarr_version=bazarr_version,
|
2018-11-29 13:20:51 +00:00
|
|
|
sonarr_version=sonarr_version, radarr_version=radarr_version,
|
2018-11-26 03:00:12 +00:00
|
|
|
operating_system=platform.platform(), python_version=platform.python_version(),
|
2019-06-17 02:03:19 +00:00
|
|
|
config_dir=args.config_dir, bazarr_dir=os.path.normcase(os.path.dirname(os.path.dirname(__file__))),
|
2019-03-25 04:02:14 +00:00
|
|
|
base_url=base_url, task_list=task_list, page_size=page_size, releases=releases,
|
|
|
|
current_port=settings.general.port, throttled_providers=throttled_providers)
|
2018-10-03 10:53:22 +00:00
|
|
|
|
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/logs')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2019-03-25 04:02:14 +00:00
|
|
|
def get_logs():
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2019-03-25 04:02:14 +00:00
|
|
|
logs = []
|
2020-01-30 01:30:30 +00:00
|
|
|
with io.open(os.path.join(args.config_dir, 'log', 'bazarr.log'), encoding='UTF-8') as file:
|
2019-09-18 15:30:46 +00:00
|
|
|
for line in file.readlines():
|
|
|
|
lin = []
|
|
|
|
lin = line.split('|')
|
|
|
|
logs.append(lin)
|
|
|
|
logs.reverse()
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2019-03-25 04:02:14 +00:00
|
|
|
return dict(data=logs)
|
2018-12-15 00:36:28 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/execute/<taskid>')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def execute_task(taskid):
|
2020-02-01 02:54:53 +00:00
|
|
|
scheduler.execute_now(taskid)
|
2020-01-22 04:54:32 +00:00
|
|
|
return '', 200
|
2018-10-03 10:53:22 +00:00
|
|
|
|
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/remove_subtitles_movie', methods=['POST'])
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def remove_subtitles_movie():
|
2020-01-04 22:04:07 +00:00
|
|
|
moviePath = request.form.get('moviePath')
|
|
|
|
language = request.form.get('language')
|
|
|
|
subtitlesPath = request.form.get('subtitlesPath')
|
|
|
|
radarrId = request.form.get('radarrId')
|
2020-01-04 21:25:25 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
try:
|
2019-03-11 21:44:49 +00:00
|
|
|
os.remove(subtitlesPath)
|
2018-10-03 10:53:22 +00:00
|
|
|
result = language_from_alpha3(language) + " subtitles deleted from disk."
|
2019-11-20 03:02:59 +00:00
|
|
|
history_log_movie(0, radarrId, result, language=alpha2_from_alpha3(language))
|
2019-03-11 21:44:49 +00:00
|
|
|
except OSError as e:
|
|
|
|
logging.exception('BAZARR cannot delete subtitles file: ' + subtitlesPath)
|
2019-11-08 19:30:58 +00:00
|
|
|
store_subtitles_movie(path_replace_reverse_movie(moviePath), moviePath)
|
2018-10-03 10:53:22 +00:00
|
|
|
|
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/get_subtitle_movie', methods=['POST'])
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def get_subtitle_movie():
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
ref = request.environ['HTTP_REFERER']
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2020-01-04 21:44:02 +00:00
|
|
|
moviePath = request.form.get('moviePath')
|
|
|
|
sceneName = request.form.get('sceneName')
|
2020-01-04 21:25:25 +00:00
|
|
|
if sceneName == "null":
|
|
|
|
sceneName = "None"
|
2019-11-28 11:34:37 +00:00
|
|
|
language = request.form.get('language')
|
2020-01-04 21:25:25 +00:00
|
|
|
hi = request.form.get('hi').capitalize()
|
|
|
|
forced = request.form.get('forced').capitalize()
|
2019-11-28 11:34:37 +00:00
|
|
|
radarrId = request.form.get('radarrId')
|
2020-01-04 21:44:02 +00:00
|
|
|
title = request.form.get('title')
|
2018-10-03 10:53:22 +00:00
|
|
|
providers_list = get_providers()
|
|
|
|
providers_auth = get_providers_auth()
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
try:
|
2019-06-11 18:45:48 +00:00
|
|
|
result = download_subtitle(moviePath, language, hi, forced, providers_list, providers_auth, sceneName, title,
|
|
|
|
'movie')
|
2018-10-03 10:53:22 +00:00
|
|
|
if result is not None:
|
2019-03-11 21:44:49 +00:00
|
|
|
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]
|
2019-03-11 21:44:49 +00:00
|
|
|
provider = result[3]
|
|
|
|
score = result[4]
|
|
|
|
history_log_movie(1, radarrId, message, path, language_code, provider, score)
|
|
|
|
send_notifications_movie(radarrId, message)
|
2019-11-08 19:30:58 +00:00
|
|
|
store_subtitles_movie(path, moviePath)
|
2018-10-03 10:53:22 +00:00
|
|
|
redirect(ref)
|
|
|
|
except OSError:
|
|
|
|
pass
|
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/manual_search_movie', methods=['POST'])
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def manual_search_movie_json():
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2020-01-04 21:44:02 +00:00
|
|
|
moviePath = request.form.get('moviePath')
|
|
|
|
sceneName = request.form.get('sceneName')
|
2020-01-04 21:25:25 +00:00
|
|
|
if sceneName == "null":
|
|
|
|
sceneName = "None"
|
2019-11-28 11:34:37 +00:00
|
|
|
language = request.form.get('language')
|
2020-01-04 21:25:25 +00:00
|
|
|
hi = request.form.get('hi').capitalize()
|
|
|
|
forced = request.form.get('forced').capitalize()
|
2020-01-04 21:44:02 +00:00
|
|
|
title = request.form.get('title')
|
2018-10-03 10:53:22 +00:00
|
|
|
providers_list = get_providers()
|
|
|
|
providers_auth = get_providers_auth()
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2019-03-31 03:09:52 +00:00
|
|
|
data = manual_search(moviePath, language, hi, forced, providers_list, providers_auth, sceneName, title, 'movie')
|
2018-10-03 10:53:22 +00:00
|
|
|
return dict(data=data)
|
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/manual_get_subtitle_movie', methods=['POST'])
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def manual_get_subtitle_movie():
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
ref = request.environ['HTTP_REFERER']
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2020-01-04 21:44:02 +00:00
|
|
|
moviePath = request.form.get('moviePath')
|
|
|
|
sceneName = request.form.get('sceneName')
|
2020-01-04 21:25:25 +00:00
|
|
|
if sceneName == "null":
|
|
|
|
sceneName = "None"
|
2019-11-28 11:34:37 +00:00
|
|
|
language = request.form.get('language')
|
2020-01-04 21:25:25 +00:00
|
|
|
hi = request.form.get('hi').capitalize()
|
|
|
|
forced = request.form.get('forced').capitalize()
|
2020-01-04 21:44:02 +00:00
|
|
|
selected_provider = request.form.get('provider')
|
|
|
|
subtitle = request.form.get('subtitle')
|
2019-11-28 11:34:37 +00:00
|
|
|
radarrId = request.form.get('radarrId')
|
2020-01-04 21:44:02 +00:00
|
|
|
title = request.form.get('title')
|
2018-10-03 10:53:22 +00:00
|
|
|
providers_auth = get_providers_auth()
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
try:
|
2019-03-31 03:09:52 +00:00
|
|
|
result = manual_download_subtitle(moviePath, language, hi, forced, subtitle, selected_provider, providers_auth,
|
2018-11-29 13:40:31 +00:00
|
|
|
sceneName, title, 'movie')
|
2018-10-03 10:53:22 +00:00
|
|
|
if result is not None:
|
2019-03-11 21:44:49 +00:00
|
|
|
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]
|
2019-03-11 21:44:49 +00:00
|
|
|
provider = result[3]
|
|
|
|
score = result[4]
|
2019-03-19 04:08:53 +00:00
|
|
|
history_log_movie(2, radarrId, message, path, language_code, provider, score)
|
2019-03-11 21:44:49 +00:00
|
|
|
send_notifications_movie(radarrId, message)
|
2019-11-08 19:30:58 +00:00
|
|
|
store_subtitles_movie(path, moviePath)
|
2018-10-03 10:53:22 +00:00
|
|
|
redirect(ref)
|
|
|
|
except OSError:
|
|
|
|
pass
|
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/manual_upload_subtitle_movie', methods=['POST'])
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2019-08-23 00:02:11 +00:00
|
|
|
def perform_manual_upload_subtitle_movie():
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2019-08-23 00:02:11 +00:00
|
|
|
ref = request.environ['HTTP_REFERER']
|
|
|
|
|
2020-01-04 21:44:02 +00:00
|
|
|
moviePath = request.form.get('moviePath')
|
|
|
|
sceneName = request.form.get('sceneName')
|
2020-01-04 21:25:25 +00:00
|
|
|
if sceneName == "null":
|
|
|
|
sceneName = "None"
|
2019-11-28 11:34:37 +00:00
|
|
|
language = request.form.get('language')
|
|
|
|
forced = True if request.form.get('forced') == '1' else False
|
2019-08-23 00:02:11 +00:00
|
|
|
upload = request.files.get('upload')
|
2019-11-28 11:34:37 +00:00
|
|
|
radarrId = request.form.get('radarrId')
|
2020-01-04 21:44:02 +00:00
|
|
|
title = request.form.get('title')
|
2019-08-23 00:02:11 +00:00
|
|
|
|
|
|
|
_, ext = os.path.splitext(upload.filename)
|
|
|
|
|
|
|
|
if ext not in SUBTITLE_EXTENSIONS:
|
|
|
|
raise ValueError('A subtitle of an invalid format was uploaded.')
|
2019-08-26 02:20:42 +00:00
|
|
|
|
2019-08-23 00:02:11 +00:00
|
|
|
try:
|
2019-08-26 02:20:42 +00:00
|
|
|
result = manual_upload_subtitle(path=moviePath,
|
2019-08-23 00:02:11 +00:00
|
|
|
language=language,
|
|
|
|
forced=forced,
|
2019-08-26 02:20:42 +00:00
|
|
|
title=title,
|
|
|
|
scene_name=sceneName,
|
2019-08-23 00:02:11 +00:00
|
|
|
media_type='series',
|
|
|
|
subtitle=upload)
|
2019-08-26 02:20:42 +00:00
|
|
|
|
2019-08-23 00:02:11 +00:00
|
|
|
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)
|
2019-11-08 19:30:58 +00:00
|
|
|
store_subtitles_movie(path, moviePath)
|
2019-08-26 02:20:42 +00:00
|
|
|
|
2019-08-23 00:02:11 +00:00
|
|
|
redirect(ref)
|
|
|
|
except OSError:
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
def configured():
|
2019-11-06 03:35:27 +00:00
|
|
|
database.execute("UPDATE system SET configured = 1")
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/api/series/wanted')
|
2018-10-03 10:53:22 +00:00
|
|
|
def api_wanted():
|
2019-10-25 02:35:04 +00:00
|
|
|
data = database.execute("SELECT table_shows.title as seriesTitle, table_episodes.season || 'x' || table_episodes.episode as episode_number, "
|
|
|
|
"table_episodes.title as episodeTitle, table_episodes.missing_subtitles FROM table_episodes "
|
2019-10-23 10:59:04 +00:00
|
|
|
"INNER JOIN table_shows on table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId "
|
|
|
|
"WHERE table_episodes.missing_subtitles != '[]' ORDER BY table_episodes._rowid_ DESC "
|
|
|
|
"LIMIT 10")
|
2019-08-08 10:33:00 +00:00
|
|
|
|
|
|
|
wanted_subs = []
|
|
|
|
for item in data:
|
2019-10-23 10:59:04 +00:00
|
|
|
wanted_subs.append([item['seriesTitle'], item['episode_number'], item['episodeTitle'], item['missing_subtitles']])
|
2019-08-08 10:33:00 +00:00
|
|
|
|
|
|
|
return dict(subtitles=wanted_subs)
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/api/series/history')
|
2018-10-03 10:53:22 +00:00
|
|
|
def api_history():
|
2019-10-25 02:35:04 +00:00
|
|
|
data = database.execute("SELECT table_shows.title as seriesTitle, "
|
|
|
|
"table_episodes.season || 'x' || table_episodes.episode as episode_number, "
|
|
|
|
"table_episodes.title as episodeTitle, "
|
|
|
|
"strftime('%Y-%m-%d', datetime(table_history.timestamp, 'unixepoch')) as date, "
|
|
|
|
"table_history.description FROM table_history "
|
2019-10-23 10:59:04 +00:00
|
|
|
"INNER JOIN table_shows on table_shows.sonarrSeriesId = table_history.sonarrSeriesId "
|
|
|
|
"INNER JOIN table_episodes on table_episodes.sonarrEpisodeId = table_history.sonarrEpisodeId "
|
|
|
|
"WHERE table_history.action != '0' ORDER BY id DESC LIMIT 10")
|
2019-08-08 10:33:00 +00:00
|
|
|
|
|
|
|
history_subs = []
|
|
|
|
for item in data:
|
2019-10-23 10:59:04 +00:00
|
|
|
history_subs.append([item['seriesTitle'], item['episode_number'], item['episodeTitle'], item['date'], item['description']])
|
2019-08-08 10:33:00 +00:00
|
|
|
|
|
|
|
return dict(subtitles=history_subs)
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/api/movies/wanted/')
|
2019-11-28 11:34:37 +00:00
|
|
|
def api_movies_wanted():
|
2019-10-23 10:59:04 +00:00
|
|
|
data = database.execute("SELECT table_movies.title, table_movies.missing_subtitles FROM table_movies "
|
|
|
|
"WHERE table_movies.missing_subtitles != '[]' ORDER BY table_movies._rowid_ DESC LIMIT 10")
|
2019-08-08 10:33:00 +00:00
|
|
|
|
|
|
|
wanted_subs = []
|
|
|
|
for item in data:
|
2019-10-23 10:59:04 +00:00
|
|
|
wanted_subs.append([item['title'], item['missing_subtitles']])
|
2019-08-08 10:33:00 +00:00
|
|
|
|
|
|
|
return dict(subtitles=wanted_subs)
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/api/movies/history/')
|
2019-11-28 11:34:37 +00:00
|
|
|
def api_movies_history():
|
2019-10-23 10:59:04 +00:00
|
|
|
data = database.execute("SELECT table_movies.title, strftime('%Y-%m-%d', "
|
2019-10-25 02:35:04 +00:00
|
|
|
"datetime(table_history_movie.timestamp, 'unixepoch')) as date, "
|
|
|
|
"table_history_movie.description FROM table_history_movie "
|
2019-10-23 10:59:04 +00:00
|
|
|
"INNER JOIN table_movies on table_movies.radarrId = table_history_movie.radarrId "
|
|
|
|
"WHERE table_history_movie.action != '0' ORDER BY id DESC LIMIT 10")
|
2019-08-08 10:33:00 +00:00
|
|
|
|
|
|
|
history_subs = []
|
|
|
|
for item in data:
|
2019-10-23 10:59:04 +00:00
|
|
|
history_subs.append([item['title'], item['date'], item['description']])
|
2019-08-08 10:33:00 +00:00
|
|
|
|
|
|
|
return dict(subtitles=history_subs)
|
2018-10-03 10:53:22 +00:00
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/test_url/<protocol>/<path:url>', methods=['GET'])
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-10-03 10:53:22 +00:00
|
|
|
def test_url(protocol, url):
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2019-09-13 19:12:26 +00:00
|
|
|
url = six.moves.urllib.parse.unquote(url)
|
2018-10-03 10:53:22 +00:00
|
|
|
try:
|
2019-01-05 14:08:56 +00:00
|
|
|
result = requests.get(protocol + "://" + url, allow_redirects=False, verify=False).json()['version']
|
2018-10-03 10:53:22 +00:00
|
|
|
except:
|
|
|
|
return dict(status=False)
|
|
|
|
else:
|
|
|
|
return dict(status=True, version=result)
|
|
|
|
|
2018-10-31 19:34:40 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/test_notification/<protocol>/<path:provider>', methods=['GET'])
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2018-12-18 11:39:49 +00:00
|
|
|
def test_notification(protocol, provider):
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2019-09-13 19:12:26 +00:00
|
|
|
provider = six.moves.urllib.parse.unquote(provider)
|
2018-11-27 21:34:09 +00:00
|
|
|
apobj = apprise.Apprise()
|
2018-12-18 11:39:49 +00:00
|
|
|
apobj.add(protocol + "://" + provider)
|
2019-12-29 21:17:39 +00:00
|
|
|
|
2018-11-27 21:34:09 +00:00
|
|
|
apobj.notify(
|
|
|
|
title='Bazarr test notification',
|
|
|
|
body=('Test notification')
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/notifications')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2019-02-21 04:30:25 +00:00
|
|
|
def notifications():
|
|
|
|
if queueconfig.notifications:
|
2019-12-16 13:58:10 +00:00
|
|
|
test = queueconfig.notifications
|
|
|
|
return queueconfig.notifications.read() or ''
|
2019-02-21 04:30:25 +00:00
|
|
|
else:
|
2019-12-16 13:58:10 +00:00
|
|
|
return abort(400)
|
2018-11-30 02:24:48 +00:00
|
|
|
|
2018-12-14 11:52:09 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/running_tasks')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2019-02-24 16:42:33 +00:00
|
|
|
def running_tasks_list():
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2020-02-01 00:54:17 +00:00
|
|
|
return dict(tasks=scheduler.get_running_tasks())
|
2018-11-30 02:24:48 +00:00
|
|
|
|
2019-06-11 18:45:48 +00:00
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/episode_history/<int:no>')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2019-11-20 03:02:59 +00:00
|
|
|
def episode_history(no):
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2019-11-20 03:02:59 +00:00
|
|
|
episode_history = database.execute("SELECT action, timestamp, language, provider, score FROM table_history "
|
|
|
|
"WHERE sonarrEpisodeId=? ORDER BY timestamp DESC", (no,))
|
|
|
|
for item in episode_history:
|
|
|
|
item['timestamp'] = "<div data-tooltip='" + \
|
|
|
|
time.strftime('%d/%m/%Y %H:%M:%S', time.localtime(item['timestamp'])) + "'>" + \
|
|
|
|
pretty.date(datetime.fromtimestamp(item['timestamp'])) + "</div>"
|
|
|
|
if item['language']:
|
|
|
|
item['language'] = language_from_alpha2(item['language'])
|
|
|
|
else:
|
|
|
|
item['language'] = "<i>undefined</i>"
|
|
|
|
if item['score']:
|
|
|
|
item['score'] = str(round((int(item['score']) * 100 / 360), 2)) + "%"
|
|
|
|
|
|
|
|
return dict(data=episode_history)
|
|
|
|
|
|
|
|
|
2019-12-16 13:58:10 +00:00
|
|
|
@app.route('/movie_history/<int:no>')
|
2019-12-29 21:17:39 +00:00
|
|
|
@login_required
|
2019-11-20 03:02:59 +00:00
|
|
|
def movie_history(no):
|
2019-12-13 14:46:24 +00:00
|
|
|
|
2019-11-20 03:02:59 +00:00
|
|
|
movie_history = database.execute("SELECT action, timestamp, language, provider, score FROM table_history_movie "
|
|
|
|
"WHERE radarrId=? ORDER BY timestamp DESC", (no,))
|
|
|
|
for item in movie_history:
|
|
|
|
if item['action'] == 0:
|
|
|
|
item['action'] = "<div class ='ui inverted basic compact icon' data-tooltip='Subtitle file has been " \
|
|
|
|
"erased.' data-inverted='' data-position='top left'><i class='ui trash icon'></i></div>"
|
|
|
|
elif item['action'] == 1:
|
|
|
|
item['action'] = "<div class ='ui inverted basic compact icon' data-tooltip='Subtitle file has been " \
|
|
|
|
"downloaded.' data-inverted='' data-position='top left'><i class='ui download " \
|
|
|
|
"icon'></i></div>"
|
|
|
|
elif item['action'] == 2:
|
|
|
|
item['action'] = "<div class ='ui inverted basic compact icon' data-tooltip='Subtitle file has been " \
|
|
|
|
"manually downloaded.' data-inverted='' data-position='top left'><i class='ui user " \
|
|
|
|
"icon'></i></div>"
|
|
|
|
elif item['action'] == 3:
|
|
|
|
item['action'] = "<div class ='ui inverted basic compact icon' data-tooltip='Subtitle file has been " \
|
|
|
|
"upgraded.' data-inverted='' data-position='top left'><i class='ui recycle " \
|
|
|
|
"icon'></i></div>"
|
|
|
|
elif item['action'] == 4:
|
|
|
|
item['action'] = "<div class ='ui inverted basic compact icon' data-tooltip='Subtitle file has been " \
|
|
|
|
"manually uploaded.' data-inverted='' data-position='top left'><i class='ui cloud " \
|
|
|
|
"upload icon'></i></div>"
|
|
|
|
|
|
|
|
item['timestamp'] = "<div data-tooltip='" + \
|
|
|
|
time.strftime('%d/%m/%Y %H:%M:%S', time.localtime(item['timestamp'])) + "'>" + \
|
|
|
|
pretty.date(datetime.fromtimestamp(item['timestamp'])) + "</div>"
|
|
|
|
if item['language']:
|
|
|
|
item['language'] = language_from_alpha2(item['language'])
|
|
|
|
else:
|
|
|
|
item['language'] = "<i>undefined</i>"
|
|
|
|
if item['score']:
|
|
|
|
item['score'] = str(round((int(item['score']) * 100 / 120), 2)) + '%'
|
|
|
|
|
|
|
|
return dict(data=movie_history)
|
|
|
|
|
|
|
|
|
2018-10-03 10:53:22 +00:00
|
|
|
# Mute DeprecationWarning
|
|
|
|
warnings.simplefilter("ignore", DeprecationWarning)
|
2020-01-29 11:53:29 +00:00
|
|
|
warnings.simplefilter("ignore", BrokenPipeError)
|
2019-12-16 13:58:10 +00:00
|
|
|
if args.dev:
|
2019-11-28 11:34:37 +00:00
|
|
|
server = app.run(
|
2019-12-16 13:58:10 +00:00
|
|
|
host=str(settings.general.ip), port=(int(args.port) if args.port else int(settings.general.port)))
|
2019-11-28 11:34:37 +00:00
|
|
|
else:
|
|
|
|
server = CherryPyWSGIServer((str(settings.general.ip), (int(args.port) if args.port else int(settings.general.port))), app)
|
2018-10-14 13:32:16 +00:00
|
|
|
try:
|
2019-02-17 09:38:45 +00:00
|
|
|
logging.info('BAZARR is started and waiting for request on http://' + str(settings.general.ip) + ':' + (str(
|
|
|
|
args.port) if args.port else str(settings.general.port)) + str(base_url))
|
2019-12-16 13:58:10 +00:00
|
|
|
if not args.dev:
|
|
|
|
server.start()
|
2018-10-14 13:32:16 +00:00
|
|
|
except KeyboardInterrupt:
|
2020-02-09 09:32:02 +00:00
|
|
|
doShutdown()
|