Merge branch 'development' of https://github.com/morpheus65535/bazarr into halali

pull/292/head
Halali 6 years ago
commit a80d425398

@ -97,8 +97,9 @@ def sync_episodes():
# Close database connection # Close database connection
c.close() c.close()
for updated_episode in episodes_to_update: # TODO: Commented until I find a way to make it store only episodes really updated.
store_subtitles(path_replace(updated_episode[1])) #for updated_episode in episodes_to_update:
# store_subtitles(path_replace(updated_episode[1]))
for added_episode in episodes_to_add: for added_episode in episodes_to_add:
store_subtitles(path_replace(added_episode[3])) store_subtitles(path_replace(added_episode[3]))

@ -104,7 +104,6 @@ def update_movies():
db.commit() db.commit()
db.close() db.close()
added_movies = list(set(current_movies_radarr) - set(current_movies_db_list))
removed_movies = list(set(current_movies_db_list) - set(current_movies_radarr)) removed_movies = list(set(current_movies_db_list) - set(current_movies_radarr))
db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
@ -114,12 +113,8 @@ def update_movies():
db.commit() db.commit()
db.close() db.close()
db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) for added_movie in movies_to_add:
c = db.cursor() store_subtitles_movie(path_replace_movie(added_movie[1]))
for added_movie in added_movies:
added_path = c.execute('SELECT path FROM table_movies WHERE tmdbId = ?', (added_movie,)).fetchone()
store_subtitles_movie(path_replace_movie(added_path[0]))
db.close()
for updated_movie in movies_to_update: for updated_movie in movies_to_update:
store_subtitles_movie(path_replace_movie(updated_movie[1])) store_subtitles_movie(path_replace_movie(updated_movie[1]))

@ -172,6 +172,9 @@ def download_subtitle(path, language, hi, providers, providers_auth, sceneName,
def manual_search(path, language, hi, providers, providers_auth, sceneName, media_type): def manual_search(path, language, hi, providers, providers_auth, sceneName, media_type):
logging.debug('BAZARR Manually searching subtitles for this file: ' + path) logging.debug('BAZARR Manually searching subtitles for this file: ' + path)
subtitles_dict = {}
if hi == "True": if hi == "True":
hi = True hi = True
else: else:
@ -239,11 +242,10 @@ def manual_search(path, language, hi, providers, providers_auth, sceneName, medi
# The pickle doesn't work very well with RAR (rarfile.RarFile) or ZIP (zipfile.ZipFile) # The pickle doesn't work very well with RAR (rarfile.RarFile) or ZIP (zipfile.ZipFile)
s.archive.content = None s.archive.content = None
subtitles_list.append(dict(score=round((compute_score(s, video, hearing_impaired=hi) / max_score * 100), 2), language=alpha2_from_alpha3(s.language.alpha3), hearing_impaired=str(s.hearing_impaired), provider=s.provider_name, subtitle=codecs.encode(pickle.dumps(s), "base64").decode(), url=s.page_link, matches=list(matched), dont_matches=list(not_matched))) subtitles_list.append(dict(score=round((compute_score(s, video, hearing_impaired=hi) / max_score * 100), 2), language=alpha2_from_alpha3(s.language.alpha3), hearing_impaired=str(s.hearing_impaired), provider=s.provider_name, subtitle=codecs.encode(pickle.dumps(s), "base64").decode(), url=s.page_link, matches=list(matched), dont_matches=list(not_matched)))
subtitles_dict = {}
subtitles_dict = sorted(subtitles_list, key=lambda x: x['score'], reverse=True) subtitles_dict = sorted(subtitles_list, key=lambda x: x['score'], reverse=True)
logging.debug('BAZARR ' + str(len(subtitles_dict)) + " subtitles have been found for this file: " + path) logging.debug('BAZARR ' + str(len(subtitles_dict)) + " subtitles have been found for this file: " + path)
logging.debug('BAZARR Ended searching subtitles for this file: ' + path) logging.debug('BAZARR Ended searching subtitles for this file: ' + path)
return(subtitles_dict) return(subtitles_dict)
def manual_download_subtitle(path, language, hi, subtitle, provider, providers_auth, sceneName, media_type): def manual_download_subtitle(path, language, hi, subtitle, provider, providers_auth, sceneName, media_type):
logging.debug('BAZARR Manually downloading subtitles for this file: ' + path) logging.debug('BAZARR Manually downloading subtitles for this file: ' + path)

@ -1,7 +1,9 @@
import os import os
import sqlite3 import sqlite3
import logging import logging
import time
from cork import Cork
from configparser import ConfigParser from configparser import ConfigParser
from get_argv import config_dir from get_argv import config_dir
@ -79,8 +81,6 @@ if cfg.has_section('general'):
with open(config_file, 'w+') as configfile: with open(config_file, 'w+') as configfile:
cfg.write(configfile) cfg.write(configfile)
from cork import Cork
import time
if os.path.exists(os.path.normpath(os.path.join(config_dir, 'config/users.json'))) is False: if os.path.exists(os.path.normpath(os.path.join(config_dir, 'config/users.json'))) is False:
cork = Cork(os.path.normpath(os.path.join(config_dir, 'config')), initialize=True) cork = Cork(os.path.normpath(os.path.join(config_dir, 'config')), initialize=True)

@ -18,10 +18,11 @@ from get_languages import alpha2_from_alpha3
gc.enable() gc.enable()
def store_subtitles(file): def store_subtitles(file):
# languages = [] logging.debug('BAZARR started subtitles indexing for this file: ' + file)
actual_subtitles = [] actual_subtitles = []
if os.path.exists(file): if os.path.exists(file):
if os.path.splitext(file)[1] == '.mkv': if os.path.splitext(file)[1] == '.mkv':
logging.debug("BAZARR is trying to index embedded subtitles.")
try: try:
with open(file, 'rb') as f: with open(file, 'rb') as f:
mkv = enzyme.MKV(f) mkv = enzyme.MKV(f)
@ -29,54 +30,71 @@ def store_subtitles(file):
for subtitle_track in mkv.subtitle_tracks: for subtitle_track in mkv.subtitle_tracks:
try: try:
if alpha2_from_alpha3(subtitle_track.language) != None: if alpha2_from_alpha3(subtitle_track.language) != None:
actual_subtitles.append([str(alpha2_from_alpha3(subtitle_track.language)),None]) lang = str(alpha2_from_alpha3(subtitle_track.language))
logging.debug("BAZARR embedded subtitles detected: " + lang)
actual_subtitles.append([lang,None])
except: except:
logging.debug("BAZARR unable to index this unrecognized language: " + subtitle_track.language)
pass pass
except: except Exception as e:
logging.exception("BAZARR error when trying to analyze this mkv file: " + file)
pass pass
else:
logging.debug("BAZARR This file isn't an .mkv file.")
brazilian_portuguese = [".pt-br", ".pob", "pb"] brazilian_portuguese = [".pt-br", ".pob", "pb"]
try: try:
subtitles = core.search_external_subtitles(file) subtitles = core.search_external_subtitles(file)
except: except Exception as e:
logging.exception("BAZARR unable to index external subtitles.")
pass pass
else: else:
for subtitle, language in subtitles.iteritems(): for subtitle, language in subtitles.iteritems():
if str(os.path.splitext(subtitle)[0]).lower().endswith(tuple(brazilian_portuguese)) is True: if str(os.path.splitext(subtitle)[0]).lower().endswith(tuple(brazilian_portuguese)) is True:
logging.debug("BAZARR external subtitles detected: " + "pb")
actual_subtitles.append([str("pb"), path_replace_reverse(os.path.join(os.path.dirname(file), subtitle))]) actual_subtitles.append([str("pb"), path_replace_reverse(os.path.join(os.path.dirname(file), subtitle))])
elif str(language) != 'und': elif str(language) != 'und':
logging.debug("BAZARR external subtitles detected: " + str(language))
actual_subtitles.append([str(language), path_replace_reverse(os.path.join(os.path.dirname(file), subtitle))]) actual_subtitles.append([str(language), path_replace_reverse(os.path.join(os.path.dirname(file), subtitle))])
else: else:
with open(path_replace(os.path.join(os.path.dirname(file), subtitle)), 'r') as f: if os.path.splitext(subtitle)[1] != ".sub":
text = list(islice(f, 100)) logging.debug("BAZARR falling back to file content analysis to detect language.")
text = ' '.join(text) with open(path_replace(os.path.join(os.path.dirname(file), subtitle)), 'r') as f:
encoding = UnicodeDammit(text) text = list(islice(f, 100))
try: text = ' '.join(text)
text = text.decode(encoding.original_encoding) encoding = UnicodeDammit(text)
detected_language = langdetect.detect(text) try:
except Exception as e: text = text.decode(encoding.original_encoding)
logging.exception('BAZARR Error trying to detect character encoding for this subtitles file: ' + path_replace(os.path.join(os.path.dirname(file), subtitle)) + ' You should try to delete this subtitles file manually and ask Bazarr to download it again.') detected_language = langdetect.detect(text)
else: except Exception as e:
if len(detected_language) > 0: logging.exception('BAZARR Error trying to detect language for this subtitles file: ' + path_replace(os.path.join(os.path.dirname(file), subtitle)) + ' You should try to delete this subtitles file manually and ask Bazarr to download it again.')
actual_subtitles.append([str(detected_language), path_replace_reverse(os.path.join(os.path.dirname(file), subtitle))]) else:
if len(detected_language) > 0:
conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) logging.debug("BAZARR external subtitles detected and analysis guessed this language: " + str(detected_language))
c_db = conn_db.cursor() actual_subtitles.append([str(detected_language), path_replace_reverse(os.path.join(os.path.dirname(file), subtitle))])
c_db.execute("UPDATE table_episodes SET subtitles = ? WHERE path = ?", (str(actual_subtitles), path_replace_reverse(file))) conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
conn_db.commit() c_db = conn_db.cursor()
logging.debug("BAZARR storing those languages to DB: " + str(actual_subtitles))
c_db.close() c_db.execute("UPDATE table_episodes SET subtitles = ? WHERE path = ?", (str(actual_subtitles), path_replace_reverse(file)))
conn_db.commit()
c_db.close()
else:
logging.debug("BAZARR this file doesn't seems to exist or isn't accessible.")
logging.debug('BAZARR ended subtitles indexing for this file: ' + file)
return actual_subtitles return actual_subtitles
def store_subtitles_movie(file): def store_subtitles_movie(file):
# languages = [] logging.debug('BAZARR started subtitles indexing for this file: ' + file)
actual_subtitles = [] actual_subtitles = []
if os.path.exists(file): if os.path.exists(file):
if os.path.splitext(file)[1] == '.mkv': if os.path.splitext(file)[1] == '.mkv':
logging.debug("BAZARR is trying to index embedded subtitles.")
try: try:
with open(file, 'rb') as f: with open(file, 'rb') as f:
mkv = enzyme.MKV(f) mkv = enzyme.MKV(f)
@ -84,42 +102,61 @@ def store_subtitles_movie(file):
for subtitle_track in mkv.subtitle_tracks: for subtitle_track in mkv.subtitle_tracks:
try: try:
if alpha2_from_alpha3(subtitle_track.language) != None: if alpha2_from_alpha3(subtitle_track.language) != None:
actual_subtitles.append([str(alpha2_from_alpha3(subtitle_track.language)), None]) lang = str(alpha2_from_alpha3(subtitle_track.language))
logging.debug("BAZARR embedded subtitles detected: " + lang)
actual_subtitles.append([lang, None])
except: except:
logging.debug("BAZARR unable to index this unrecognized language: " + subtitle_track.language)
pass pass
except: except Exception as e:
logging.exception("BAZARR error when trying to analyze this mkv file: " + file)
pass pass
else:
logging.debug("BAZARR This file isn't an .mkv file.")
subtitles = core.search_external_subtitles(file)
brazilian_portuguese = [".pt-br", ".pob", "pb"]
for subtitle, language in subtitles.iteritems(): brazilian_portuguese = [".pt-br", ".pob", "pb"]
if str(os.path.splitext(subtitle)[0]).lower().endswith(tuple(brazilian_portuguese)) is True: try:
actual_subtitles.append([str("pb"), path_replace_reverse_movie(os.path.join(os.path.dirname(file), subtitle))]) subtitles = core.search_external_subtitles(file)
elif str(language) != 'und': except Exception as e:
actual_subtitles.append([str(language), path_replace_reverse_movie(os.path.join(os.path.dirname(file), subtitle))]) logging.exception("BAZARR unable to index external subtitles.")
else: pass
if os.path.splitext(subtitle)[1] != ".sub": else:
with open(path_replace_movie(os.path.join(os.path.dirname(file), subtitle)), 'r') as f: for subtitle, language in subtitles.iteritems():
text = list(islice(f, 100)) if str(os.path.splitext(subtitle)[0]).lower().endswith(tuple(brazilian_portuguese)) is True:
text = ' '.join(text) logging.debug("BAZARR external subtitles detected: " + "pb")
encoding = UnicodeDammit(text) actual_subtitles.append([str("pb"), path_replace_reverse_movie(os.path.join(os.path.dirname(file), subtitle))])
try: elif str(language) != 'und':
text = text.decode(encoding.original_encoding) logging.debug("BAZARR external subtitles detected: " + str(language))
detected_language = langdetect.detect(text) actual_subtitles.append([str(language), path_replace_reverse_movie(os.path.join(os.path.dirname(file), subtitle))])
except Exception as e: else:
logging.exception('BAZARR Error trying to detect character encoding for this subtitles file: ' + path_replace_movie(os.path.join(os.path.dirname(file), subtitle)) + ' You should try to delete this subtitles file manually and ask Bazarr to download it again.') if os.path.splitext(subtitle)[1] != ".sub":
else: logging.debug("BAZARR falling back to file content analysis to detect language.")
if len(detected_language) > 0: with open(path_replace_movie(os.path.join(os.path.dirname(file), subtitle)), 'r') as f:
actual_subtitles.append([str(detected_language), path_replace_reverse_movie(os.path.join(os.path.dirname(file), subtitle))]) text = list(islice(f, 100))
text = ' '.join(text)
encoding = UnicodeDammit(text)
try:
text = text.decode(encoding.original_encoding)
detected_language = langdetect.detect(text)
except Exception as e:
logging.exception('BAZARR Error trying to detect language for this subtitles file: ' + path_replace(os.path.join(os.path.dirname(file), subtitle)) + ' You should try to delete this subtitles file manually and ask Bazarr to download it again.')
else:
if len(detected_language) > 0:
logging.debug("BAZARR external subtitles detected and analysis guessed this language: " + str(detected_language))
actual_subtitles.append([str(detected_language), path_replace_reverse_movie(os.path.join(os.path.dirname(file), subtitle))])
conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) conn_db = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30)
c_db = conn_db.cursor() c_db = conn_db.cursor()
logging.debug("BAZARR storing those languages to DB: " + str(actual_subtitles))
c_db.execute("UPDATE table_movies SET subtitles = ? WHERE path = ?", (str(actual_subtitles), path_replace_reverse_movie(file))) c_db.execute("UPDATE table_movies SET subtitles = ? WHERE path = ?", (str(actual_subtitles), path_replace_reverse_movie(file)))
conn_db.commit() conn_db.commit()
c_db.close() c_db.close()
else:
logging.debug("BAZARR this file doesn't seems to exist or isn't accessible.")
logging.debug('BAZARR ended subtitles indexing for this file: ' + file)
return actual_subtitles return actual_subtitles

@ -1,6 +1,9 @@
# coding=utf-8
import os import os
import logging import logging
import re import re
import types
from logging.handlers import TimedRotatingFileHandler from logging.handlers import TimedRotatingFileHandler
from get_argv import config_dir from get_argv import config_dir
@ -15,7 +18,7 @@ class OneLineExceptionFormatter(logging.Formatter):
""" """
result = super(OneLineExceptionFormatter, self).formatException(exc_info) result = super(OneLineExceptionFormatter, self).formatException(exc_info)
return repr(result) # or format into one line however you want to return repr(result) # or format into one line however you want to
def format(self, record): def format(self, record):
s = super(OneLineExceptionFormatter, self).format(record) s = super(OneLineExceptionFormatter, self).format(record)
if record.exc_text: if record.exc_text:
@ -27,7 +30,7 @@ class NoExceptionFormatter(logging.Formatter):
def format(self, record): def format(self, record):
record.exc_text = '' # ensure formatException gets called record.exc_text = '' # ensure formatException gets called
return super(NoExceptionFormatter, self).format(record) return super(NoExceptionFormatter, self).format(record)
def formatException(self, record): def formatException(self, record):
return '' return ''
@ -37,21 +40,21 @@ def configure_logging(debug=False):
log_level = "INFO" log_level = "INFO"
else: else:
log_level = "DEBUG" log_level = "DEBUG"
logger.handlers = [] logger.handlers = []
logger.setLevel(log_level) logger.setLevel(log_level)
# Console logging # Console logging
ch = logging.StreamHandler() ch = logging.StreamHandler()
cf = NoExceptionFormatter('%(asctime)-15s - %(name)-32s (%(thread)x) : %(levelname)s (%(module)s:%(lineno)d) ' cf = (debug and logging.Formatter or NoExceptionFormatter)(
'- %(message)s') '%(asctime)-15s - %(name)-32s (%(thread)x) : %(levelname)s (%(module)s:%(lineno)d) - %(message)s')
ch.setFormatter(cf) ch.setFormatter(cf)
ch.setLevel(log_level) ch.setLevel(log_level)
# ch.addFilter(MyFilter()) # ch.addFilter(MyFilter())
logger.addHandler(ch) logger.addHandler(ch)
# File Logging # File Logging
global fh global fh
fh = TimedRotatingFileHandler(os.path.join(config_dir, 'log/bazarr.log'), when="midnight", interval=1, fh = TimedRotatingFileHandler(os.path.join(config_dir, 'log/bazarr.log'), when="midnight", interval=1,
@ -70,76 +73,93 @@ def configure_logging(debug=False):
else: else:
logging.getLogger("apscheduler").setLevel(logging.WARNING) logging.getLogger("apscheduler").setLevel(logging.WARNING)
logging.getLogger("subliminal").setLevel(logging.CRITICAL) logging.getLogger("subliminal").setLevel(logging.CRITICAL)
logging.getLogger("enzyme").setLevel(logging.CRITICAL) logging.getLogger("enzyme").setLevel(logging.CRITICAL)
logging.getLogger("guessit").setLevel(logging.WARNING) logging.getLogger("guessit").setLevel(logging.WARNING)
logging.getLogger("rebulk").setLevel(logging.WARNING) logging.getLogger("rebulk").setLevel(logging.WARNING)
logging.getLogger("stevedore.extension").setLevel(logging.CRITICAL) logging.getLogger("stevedore.extension").setLevel(logging.CRITICAL)
fh.setLevel(log_level) fh.setLevel(log_level)
logger.addHandler(fh) logger.addHandler(fh)
class MyFilter(logging.Filter): class MyFilter(logging.Filter):
def __init__(self): def __init__(self):
pass super(MyFilter, self).__init__()
def filter(self, record): def filter(self, record):
if record.name != 'root': if record.name != 'root':
return False return 0
return True return 1
class ArgsFilteringFilter(logging.Filter):
def filter_args(self, record, func):
if isinstance(record.args, (types.ListType, types.TupleType)):
final_args = []
for arg in record.args:
if not isinstance(arg, basestring):
final_args.append(arg)
continue
final_args.append(func(arg))
record.args = type(record.args)(final_args)
elif isinstance(record.args, dict):
for key, arg in record.args.items():
if not isinstance(arg, basestring):
continue
class BlacklistFilter(logging.Filter): record.args[key] = func(arg)
class BlacklistFilter(ArgsFilteringFilter):
""" """
Log filter for blacklisted tokens and passwords Log filter for blacklisted tokens and passwords
""" """
APIKEY_RE = re.compile(r'apikey(?:=|%3D)([a-zA-Z0-9]+)')
def __init__(self): def __init__(self):
pass super(BlacklistFilter, self).__init__()
def filter(self, record): def filter(self, record):
try: def mask_apikeys(s):
apikeys = re.findall(r'apikey(?:=|%3D)([a-zA-Z0-9]+)', record.msg) apikeys = self.APIKEY_RE.findall(s)
for apikey in apikeys: for apikey in apikeys:
record.msg = record.msg.replace(apikey, 8 * '*' + apikey[-2:]) s = s.replace(apikey, 8 * '*' + apikey[-2:])
return s
args = []
for arg in record.args: try:
apikeys = re.findall(r'apikey(?:=|%3D)([a-zA-Z0-9]+)', arg) if isinstance(arg, basestring) else [] record.msg = mask_apikeys(record.msg)
for apikey in apikeys: self.filter_args(record, mask_apikeys)
arg = arg.replace(apikey, 8 * '*' + apikey[-2:])
args.append(arg)
record.args = tuple(args)
except: except:
pass pass
return True return 1
class PublicIPFilter(logging.Filter): class PublicIPFilter(ArgsFilteringFilter):
""" """
Log filter for public IP addresses Log filter for public IP addresses
""" """
IPV4_RE = re.compile(r'[0-9]+(?:\.[0-9]+){3}(?!\d*-[a-z0-9]{6})')
def __init__(self): def __init__(self):
pass super(PublicIPFilter, self).__init__()
def filter(self, record): def filter(self, record):
try: def mask_ipv4(s):
# Currently only checking for ipv4 addresses ipv4 = self.IPV4_RE.findall(s)
ipv4 = re.findall(r'[0-9]+(?:\.[0-9]+){3}(?!\d*-[a-z0-9]{6})', record.msg)
for ip in ipv4: for ip in ipv4:
record.msg = record.msg.replace(ip, ip.partition('.')[0] + '.***.***.***') s = s.replace(ip, ip.partition('.')[0] + '.***.***.***')
return s
args = [] try:
for arg in record.args: # Currently only checking for ipv4 addresses
ipv4 = re.findall(r'[0-9]+(?:\.[0-9]+){3}(?!\d*-[a-z0-9]{6})', arg) if isinstance(arg, basestring) else [] record.msg = mask_ipv4(record.msg)
for ip in ipv4: self.filter_args(record, mask_ipv4)
arg = arg.replace(ip, ip.partition('.')[0] + '.***.***.***')
args.append(arg)
record.args = tuple(args)
except: except:
pass pass
return True return 1
def empty_log(): def empty_log():
fh.doRollover() fh.doRollover()

@ -1,4 +1,4 @@
bazarr_version = '0.6.9' bazarr_version = '0.6.9.1'
import gc import gc
gc.enable() gc.enable()
@ -61,6 +61,7 @@ import ast
import hashlib import hashlib
import time import time
import urllib import urllib
import platform
from six import text_type from six import text_type
import apprise import apprise
@ -86,6 +87,11 @@ c.execute("UPDATE system SET configured = 0, updated = 0")
conn.commit() conn.commit()
c.close() c.close()
logging.debug('Bazarr version: %s', bazarr_version)
logging.debug('Bazarr branch: %s', get_general_settings()[5])
logging.debug('Operating system: %s', platform.platform())
logging.debug('Python version: %s', platform.python_version())
# Load languages in database # Load languages in database
load_language_in_db() load_language_in_db()
@ -215,7 +221,7 @@ def wizard():
settings_sonarr = get_sonarr_settings() settings_sonarr = get_sonarr_settings()
settings_radarr = get_radarr_settings() settings_radarr = get_radarr_settings()
return template('wizard', __file__=__file__, bazarr_version=bazarr_version, settings_general=settings_general, return template('wizard', bazarr_version=bazarr_version, settings_general=settings_general,
settings_languages=settings_languages, settings_providers=settings_providers, settings_languages=settings_languages, settings_providers=settings_providers,
settings_sonarr=settings_sonarr, settings_radarr=settings_radarr, base_url=base_url) settings_sonarr=settings_sonarr, settings_radarr=settings_radarr, base_url=base_url)
@ -519,7 +525,7 @@ def series():
c.execute("SELECT table_shows.sonarrSeriesId, COUNT(table_episodes.missing_subtitles) FROM table_shows LEFT JOIN table_episodes ON table_shows.sonarrSeriesId=table_episodes.sonarrSeriesId WHERE table_shows.languages IS NOT 'None'" + monitored_only_query_string + " GROUP BY table_shows.sonarrSeriesId") c.execute("SELECT table_shows.sonarrSeriesId, COUNT(table_episodes.missing_subtitles) FROM table_shows LEFT JOIN table_episodes ON table_shows.sonarrSeriesId=table_episodes.sonarrSeriesId WHERE table_shows.languages IS NOT 'None'" + monitored_only_query_string + " GROUP BY table_shows.sonarrSeriesId")
total_subtitles_list = c.fetchall() total_subtitles_list = c.fetchall()
c.close() c.close()
output = template('series', __file__=__file__, bazarr_version=bazarr_version, rows=data, output = template('series', bazarr_version=bazarr_version, rows=data,
missing_subtitles_list=missing_subtitles_list, total_subtitles_list=total_subtitles_list, missing_subtitles_list=missing_subtitles_list, total_subtitles_list=total_subtitles_list,
languages=languages, missing_count=missing_count, page=page, max_page=max_page, base_url=base_url, languages=languages, missing_count=missing_count, page=page, max_page=max_page, base_url=base_url,
single_language=single_language, page_size=page_size, current_port=port) single_language=single_language, page_size=page_size, current_port=port)
@ -545,7 +551,7 @@ def serieseditor():
c.execute("SELECT code2, name FROM table_settings_languages WHERE enabled = 1") c.execute("SELECT code2, name FROM table_settings_languages WHERE enabled = 1")
languages = c.fetchall() languages = c.fetchall()
c.close() c.close()
output = template('serieseditor', __file__=__file__, bazarr_version=bazarr_version, rows=data, languages=languages, missing_count=missing_count, base_url=base_url, single_language=single_language, current_port=port) output = template('serieseditor', bazarr_version=bazarr_version, rows=data, languages=languages, missing_count=missing_count, base_url=base_url, single_language=single_language, current_port=port)
return output return output
@ -670,7 +676,7 @@ def episodes(no):
for key, season in itertools.groupby(episodes,operator.itemgetter(2)): for key, season in itertools.groupby(episodes,operator.itemgetter(2)):
seasons_list.append(list(season)) seasons_list.append(list(season))
return template('episodes', __file__=__file__, bazarr_version=bazarr_version, no=no, details=series_details, languages=languages, seasons=seasons_list, url_sonarr_short=url_sonarr_short, base_url=base_url, tvdbid=tvdbid, number=number, current_port=port) return template('episodes', bazarr_version=bazarr_version, no=no, details=series_details, languages=languages, seasons=seasons_list, url_sonarr_short=url_sonarr_short, base_url=base_url, tvdbid=tvdbid, number=number, current_port=port)
@route(base_url + 'movies') @route(base_url + 'movies')
@custom_auth_basic(check_credentials) @custom_auth_basic(check_credentials)
@ -697,7 +703,7 @@ def movies():
c.execute("SELECT code2, name FROM table_settings_languages WHERE enabled = 1") c.execute("SELECT code2, name FROM table_settings_languages WHERE enabled = 1")
languages = c.fetchall() languages = c.fetchall()
c.close() c.close()
output = template('movies', __file__=__file__, bazarr_version=bazarr_version, rows=data, languages=languages, missing_count=missing_count, page=page, max_page=max_page, base_url=base_url, single_language=single_language, page_size=page_size, current_port=port) output = template('movies', bazarr_version=bazarr_version, rows=data, languages=languages, missing_count=missing_count, page=page, max_page=max_page, base_url=base_url, single_language=single_language, page_size=page_size, current_port=port)
return output return output
@route(base_url + 'movieseditor') @route(base_url + 'movieseditor')
@ -719,7 +725,7 @@ def movieseditor():
c.execute("SELECT code2, name FROM table_settings_languages WHERE enabled = 1") c.execute("SELECT code2, name FROM table_settings_languages WHERE enabled = 1")
languages = c.fetchall() languages = c.fetchall()
c.close() c.close()
output = template('movieseditor', __file__=__file__, bazarr_version=bazarr_version, rows=data, languages=languages, missing_count=missing_count, base_url=base_url, single_language=single_language, current_port=port) output = template('movieseditor', bazarr_version=bazarr_version, rows=data, languages=languages, missing_count=missing_count, base_url=base_url, single_language=single_language, current_port=port)
return output return output
@route(base_url + 'edit_movieseditor', method='POST') @route(base_url + 'edit_movieseditor', method='POST')
@ -804,7 +810,7 @@ def movie(no):
languages = c.execute("SELECT code2, name FROM table_settings_languages WHERE enabled = 1").fetchall() languages = c.execute("SELECT code2, name FROM table_settings_languages WHERE enabled = 1").fetchall()
c.close() c.close()
return template('movie', __file__=__file__, bazarr_version=bazarr_version, no=no, details=movies_details, languages=languages, url_radarr_short=url_radarr_short, base_url=base_url, tmdbid=tmdbid, current_port=port) return template('movie', bazarr_version=bazarr_version, no=no, details=movies_details, languages=languages, url_radarr_short=url_radarr_short, base_url=base_url, tmdbid=tmdbid, current_port=port)
@route(base_url + 'scan_disk/<no:int>', method='GET') @route(base_url + 'scan_disk/<no:int>', method='GET')
@custom_auth_basic(check_credentials) @custom_auth_basic(check_credentials)
@ -850,7 +856,7 @@ def search_missing_subtitles_movie(no):
@custom_auth_basic(check_credentials) @custom_auth_basic(check_credentials)
def history(): def history():
authorize() authorize()
return template('history', __file__=__file__, bazarr_version=bazarr_version, base_url=base_url, current_port=port) return template('history', bazarr_version=bazarr_version, base_url=base_url, current_port=port)
@route(base_url + 'historyseries') @route(base_url + 'historyseries')
@custom_auth_basic(check_credentials) @custom_auth_basic(check_credentials)
@ -888,7 +894,7 @@ def historyseries():
data = c.fetchall() data = c.fetchall()
c.close() c.close()
data = reversed(sorted(data, key=operator.itemgetter(4))) data = reversed(sorted(data, key=operator.itemgetter(4)))
return template('historyseries', __file__=__file__, bazarr_version=bazarr_version, rows=data, row_count=row_count, page=page, max_page=max_page, stats=stats, base_url=base_url, page_size=page_size, current_port=port) return template('historyseries', bazarr_version=bazarr_version, rows=data, row_count=row_count, page=page, max_page=max_page, stats=stats, base_url=base_url, page_size=page_size, current_port=port)
@route(base_url + 'historymovies') @route(base_url + 'historymovies')
@custom_auth_basic(check_credentials) @custom_auth_basic(check_credentials)
@ -926,13 +932,13 @@ def historymovies():
data = c.fetchall() data = c.fetchall()
c.close() c.close()
data = reversed(sorted(data, key=operator.itemgetter(2))) data = reversed(sorted(data, key=operator.itemgetter(2)))
return template('historymovies', __file__=__file__, bazarr_version=bazarr_version, rows=data, row_count=row_count, page=page, max_page=max_page, stats=stats, base_url=base_url, page_size=page_size, current_port=port) return template('historymovies', bazarr_version=bazarr_version, rows=data, row_count=row_count, page=page, max_page=max_page, stats=stats, base_url=base_url, page_size=page_size, current_port=port)
@route(base_url + 'wanted') @route(base_url + 'wanted')
@custom_auth_basic(check_credentials) @custom_auth_basic(check_credentials)
def wanted(): def wanted():
authorize() authorize()
return template('wanted', __file__=__file__, bazarr_version=bazarr_version, base_url=base_url, current_port=port) return template('wanted', bazarr_version=bazarr_version, base_url=base_url, current_port=port)
@route(base_url + 'wantedseries') @route(base_url + 'wantedseries')
@custom_auth_basic(check_credentials) @custom_auth_basic(check_credentials)
@ -960,7 +966,7 @@ def wantedseries():
c.execute("SELECT table_shows.title, table_episodes.season || 'x' || table_episodes.episode, table_episodes.title, table_episodes.missing_subtitles, table_episodes.sonarrSeriesId, path_substitution(table_episodes.path), table_shows.hearing_impaired, table_episodes.sonarrEpisodeId, table_episodes.scene_name, table_episodes.failedAttempts FROM table_episodes INNER JOIN table_shows on table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE table_episodes.missing_subtitles != '[]'" + monitored_only_query_string + " ORDER BY table_episodes._rowid_ DESC LIMIT ? OFFSET ?", (page_size, offset,)) c.execute("SELECT table_shows.title, table_episodes.season || 'x' || table_episodes.episode, table_episodes.title, table_episodes.missing_subtitles, table_episodes.sonarrSeriesId, path_substitution(table_episodes.path), table_shows.hearing_impaired, table_episodes.sonarrEpisodeId, table_episodes.scene_name, table_episodes.failedAttempts FROM table_episodes INNER JOIN table_shows on table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE table_episodes.missing_subtitles != '[]'" + monitored_only_query_string + " ORDER BY table_episodes._rowid_ DESC LIMIT ? OFFSET ?", (page_size, offset,))
data = c.fetchall() data = c.fetchall()
c.close() c.close()
return template('wantedseries', __file__=__file__, bazarr_version=bazarr_version, rows=data, missing_count=missing_count, page=page, max_page=max_page, base_url=base_url, page_size=page_size, current_port=port) return template('wantedseries', bazarr_version=bazarr_version, rows=data, missing_count=missing_count, page=page, max_page=max_page, base_url=base_url, page_size=page_size, current_port=port)
@route(base_url + 'wantedmovies') @route(base_url + 'wantedmovies')
@custom_auth_basic(check_credentials) @custom_auth_basic(check_credentials)
@ -988,7 +994,7 @@ def wantedmovies():
c.execute("SELECT title, missing_subtitles, radarrId, path_substitution(path), hearing_impaired, sceneName, failedAttempts FROM table_movies WHERE missing_subtitles != '[]'" + monitored_only_query_string + " ORDER BY _rowid_ DESC LIMIT ? OFFSET ?", (page_size, offset,)) c.execute("SELECT title, missing_subtitles, radarrId, path_substitution(path), hearing_impaired, sceneName, failedAttempts FROM table_movies WHERE missing_subtitles != '[]'" + monitored_only_query_string + " ORDER BY _rowid_ DESC LIMIT ? OFFSET ?", (page_size, offset,))
data = c.fetchall() data = c.fetchall()
c.close() c.close()
return template('wantedmovies', __file__=__file__, bazarr_version=bazarr_version, rows=data, missing_count=missing_count, page=page, max_page=max_page, base_url=base_url, page_size=page_size, current_port=port) return template('wantedmovies', bazarr_version=bazarr_version, rows=data, missing_count=missing_count, page=page, max_page=max_page, base_url=base_url, page_size=page_size, current_port=port)
@route(base_url + 'wanted_search_missing_subtitles') @route(base_url + 'wanted_search_missing_subtitles')
@custom_auth_basic(check_credentials) @custom_auth_basic(check_credentials)
@ -1021,7 +1027,7 @@ def settings():
settings_sonarr = get_sonarr_settings() settings_sonarr = get_sonarr_settings()
settings_radarr = get_radarr_settings() settings_radarr = get_radarr_settings()
return template('settings', __file__=__file__, bazarr_version=bazarr_version, settings_general=settings_general, settings_proxy=settings_proxy, settings_auth=settings_auth, settings_languages=settings_languages, settings_providers=settings_providers, settings_sonarr=settings_sonarr, settings_radarr=settings_radarr, settings_notifier=settings_notifier, base_url=base_url, current_port=port) return template('settings', bazarr_version=bazarr_version, settings_general=settings_general, settings_proxy=settings_proxy, settings_auth=settings_auth, settings_languages=settings_languages, settings_providers=settings_providers, settings_sonarr=settings_sonarr, settings_radarr=settings_radarr, settings_notifier=settings_notifier, base_url=base_url, current_port=port)
@route(base_url + 'save_settings', method='POST') @route(base_url + 'save_settings', method='POST')
@custom_auth_basic(check_credentials) @custom_auth_basic(check_credentials)
@ -1446,24 +1452,31 @@ def system():
releases = ast.literal_eval(f.read()) releases = ast.literal_eval(f.read())
import platform import platform
use_sonarr = get_general_settings()[12]
url_sonarr = get_sonarr_settings()[6] url_sonarr = get_sonarr_settings()[6]
apikey_sonarr = get_sonarr_settings()[4] apikey_sonarr = get_sonarr_settings()[4]
sv = url_sonarr + "/api/system/status?apikey=" + apikey_sonarr sv = url_sonarr + "/api/system/status?apikey=" + apikey_sonarr
try: sonarr_version = ''
sonarr_version = requests.get(sv, timeout=15, verify=False) if use_sonarr:
except: try:
sonarr_version = '' sonarr_version = requests.get(sv, timeout=15, verify=False).json()['version']
except:
pass
use_radarr = get_general_settings()[13]
url_radarr = get_radarr_settings()[6] url_radarr = get_radarr_settings()[6]
apikey_radarr = get_radarr_settings()[4] apikey_radarr = get_radarr_settings()[4]
sv = url_radarr + "/api/system/status?apikey=" + apikey_radarr rv = url_radarr + "/api/system/status?apikey=" + apikey_radarr
try: radarr_version = ''
radarr_version = requests.get(sv, timeout=15, verify=False) if use_radarr:
except: try:
radarr_version = '' radarr_version = requests.get(rv, timeout=15, verify=False).json()['version']
except:
pass
return template('system', __file__=__file__, bazarr_version=bazarr_version, return template('system', bazarr_version=bazarr_version,
sonarr_version=sonarr_version.json()['version'], radarr_version=radarr_version.json()['version'], sonarr_version=sonarr_version, radarr_version=radarr_version,
operating_system=platform.platform(), python_version=platform.python_version(), operating_system=platform.platform(), python_version=platform.python_version(),
config_dir=config_dir, bazarr_dir=os.path.normcase(os.getcwd()), config_dir=config_dir, bazarr_dir=os.path.normcase(os.getcwd()),
base_url=base_url, task_list=task_list, row_count=row_count, max_page=max_page, page_size=page_size, base_url=base_url, task_list=task_list, row_count=row_count, max_page=max_page, page_size=page_size,
@ -1734,7 +1747,7 @@ def test_url(protocol, url):
@route(base_url + 'test_notification/<provider>', method='GET') @route(base_url + 'test_notification/<provider>', method='GET')
@custom_auth_basic(check_credentials) @custom_auth_basic(check_credentials)
def test_notification(provider): def test_notification(provider):
print provider provider = urllib.unquote(provider)
apobj = apprise.Apprise() apobj = apprise.Apprise()
apobj.add(provider) apobj.add(provider)

File diff suppressed because one or more lines are too long

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -9,7 +9,6 @@
<link rel="stylesheet" href="{{base_url}}static/semantic/semantic.css"> <link rel="stylesheet" href="{{base_url}}static/semantic/semantic.css">
<link rel="stylesheet" type="text/css" href="{{base_url}}static/datatables/datatables.min.css"/> <link rel="stylesheet" type="text/css" href="{{base_url}}static/datatables/datatables.min.css"/>
<link rel="stylesheet" type="text/css" href="{{base_url}}static/datatables/semanticui.min.css"/> <link rel="stylesheet" type="text/css" href="{{base_url}}static/datatables/semanticui.min.css"/>
<link rel="apple-touch-icon" sizes="120x120" href="{{base_url}}static/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="120x120" href="{{base_url}}static/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="{{base_url}}static/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="32x32" href="{{base_url}}static/favicon-32x32.png">
@ -37,14 +36,14 @@
margin-bottom: 3em; margin-bottom: 3em;
padding: 2em; padding: 2em;
border-radius: 1px; border-radius: 1px;
box-shadow: 0px 0px 5px 5px #000000; box-shadow: 0 0 5px 5px #000000;
min-height: calc(250px + 4em); min-height: calc(250px + 4em);
} }
#fondblanc { #fondblanc {
background-color: #ffffff; background-color: #ffffff;
opacity: 0.9; opacity: 0.9;
border-radius: 1px; border-radius: 1px;
box-shadow: 0px 0px 3px 3px #ffffff; box-shadow: 0 0 3px 3px #ffffff;
margin-top: 32px; margin-top: 32px;
margin-bottom: 3em; margin-bottom: 3em;
padding-top: 2em; padding-top: 2em;
@ -78,11 +77,11 @@
</style> </style>
<script> <script>
$(document).ready(function(){ $(function(){
$('.ui.accordion').accordion(); $('.ui.accordion').accordion();
var first_season_acc_title = document.getElementsByClassName("title")[0]; const first_season_acc_title = document.getElementsByClassName("title")[0];
first_season_acc_title.className += " active"; first_season_acc_title.className += " active";
var first_season_acc_content = document.getElementsByClassName("content")[0]; const first_season_acc_content = document.getElementsByClassName("content")[0];
first_season_acc_content.className += " active"; first_season_acc_content.className += " active";
}); });
</script> </script>
@ -230,12 +229,12 @@
%> %>
<a data-episodePath="{{episode[1]}}" data-scenename="{{episode[8]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{details[4]}}" data-sonarrSeriesId="{{episode[5]}}" data-sonarrEpisodeId="{{episode[7]}}" class="get_subtitle ui tiny label"> <a data-episodePath="{{episode[1]}}" data-scenename="{{episode[8]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{details[4]}}" data-sonarrSeriesId="{{episode[5]}}" data-sonarrEpisodeId="{{episode[7]}}" class="get_subtitle ui tiny label">
{{language}} {{language}}
<i style="margin-left:3px; margin-right:0px" class="search icon"></i> <i style="margin-left:3px; margin-right:0" class="search icon"></i>
</a> </a>
%else: %else:
<a data-tooltip="Automatic searching delayed (adaptive search)" data-position="top right" data-inverted="" data-episodePath="{{episode[1]}}" data-scenename="{{episode[8]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{details[4]}}" data-sonarrSeriesId="{{episode[5]}}" data-sonarrEpisodeId="{{episode[7]}}" class="get_subtitle ui tiny label"> <a data-tooltip="Automatic searching delayed (adaptive search)" data-position="top right" data-inverted="" data-episodePath="{{episode[1]}}" data-scenename="{{episode[8]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{details[4]}}" data-sonarrSeriesId="{{episode[5]}}" data-sonarrEpisodeId="{{episode[7]}}" class="get_subtitle ui tiny label">
{{language}} {{language}}
<i style="margin-left:3px; margin-right:0px" class="search red icon"></i> <i style="margin-left:3px; margin-right:0" class="search red icon"></i>
</a> </a>
%end %end
%end %end
@ -243,7 +242,7 @@
%else: %else:
<a data-episodePath="{{episode[1]}}" data-scenename="{{episode[8]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{details[4]}}" data-sonarrSeriesId="{{episode[5]}}" data-sonarrEpisodeId="{{episode[7]}}" class="get_subtitle ui tiny label"> <a data-episodePath="{{episode[1]}}" data-scenename="{{episode[8]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{details[4]}}" data-sonarrSeriesId="{{episode[5]}}" data-sonarrEpisodeId="{{episode[7]}}" class="get_subtitle ui tiny label">
{{language}} {{language}}
<i style="margin-left:3px; margin-right:0px" class="search icon"></i> <i style="margin-left:3px; margin-right:0" class="search icon"></i>
</a> </a>
%end %end
%end %end
@ -356,18 +355,18 @@
</html> </html>
<script> <script>
$('#scan_disk').click(function(){ $('#scan_disk').on('click', function(){
$('#loader_text').text("Scanning disk for existing subtitles..."); $('#loader_text').text("Scanning disk for existing subtitles...");
window.location = '{{base_url}}scan_disk/{{no}}'; window.location = '{{base_url}}scan_disk/{{no}}';
}) });
$('#search_missing_subtitles').click(function(){ $('#search_missing_subtitles').on('click', function(){
$('#loader_text').text("Searching for missing subtitles..."); $('#loader_text').text("Searching for missing subtitles...");
window.location = '{{base_url}}search_missing_subtitles/{{no}}'; window.location = '{{base_url}}search_missing_subtitles/{{no}}';
}) });
$('.remove_subtitles').click(function(){ $('.remove_subtitles').on('click', function(){
var values = { const values = {
episodePath: $(this).attr("data-episodePath"), episodePath: $(this).attr("data-episodePath"),
language: $(this).attr("data-language"), language: $(this).attr("data-language"),
subtitlesPath: $(this).attr("data-subtitlesPath"), subtitlesPath: $(this).attr("data-subtitlesPath"),
@ -390,10 +389,10 @@
$(document).ajaxStop(function(){ $(document).ajaxStop(function(){
window.location.reload(); window.location.reload();
}); });
}) });
$('.get_subtitle').click(function(){ $('.get_subtitle').on('click', function(){
var values = { const values = {
episodePath: $(this).attr("data-episodePath"), episodePath: $(this).attr("data-episodePath"),
sceneName: $(this).attr("data-sceneName"), sceneName: $(this).attr("data-sceneName"),
language: $(this).attr("data-language"), language: $(this).attr("data-language"),
@ -416,19 +415,18 @@
$(document).ajaxStop(function(){ $(document).ajaxStop(function(){
window.location.reload(); window.location.reload();
}); });
}) });
$('a:not(.manual_search), .menu .item, button:not(#config, .cancel)').click(function(){ $('a:not(.manual_search), .menu .item, button:not(#config, .cancel)').on('click', function(){
$('#loader').addClass('active'); $('#loader').addClass('active');
}) });
$('.modal') $('.modal')
.modal({ .modal({
autofocus: false autofocus: false
}) });
;
$('#config').click(function(){ $('#config').on('click', function(){
$('#series_form').attr('action', '{{base_url}}edit_series/{{no}}'); $('#series_form').attr('action', '{{base_url}}edit_series/{{no}}');
$("#series_title").html($(this).data("title")); $("#series_title").html($(this).data("title"));
@ -437,10 +435,10 @@
$("#series_audio_language").html($(this).data("audio")); $("#series_audio_language").html($(this).data("audio"));
$('#series_languages').dropdown('clear'); $('#series_languages').dropdown('clear');
var languages_array = eval($(this).data("languages")); const languages_array = eval($(this).data("languages"));
$('#series_languages').dropdown('set selected',languages_array); $('#series_languages').dropdown('set selected',languages_array);
if ($(this).data("hearing-impaired") == "True") { if ($(this).data("hearing-impaired") === "True") {
$("#series_hearing-impaired_div").checkbox('check'); $("#series_hearing-impaired_div").checkbox('check');
} else { } else {
$("#series_hearing-impaired_div").checkbox('uncheck'); $("#series_hearing-impaired_div").checkbox('uncheck');
@ -450,24 +448,23 @@
.modal({ .modal({
centered: true centered: true
}) })
.modal('show') .modal('show');
; });
})
$('.manual_search').click(function(){ $('.manual_search').on('click', function(){
$("#series_title_span").html($(this).data("series_title")); $("#series_title_span").html($(this).data("series_title"));
$("#season").html($(this).data("season")); $("#season").html($(this).data("season"));
$("#episode").html($(this).data("episode")); $("#episode").html($(this).data("episode"));
$("#episode_title").html($(this).data("episode_title")); $("#episode_title").html($(this).data("episode_title"));
episodePath = $(this).attr("data-episodePath"), episodePath = $(this).attr("data-episodePath");
sceneName = $(this).attr("data-sceneName"), sceneName = $(this).attr("data-sceneName");
language = $(this).attr("data-language"), language = $(this).attr("data-language");
hi = $(this).attr("data-hi"), hi = $(this).attr("data-hi");
sonarrSeriesId = $(this).attr("data-sonarrSeriesId"), sonarrSeriesId = $(this).attr("data-sonarrSeriesId");
sonarrEpisodeId = $(this).attr("data-sonarrEpisodeId") sonarrEpisodeId = $(this).attr("data-sonarrEpisodeId");
var values = { const values = {
episodePath: episodePath, episodePath: episodePath,
sceneName: sceneName, sceneName: sceneName,
language: language, language: language,
@ -511,19 +508,19 @@
}, },
{ data: null, { data: null,
render: function ( data, type, row ) { render: function ( data, type, row ) {
var array_matches = data.matches; const array_matches = data.matches;
var array_dont_matches = data.dont_matches; const array_dont_matches = data.dont_matches;
var i; let i;
text = '<div class="ui inline dropdown"><i class="green check icon"></i><div class="text">' let text = '<div class="ui inline dropdown"><i class="green check icon"></i><div class="text">';
text += array_matches.length; text += array_matches.length;
text += '</div><i class="dropdown icon"></i><div class="menu">' text += '</div><i class="dropdown icon"></i><div class="menu">';
for (i = 0; i < array_matches.length; i++) { for (i = 0; i < array_matches.length; i++) {
text += '<div class="criteria_matched disabled item">' + array_matches[i] + '</div>'; text += '<div class="criteria_matched disabled item">' + array_matches[i] + '</div>';
} }
text += '</div></div>'; text += '</div></div>';
text += '<div class="ui inline dropdown"><i class="red times icon"></i><div class="text">' text += '<div class="ui inline dropdown"><i class="red times icon"></i><div class="text">';
text += array_dont_matches.length; text += array_dont_matches.length;
text += '</div><i class="dropdown icon"></i><div class="menu">' text += '</div><i class="dropdown icon"></i><div class="menu">';
for (i = 0; i < array_dont_matches.length; i++) { for (i = 0; i < array_dont_matches.length; i++) {
text += '<div class="criteria_not_matched disabled item">' + array_dont_matches[i] + '</div>'; text += '<div class="criteria_not_matched disabled item">' + array_dont_matches[i] + '</div>';
} }
@ -543,12 +540,11 @@
.modal({ .modal({
centered: false centered: false
}) })
.modal('show') .modal('show');
; });
})
function manual_get(button, episodePath, sceneName, hi, sonarrSeriesId, sonarrEpisodeId){ function manual_get(button, episodePath, sceneName, hi, sonarrSeriesId, sonarrEpisodeId){
var values = { const values = {
subtitle: $(button).attr("data-subtitle"), subtitle: $(button).attr("data-subtitle"),
provider: $(button).attr("data-provider"), provider: $(button).attr("data-provider"),
episodePath: episodePath, episodePath: episodePath,

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -23,16 +23,13 @@
} }
#fondblanc { #fondblanc {
background-color: #ffffff; background-color: #ffffff;
border-radius: 0px; border-radius: 0;
box-shadow: 0px 0px 5px 5px #ffffff; box-shadow: 0 0 5px 5px #ffffff;
margin-top: 32px; margin-top: 32px;
margin-bottom: 3em; margin-bottom: 3em;
padding: 1em; padding: 1em;
overflow-x:auto; overflow-x:auto;
} }
#logs {
margin-top: 4em;
}
.fast.backward, .backward, .forward, .fast.forward { .fast.backward, .backward, .forward, .fast.forward {
cursor: pointer; cursor: pointer;
} }
@ -77,16 +74,15 @@
<script> <script>
$('.menu .item') $('.menu .item')
.tab() .tab();
;
$('#series_tab').click(function() { $('#series_tab').on('click', function() {
loadURLseries(1); loadURLseries(1);
}) });
$('#movies_tab').click(function() { $('#movies_tab').on('click', function() {
loadURLmovies(1); loadURLmovies(1);
}) });
function loadURLseries(page) { function loadURLseries(page) {
$.ajax({ $.ajax({
@ -110,25 +106,25 @@
}); });
} }
$('a:not(.tabs), button:not(.cancel, #download_log)').click(function(){ $('a:not(.tabs), button:not(.cancel, #download_log)').on('click', function(){
$('#loader').addClass('active'); $('#loader').addClass('active');
}) });
if ($('#series_tab').data("enabled") == "True") { if ($('#series_tab').data("enabled") === "True") {
$("#series_tab").removeClass('disabled'); $("#series_tab").removeClass('disabled');
} else { } else {
$("#series_tab").addClass('disabled'); $("#series_tab").addClass('disabled');
} }
if ($('#movies_tab').data("enabled") == "True") { if ($('#movies_tab').data("enabled") === "True") {
$("#movies_tab").removeClass('disabled'); $("#movies_tab").removeClass('disabled');
} else { } else {
$("#movies_tab").addClass('disabled'); $("#movies_tab").addClass('disabled');
} }
if ($('#series_tab').data("enabled") == "True") { if ($('#series_tab').data("enabled") === "True") {
$( "#series_tab" ).trigger( "click" ); $( "#series_tab" ).trigger( "click" );
} }
if ($('#series_tab').data("enabled") == "False" && $('#movies_tab').data("enabled") == "True") { if ($('#series_tab').data("enabled") === "False" && $('#movies_tab').data("enabled") === "True") {
$( "#movies_tab" ).trigger( "click" ); $( "#movies_tab" ).trigger( "click" );
} }
</script> </script>

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -21,15 +21,6 @@
body { body {
background-color: #272727; background-color: #272727;
} }
#fondblanc {
background-color: #ffffff;
border-radius: 0px;
box-shadow: 0px 0px 5px 5px #ffffff;
margin-top: 32px;
margin-bottom: 3em;
padding: 3em;
overflow-x:auto;
}
.fast.backward, .backward, .forward, .fast.forward { .fast.backward, .backward, .forward, .fast.forward {
cursor: pointer; cursor: pointer;
} }
@ -183,22 +174,22 @@
sessionStorage.clear(); sessionStorage.clear();
} }
$('a, i').click(function(){ $('a, i').on('click', function(){
sessionStorage.scrolly=$(window).scrollTop(); sessionStorage.scrolly=$(window).scrollTop();
$('#loader').addClass('active'); $('#loader').addClass('active');
}) });
$('.fast.backward').click(function(){ $('.fast.backward').on('click', function(){
loadURLseries(1); loadURLseries(1);
}) });
$('.backward:not(.fast)').click(function(){ $('.backward:not(.fast)').on('click', function(){
loadURLseries({{int(page)-1}}); loadURLseries({{int(page)-1}});
}) });
$('.forward:not(.fast)').click(function(){ $('.forward:not(.fast)').on('click', function(){
loadURLseries({{int(page)+1}}); loadURLseries({{int(page)+1}});
}) });
$('.fast.forward').click(function(){ $('.fast.forward').on('click', function(){
loadURLseries({{int(max_page)}}); loadURLseries({{int(max_page)}});
}) });
</script> </script>

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -21,15 +21,6 @@
body { body {
background-color: #272727; background-color: #272727;
} }
#fondblanc {
background-color: #ffffff;
border-radius: 0px;
box-shadow: 0px 0px 5px 5px #ffffff;
margin-top: 32px;
margin-bottom: 3em;
padding: 3em;
overflow-x:auto;
}
.fast.backward, .backward, .forward, .fast.forward { .fast.backward, .backward, .forward, .fast.forward {
cursor: pointer; cursor: pointer;
} }
@ -198,22 +189,22 @@
sessionStorage.clear(); sessionStorage.clear();
} }
$('a, i').click(function(){ $('a, i').on('click', function(){
sessionStorage.scrolly=$(window).scrollTop(); sessionStorage.scrolly=$(window).scrollTop();
$('#loader').addClass('active'); $('#loader').addClass('active');
}) });
$('.fast.backward').click(function(){ $('.fast.backward').on('click', function(){
loadURLseries(1); loadURLseries(1);
}) });
$('.backward:not(.fast)').click(function(){ $('.backward:not(.fast)').on('click', function(){
loadURLseries({{int(page)-1}}); loadURLseries({{int(page)-1}});
}) });
$('.forward:not(.fast)').click(function(){ $('.forward:not(.fast)').on('click', function(){
loadURLseries({{int(page)+1}}); loadURLseries({{int(page)+1}});
}) });
$('.fast.forward').click(function(){ $('.fast.forward').on('click', function(){
loadURLseries({{int(max_page)}}); loadURLseries({{int(max_page)}});
}) });
</script> </script>

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -24,7 +24,7 @@
height: 100%; height: 100%;
} }
.image { .image {
margin-top: 0px; margin-top: 0;
} }
.column { .column {
max-width: 450px; max-width: 450px;
@ -64,8 +64,5 @@
</div> </div>
</div> </div>
</form>
</body> </body>
</html> </html>

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -105,17 +105,16 @@ bug icon \\
$('.modal') $('.modal')
.modal({ .modal({
autofocus: false autofocus: false
}) });
;
$('.log').click(function(){ $('.log').on('click', function(){
$("#message").html($(this).data("message")); $("#message").html($(this).data("message"));
exception = $(this).data("exception"); let exception = $(this).data("exception");
exception = exception.replace(/'/g,""); exception = exception.replace(/'/g,"");
exception = exception.replace(/\\n\s\s\s\s/g, "\\n&emsp;&emsp;"); exception = exception.replace(/\\n\s\s\s\s/g, "\\n&emsp;&emsp;");
exception = exception.replace(/\\n\s\s/g, "\\n&emsp;"); exception = exception.replace(/\\n\s\s/g, "\\n&emsp;");
exception = exception.replace(/\\n/g, "<br />") exception = exception.replace(/\\n/g, "<br />");
$("#exception").html(exception); $("#exception").html(exception);
$('#modal').modal('show'); $('#modal').modal('show');
}) });
</script> </script>

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<style> <style>
@ -26,13 +26,13 @@
% import sqlite3 % import sqlite3
% from get_settings import get_general_settings % from get_settings import get_general_settings
%if get_general_settings()[24] is True: %if get_general_settings()[24]:
% monitored_only_query_string = ' AND monitored = "True"' % monitored_only_query_string = ' AND monitored = "True"'
%else: %else:
% monitored_only_query_string = "" % monitored_only_query_string = ""
%end %end
% conn = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) % conn = sqlite3.connect(os.path.join(config_dir, 'db', 'bazarr.db'), timeout=30)
% c = conn.cursor() % c = conn.cursor()
% wanted_series = c.execute("SELECT COUNT(*) FROM table_episodes WHERE missing_subtitles != '[]'" + monitored_only_query_string).fetchone() % wanted_series = c.execute("SELECT COUNT(*) FROM table_episodes WHERE missing_subtitles != '[]'" + monitored_only_query_string).fetchone()
% wanted_movies = c.execute("SELECT COUNT(*) FROM table_movies WHERE missing_subtitles != '[]'" + monitored_only_query_string).fetchone() % wanted_movies = c.execute("SELECT COUNT(*) FROM table_movies WHERE missing_subtitles != '[]'" + monitored_only_query_string).fetchone()
@ -50,13 +50,13 @@
<div class="sixteen wide column"> <div class="sixteen wide column">
<div class="ui inverted borderless labeled icon massive menu six item"> <div class="ui inverted borderless labeled icon massive menu six item">
<div class="ui container"> <div class="ui container">
% if get_general_settings()[12] is True: % if get_general_settings()[12]:
<a class="item" href="{{base_url}}series"> <a class="item" href="{{base_url}}series">
<i class="play icon"></i> <i class="play icon"></i>
Series Series
</a> </a>
% end % end
% if get_general_settings()[13] is True: % if get_general_settings()[13]:
<a class="item" href="{{base_url}}movies"> <a class="item" href="{{base_url}}movies">
<i class="film icon"></i> <i class="film icon"></i>
Movies Movies
@ -68,12 +68,12 @@
</a> </a>
<a class="item" href="{{base_url}}wanted"> <a class="item" href="{{base_url}}wanted">
<i class="warning sign icon"> <i class="warning sign icon">
% if get_general_settings()[12] is True: % if get_general_settings()[12]:
<div class="floating ui tiny yellow label" style="left:90% !important;top:0.5em !important;"> <div class="floating ui tiny yellow label" style="left:90% !important;top:0.5em !important;">
{{wanted_series[0]}} {{wanted_series[0]}}
</div> </div>
% end % end
% if get_general_settings()[13] is True: % if get_general_settings()[13]:
<div class="floating ui tiny green label" style="left:90% !important;top:3em !important;"> <div class="floating ui tiny green label" style="left:90% !important;top:3em !important;">
{{wanted_movies[0]}} {{wanted_movies[0]}}
</div> </div>
@ -94,7 +94,7 @@
</div> </div>
</div> </div>
<div style='padding-top:0rem;' class="row"> <div style='padding-top:0;' class="row">
<div class="three wide column"></div> <div class="three wide column"></div>
<div class="ten wide column"> <div class="ten wide column">
@ -133,7 +133,7 @@
apiSettings: { apiSettings: {
url: '{{base_url}}search_json/{query}', url: '{{base_url}}search_json/{query}',
onResponse: function(results) { onResponse: function(results) {
var response = { const response = {
results : [] results : []
}; };
$.each(results.items, function(index, item) { $.each(results.items, function(index, item) {
@ -154,21 +154,21 @@
$('.menu').css('opacity', '0.8'); $('.menu').css('opacity', '0.8');
$('#divmenu').css('background', '#000000'); $('#divmenu').css('background', '#000000');
$('#divmenu').css('opacity', '0.8'); $('#divmenu').css('opacity', '0.8');
$('#divmenu').css('box-shadow', '0px 0px 5px 5px #000000'); $('#divmenu').css('box-shadow', '0 0 5px 5px #000000');
} }
else if (window.location.href.indexOf("movie/") > -1) { else if (window.location.href.indexOf("movie/") > -1) {
$('.menu').css('background', '#000000'); $('.menu').css('background', '#000000');
$('.menu').css('opacity', '0.8'); $('.menu').css('opacity', '0.8');
$('#divmenu').css('background', '#000000'); $('#divmenu').css('background', '#000000');
$('#divmenu').css('opacity', '0.8'); $('#divmenu').css('opacity', '0.8');
$('#divmenu').css('box-shadow', '0px 0px 5px 5px #000000'); $('#divmenu').css('box-shadow', '0 0 5px 5px #000000');
} }
else { else {
$('.menu').css('background', '#272727'); $('.menu').css('background', '#272727');
$('#divmenu').css('background', '#272727'); $('#divmenu').css('background', '#272727');
} }
$('#restart_link').click(function(){ $('#restart_link').on('click', function(){
$('#loader_text').text("Bazarr is restarting, please wait..."); $('#loader_text').text("Bazarr is restarting, please wait...");
$.ajax({ $.ajax({
url: "{{base_url}}restart", url: "{{base_url}}restart",
@ -177,14 +177,14 @@
.done(function(){ .done(function(){
setTimeout(function(){ setInterval(ping, 2000); },8000); setTimeout(function(){ setInterval(ping, 2000); },8000);
}); });
}) });
% from get_settings import get_general_settings % from get_settings import get_general_settings
% ip = get_general_settings()[0] % ip = get_general_settings()[0]
% port = get_general_settings()[1] % port = get_general_settings()[1]
% base_url = get_general_settings()[2] % base_url = get_general_settings()[2]
if ("{{ip}}" == "0.0.0.0") { if ("{{ip}}" === "0.0.0.0") {
public_ip = window.location.hostname; public_ip = window.location.hostname;
} else { } else {
public_ip = "{{ip}}"; public_ip = "{{ip}}";
@ -192,7 +192,7 @@
protocol = window.location.protocol; protocol = window.location.protocol;
if (window.location.port == '{{current_port}}') { if (window.location.port === '{{current_port}}') {
public_port = '{{port}}'; public_port = '{{port}}';
} else { } else {
public_port = window.location.port; public_port = window.location.port;

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -36,14 +36,14 @@
margin-bottom: 3em; margin-bottom: 3em;
padding: 2em; padding: 2em;
border-radius: 1px; border-radius: 1px;
box-shadow: 0px 0px 5px 5px #000000; box-shadow: 0 0 5px 5px #000000;
min-height: calc(250px + 4em); min-height: calc(250px + 4em);
} }
#fondblanc { #fondblanc {
background-color: #ffffff; background-color: #ffffff;
opacity: 0.9; opacity: 0.9;
border-radius: 1px; border-radius: 1px;
box-shadow: 0px 0px 3px 3px #ffffff; box-shadow: 0 0 3px 3px #ffffff;
margin-top: 32px; margin-top: 32px;
margin-bottom: 3em; margin-bottom: 3em;
padding-top: 2em; padding-top: 2em;
@ -170,8 +170,12 @@
</tbody> </tbody>
</table> </table>
<% <%
missing_subs_languages = ast.literal_eval(details[11]) if details[11] is not None:
from get_subtitle import search_active missing_subs_languages = ast.literal_eval(details[11])
else:
missing_subs_languages = []
end
from get_subtitle import search_active
if missing_subs_languages is not None: if missing_subs_languages is not None:
%> %>
<table class="ui very basic single line selectable table"> <table class="ui very basic single line selectable table">
@ -190,12 +194,12 @@
%> %>
<a class="get_subtitle ui small blue label" data-moviePath="{{details[8]}}" data-scenename="{{details[12]}}" data-language="{{alpha3_from_alpha2(str(missing_subs_language))}}" data-hi="{{details[4]}}" data-radarrId={{details[10]}}> <a class="get_subtitle ui small blue label" data-moviePath="{{details[8]}}" data-scenename="{{details[12]}}" data-language="{{alpha3_from_alpha2(str(missing_subs_language))}}" data-hi="{{details[4]}}" data-radarrId={{details[10]}}>
{{language_from_alpha2(str(missing_subs_language))}} {{language_from_alpha2(str(missing_subs_language))}}
<i style="margin-left:3px; margin-right:0px" class="search icon"></i> <i style="margin-left:3px; margin-right:0" class="search icon"></i>
</a> </a>
%else: %else:
<a data-tooltip="Automatic searching delayed (adaptive search)" data-position="top left" data-inverted="" class="get_subtitle ui small red label" data-moviePath="{{details[8]}}" data-scenename="{{details[12]}}" data-language="{{alpha3_from_alpha2(str(missing_subs_language))}}" data-hi="{{details[4]}}" data-radarrId={{details[10]}}> <a data-tooltip="Automatic searching delayed (adaptive search)" data-position="top left" data-inverted="" class="get_subtitle ui small red label" data-moviePath="{{details[8]}}" data-scenename="{{details[12]}}" data-language="{{alpha3_from_alpha2(str(missing_subs_language))}}" data-hi="{{details[4]}}" data-radarrId={{details[10]}}>
{{language_from_alpha2(str(missing_subs_language))}} {{language_from_alpha2(str(missing_subs_language))}}
<i style="margin-left:3px; margin-right:0px" class="search icon"></i> <i style="margin-left:3px; margin-right:0" class="search icon"></i>
</a> </a>
<% <%
end end
@ -205,7 +209,7 @@
%> %>
<a class="get_subtitle ui small blue label" data-moviePath="{{details[8]}}" data-scenename="{{details[12]}}" data-language="{{alpha3_from_alpha2(str(missing_subs_language))}}" data-hi="{{details[4]}}" data-radarrId={{details[10]}}> <a class="get_subtitle ui small blue label" data-moviePath="{{details[8]}}" data-scenename="{{details[12]}}" data-language="{{alpha3_from_alpha2(str(missing_subs_language))}}" data-hi="{{details[4]}}" data-radarrId={{details[10]}}>
{{language_from_alpha2(str(missing_subs_language))}} {{language_from_alpha2(str(missing_subs_language))}}
<i style="margin-left:3px; margin-right:0px" class="search icon"></i> <i style="margin-left:3px; margin-right:0" class="search icon"></i>
</a> </a>
<% <%
end end
@ -301,18 +305,18 @@
</html> </html>
<script> <script>
$('#scan_disk').click(function(){ $('#scan_disk').on('click', function(){
$('#loader_text').text("Scanning disk for existing subtitles..."); $('#loader_text').text("Scanning disk for existing subtitles...");
window.location = '{{base_url}}scan_disk_movie/{{no}}'; window.location = '{{base_url}}scan_disk_movie/{{no}}';
}) });
$('#search_missing_subtitles').click(function(){ $('#search_missing_subtitles').on('click', function(){
$('#loader_text').text("Searching for missing subtitles..."); $('#loader_text').text("Searching for missing subtitles...");
window.location = '{{base_url}}search_missing_subtitles_movie/{{no}}'; window.location = '{{base_url}}search_missing_subtitles_movie/{{no}}';
}) });
$('.remove_subtitles').click(function(){ $('.remove_subtitles').on('click', function(){
var values = { const values = {
moviePath: $(this).attr("data-moviePath"), moviePath: $(this).attr("data-moviePath"),
language: $(this).attr("data-language"), language: $(this).attr("data-language"),
subtitlesPath: $(this).attr("data-subtitlesPath"), subtitlesPath: $(this).attr("data-subtitlesPath"),
@ -334,10 +338,10 @@
$(document).ajaxStop(function(){ $(document).ajaxStop(function(){
window.location.reload(); window.location.reload();
}); });
}) });
$('.get_subtitle').click(function(){ $('.get_subtitle').on('click', function(){
var values = { const values = {
moviePath: $(this).attr("data-moviePath"), moviePath: $(this).attr("data-moviePath"),
sceneName: $(this).attr("data-sceneName"), sceneName: $(this).attr("data-sceneName"),
language: $(this).attr("data-language"), language: $(this).attr("data-language"),
@ -360,19 +364,18 @@
$(document).ajaxStop(function(){ $(document).ajaxStop(function(){
window.location.reload(); window.location.reload();
}); });
}) });
$('a, .menu .item, button:not(#config, .cancel, .manual_search)').click(function(){ $('a, .menu .item, button:not(#config, .cancel, .manual_search)').on('click', function(){
$('#loader').addClass('active'); $('#loader').addClass('active');
}) });
$('.modal') $('.modal')
.modal({ .modal({
autofocus: false autofocus: false
}) });
;
$('#config').click(function(){ $('#config').on('click', function(){
$('#movie_form').attr('action', '{{base_url}}edit_movie/{{no}}'); $('#movie_form').attr('action', '{{base_url}}edit_movie/{{no}}');
$("#movie_title").html($(this).data("title")); $("#movie_title").html($(this).data("title"));
@ -381,10 +384,10 @@
$("#movie_audio_language").html($(this).data("audio")); $("#movie_audio_language").html($(this).data("audio"));
$('#movie_languages').dropdown('clear'); $('#movie_languages').dropdown('clear');
var languages_array = eval($(this).data("languages")); const languages_array = eval($(this).data("languages"));
$('#movie_languages').dropdown('set selected',languages_array); $('#movie_languages').dropdown('set selected',languages_array);
if ($(this).data("hearing-impaired") == "True") { if ($(this).data("hearing-impaired") === "True") {
$("#movie_hearing-impaired_div").checkbox('check'); $("#movie_hearing-impaired_div").checkbox('check');
} else { } else {
$("#movie_hearing-impaired_div").checkbox('uncheck'); $("#movie_hearing-impaired_div").checkbox('uncheck');
@ -394,20 +397,19 @@
.modal({ .modal({
centered: true centered: true
}) })
.modal('show') .modal('show');
; });
})
$('.manual_search').click(function(){ $('.manual_search').on('click', function(){
$("#movie_title_span").html($(this).data("movie_title")); $("#movie_title_span").html($(this).data("movie_title"));
moviePath = $(this).attr("data-moviePath"), moviePath = $(this).attr("data-moviePath");
sceneName = $(this).attr("data-sceneName"), sceneName = $(this).attr("data-sceneName");
language = $(this).attr("data-language"), language = $(this).attr("data-language");
hi = $(this).attr("data-hi"), hi = $(this).attr("data-hi");
radarrId = $(this).attr("data-radarrId") radarrId = $(this).attr("data-radarrId");
var values = { const values = {
moviePath: moviePath, moviePath: moviePath,
sceneName: sceneName, sceneName: sceneName,
language: language, language: language,
@ -450,19 +452,19 @@
}, },
{ data: null, { data: null,
render: function ( data, type, row ) { render: function ( data, type, row ) {
var array_matches = data.matches; const array_matches = data.matches;
var array_dont_matches = data.dont_matches; const array_dont_matches = data.dont_matches;
var i; let i;
text = '<div class="ui inline dropdown"><i class="green check icon"></i><div class="text">' let text = '<div class="ui inline dropdown"><i class="green check icon"></i><div class="text">';
text += array_matches.length; text += array_matches.length;
text += '</div><i class="dropdown icon"></i><div class="menu">' text += '</div><i class="dropdown icon"></i><div class="menu">';
for (i = 0; i < array_matches.length; i++) { for (i = 0; i < array_matches.length; i++) {
text += '<div class="criteria_matched disabled item">' + array_matches[i] + '</div>'; text += '<div class="criteria_matched disabled item">' + array_matches[i] + '</div>';
} }
text += '</div></div>'; text += '</div></div>';
text += '<div class="ui inline dropdown"><i class="red times icon"></i><div class="text">' text += '<div class="ui inline dropdown"><i class="red times icon"></i><div class="text">';
text += array_dont_matches.length; text += array_dont_matches.length;
text += '</div><i class="dropdown icon"></i><div class="menu">' text += '</div><i class="dropdown icon"></i><div class="menu">';
for (i = 0; i < array_dont_matches.length; i++) { for (i = 0; i < array_dont_matches.length; i++) {
text += '<div class="criteria_not_matched disabled item">' + array_dont_matches[i] + '</div>'; text += '<div class="criteria_not_matched disabled item">' + array_dont_matches[i] + '</div>';
} }
@ -484,10 +486,10 @@
}) })
.modal('show') .modal('show')
; ;
}) });
function manual_get(button, episodePath, sceneName, hi, sonarrSeriesId, sonarrEpisodeId){ function manual_get(button, episodePath, sceneName, hi, sonarrSeriesId, sonarrEpisodeId){
var values = { const values = {
subtitle: $(button).attr("data-subtitle"), subtitle: $(button).attr("data-subtitle"),
provider: $(button).attr("data-provider"), provider: $(button).attr("data-provider"),
moviePath: moviePath, moviePath: moviePath,
@ -511,5 +513,5 @@
$(document).ajaxStop(function(){ $(document).ajaxStop(function(){
window.location.reload(); window.location.reload();
}); });
} };
</script> </script>

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -23,8 +23,8 @@
} }
#fondblanc { #fondblanc {
background-color: #ffffff; background-color: #ffffff;
border-radius: 0px; border-radius: 0;
box-shadow: 0px 0px 5px 5px #ffffff; box-shadow: 0 0 5px 5px #ffffff;
margin-top: 32px; margin-top: 32px;
margin-bottom: 3em; margin-bottom: 3em;
padding: 2em 3em 2em 3em; padding: 2em 3em 2em 3em;
@ -100,8 +100,8 @@
%end %end
%end %end
</td> </td>
<td>{{!"" if row[4] == None else row[4]}}</td> <td>{{!"" if row[4] is None else row[4]}}</td>
<td {{!"style='background-color: #e8e8e8;'" if row[4] == None else ""}}> <td {{!"style='background-color: #e8e8e8;'" if row[4] is None else ""}}>
<% <%
subs_languages_list = [] subs_languages_list = []
if subs_languages is not None: if subs_languages is not None:
@ -223,26 +223,26 @@
$('table').tablesort(); $('table').tablesort();
$('a, button:not(.cancel)').click(function(){ $('a, button:not(.cancel)').on('click', function(){
$('#loader').addClass('active'); $('#loader').addClass('active');
}) });
$('.fast.backward').click(function(){ $('.fast.backward').on('click', function(){
location.href="?page=1"; location.href="?page=1";
}) });
$('.backward:not(.fast)').click(function(){ $('.backward:not(.fast)').on('click', function(){
location.href="?page={{int(page)-1}}"; location.href="?page={{int(page)-1}}";
}) });
$('.forward:not(.fast)').click(function(){ $('.forward:not(.fast)').on('click', function(){
location.href="?page={{int(page)+1}}"; location.href="?page={{int(page)+1}}";
}) });
$('.fast.forward').click(function(){ $('.fast.forward').on('click', function(){
location.href="?page={{int(max_page)}}"; location.href="?page={{int(max_page)}}";
}) });
$('#movieseditor').click(function(){ $('#movieseditor').on('click', function(){
window.location = '{{base_url}}movieseditor'; window.location = '{{base_url}}movieseditor';
}) });
$('.modal') $('.modal')
.modal({ .modal({
@ -250,7 +250,7 @@
}) })
; ;
$('.config').click(function(){ $('.config').on('click', function(){
sessionStorage.scrolly=$(window).scrollTop(); sessionStorage.scrolly=$(window).scrollTop();
$('#movies_form').attr('action', '{{base_url}}edit_movie/' + $(this).data("no")); $('#movies_form').attr('action', '{{base_url}}edit_movie/' + $(this).data("no"));
@ -264,14 +264,14 @@
var languages_array = eval($(this).data("languages")); var languages_array = eval($(this).data("languages"));
$('#movies_languages').dropdown('set selected',languages_array); $('#movies_languages').dropdown('set selected',languages_array);
if ($(this).data("hearing-impaired") == "True") { if ($(this).data("hearing-impaired") === "True") {
$("#movies_hearing-impaired_div").checkbox('check'); $("#movies_hearing-impaired_div").checkbox('check');
} else { } else {
$("#movies_hearing-impaired_div").checkbox('uncheck'); $("#movies_hearing-impaired_div").checkbox('uncheck');
} }
$('.small.modal').modal('show'); $('.small.modal').modal('show');
}) });
$('#movies_languages').dropdown(); $('#movies_languages').dropdown();
</script> </script>

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -23,8 +23,8 @@
} }
#fondblanc { #fondblanc {
background-color: #ffffff; background-color: #ffffff;
border-radius: 0px; border-radius: 0;
box-shadow: 0px 0px 5px 5px #ffffff; box-shadow: 0 0 5px 5px #ffffff;
margin-top: 32px; margin-top: 32px;
margin-bottom: 3em; margin-bottom: 3em;
padding: 2em 3em 2em 3em; padding: 2em 3em 2em 3em;
@ -32,9 +32,6 @@
#tablemovies { #tablemovies {
padding-top: 1em; padding-top: 1em;
} }
#divdetails {
min-height: 250px;
}
#bottommenu { #bottommenu {
background-color: #333333; background-color: #333333;
box-shadow: 0 0 10px 1px #333; box-shadow: 0 0 10px 1px #333;
@ -140,9 +137,9 @@
$('table').tablesort(); $('table').tablesort();
$('a, button').click(function(){ $('a, button').on('click', function(){
$('#loader').addClass('active'); $('#loader').addClass('active');
}) });
$('.modal') $('.modal')
.modal({ .modal({
@ -150,7 +147,7 @@
}) })
; ;
$('.selected').change(function() { $('.selected').on('change', function() {
$("#count").text($('.selected:checked').length); $("#count").text($('.selected:checked').length);
if ( $('.selected:checked').length > 0 ) { if ( $('.selected:checked').length > 0 ) {
$('.select').removeClass('disabled'); $('.select').removeClass('disabled');
@ -161,19 +158,19 @@
$('#save').addClass('disabled'); $('#save').addClass('disabled');
} }
var result = []; const result = [];
$('.selected:checked').each(function(i){ $('.selected:checked').each(function(i){
result.push($(this).attr('id')); result.push($(this).attr('id'));
}); });
$("#checked").val(result); $("#checked").val(result);
}); });
$('#selectall').change(function() { $('#selectall').on('change', function() {
if ( $('#selectall').is(":checked") ) { if ( $('#selectall').is(":checked") ) {
$('.selected').prop('checked', true).change(); $('.selected').prop('checked', true).trigger('change');
} }
else { else {
$('.selected').prop('checked', false).change(); $('.selected').prop('checked', false).trigger('change');
} }
}); });

@ -1,314 +1,313 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
<script src="{{base_url}}static/semantic/semantic.min.js"></script> <script src="{{base_url}}static/semantic/semantic.min.js"></script>
<link rel="stylesheet" href="{{base_url}}static/semantic/semantic.min.css"> <link rel="stylesheet" href="{{base_url}}static/semantic/semantic.min.css">
<link rel="apple-touch-icon" sizes="120x120" href="{{base_url}}static/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="120x120" href="{{base_url}}static/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="{{base_url}}static/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="32x32" href="{{base_url}}static/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="{{base_url}}static/favicon-16x16.png"> <link rel="icon" type="image/png" sizes="16x16" href="{{base_url}}static/favicon-16x16.png">
<link rel="manifest" href="{{base_url}}static/manifest.json"> <link rel="manifest" href="{{base_url}}static/manifest.json">
<link rel="mask-icon" href="{{base_url}}static/safari-pinned-tab.svg" color="#5bbad5"> <link rel="mask-icon" href="{{base_url}}static/safari-pinned-tab.svg" color="#5bbad5">
<link rel="shortcut icon" href="{{base_url}}static/favicon.ico"> <link rel="shortcut icon" href="{{base_url}}static/favicon.ico">
<meta name="msapplication-config" content="{{base_url}}static/browserconfig.xml"> <meta name="msapplication-config" content="{{base_url}}static/browserconfig.xml">
<meta name="theme-color" content="#ffffff"> <meta name="theme-color" content="#ffffff">
<title>Series - Bazarr</title> <title>Series - Bazarr</title>
<style> <style>
body { body {
background-color: #272727; background-color: #272727;
} }
#fondblanc { #fondblanc {
background-color: #ffffff; background-color: #ffffff;
border-radius: 0px; border-radius: 0;
box-shadow: 0px 0px 5px 5px #ffffff; box-shadow: 0 0 5px 5px #ffffff;
margin-top: 32px; margin-top: 32px;
margin-bottom: 3em; margin-bottom: 3em;
padding: 2em 3em 2em 3em; padding: 2em 3em 2em 3em;
overflow-x:auto; overflow-x:auto;
} }
#tableseries { #tableseries {
padding-top: 1em; padding-top: 1em;
} }
#divdetails { #divdetails {
min-height: 250px; min-height: 250px;
} }
.fast.backward, .backward, .forward, .fast.forward { .fast.backward, .backward, .forward, .fast.forward {
cursor: pointer; cursor: pointer;
} }
.fast.backward, .backward, .forward, .fast.forward { pointer-events: auto; } .fast.backward, .backward, .forward, .fast.forward { pointer-events: auto; }
.fast.backward.disabled, .backward.disabled, .forward.disabled, .fast.forward.disabled { pointer-events: none; } .fast.backward.disabled, .backward.disabled, .forward.disabled, .fast.forward.disabled { pointer-events: none; }
.ui.progress:last-child {margin: 0 0 0em !important;} .ui.progress:last-child {margin: 0 0 0 !important;}
.ui.progress .bar>.progress { .ui.progress .bar>.progress {
right: auto; right: auto;
left: .5em; left: .5em;
color: rgba(0, 0, 0, 0.60); color: rgba(0, 0, 0, 0.60);
} }
</style> </style>
</head> </head>
<body> <body>
<div id='loader' class="ui page dimmer"> <div id='loader' class="ui page dimmer">
<div id="loader_text" class="ui indeterminate text loader">Loading...</div> <div id="loader_text" class="ui indeterminate text loader">Loading...</div>
</div> </div>
% include('menu.tpl') % include('menu.tpl')
<div id="fondblanc" class="ui container"> <div id="fondblanc" class="ui container">
<div class="ui basic buttons"> <div class="ui basic buttons">
<button id="serieseditor" class="ui button"><i class="configure icon"></i>Series Editor</button> <button id="serieseditor" class="ui button"><i class="configure icon"></i>Series Editor</button>
</div> </div>
<table id="tableseries" class="ui very basic selectable table"> <table id="tableseries" class="ui very basic selectable table">
<thead> <thead>
<tr> <tr>
<th>Name</th> <th>Name</th>
<th>Path</th> <th>Path</th>
<th>Audio language</th> <th>Audio language</th>
<th>Subtitles languages</th> <th>Subtitles languages</th>
<th>Hearing-impaired</th> <th>Hearing-impaired</th>
<th class="two wide">Subtitles</th> <th class="two wide">Subtitles</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
%import ast %import ast
%import os %import os
%for row in rows: %for row in rows:
<tr class="selectable"> <tr class="selectable">
<td><a href="{{base_url}}episodes/{{row[5]}}">{{row[1]}}</a></td> <td><a href="{{base_url}}episodes/{{row[5]}}">{{row[1]}}</a></td>
<td> <td>
%if os.path.isdir(row[2]): %if os.path.isdir(row[2]):
<span data-tooltip="This path seems to be valid." data-inverted="" data-position="top left"><i class="checkmark icon"></i></span> <span data-tooltip="This path seems to be valid." data-inverted="" data-position="top left"><i class="checkmark icon"></i></span>
%else: %else:
<span data-tooltip="This path doesn't seems to be valid." data-inverted="" data-position="top left"><i class="warning sign icon"></i></span> <span data-tooltip="This path doesn't seems to be valid." data-inverted="" data-position="top left"><i class="warning sign icon"></i></span>
%end %end
{{row[2]}} {{row[2]}}
</td> </td>
<td>{{row[7]}}</td> <td>{{row[7]}}</td>
<td> <td>
%subs_languages = ast.literal_eval(str(row[3])) %subs_languages = ast.literal_eval(str(row[3]))
%if subs_languages is not None: %if subs_languages is not None:
%for subs_language in subs_languages: %for subs_language in subs_languages:
<div class="ui tiny label">{{subs_language}}</div> <div class="ui tiny label">{{subs_language}}</div>
%end %end
%end %end
</td> </td>
<td>{{!"" if row[4] == None else row[4]}}</td> <td>{{!"" if row[4] == None else row[4]}}</td>
<td> <td>
%total_subs = 0 %total_subs = 0
%missing_subs = 0 %missing_subs = 0
%if not total_subtitles_list: %if not total_subtitles_list:
% pass % pass
%else: %else:
% for total_subtitles in total_subtitles_list: % for total_subtitles in total_subtitles_list:
% if total_subtitles[0] == row[5]: % if total_subtitles[0] == row[5]:
% total_subs = total_subtitles[1] % total_subs = total_subtitles[1]
% end % end
% end % end
% for missing_subtitles in missing_subtitles_list: % for missing_subtitles in missing_subtitles_list:
% if missing_subtitles[0] == row[5]: % if missing_subtitles[0] == row[5]:
% missing_subs = missing_subtitles[1] % missing_subs = missing_subtitles[1]
% end % end
% end % end
%end %end
<div class="ui progress" data-value="{{total_subs - missing_subs}}" data-total="{{total_subs}}"> <div class="ui progress" data-value="{{total_subs - missing_subs}}" data-total="{{total_subs}}">
<div class="bar"> <div class="bar">
<div class="progress"></div> <div class="progress"></div>
</div> </div>
</div> </div>
</td> </td>
<td {{!"style='background-color: #e8e8e8;'" if row[4] == None else ""}}> <td {{!"style='background-color: #e8e8e8;'" if row[4] == None else ""}}>
<% <%
subs_languages_list = [] subs_languages_list = []
if subs_languages is not None: if subs_languages is not None:
for subs_language in subs_languages: for subs_language in subs_languages:
subs_languages_list.append(subs_language) subs_languages_list.append(subs_language)
end end
end end
%> %>
<div class="config ui inverted basic compact icon" data-tooltip="Edit series" data-inverted="" data-position="top right" data-no="{{row[5]}}" data-title="{{row[1]}}" data-poster="{{row[6]}}" data-languages="{{!subs_languages_list}}" data-hearing-impaired="{{row[4]}}" data-audio="{{row[7]}}"> <div class="config ui inverted basic compact icon" data-tooltip="Edit series" data-inverted="" data-position="top right" data-no="{{row[5]}}" data-title="{{row[1]}}" data-poster="{{row[6]}}" data-languages="{{!subs_languages_list}}" data-hearing-impaired="{{row[4]}}" data-audio="{{row[7]}}">
<i class="ui black configure icon"></i> <i class="ui black configure icon"></i>
</div> </div>
</td> </td>
</tr> </tr>
%end %end
</tbody> </tbody>
</table> </table>
%try: page_size %try: page_size
%except NameError: page_size = "25" %except NameError: page_size = "25"
%end %end
%if page_size != -1: %if page_size != -1:
<div class="ui grid"> <div class="ui grid">
<div class="three column row"> <div class="three column row">
<div class="column"></div> <div class="column"></div>
<div class="center aligned column"> <div class="center aligned column">
<i class="\\ <i class="\\
%if page == "1": %if page == "1":
disabled\\ disabled\\
%end %end
fast backward icon"></i> fast backward icon"></i>
<i class="\\ <i class="\\
%if page == "1": %if page == "1":
disabled\\ disabled\\
%end %end
backward icon"></i> backward icon"></i>
{{page}} / {{max_page}} {{page}} / {{max_page}}
<i class="\\ <i class="\\
%if int(page) == int(max_page): %if int(page) == int(max_page):
disabled\\ disabled\\
%end %end
forward icon"></i> forward icon"></i>
<i class="\\ <i class="\\
%if int(page) == int(max_page): %if int(page) == int(max_page):
disabled\\ disabled\\
%end %end
fast forward icon"></i> fast forward icon"></i>
</div> </div>
<div class="right floated right aligned column">Total records: {{missing_count}}</div> <div class="right floated right aligned column">Total records: {{missing_count}}</div>
</div> </div>
</div> </div>
%end %end
</div> </div>
<div class="ui small modal"> <div class="ui small modal">
<i class="close icon"></i> <i class="close icon"></i>
<div class="header"> <div class="header">
<div id="series_title"></div> <div id="series_title"></div>
</div> </div>
<div class="content"> <div class="content">
<form name="series_form" id="series_form" action="" method="post" class="ui form"> <form name="series_form" id="series_form" action="" method="post" class="ui form">
<div id="divdetails" class="ui grid"> <div id="divdetails" class="ui grid">
<div class="four wide column"> <div class="four wide column">
<img id="series_poster" class="ui image" src=""> <img id="series_poster" class="ui image" src="">
</div> </div>
<div class="twelve wide column"> <div class="twelve wide column">
<div class="ui grid"> <div class="ui grid">
<div class="middle aligned row"> <div class="middle aligned row">
<div class="right aligned five wide column"> <div class="right aligned five wide column">
<label>Audio language</label> <label>Audio language</label>
</div> </div>
<div class="nine wide column"> <div class="nine wide column">
<div id="series_audio_language"></div> <div id="series_audio_language"></div>
</div> </div>
</div> </div>
<div class="middle aligned row"> <div class="middle aligned row">
<div class="right aligned five wide column"> <div class="right aligned five wide column">
<label>Subtitles languages</label> <label>Subtitles languages</label>
</div> </div>
<div class="nine wide column"> <div class="nine wide column">
<select name="languages" id="series_languages" {{!'multiple="" ' if single_language is False else ''}}class="ui fluid selection dropdown"> <select name="languages" id="series_languages" {{!'multiple="" ' if single_language is False else ''}}class="ui fluid selection dropdown">
<option value="">Languages</option> <option value="">Languages</option>
%if single_language is True: %if single_language is True:
<option value="None">None</option> <option value="None">None</option>
%end %end
%for language in languages: %for language in languages:
<option value="{{language[0]}}">{{language[1]}}</option> <option value="{{language[0]}}">{{language[1]}}</option>
%end %end
</select> </select>
</div> </div>
</div> </div>
<div class="middle aligned row"> <div class="middle aligned row">
<div class="right aligned five wide column"> <div class="right aligned five wide column">
<label>Hearing-impaired</label> <label>Hearing-impaired</label>
</div> </div>
<div class="nine wide column"> <div class="nine wide column">
<div id="series_hearing-impaired_div" class="ui toggle checkbox"> <div id="series_hearing-impaired_div" class="ui toggle checkbox">
<input name="hearing_impaired" id="series_hearing-impaired" type="checkbox"> <input name="hearing_impaired" id="series_hearing-impaired" type="checkbox">
<label></label> <label></label>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</form> </form>
</div> </div>
<div class="actions"> <div class="actions">
<button class="ui cancel button" >Cancel</button> <button class="ui cancel button" >Cancel</button>
<button type="submit" name="save" value="save" form="series_form" class="ui blue approve button">Save</button> <button type="submit" name="save" value="save" form="series_form" class="ui blue approve button">Save</button>
</div> </div>
</div> </div>
% include('footer.tpl') % include('footer.tpl')
</body> </body>
</html> </html>
<script> <script>
if (sessionStorage.scrolly) { if (sessionStorage.scrolly) {
$(window).scrollTop(sessionStorage.scrolly); $(window).scrollTop(sessionStorage.scrolly);
sessionStorage.clear(); sessionStorage.clear();
} }
$('a, button:not(.cancel)').click(function(){ $('a, button:not(.cancel)').on('click', function(){
$('#loader').addClass('active'); $('#loader').addClass('active');
}) });
$('.fast.backward').click(function(){ $('.fast.backward').on('click', function(){
location.href="?page=1"; location.href="?page=1";
}) });
$('.backward:not(.fast)').click(function(){ $('.backward:not(.fast)').on('click', function(){
location.href="?page={{int(page)-1}}"; location.href="?page={{int(page)-1}}";
}) });
$('.forward:not(.fast)').click(function(){ $('.forward:not(.fast)').on('click', function(){
location.href="?page={{int(page)+1}}"; location.href="?page={{int(page)+1}}";
}) });
$('.fast.forward').click(function(){ $('.fast.forward').on('click', function(){
location.href="?page={{int(max_page)}}"; location.href="?page={{int(max_page)}}";
}) });
$('#serieseditor').click(function(){ $('#serieseditor').on('click', function(){
window.location = '{{base_url}}serieseditor'; window.location = '{{base_url}}serieseditor';
}) });
$('.modal') $('.modal')
.modal({ .modal({
autofocus: false autofocus: false
}) });
;
$('.config').on('click', function(){
$('.config').click(function(){ sessionStorage.scrolly=$(window).scrollTop();
sessionStorage.scrolly=$(window).scrollTop();
$('#series_form').attr('action', '{{base_url}}edit_series/' + $(this).data("no"));
$('#series_form').attr('action', '{{base_url}}edit_series/' + $(this).data("no"));
$("#series_title").html($(this).data("title"));
$("#series_title").html($(this).data("title")); $("#series_poster").attr("src", "{{base_url}}image_proxy" + $(this).data("poster"));
$("#series_poster").attr("src", "{{base_url}}image_proxy" + $(this).data("poster"));
$("#series_audio_language").html($(this).data("audio"));
$("#series_audio_language").html($(this).data("audio"));
$('#series_languages').dropdown('clear');
$('#series_languages').dropdown('clear'); const languages_array = eval($(this).data("languages"));
var languages_array = eval($(this).data("languages")); $('#series_languages').dropdown('set selected',languages_array);
$('#series_languages').dropdown('set selected',languages_array);
if ($(this).data("hearing-impaired") === "True") {
if ($(this).data("hearing-impaired") == "True") { $("#series_hearing-impaired_div").checkbox('check');
$("#series_hearing-impaired_div").checkbox('check'); } else {
} else { $("#series_hearing-impaired_div").checkbox('uncheck');
$("#series_hearing-impaired_div").checkbox('uncheck'); }
}
$('.small.modal').modal('show');
$('.small.modal').modal('show'); });
})
$('#series_languages').dropdown();
$('#series_languages').dropdown();
$('.progress').progress({
$('.progress').progress({ label: 'ratio',
label: 'ratio', text: {
text: { ratio: '{value} / {total}'
ratio: '{value} / {total}' },
}, showActivity: false
showActivity: false });
});
$( ".progress" ).each(function() {
$( ".progress" ).each(function() { if ($(this).progress('is complete') !== true) {
if ($(this).progress('is complete') != true) { $(this).addClass('yellow');
$(this).addClass('yellow'); }
} if ($(this).progress('get total') == 0) {
if ($(this).progress('get total') == 0) { $(this).progress('update progress', '99');
$(this).progress('update progress', '99'); $(this).addClass('grey disabled');
$(this).addClass('grey disabled'); $(this).progress('set bar label', '0 / 0');
$(this).progress('set bar label', '0 / 0'); }
} });
});
</script> </script>

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -23,8 +23,8 @@
} }
#fondblanc { #fondblanc {
background-color: #ffffff; background-color: #ffffff;
border-radius: 0px; border-radius: 0;
box-shadow: 0px 0px 5px 5px #ffffff; box-shadow: 0 0 5px 5px #ffffff;
margin-top: 32px; margin-top: 32px;
margin-bottom: 3em; margin-bottom: 3em;
padding: 2em 3em 2em 3em; padding: 2em 3em 2em 3em;
@ -32,9 +32,6 @@
#tableseries { #tableseries {
padding-top: 1em; padding-top: 1em;
} }
#divdetails {
min-height: 250px;
}
#bottommenu { #bottommenu {
background-color: #333333; background-color: #333333;
box-shadow: 0 0 10px 1px #333; box-shadow: 0 0 10px 1px #333;
@ -90,7 +87,7 @@
%end %end
%end %end
</td> </td>
<td>{{!"" if row[4] == None else row[4]}}</td> <td>{{!"" if row[4] is None else row[4]}}</td>
</tr> </tr>
%end %end
</tbody> </tbody>
@ -140,17 +137,16 @@
$('table').tablesort(); $('table').tablesort();
$('a, button').click(function(){ $('a, button').on('click', function(){
$('#loader').addClass('active'); $('#loader').addClass('active');
}) });
$('.modal') $('.modal')
.modal({ .modal({
autofocus: false autofocus: false
}) });
;
$('.selected').change(function() { $('.selected').on('change', function() {
$("#count").text($('.selected:checked').length); $("#count").text($('.selected:checked').length);
if ( $('.selected:checked').length > 0 ) { if ( $('.selected:checked').length > 0 ) {
$('.select').removeClass('disabled'); $('.select').removeClass('disabled');
@ -161,19 +157,19 @@
$('#save').addClass('disabled'); $('#save').addClass('disabled');
} }
var result = []; const result = [];
$('.selected:checked').each(function(i){ $('.selected:checked').each(function(i){
result.push($(this).attr('id')); result.push($(this).attr('id'));
}); });
$("#checked").val(result); $("#checked").val(result);
}); });
$('#selectall').change(function() { $('#selectall').on('change', function() {
if ( $('#selectall').is(":checked") ) { if ( $('#selectall').is(":checked") ) {
$('.selected').prop('checked', true).change(); $('.selected').prop('checked', true).trigger('change');
} }
else { else {
$('.selected').prop('checked', false).change(); $('.selected').prop('checked', false).trigger('change');
} }
}); });

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -23,8 +23,8 @@
} }
#fondblanc { #fondblanc {
background-color: #ffffff; background-color: #ffffff;
border-radius: 0px; border-radius: 0;
box-shadow: 0px 0px 5px 5px #ffffff; box-shadow: 0 0 5px 5px #ffffff;
margin-top: 32px; margin-top: 32px;
margin-bottom: 3em; margin-bottom: 3em;
padding: 1em; padding: 1em;
@ -115,7 +115,7 @@
</div> </div>
<div class="five wide column"> <div class="five wide column">
<div class="ui fluid input"> <div class="ui fluid input">
%if settings_general[2] == None: %if settings_general[2] is None:
% base_url = "/" % base_url = "/"
%else: %else:
% base_url = settings_general[2] % base_url = settings_general[2]
@ -1348,7 +1348,7 @@
<div class='field'> <div class='field'>
<div id="settings_notifier_{{notifier[0]}}_url_div" class="ui fluid input"> <div id="settings_notifier_{{notifier[0]}}_url_div" class="ui fluid input">
<input name="settings_notifier_{{notifier[0]}}_url" type="text" value="{{notifier[1] if notifier[1] != None else ''}}"> <input name="settings_notifier_{{notifier[0]}}_url" type="text" value="{{notifier[1] if notifier[1] != None else ''}}">
<div id="test_notification" class="ui blue button" data-notification="{{notifier[1]}}">Test Notification</div> <div class="test_notification ui blue button" data-notification="{{notifier[1]}}">Test Notification</div>
</div> </div>
</div> </div>
</div> </div>
@ -1365,9 +1365,9 @@
<script> <script>
$('#test_notification').click(function() { $('.test_notification').on('click', function() {
$.ajax({ $.ajax({
url: "{{base_url}}test_notification/" + $(this).data("notification"), url: "{{base_url}}test_notification/" + encodeURIComponent($(this).data("notification")),
beforeSend: function () { beforeSend: function () {
$('#loader').addClass('active'); $('#loader').addClass('active');
}, },
@ -1387,69 +1387,69 @@
.tab() .tab()
; ;
$('a:not(.tabs), button:not(.cancel, .test)').click(function(){ $('a:not(.tabs), button:not(.cancel, .test)').on('click', function(){
$('#loader').addClass('active'); $('#loader').addClass('active');
}) });
$('a[target="_blank"]').click(function(){ $('a[target="_blank"]').on('click', function(){
$('#loader').removeClass('active'); $('#loader').removeClass('active');
}) });
if ($('#sonarr_ssl_div').data("ssl") == "True") { if ($('#sonarr_ssl_div').data("ssl") === "True") {
$("#sonarr_ssl_div").checkbox('check'); $("#sonarr_ssl_div").checkbox('check');
} else { } else {
$("#sonarr_ssl_div").checkbox('uncheck'); $("#sonarr_ssl_div").checkbox('uncheck');
} }
if ($('#radarr_ssl_div').data("ssl") == "True") { if ($('#radarr_ssl_div').data("ssl") === "True") {
$("#radarr_ssl_div").checkbox('check'); $("#radarr_ssl_div").checkbox('check');
} else { } else {
$("#radarr_ssl_div").checkbox('uncheck'); $("#radarr_ssl_div").checkbox('uncheck');
} }
if ($('#settings_automatic_div').data("automatic") == "True") { if ($('#settings_automatic_div').data("automatic") === "True") {
$("#settings_automatic_div").checkbox('check'); $("#settings_automatic_div").checkbox('check');
} else { } else {
$("#settings_automatic_div").checkbox('uncheck'); $("#settings_automatic_div").checkbox('uncheck');
} }
if ($('#settings_debug').data("debug") == "True") { if ($('#settings_debug').data("debug") === "True") {
$("#settings_debug").checkbox('check'); $("#settings_debug").checkbox('check');
} else { } else {
$("#settings_debug").checkbox('uncheck'); $("#settings_debug").checkbox('uncheck');
} }
if ($('#settings_single_language').data("single-language") == "True") { if ($('#settings_single_language').data("single-language") === "True") {
$("#settings_single_language").checkbox('check'); $("#settings_single_language").checkbox('check');
} else { } else {
$("#settings_single_language").checkbox('uncheck'); $("#settings_single_language").checkbox('uncheck');
} }
if ($('#settings_scenename').data("scenename") == "True") { if ($('#settings_scenename').data("scenename") === "True") {
$("#settings_scenename").checkbox('check'); $("#settings_scenename").checkbox('check');
} else { } else {
$("#settings_scenename").checkbox('uncheck'); $("#settings_scenename").checkbox('uncheck');
} }
if ($('#settings_embedded').data("embedded") == "True") { if ($('#settings_embedded').data("embedded") === "True") {
$("#settings_embedded").checkbox('check'); $("#settings_embedded").checkbox('check');
} else { } else {
$("#settings_embedded").checkbox('uncheck'); $("#settings_embedded").checkbox('uncheck');
} }
if ($('#settings_only_monitored').data("monitored") == "True") { if ($('#settings_only_monitored').data("monitored") === "True") {
$("#settings_only_monitored").checkbox('check'); $("#settings_only_monitored").checkbox('check');
} else { } else {
$("#settings_only_monitored").checkbox('uncheck'); $("#settings_only_monitored").checkbox('uncheck');
} }
if ($('#settings_adaptive_searching').data("adaptive") == "True") { if ($('#settings_adaptive_searching').data("adaptive") === "True") {
$("#settings_adaptive_searching").checkbox('check'); $("#settings_adaptive_searching").checkbox('check');
} else { } else {
$("#settings_adaptive_searching").checkbox('uncheck'); $("#settings_adaptive_searching").checkbox('uncheck');
} }
if ($('#settings_use_postprocessing').data("postprocessing") == "True") { if ($('#settings_use_postprocessing').data("postprocessing") === "True") {
$("#settings_use_postprocessing").checkbox('check'); $("#settings_use_postprocessing").checkbox('check');
$("#settings_general_postprocessing_cmd_div").removeClass('disabled'); $("#settings_general_postprocessing_cmd_div").removeClass('disabled');
} else { } else {
@ -1457,7 +1457,7 @@
$("#settings_general_postprocessing_cmd_div").addClass('disabled'); $("#settings_general_postprocessing_cmd_div").addClass('disabled');
} }
$("#settings_use_postprocessing").change(function(i, obj) { $("#settings_use_postprocessing").on('change', function(i, obj) {
if ($("#settings_use_postprocessing").checkbox('is checked')) { if ($("#settings_use_postprocessing").checkbox('is checked')) {
$("#settings_general_postprocessing_cmd_div").removeClass('disabled'); $("#settings_general_postprocessing_cmd_div").removeClass('disabled');
} else { } else {
@ -1465,7 +1465,7 @@
} }
}); });
if ($('#settings_use_sonarr').data("enabled") == "True") { if ($('#settings_use_sonarr').data("enabled") === "True") {
$("#settings_use_sonarr").checkbox('check'); $("#settings_use_sonarr").checkbox('check');
$("#sonarr_tab").removeClass('disabled'); $("#sonarr_tab").removeClass('disabled');
} else { } else {
@ -1485,7 +1485,7 @@
} }
}); });
if ($('#settings_use_radarr').data("enabled") == "True") { if ($('#settings_use_radarr').data("enabled") === "True") {
$("#settings_use_radarr").checkbox('check'); $("#settings_use_radarr").checkbox('check');
$("#radarr_tab").removeClass('disabled'); $("#radarr_tab").removeClass('disabled');
} else { } else {
@ -1505,17 +1505,17 @@
} }
}); });
if ($('#settings_auth_type').val() == "None") { if ($('#settings_auth_type').val() === "None") {
$('.auth_option').hide(); $('.auth_option').hide();
}; }
$('#settings_auth_type').dropdown('setting', 'onChange', function(){ $('#settings_auth_type').dropdown('setting', 'onChange', function(){
if ($('#settings_auth_type').val() == "None") { if ($('#settings_auth_type').val() === "None") {
$('.auth_option').hide(); $('.auth_option').hide();
} }
else { else {
$('.auth_option').show(); $('.auth_option').show();
}; }
}); });
// Load default value for Settings_auth_type // Load default value for Settings_auth_type
@ -1523,8 +1523,8 @@
$('#settings_auth_type').dropdown('set selected','{{!settings_auth[0]}}'); $('#settings_auth_type').dropdown('set selected','{{!settings_auth[0]}}');
// Remove value from Password input when changing to Form login to prevent bad password saving // Remove value from Password input when changing to Form login to prevent bad password saving
$("#settings_auth_type").change(function() { $("#settings_auth_type").on('change', function() {
if ($(this).val() == 'form'){ if ($(this).val() === 'form'){
$('#settings_auth_password').val(''); $('#settings_auth_password').val('');
} }
else { else {
@ -1535,7 +1535,7 @@
$('#settings_languages').dropdown('setting', 'onAdd', function(val, txt){ $('#settings_languages').dropdown('setting', 'onAdd', function(val, txt){
$("#settings_serie_default_languages").append( $("#settings_serie_default_languages").append(
$("<option></option>").attr("value", val).text(txt) $("<option></option>").attr("value", val).text(txt)
) );
$("#settings_movie_default_languages").append( $("#settings_movie_default_languages").append(
$("<option></option>").attr("value", val).text(txt) $("<option></option>").attr("value", val).text(txt)
) )
@ -1549,13 +1549,13 @@
$("#settings_movie_default_languages option[value='" + val + "']").remove(); $("#settings_movie_default_languages option[value='" + val + "']").remove();
}); });
if ($('#settings_serie_default_enabled_div').data("enabled") == "True") { if ($('#settings_serie_default_enabled_div').data("enabled") === "True") {
$("#settings_serie_default_enabled_div").checkbox('check'); $("#settings_serie_default_enabled_div").checkbox('check');
} else { } else {
$("#settings_serie_default_enabled_div").checkbox('uncheck'); $("#settings_serie_default_enabled_div").checkbox('uncheck');
} }
if ($('#settings_serie_default_enabled_div').data("enabled") == "True") { if ($('#settings_serie_default_enabled_div').data("enabled") === "True") {
$("#settings_serie_default_languages").removeClass('disabled'); $("#settings_serie_default_languages").removeClass('disabled');
$("#settings_serie_default_hi_div").removeClass('disabled'); $("#settings_serie_default_hi_div").removeClass('disabled');
} else { } else {
@ -1574,19 +1574,19 @@
} }
}); });
if ($('#settings_serie_default_hi_div').data("hi") == "True") { if ($('#settings_serie_default_hi_div').data("hi") === "True") {
$("#settings_serie_default_hi_div").checkbox('check'); $("#settings_serie_default_hi_div").checkbox('check');
} else { } else {
$("#settings_serie_default_hi_div").checkbox('uncheck'); $("#settings_serie_default_hi_div").checkbox('uncheck');
} }
if ($('#settings_movie_default_enabled_div').data("enabled") == "True") { if ($('#settings_movie_default_enabled_div').data("enabled") === "True") {
$("#settings_movie_default_enabled_div").checkbox('check'); $("#settings_movie_default_enabled_div").checkbox('check');
} else { } else {
$("#settings_movie_default_enabled_div").checkbox('uncheck'); $("#settings_movie_default_enabled_div").checkbox('uncheck');
} }
if ($('#settings_movie_default_enabled_div').data("enabled") == "True") { if ($('#settings_movie_default_enabled_div').data("enabled") === "True") {
$("#settings_movie_default_languages").removeClass('disabled'); $("#settings_movie_default_languages").removeClass('disabled');
$("#settings_movie_default_hi_div").removeClass('disabled'); $("#settings_movie_default_hi_div").removeClass('disabled');
} else { } else {
@ -1605,7 +1605,7 @@
} }
}); });
if ($('#settings_movie_default_hi_div').data("hi") == "True") { if ($('#settings_movie_default_hi_div').data("hi") === "True") {
$("#settings_movie_default_hi_div").checkbox('check'); $("#settings_movie_default_hi_div").checkbox('check');
} else { } else {
$("#settings_movie_default_hi_div").checkbox('uncheck'); $("#settings_movie_default_hi_div").checkbox('uncheck');
@ -1623,7 +1623,7 @@
$("#settings_movie_default_languages").attr('multiple'); $("#settings_movie_default_languages").attr('multiple');
} }
$("#settings_single_language").change(function(i, obj) { $("#settings_single_language").on('change', function() {
if ($("#settings_single_language").checkbox('is checked')) { if ($("#settings_single_language").checkbox('is checked')) {
$("#settings_serie_default_languages").dropdown('clear'); $("#settings_serie_default_languages").dropdown('clear');
$("#settings_movie_default_languages").dropdown('clear'); $("#settings_movie_default_languages").dropdown('clear');
@ -1645,8 +1645,8 @@
} }
}); });
$('.notifier_enabled').each(function(i, obj) { $('.notifier_enabled').each(function() {
if ($(this).data("enabled") == 1) { if ($(this).data("enabled") === 1) {
$(this).checkbox('check'); $(this).checkbox('check');
$('[id=\"' + $(this).data("notifier-url-div") + '\"]').removeClass('disabled'); $('[id=\"' + $(this).data("notifier-url-div") + '\"]').removeClass('disabled');
} else { } else {
@ -1655,7 +1655,7 @@
} }
}); });
$('.notifier_enabled').change(function(i, obj) { $('.notifier_enabled').on('change', function() {
if ($(this).checkbox('is checked')) { if ($(this).checkbox('is checked')) {
$('[id=\"' + $(this).data("notifier-url-div") + '\"]').removeClass('disabled'); $('[id=\"' + $(this).data("notifier-url-div") + '\"]').removeClass('disabled');
} else { } else {
@ -1843,31 +1843,31 @@
}) })
; ;
if ($('#settings_proxy_type').val() == "None") { if ($('#settings_proxy_type').val() === "None") {
$('.proxy_option').hide(); $('.proxy_option').hide();
$('#settings_form').form('remove rule', 'settings_proxy_url', 'empty') $('#settings_form').form('remove rule', 'settings_proxy_url', 'empty');
$('#settings_form').form('remove rule', 'settings_proxy_port', 'empty') $('#settings_form').form('remove rule', 'settings_proxy_port', 'empty');
$('#settings_form').form('remove rule', 'settings_proxy_port', 'integer[1..65535]') $('#settings_form').form('remove rule', 'settings_proxy_port', 'integer[1..65535]');
} }
else { else {
$('#settings_form').form('add rule', 'settings_proxy_url', 'empty') $('#settings_form').form('add rule', 'settings_proxy_url', 'empty');
$('#settings_form').form('add rule', 'settings_proxy_port', 'empty') $('#settings_form').form('add rule', 'settings_proxy_port', 'empty');
$('#settings_form').form('add rule', 'settings_proxy_port', 'integer[1..65535]') $('#settings_form').form('add rule', 'settings_proxy_port', 'integer[1..65535]');
}; }
$('#settings_proxy_type').dropdown('setting', 'onChange', function(){ $('#settings_proxy_type').dropdown('setting', 'onChange', function(){
if ($('#settings_proxy_type').val() == "None") { if ($('#settings_proxy_type').val() === "None") {
$('.proxy_option').hide(); $('.proxy_option').hide();
$('#settings_form').form('remove rule', 'settings_proxy_url', 'empty') $('#settings_form').form('remove rule', 'settings_proxy_url', 'empty');
$('#settings_form').form('remove rule', 'settings_proxy_port', 'empty') $('#settings_form').form('remove rule', 'settings_proxy_port', 'empty');
$('#settings_form').form('remove rule', 'settings_proxy_port', 'integer[1..65535]') $('#settings_form').form('remove rule', 'settings_proxy_port', 'integer[1..65535]');
} }
else { else {
$('.proxy_option').show(); $('.proxy_option').show();
$('#settings_form').form('add rule', 'settings_proxy_url', 'empty') $('#settings_form').form('add rule', 'settings_proxy_url', 'empty');
$('#settings_form').form('add rule', 'settings_proxy_port', 'empty') $('#settings_form').form('add rule', 'settings_proxy_port', 'empty');
$('#settings_form').form('add rule', 'settings_proxy_port', 'integer[1..65535]') $('#settings_form').form('add rule', 'settings_proxy_port', 'integer[1..65535]');
}; }
}); });
$('#settings_providers').dropdown('setting', 'onChange', function(){ $('#settings_providers').dropdown('setting', 'onChange', function(){
@ -1877,33 +1877,33 @@
$('.form').form('validate field', 'settings_subliminal_languages'); $('.form').form('validate field', 'settings_subliminal_languages');
}); });
$('.submit').click(function() { $('.submit').on('click', function() {
alert('Settings saved.'); alert('Settings saved.');
}) });
$( document ).ready(function() { $(function() {
$('.form').form('validate form'); $('.form').form('validate form');
$('#loader').removeClass('active'); $('#loader').removeClass('active');
}); });
$('#settings_form').focusout(function() { $('#settings_form').on('focusout', function() {
$('.form').form('validate form'); $('.form').form('validate form');
$('#loader').removeClass('active'); $('#loader').removeClass('active');
}) });
$('#settings_auth_username').keyup(function() { $('#settings_auth_username').on('keyup', function() {
$('#settings_auth_password').val(''); $('#settings_auth_password').val('');
$('.form').form('validate form'); $('.form').form('validate form');
$('#loader').removeClass('active'); $('#loader').removeClass('active');
}) });
$('#sonarr_validate').click(function() { $('#sonarr_validate').on('click', function() {
if ($('#sonarr_ssl_div').checkbox('is checked')) { if ($('#sonarr_ssl_div').checkbox('is checked')) {
protocol = 'https'; protocol = 'https';
} else { } else {
protocol = 'http'; protocol = 'http';
} }
sonarr_url = $('#settings_sonarr_ip').val() + ":" + $('#settings_sonarr_port').val() + $('#settings_sonarr_baseurl').val().replace(/\/$/, "") + "/api/system/status?apikey=" + $('#settings_sonarr_apikey').val(); const sonarr_url = $('#settings_sonarr_ip').val() + ":" + $('#settings_sonarr_port').val() + $('#settings_sonarr_baseurl').val().replace(/\/$/, "") + "/api/system/status?apikey=" + $('#settings_sonarr_apikey').val();
$.getJSON("{{base_url}}test_url/" + protocol + "/" + encodeURIComponent(sonarr_url), function (data) { $.getJSON("{{base_url}}test_url/" + protocol + "/" + encodeURIComponent(sonarr_url), function (data) {
if (data.status) { if (data.status) {
@ -1918,31 +1918,31 @@
$('#loader').removeClass('active'); $('#loader').removeClass('active');
} }
}); });
}) });
$('.sonarr_config').keyup(function() { $('.sonarr_config').on('keyup', function() {
$('#sonarr_validated').checkbox('uncheck'); $('#sonarr_validated').checkbox('uncheck');
$('#sonarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red'); $('#sonarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red');
$('.form').form('validate form'); $('.form').form('validate form');
$('#loader').removeClass('active'); $('#loader').removeClass('active');
}) });
$('#settings_sonarr_ssl').change(function() { $('#settings_sonarr_ssl').on('change', function() {
$('#sonarr_validated').checkbox('uncheck'); $('#sonarr_validated').checkbox('uncheck');
$('#sonarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red'); $('#sonarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red');
$('.form').form('validate form'); $('.form').form('validate form');
$('#loader').removeClass('active'); $('#loader').removeClass('active');
}) });
$("#sonarr_validated").checkbox('check'); $("#sonarr_validated").checkbox('check');
$('#radarr_validate').click(function() { $('#radarr_validate').on('click', function() {
if ($('#radarr_ssl_div').checkbox('is checked')) { if ($('#radarr_ssl_div').checkbox('is checked')) {
protocol = 'https'; protocol = 'https';
} else { } else {
protocol = 'http'; protocol = 'http';
} }
radarr_url = $('#settings_radarr_ip').val() + ":" + $('#settings_radarr_port').val() + $('#settings_radarr_baseurl').val().replace(/\/$/, "") + "/api/system/status?apikey=" + $('#settings_radarr_apikey').val(); const radarr_url = $('#settings_radarr_ip').val() + ":" + $('#settings_radarr_port').val() + $('#settings_radarr_baseurl').val().replace(/\/$/, "") + "/api/system/status?apikey=" + $('#settings_radarr_apikey').val();
$.getJSON("{{base_url}}test_url/" + protocol + "/" + encodeURIComponent(radarr_url), function (data) { $.getJSON("{{base_url}}test_url/" + protocol + "/" + encodeURIComponent(radarr_url), function (data) {
if (data.status) { if (data.status) {
@ -1957,21 +1957,21 @@
$('#loader').removeClass('active'); $('#loader').removeClass('active');
} }
}); });
}) });
$('.radarr_config').keyup(function() { $('.radarr_config').on('keyup', function() {
$('#radarr_validated').checkbox('uncheck'); $('#radarr_validated').checkbox('uncheck');
$('#radarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red'); $('#radarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red');
$('.form').form('validate form'); $('.form').form('validate form');
$('#loader').removeClass('active'); $('#loader').removeClass('active');
}) });
$('#settings_radarr_ssl').change(function() { $('#settings_radarr_ssl').on('change', function() {
$('#radarr_validated').checkbox('uncheck'); $('#radarr_validated').checkbox('uncheck');
$('#radarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red'); $('#radarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red');
$('.form').form('validate form'); $('.form').form('validate form');
$('#loader').removeClass('active'); $('#loader').removeClass('active');
}) });
$("#radarr_validated").checkbox('check'); $("#radarr_validated").checkbox('check');
</script> </script>

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -23,8 +23,8 @@
} }
#fondblanc { #fondblanc {
background-color: #ffffff; background-color: #ffffff;
border-radius: 0px; border-radius: 0;
box-shadow: 0px 0px 5px 5px #ffffff; box-shadow: 0 0 5px 5px #ffffff;
margin-top: 32px; margin-top: 32px;
margin-bottom: 3em; margin-bottom: 3em;
padding: 1em; padding: 1em;
@ -50,7 +50,7 @@
<div id="shutdown" class="ui icon button" data-tooltip="Shutdown" data-inverted=""><i class="red power off icon"></i></div> <div id="shutdown" class="ui icon button" data-tooltip="Shutdown" data-inverted=""><i class="red power off icon"></i></div>
<div id="restart" class="ui icon button" data-tooltip="Restart" data-inverted=""><i class="redo alternate icon"></i></div> <div id="restart" class="ui icon button" data-tooltip="Restart" data-inverted=""><i class="redo alternate icon"></i></div>
% from get_settings import get_auth_settings % from get_settings import get_auth_settings
% if get_auth_settings()[0] != 'None': % if get_auth_settings()[0] is not 'None':
<div id="logout" class="ui icon button" data-tooltip="Logout" data-inverted=""><i class="sign-out icon"></i></div> <div id="logout" class="ui icon button" data-tooltip="Logout" data-inverted=""><i class="sign-out icon"></i></div>
% end % end
</div> </div>
@ -225,7 +225,7 @@
<div class="five wide column"> <div class="five wide column">
<div class='field'> <div class='field'>
<div class="ui fluid input"> <div class="ui fluid input">
<i class="github icon"></i><a href="https://github.com/morpheus65535/bazarr">Bazarr on GitHub</a> <i class="github icon"></i><a href="https://github.com/morpheus65535/bazarr" target="_blank">Bazarr on GitHub</a>
</div> </div>
</div> </div>
</div> </div>
@ -237,7 +237,7 @@
<div class="five wide column"> <div class="five wide column">
<div class='field'> <div class='field'>
<div class="ui fluid input"> <div class="ui fluid input">
<i class="wikipedia w icon"></i><a href="https://github.com/morpheus65535/bazarr/wiki">Bazarr Wiki</a> <i class="wikipedia w icon"></i><a href="https://github.com/morpheus65535/bazarr/wiki" target="_blank">Bazarr Wiki</a>
</div> </div>
</div> </div>
</div> </div>
@ -249,7 +249,7 @@
<div class="five wide column"> <div class="five wide column">
<div class='field'> <div class='field'>
<div class="ui fluid input"> <div class="ui fluid input">
<i class="discord icon"></i><a href="https://discord.gg/MH2e2eb">Bazarr on Discord</a> <i class="discord icon"></i><a href="https://discord.gg/MH2e2eb" target="_blank">Bazarr on Discord</a>
</div> </div>
</div> </div>
</div> </div>
@ -292,8 +292,7 @@
<script> <script>
$('.menu .item') $('.menu .item')
.tab() .tab();
;
function loadURL(page) { function loadURL(page) {
$.ajax({ $.ajax({
@ -322,40 +321,44 @@
loadURL(1); loadURL(1);
$('.backward').click(function(){ $('.backward').on('click', function(){
loadURL(current_page - 1); loadURL(current_page - 1);
}) });
$('.fast.backward').click(function(){ $('.fast.backward').on('click', function(){
loadURL(1); loadURL(1);
}) });
$('.forward').click(function(){ $('.forward').on('click', function(){
loadURL(current_page + 1); loadURL(current_page + 1);
}) });
$('.fast.forward').click(function(){ $('.fast.forward').on('click', function(){
loadURL({{int(max_page)}}); loadURL({{int(max_page)}});
}) });
$('#refresh_log').click(function(){ $('#refresh_log').on('click', function(){
loadURL(current_page); loadURL(current_page);
}) });
$('#download_log').click(function(){ $('#download_log').on('click', function(){
window.location = '{{base_url}}bazarr.log'; window.location = '{{base_url}}bazarr.log';
}) });
$('#empty_log').click(function(){ $('#empty_log').on('click', function(){
window.location = '{{base_url}}emptylog'; window.location = '{{base_url}}emptylog';
}) });
$('.execute').click(function(){ $('.execute').on('click', function(){
window.location = '{{base_url}}execute/' + $(this).data("taskid"); window.location = '{{base_url}}execute/' + $(this).data("taskid");
}) });
$('a:not(.tabs), button:not(.cancel, #download_log), #restart').click(function(){ $('a:not(.tabs), button:not(.cancel, #download_log), #restart').on('click', function(){
$('#loader').addClass('active'); $('#loader').addClass('active');
}) });
$('#shutdown').click(function(){ $('a[target="_blank"]').on('click', function(){
$('#loader').removeClass('active');
});
$('#shutdown').on('click', function(){
$.ajax({ $.ajax({
url: "{{base_url}}shutdown", url: "{{base_url}}shutdown",
async: false async: false
@ -365,13 +368,13 @@
document.write('Bazarr has shutdown.'); document.write('Bazarr has shutdown.');
document.close(); document.close();
}); });
}) });
$('#logout').click(function(){ $('#logout').on('click', function(){
window.location = '{{base_url}}logout'; window.location = '{{base_url}}logout';
}) });
$('#restart').click(function(){ $('#restart').on('click', function(){
$('#loader_text').text("Bazarr is restarting, please wait..."); $('#loader_text').text("Bazarr is restarting, please wait...");
$.ajax({ $.ajax({
url: "{{base_url}}restart", url: "{{base_url}}restart",
@ -379,7 +382,7 @@
}) })
.done(function(){ .done(function(){
setTimeout(function(){ setInterval(ping, 2000); },8000); setTimeout(function(){ setInterval(ping, 2000); },8000);
}); })
}); });
% from get_settings import get_general_settings % from get_settings import get_general_settings
@ -387,7 +390,7 @@
% port = get_general_settings()[1] % port = get_general_settings()[1]
% base_url = get_general_settings()[2] % base_url = get_general_settings()[2]
if ("{{ip}}" == "0.0.0.0") { if ("{{ip}}" === "0.0.0.0") {
public_ip = window.location.hostname; public_ip = window.location.hostname;
} else { } else {
public_ip = "{{ip}}"; public_ip = "{{ip}}";
@ -395,7 +398,7 @@
protocol = window.location.protocol; protocol = window.location.protocol;
if (window.location.port == '{{current_port}}') { if (window.location.port === '{{current_port}}') {
public_port = '{{port}}'; public_port = '{{port}}';
} else { } else {
public_port = window.location.port; public_port = window.location.port;

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -23,24 +23,12 @@
} }
#fondblanc { #fondblanc {
background-color: #ffffff; background-color: #ffffff;
border-radius: 0px; border-radius: 0;
box-shadow: 0px 0px 5px 5px #ffffff; box-shadow: 0 0 5px 5px #ffffff;
margin-top: 32px; margin-top: 32px;
margin-bottom: 3em; margin-bottom: 3em;
padding: 1em; padding: 1em;
} }
#logs {
margin-top: 4em;
}
.fast.backward, .backward, .forward, .fast.forward {
cursor: pointer;
}
.fast.backward, .backward, .forward, .fast.forward { pointer-events: auto; }
.fast.backward.disabled, .backward.disabled, .forward.disabled, .fast.forward.disabled { pointer-events: none; }
.ui.tabular.menu > .disabled.item {
opacity: 0.45 !important;
pointer-events: none !important;
}
</style> </style>
</head> </head>
<body> <body>
@ -50,13 +38,13 @@
% import sqlite3 % import sqlite3
% from get_settings import get_general_settings % from get_settings import get_general_settings
%if get_general_settings()[24] is True: %if get_general_settings()[24]:
% monitored_only_query_string = ' AND monitored = "True"' % monitored_only_query_string = ' AND monitored = "True"'
%else: %else:
% monitored_only_query_string = "" % monitored_only_query_string = ""
%end %end
% conn = sqlite3.connect(os.path.join(config_dir, 'db/bazarr.db'), timeout=30) % conn = sqlite3.connect(os.path.join(config_dir, 'db', 'bazarr.db'), timeout=30)
% c = conn.cursor() % c = conn.cursor()
% wanted_series = c.execute("SELECT COUNT(*) FROM table_episodes WHERE missing_subtitles != '[]'" + monitored_only_query_string).fetchone() % wanted_series = c.execute("SELECT COUNT(*) FROM table_episodes WHERE missing_subtitles != '[]'" + monitored_only_query_string).fetchone()
% wanted_movies = c.execute("SELECT COUNT(*) FROM table_movies WHERE missing_subtitles != '[]'" + monitored_only_query_string).fetchone() % wanted_movies = c.execute("SELECT COUNT(*) FROM table_movies WHERE missing_subtitles != '[]'" + monitored_only_query_string).fetchone()
@ -103,13 +91,13 @@
.tab() .tab()
; ;
$('#series_tab').click(function() { $('#series_tab').on('click', function() {
loadURLseries(1); loadURLseries(1);
}) });
$('#movies_tab').click(function() { $('#movies_tab').on('click', function() {
loadURLmovies(1); loadURLmovies(1);
}) });
function loadURLseries(page) { function loadURLseries(page) {
$.ajax({ $.ajax({
@ -133,25 +121,25 @@
}); });
} }
$('a:not(.tabs), button:not(.cancel, #download_log)').click(function(){ $('a:not(.tabs), button:not(.cancel, #download_log)').on('click', function(){
$('#loader').addClass('active'); $('#loader').addClass('active');
}) });
if ($('#series_tab').data("enabled") == "True") { if ($('#series_tab').data("enabled") === "True") {
$("#series_tab").removeClass('disabled'); $("#series_tab").removeClass('disabled');
} else { } else {
$("#series_tab").addClass('disabled'); $("#series_tab").addClass('disabled');
} }
if ($('#movies_tab').data("enabled") == "True") { if ($('#movies_tab').data("enabled") === "True") {
$("#movies_tab").removeClass('disabled'); $("#movies_tab").removeClass('disabled');
} else { } else {
$("#movies_tab").addClass('disabled'); $("#movies_tab").addClass('disabled');
} }
if ($('#series_tab').data("enabled") == "True") { if ($('#series_tab').data("enabled") === "True") {
$( "#series_tab" ).trigger( "click" ); $( "#series_tab" ).trigger( "click" );
} }
if ($('#series_tab').data("enabled") == "False" && $('#movies_tab').data("enabled") == "True") { if ($('#series_tab').data("enabled") === "False" && $('#movies_tab').data("enabled") === "True") {
$( "#movies_tab" ).trigger( "click" ); $( "#movies_tab" ).trigger( "click" );
} }
</script> </script>

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -21,14 +21,6 @@
body { body {
background-color: #272727; background-color: #272727;
} }
#fondblanc {
background-color: #ffffff;
border-radius: 0px;
box-shadow: 0px 0px 5px 5px #ffffff;
margin-top: 32px;
margin-bottom: 3em;
padding: 2em 3em 2em 3em;
}
#tablehistory { #tablehistory {
padding-top: 2em; padding-top: 2em;
} }
@ -83,12 +75,12 @@
%> %>
<a data-moviePath="{{row[3]}}" data-sceneName="{{row[5]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{row[4]}}" data-radarrId={{row[2]}} class="get_subtitle ui tiny label"> <a data-moviePath="{{row[3]}}" data-sceneName="{{row[5]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{row[4]}}" data-radarrId={{row[2]}} class="get_subtitle ui tiny label">
{{language}} {{language}}
<i style="margin-left:3px; margin-right:0px" class="search icon"></i> <i style="margin-left:3px; margin-right:0" class="search icon"></i>
</a> </a>
%else: %else:
<a data-tooltip="Automatic searching delayed (adaptive search)" data-position="top right" data-inverted="" data-moviePath="{{row[3]}}" data-sceneName="{{row[5]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{row[4]}}" data-radarrId={{row[2]}} class="get_subtitle ui tiny label"> <a data-tooltip="Automatic searching delayed (adaptive search)" data-position="top right" data-inverted="" data-moviePath="{{row[3]}}" data-sceneName="{{row[5]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{row[4]}}" data-radarrId={{row[2]}} class="get_subtitle ui tiny label">
{{language}} {{language}}
<i style="margin-left:3px; margin-right:0px" class="search red icon"></i> <i style="margin-left:3px; margin-right:0" class="search red icon"></i>
</a> </a>
%end %end
%end %end
@ -96,7 +88,7 @@
%else: %else:
<a data-moviePath="{{row[3]}}" data-sceneName="{{row[5]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{row[4]}}" data-radarrId={{row[2]}} class="get_subtitle ui tiny label"> <a data-moviePath="{{row[3]}}" data-sceneName="{{row[5]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{row[4]}}" data-radarrId={{row[2]}} class="get_subtitle ui tiny label">
{{language}} {{language}}
<i style="margin-left:3px; margin-right:0px" class="search icon"></i> <i style="margin-left:3px; margin-right:0" class="search icon"></i>
</a> </a>
%end %end
@ -147,30 +139,30 @@
<script> <script>
$('a, button').click(function(){ $('a, button').on('click', function(){
$('#loader').addClass('active'); $('#loader').addClass('active');
}) });
$('.fast.backward').click(function(){ $('.fast.backward').on('click', function(){
loadURLmovies(1); loadURLmovies(1);
}) });
$('.backward:not(.fast)').click(function(){ $('.backward:not(.fast)').on('click', function(){
loadURLmovies({{int(page)-1}}); loadURLmovies({{int(page)-1}});
}) });
$('.forward:not(.fast)').click(function(){ $('.forward:not(.fast)').on('click', function(){
loadURLmovies({{int(page)+1}}); loadURLmovies({{int(page)+1}});
}) });
$('.fast.forward').click(function(){ $('.fast.forward').on('click', function(){
loadURLmovies({{int(max_page)}}); loadURLmovies({{int(max_page)}});
}) });
$('#wanted_search_missing_subtitles_movies').click(function(){ $('#wanted_search_missing_subtitles_movies').on('click', function(){
$('#loader_text').text("Searching for missing subtitles..."); $('#loader_text').text("Searching for missing subtitles...");
window.location = '{{base_url}}wanted_search_missing_subtitles'; window.location = '{{base_url}}wanted_search_missing_subtitles';
}) });
$('.get_subtitle').click(function(){ $('.get_subtitle').on('click', function(){
var values = { const values = {
moviePath: $(this).attr("data-moviePath"), moviePath: $(this).attr("data-moviePath"),
sceneName: $(this).attr("data-sceneName"), sceneName: $(this).attr("data-sceneName"),
language: $(this).attr("data-language"), language: $(this).attr("data-language"),

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -21,14 +21,6 @@
body { body {
background-color: #272727; background-color: #272727;
} }
#fondblanc {
background-color: #ffffff;
border-radius: 0px;
box-shadow: 0px 0px 5px 5px #ffffff;
margin-top: 32px;
margin-bottom: 3em;
padding: 2em 3em 2em 3em;
}
#tablehistory { #tablehistory {
padding-top: 2em; padding-top: 2em;
} }
@ -90,12 +82,12 @@
%> %>
<a data-episodePath="{{row[5]}}" data-sceneName="{{row[8]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{row[6]}}" data-sonarrSeriesId={{row[4]}} data-sonarrEpisodeId={{row[7]}} class="get_subtitle ui tiny label"> <a data-episodePath="{{row[5]}}" data-sceneName="{{row[8]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{row[6]}}" data-sonarrSeriesId={{row[4]}} data-sonarrEpisodeId={{row[7]}} class="get_subtitle ui tiny label">
{{language}} {{language}}
<i style="margin-left:3px; margin-right:0px" class="search icon"></i> <i style="margin-left:3px; margin-right:0" class="search icon"></i>
</a> </a>
%else: %else:
<a data-tooltip="Automatic searching delayed (adaptive search)" data-position="top right" data-inverted="" data-episodePath="{{row[5]}}" data-sceneName="{{row[8]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{row[6]}}" data-sonarrSeriesId={{row[4]}} data-sonarrEpisodeId={{row[7]}} class="get_subtitle ui tiny label"> <a data-tooltip="Automatic searching delayed (adaptive search)" data-position="top right" data-inverted="" data-episodePath="{{row[5]}}" data-sceneName="{{row[8]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{row[6]}}" data-sonarrSeriesId={{row[4]}} data-sonarrEpisodeId={{row[7]}} class="get_subtitle ui tiny label">
{{language}} {{language}}
<i style="margin-left:3px; margin-right:0px" class="search red icon"></i> <i style="margin-left:3px; margin-right:0" class="search red icon"></i>
</a> </a>
%end %end
%end %end
@ -103,7 +95,7 @@
%else: %else:
<a data-episodePath="{{row[5]}}" data-sceneName="{{row[8]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{row[6]}}" data-sonarrSeriesId={{row[4]}} data-sonarrEpisodeId={{row[7]}} class="get_subtitle ui tiny label"> <a data-episodePath="{{row[5]}}" data-sceneName="{{row[8]}}" data-language="{{alpha3_from_alpha2(str(language))}}" data-hi="{{row[6]}}" data-sonarrSeriesId={{row[4]}} data-sonarrEpisodeId={{row[7]}} class="get_subtitle ui tiny label">
{{language}} {{language}}
<i style="margin-left:3px; margin-right:0px" class="search icon"></i> <i style="margin-left:3px; margin-right:0" class="search icon"></i>
</a> </a>
%end %end
@ -154,30 +146,30 @@
<script> <script>
$('a, button').click(function(){ $('a, button').on('click', function(){
$('#loader').addClass('active'); $('#loader').addClass('active');
}) });
$('.fast.backward').click(function(){ $('.fast.backward').on('click', function(){
loadURLseries(1); loadURLseries(1);
}) });
$('.backward:not(.fast)').click(function(){ $('.backward:not(.fast)').on('click', function(){
loadURLseries({{int(page)-1}}); loadURLseries({{int(page)-1}});
}) });
$('.forward:not(.fast)').click(function(){ $('.forward:not(.fast)').on('click', function(){
loadURLseries({{int(page)+1}}); loadURLseries({{int(page)+1}});
}) });
$('.fast.forward').click(function(){ $('.fast.forward').on('click', function(){
loadURLseries({{int(max_page)}}); loadURLseries({{int(max_page)}});
}) });
$('#wanted_search_missing_subtitles').click(function(){ $('#wanted_search_missing_subtitles').on('click', function(){
$('#loader_text').text("Searching for missing subtitles..."); $('#loader_text').text("Searching for missing subtitles...");
window.location = '{{base_url}}wanted_search_missing_subtitles'; window.location = '{{base_url}}wanted_search_missing_subtitles';
}) });
$('.get_subtitle').click(function(){ $('.get_subtitle').on('click', function(){
var values = { const values = {
episodePath: $(this).attr("data-episodePath"), episodePath: $(this).attr("data-episodePath"),
sceneName: $(this).attr("data-sceneName"), sceneName: $(this).attr("data-sceneName"),
language: $(this).attr("data-language"), language: $(this).attr("data-language"),

@ -1,4 +1,4 @@
<html> <html lang="en">
<head> <head>
<!DOCTYPE html> <!DOCTYPE html>
<script src="{{base_url}}static/jquery/jquery-latest.min.js"></script> <script src="{{base_url}}static/jquery/jquery-latest.min.js"></script>
@ -24,8 +24,8 @@
} }
#fondblanc { #fondblanc {
background-color: #ffffff; background-color: #ffffff;
border-radius: 0px; border-radius: 0;
box-shadow: 0px 0px 5px 5px #ffffff; box-shadow: 0 0 5px 5px #ffffff;
margin-top: 32px; margin-top: 32px;
margin-bottom: 3em; margin-bottom: 3em;
padding: 1em; padding: 1em;
@ -791,9 +791,9 @@
</html> </html>
<script> <script>
$(document).ready(function() { $(function() {
$('.next1').click(function(e) { $('.next1').on('click', function(e) {
e.preventDefault(); e.preventDefault();
@ -805,7 +805,7 @@ $(document).ready(function() {
}); });
$('.prev1').click(function(m) { $('.prev1').on('click', function(m) {
m.preventDefault(); m.preventDefault();
@ -817,7 +817,7 @@ $(document).ready(function() {
}); });
$('.next2').click(function(e) { $('.next2').on('click', function(e) {
e.preventDefault(); e.preventDefault();
@ -829,7 +829,7 @@ $(document).ready(function() {
}); });
$('.prev2').click(function(m) { $('.prev2').on('click', function(m) {
m.preventDefault(); m.preventDefault();
@ -841,7 +841,7 @@ $(document).ready(function() {
}); });
$('.next3').click(function(e) { $('.next3').on('click', function(e) {
e.preventDefault(); e.preventDefault();
@ -853,7 +853,7 @@ $(document).ready(function() {
}); });
$('.prev3').click(function(m) { $('.prev3').on('click', function(m) {
m.preventDefault(); m.preventDefault();
@ -866,9 +866,7 @@ $(document).ready(function() {
}); });
}); });
</script>
<script>
$(".sonarr_hide").hide(); $(".sonarr_hide").hide();
$('#settings_use_sonarr').checkbox({ $('#settings_use_sonarr').checkbox({
onChecked: function() { onChecked: function() {
@ -889,19 +887,19 @@ $(document).ready(function() {
} }
}); });
if ($('#sonarr_ssl_div').data("ssl") == "True") { if ($('#sonarr_ssl_div').data("ssl") === "True") {
$("#sonarr_ssl_div").checkbox('check'); $("#sonarr_ssl_div").checkbox('check');
} else { } else {
$("#sonarr_ssl_div").checkbox('uncheck'); $("#sonarr_ssl_div").checkbox('uncheck');
} }
if ($('#radarr_ssl_div').data("ssl") == "True") { if ($('#radarr_ssl_div').data("ssl") === "True") {
$("#radarr_ssl_div").checkbox('check'); $("#radarr_ssl_div").checkbox('check');
} else { } else {
$("#radarr_ssl_div").checkbox('uncheck'); $("#radarr_ssl_div").checkbox('uncheck');
} }
if ($('#settings_single_language').data("single-language") == "True") { if ($('#settings_single_language').data("single-language") === "True") {
$("#settings_single_language").checkbox('check'); $("#settings_single_language").checkbox('check');
} else { } else {
$("#settings_single_language").checkbox('uncheck'); $("#settings_single_language").checkbox('uncheck');
@ -910,13 +908,13 @@ $(document).ready(function() {
$('#settings_languages').dropdown('setting', 'onAdd', function(val, txt){ $('#settings_languages').dropdown('setting', 'onAdd', function(val, txt){
$("#settings_serie_default_languages").append( $("#settings_serie_default_languages").append(
$("<option></option>").attr("value", val).text(txt) $("<option></option>").attr("value", val).text(txt)
) );
$("#settings_movie_default_languages").append( $("#settings_movie_default_languages").append(
$("<option></option>").attr("value", val).text(txt) $("<option></option>").attr("value", val).text(txt)
) )
}); });
$('#settings_languages').dropdown('setting', 'onRemove', function(val, txt){ $('#settings_languages').dropdown('setting', 'onRemove', function(val){
$("#settings_serie_default_languages").dropdown('remove selected', val); $("#settings_serie_default_languages").dropdown('remove selected', val);
$("#settings_serie_default_languages option[value='" + val + "']").remove(); $("#settings_serie_default_languages option[value='" + val + "']").remove();
@ -924,13 +922,13 @@ $(document).ready(function() {
$("#settings_movie_default_languages option[value='" + val + "']").remove(); $("#settings_movie_default_languages option[value='" + val + "']").remove();
}); });
if ($('#settings_serie_default_enabled_div').data("enabled") == "True") { if ($('#settings_serie_default_enabled_div').data("enabled") === "True") {
$("#settings_serie_default_enabled_div").checkbox('check'); $("#settings_serie_default_enabled_div").checkbox('check');
} else { } else {
$("#settings_serie_default_enabled_div").checkbox('uncheck'); $("#settings_serie_default_enabled_div").checkbox('uncheck');
} }
if ($('#settings_serie_default_enabled_div').data("enabled") == "True") { if ($('#settings_serie_default_enabled_div').data("enabled") === "True") {
$("#settings_serie_default_languages").removeClass('disabled'); $("#settings_serie_default_languages").removeClass('disabled');
$("#settings_serie_default_hi_div").removeClass('disabled'); $("#settings_serie_default_hi_div").removeClass('disabled');
} else { } else {
@ -949,19 +947,19 @@ $(document).ready(function() {
} }
}); });
if ($('#settings_serie_default_hi_div').data("hi") == "True") { if ($('#settings_serie_default_hi_div').data("hi") === "True") {
$("#settings_serie_default_hi_div").checkbox('check'); $("#settings_serie_default_hi_div").checkbox('check');
} else { } else {
$("#settings_serie_default_hi_div").checkbox('uncheck'); $("#settings_serie_default_hi_div").checkbox('uncheck');
} }
if ($('#settings_movie_default_enabled_div').data("enabled") == "True") { if ($('#settings_movie_default_enabled_div').data("enabled") === "True") {
$("#settings_movie_default_enabled_div").checkbox('check'); $("#settings_movie_default_enabled_div").checkbox('check');
} else { } else {
$("#settings_movie_default_enabled_div").checkbox('uncheck'); $("#settings_movie_default_enabled_div").checkbox('uncheck');
} }
if ($('#settings_movie_default_enabled_div').data("enabled") == "True") { if ($('#settings_movie_default_enabled_div').data("enabled") === "True") {
$("#settings_movie_default_languages").removeClass('disabled'); $("#settings_movie_default_languages").removeClass('disabled');
$("#settings_movie_default_hi_div").removeClass('disabled'); $("#settings_movie_default_hi_div").removeClass('disabled');
} else { } else {
@ -980,7 +978,7 @@ $(document).ready(function() {
} }
}); });
if ($('#settings_movie_default_hi_div').data("hi") == "True") { if ($('#settings_movie_default_hi_div').data("hi") === "True") {
$("#settings_movie_default_hi_div").checkbox('check'); $("#settings_movie_default_hi_div").checkbox('check');
} else { } else {
$("#settings_movie_default_hi_div").checkbox('uncheck'); $("#settings_movie_default_hi_div").checkbox('uncheck');
@ -998,7 +996,7 @@ $(document).ready(function() {
$("#settings_movie_default_languages").attr('multiple'); $("#settings_movie_default_languages").attr('multiple');
} }
$("#settings_single_language").change(function(i, obj) { $("#settings_single_language").on('change', function() {
if ($("#settings_single_language").checkbox('is checked')) { if ($("#settings_single_language").checkbox('is checked')) {
$("#settings_serie_default_languages").dropdown('clear'); $("#settings_serie_default_languages").dropdown('clear');
$("#settings_movie_default_languages").dropdown('clear'); $("#settings_movie_default_languages").dropdown('clear');
@ -1035,9 +1033,7 @@ $(document).ready(function() {
%if settings_general[19] is not None: %if settings_general[19] is not None:
$('#settings_movie_default_languages').dropdown('set selected',{{!settings_general[19]}}); $('#settings_movie_default_languages').dropdown('set selected',{{!settings_general[19]}});
%end %end
</script>
<script>
// form validation // form validation
$('#wizard_form') $('#wizard_form')
.form({ .form({
@ -1179,7 +1175,6 @@ $(document).ready(function() {
$('.prev3').removeClass('disabled'); $('.prev3').removeClass('disabled');
$('.next2').removeClass('disabled'); $('.next2').removeClass('disabled');
$('.next3').removeClass('disabled'); $('.next3').removeClass('disabled');
$('#loader').addClass('active');
} }
}) })
; ;
@ -1191,18 +1186,18 @@ $(document).ready(function() {
$('.form').form('validate field', 'settings_subliminal_languages'); $('.form').form('validate field', 'settings_subliminal_languages');
}); });
$( document ).ready(function() { $(function() {
$('.form').form('validate form'); $('.form').form('validate form');
$('#loader').removeClass('active'); $('#loader').removeClass('active');
}); });
$('#wizard_form').focusout(function() { $('#wizard_form').on('focusout', function() {
$('.form').form('validate form'); $('.form').form('validate form');
$('#loader').removeClass('active'); $('#loader').removeClass('active');
}) });
$('#sonarr_validate').click(function() { $('#sonarr_validate').on('click', function() {
if ($('#sonarr_ssl_div').checkbox('is checked')) { if ($('#sonarr_ssl_div').checkbox('is checked')) {
protocol = 'https'; protocol = 'https';
} else { } else {
@ -1223,25 +1218,25 @@ $(document).ready(function() {
$('#loader').removeClass('active'); $('#loader').removeClass('active');
} }
}); });
}) });
$('.sonarr_config').keyup(function() { $('.sonarr_config').on('keyup', function() {
$('#sonarr_validated').checkbox('uncheck'); $('#sonarr_validated').checkbox('uncheck');
$('#sonarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red'); $('#sonarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red');
$('.form').form('validate form'); $('.form').form('validate form');
$('#loader').removeClass('active'); $('#loader').removeClass('active');
}) });
$('#settings_sonarr_ssl').change(function() { $('#settings_sonarr_ssl').on('change', function() {
$('#sonarr_validated').checkbox('uncheck'); $('#sonarr_validated').checkbox('uncheck');
$('#sonarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red'); $('#sonarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red');
$('.form').form('validate form'); $('.form').form('validate form');
$('#loader').removeClass('active'); $('#loader').removeClass('active');
}) });
$("#sonarr_validated").checkbox('check'); $("#sonarr_validated").checkbox('check');
$('#radarr_validate').click(function() { $('#radarr_validate').on('click', function() {
if ($('#radarr_ssl_div').checkbox('is checked')) { if ($('#radarr_ssl_div').checkbox('is checked')) {
protocol = 'https'; protocol = 'https';
} else { } else {
@ -1262,21 +1257,21 @@ $(document).ready(function() {
$('#loader').removeClass('active'); $('#loader').removeClass('active');
} }
}); });
}) });
$('.radarr_config').keyup(function() { $('.radarr_config').on('keyup', function() {
$('#radarr_validated').checkbox('uncheck'); $('#radarr_validated').checkbox('uncheck');
$('#radarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red'); $('#radarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red');
$('.form').form('validate form'); $('.form').form('validate form');
$('#loader').removeClass('active'); $('#loader').removeClass('active');
}) });
$('#settings_radarr_ssl').change(function() { $('#settings_radarr_ssl').on('change', function() {
$('#radarr_validated').checkbox('uncheck'); $('#radarr_validated').checkbox('uncheck');
$('#radarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red'); $('#radarr_validation_result').text('You must test your Sonarr connection settings before saving settings.').css('color', 'red');
$('.form').form('validate form'); $('.form').form('validate form');
$('#loader').removeClass('active'); $('#loader').removeClass('active');
}) });
$("#radarr_validated").checkbox('check'); $("#radarr_validated").checkbox('check');
</script> </script>

Loading…
Cancel
Save