bazarr/bazarr/init.py

193 lines
7.6 KiB
Python
Raw Normal View History

# coding=utf-8
import os
import io
2019-01-26 03:56:55 +00:00
import rarfile
import sys
import subprocess
2020-05-08 04:22:14 +00:00
from config import settings, configure_captcha_func
from get_args import args
from logger import configure_logging
2020-05-19 13:27:13 +00:00
from helper import path_mappings
from dogpile.cache.region import register_backend as register_cache_backend
import subliminal
import datetime
2019-04-03 13:56:34 +00:00
# set subliminal_patch user agent
os.environ["SZ_USER_AGENT"] = "Bazarr/{}".format(os.environ["BAZARR_VERSION"])
2019-04-03 13:56:34 +00:00
2019-04-08 01:27:41 +00:00
# set anti-captcha provider and key
2020-05-08 04:22:14 +00:00
configure_captcha_func()
2019-04-08 01:27:41 +00:00
# Check if args.config_dir exist
if not os.path.exists(args.config_dir):
# Create config_dir directory tree
try:
os.mkdir(os.path.join(args.config_dir))
except OSError:
2019-11-07 00:35:30 +00:00
print("BAZARR The configuration directory doesn't exist and Bazarr cannot create it (permission issue?).")
exit(2)
if not os.path.exists(os.path.join(args.config_dir, 'config')):
os.mkdir(os.path.join(args.config_dir, 'config'))
if not os.path.exists(os.path.join(args.config_dir, 'db')):
os.mkdir(os.path.join(args.config_dir, 'db'))
if not os.path.exists(os.path.join(args.config_dir, 'log')):
os.mkdir(os.path.join(args.config_dir, 'log'))
if not os.path.exists(os.path.join(args.config_dir, 'cache')):
os.mkdir(os.path.join(args.config_dir, 'cache'))
configure_logging(settings.general.getboolean('debug') or args.debug)
import logging
def is_virtualenv():
# return True if Bazarr have been start from within a virtualenv or venv
base_prefix = getattr(sys, "base_prefix", None)
# real_prefix will return None if not in a virtualenv enviroment or the default python path
real_prefix = getattr(sys, "real_prefix", None) or sys.prefix
return base_prefix != real_prefix
# deploy requirements.txt
if not args.no_update:
try:
import lxml, numpy, webrtcvad, setuptools
except ImportError:
try:
import pip
except ImportError:
logging.info('BAZARR unable to install requirements (pip not installed).')
else:
if os.path.expanduser("~") == '/':
logging.info('BAZARR unable to install requirements (user without home directory).')
else:
logging.info('BAZARR installing requirements...')
try:
pip_command = [sys.executable, '-m', 'pip', 'install', '-qq', '--disable-pip-version-check',
'-r', os.path.join(os.path.dirname(os.path.dirname(__file__)), 'requirements.txt')]
if not is_virtualenv():
# --user only make sense if not running under venv
pip_command.insert(4, '--user')
subprocess.check_output(pip_command, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
logging.exception('BAZARR requirements.txt installation result: {}'.format(e.stdout))
os._exit(1)
else:
logging.info('BAZARR requirements installed.')
try:
restart_file = io.open(os.path.join(args.config_dir, "bazarr.restart"), "w", encoding='UTF-8')
except Exception as e:
logging.error('BAZARR Cannot create bazarr.restart file: ' + repr(e))
else:
logging.info('Bazarr is being restarted...')
restart_file.write(str(''))
restart_file.close()
os._exit(0)
# create random api_key if there's none in config.ini
2020-05-22 16:49:02 +00:00
if not settings.auth.apikey or settings.auth.apikey.startswith("b'"):
from binascii import hexlify
2020-04-17 10:36:45 +00:00
settings.auth.apikey = hexlify(os.urandom(16)).decode()
with open(os.path.join(args.config_dir, 'config', 'config.ini'), 'w+') as handle:
settings.write(handle)
2020-07-05 13:16:17 +00:00
# create random Flask secret_key if there's none in config.ini
if not settings.general.flask_secret_key:
from binascii import hexlify
settings.general.flask_secret_key = hexlify(os.urandom(16)).decode()
with open(os.path.join(args.config_dir, 'config', 'config.ini'), 'w+') as handle:
settings.write(handle)
2019-12-30 19:28:03 +00:00
# change default base_url to ''
2021-03-25 14:22:43 +00:00
settings.general.base_url = settings.general.base_url.rstrip('/')
with open(os.path.join(args.config_dir, 'config', 'config.ini'), 'w+') as handle:
settings.write(handle)
# migrate enabled_providers from comma separated string to list
if isinstance(settings.general.enabled_providers, str) and not settings.general.enabled_providers.startswith('['):
settings.general.enabled_providers = str(settings.general.enabled_providers.split(","))
with open(os.path.join(args.config_dir, 'config', 'config.ini'), 'w+') as handle:
settings.write(handle)
# make sure settings.general.branch is properly set when running inside a docker container
package_info_file = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'package_info')
if os.path.isfile(package_info_file):
try:
splitted_lines = []
package_info = {}
with open(package_info_file) as file:
lines = file.readlines()
for line in lines:
splitted_lines += line.split(r'\n')
for line in splitted_lines:
splitted_line = line.split('=')
if len(splitted_line) == 2:
package_info[splitted_line[0].lower()] = splitted_line[1].replace('\n', '')
else:
continue
if 'branch' in package_info:
settings.general.branch = package_info['branch']
except:
pass
else:
with open(os.path.join(args.config_dir, 'config', 'config.ini'), 'w+') as handle:
settings.write(handle)
2019-12-30 19:28:03 +00:00
# Configure dogpile file caching for Subliminal request
register_cache_backend("subzero.cache.file", "subzero.cache_backends.file", "SZFileBackend")
subliminal.region.configure('subzero.cache.file', expiration_time=datetime.timedelta(days=30),
arguments={'appname': "sz_cache", 'app_cache_dir': args.config_dir})
subliminal.region.backend.sync()
2019-01-15 16:25:13 +00:00
2018-11-28 11:53:37 +00:00
if not os.path.exists(os.path.join(args.config_dir, 'config', 'releases.txt')):
2019-10-28 04:05:28 +00:00
from check_update import check_releases
2018-11-02 19:08:07 +00:00
check_releases()
logging.debug("BAZARR Created releases file")
config_file = os.path.normpath(os.path.join(args.config_dir, 'config', 'config.ini'))
# Move GA visitor from config.ini to dedicated file
if settings.analytics.visitor:
with open(os.path.normpath(os.path.join(args.config_dir, 'config', 'analytics.dat')), 'w+') as handle:
handle.write(settings.analytics.visitor)
with open(os.path.normpath(os.path.join(args.config_dir, 'config', 'config.ini')), 'w+') as handle:
settings.remove_option('analytics', 'visitor')
settings.write(handle)
# Clean unused settings from config.ini
with open(os.path.normpath(os.path.join(args.config_dir, 'config', 'config.ini')), 'w+') as handle:
settings.remove_option('general', 'throtteled_providers')
settings.remove_option('general', 'update_restart')
settings.write(handle)
2019-01-26 03:56:55 +00:00
def init_binaries():
2019-10-28 04:05:28 +00:00
from utils import get_binary
exe = get_binary("unrar")
2019-06-11 18:45:48 +00:00
2019-01-26 03:56:55 +00:00
rarfile.UNRAR_TOOL = exe
rarfile.ORIG_UNRAR_TOOL = exe
try:
rarfile.custom_check([rarfile.UNRAR_TOOL], True)
except:
logging.debug("custom check failed for: %s", exe)
2019-06-11 18:45:48 +00:00
2019-01-26 03:56:55 +00:00
rarfile.OPEN_ARGS = rarfile.ORIG_OPEN_ARGS
rarfile.EXTRACT_ARGS = rarfile.ORIG_EXTRACT_ARGS
rarfile.TEST_ARGS = rarfile.ORIG_TEST_ARGS
2019-10-28 14:38:57 +00:00
logging.debug("Using UnRAR from: %s", exe)
2019-01-26 03:56:55 +00:00
unrar = exe
2019-06-11 18:45:48 +00:00
2019-01-26 03:56:55 +00:00
return unrar
2019-06-11 18:45:48 +00:00
from database import init_db, migrate_db
2021-05-27 16:28:46 +00:00
init_db()
migrate_db()
2019-02-12 21:57:04 +00:00
init_binaries()
2020-05-19 13:27:13 +00:00
path_mappings.update()