Merge remote-tracking branch 'origin/development' into development

This commit is contained in:
morpheus65535 2024-03-18 20:28:26 -04:00
commit 19bc725c1b
11 changed files with 36 additions and 26 deletions

View File

@ -76,7 +76,7 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Set up Python 3.8 - name: Set up Python 3.8
uses: actions/setup-python@v4 uses: actions/setup-python@v5
with: with:
python-version: "3.8" python-version: "3.8"

View File

@ -35,7 +35,7 @@ jobs:
working-directory: ${{ env.UI_DIRECTORY }} working-directory: ${{ env.UI_DIRECTORY }}
- name: Set up Python 3.8 - name: Set up Python 3.8
uses: actions/setup-python@v4 uses: actions/setup-python@v5
with: with:
python-version: "3.8" python-version: "3.8"

View File

@ -7,6 +7,7 @@ import logging
import re import re
from urllib.parse import quote_plus from urllib.parse import quote_plus
from utilities.binaries import BinaryNotFound, get_binary
from literals import EXIT_VALIDATION_ERROR from literals import EXIT_VALIDATION_ERROR
from utilities.central import stop_bazarr from utilities.central import stop_bazarr
from subliminal.cache import region from subliminal.cache import region
@ -54,6 +55,14 @@ class Validator(OriginalValidator):
) )
def check_parser_binary(value):
try:
get_binary(value)
except BinaryNotFound as e:
raise ValidationError(f"Executable '{value}' not found in search path. Please install before making this selection.")
return True
validators = [ validators = [
# general section # general section
Validator('general.flask_secret_key', must_exist=True, default=hexlify(os.urandom(16)).decode(), Validator('general.flask_secret_key', must_exist=True, default=hexlify(os.urandom(16)).decode(),
@ -119,7 +128,7 @@ validators = [
Validator('general.dont_notify_manual_actions', must_exist=True, default=False, is_type_of=bool), Validator('general.dont_notify_manual_actions', must_exist=True, default=False, is_type_of=bool),
Validator('general.hi_extension', must_exist=True, default='hi', is_type_of=str, is_in=['hi', 'cc', 'sdh']), Validator('general.hi_extension', must_exist=True, default='hi', is_type_of=str, is_in=['hi', 'cc', 'sdh']),
Validator('general.embedded_subtitles_parser', must_exist=True, default='ffprobe', is_type_of=str, Validator('general.embedded_subtitles_parser', must_exist=True, default='ffprobe', is_type_of=str,
is_in=['ffprobe', 'mediainfo']), is_in=['ffprobe', 'mediainfo'], condition=check_parser_binary),
Validator('general.default_und_audio_lang', must_exist=True, default='', is_type_of=str), Validator('general.default_und_audio_lang', must_exist=True, default='', is_type_of=str),
Validator('general.default_und_embedded_subtitles_lang', must_exist=True, default='', is_type_of=str), Validator('general.default_und_embedded_subtitles_lang', must_exist=True, default='', is_type_of=str),
Validator('general.parse_embedded_audio_track', must_exist=True, default=False, is_type_of=bool), Validator('general.parse_embedded_audio_track', must_exist=True, default=False, is_type_of=bool),

View File

@ -3,7 +3,7 @@
import logging import logging
import requests import requests
import datetime import datetime
import json from requests.exceptions import JSONDecodeError
from dogpile.cache import make_region from dogpile.cache import make_region
@ -34,13 +34,13 @@ class GetRadarrInfo:
if 'version' in radarr_json: if 'version' in radarr_json:
radarr_version = radarr_json['version'] radarr_version = radarr_json['version']
else: else:
raise json.decoder.JSONDecodeError raise JSONDecodeError
except json.decoder.JSONDecodeError: except JSONDecodeError:
try: try:
rv = f"{url_radarr()}/api/v3/system/status?apikey={settings.radarr.apikey}" rv = f"{url_radarr()}/api/v3/system/status?apikey={settings.radarr.apikey}"
radarr_version = requests.get(rv, timeout=int(settings.radarr.http_timeout), verify=False, radarr_version = requests.get(rv, timeout=int(settings.radarr.http_timeout), verify=False,
headers=headers).json()['version'] headers=headers).json()['version']
except json.decoder.JSONDecodeError: except JSONDecodeError:
logging.debug('BAZARR cannot get Radarr version') logging.debug('BAZARR cannot get Radarr version')
radarr_version = 'unknown' radarr_version = 'unknown'
except Exception: except Exception:

View File

@ -3,7 +3,7 @@
import logging import logging
import requests import requests
import datetime import datetime
import json from requests.exceptions import JSONDecodeError
from dogpile.cache import make_region from dogpile.cache import make_region
@ -34,13 +34,13 @@ class GetSonarrInfo:
if 'version' in sonarr_json: if 'version' in sonarr_json:
sonarr_version = sonarr_json['version'] sonarr_version = sonarr_json['version']
else: else:
raise json.decoder.JSONDecodeError raise JSONDecodeError
except json.decoder.JSONDecodeError: except JSONDecodeError:
try: try:
sv = f"{url_sonarr()}/api/v3/system/status?apikey={settings.sonarr.apikey}" sv = f"{url_sonarr()}/api/v3/system/status?apikey={settings.sonarr.apikey}"
sonarr_version = requests.get(sv, timeout=int(settings.sonarr.http_timeout), verify=False, sonarr_version = requests.get(sv, timeout=int(settings.sonarr.http_timeout), verify=False,
headers=headers).json()['version'] headers=headers).json()['version']
except json.decoder.JSONDecodeError: except JSONDecodeError:
logging.debug('BAZARR cannot get Sonarr version') logging.debug('BAZARR cannot get Sonarr version')
sonarr_version = 'unknown' sonarr_version = 'unknown'
except Exception: except Exception:

View File

@ -33,7 +33,7 @@ def get_restore_path():
def get_backup_files(fullpath=True): def get_backup_files(fullpath=True):
backup_file_pattern = os.path.join(get_backup_path(), 'bazarr_backup_v*.zip') backup_file_pattern = os.path.join(get_backup_path(), 'bazarr_backup_v*.zip')
file_list = glob(backup_file_pattern) file_list = glob(backup_file_pattern)
file_list.sort(key=os.path.getmtime) file_list.sort(key=os.path.getmtime, reverse=True)
if fullpath: if fullpath:
return file_list return file_list
else: else:

View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import functools import functools
from json import JSONDecodeError from requests.exceptions import JSONDecodeError
import logging import logging
import re import re
import time import time

View File

@ -3,6 +3,7 @@ import io
import logging import logging
import os import os
import json import json
from requests.exceptions import JSONDecodeError
from subzero.language import Language from subzero.language import Language
from guessit import guessit from guessit import guessit
@ -144,7 +145,7 @@ class KtuvitProvider(Provider):
self.session.headers["Pragma"] = "no-cache" self.session.headers["Pragma"] = "no-cache"
self.session.headers["Cache-Control"] = "no-cache" self.session.headers["Cache-Control"] = "no-cache"
self.session.headers["Content-Type"] = "application/json" self.session.headers["Content-Type"] = "application/json"
self.session.headers["User-Agent"]: os.environ.get( self.session.headers["User-Agent"] = os.environ.get(
"SZ_USER_AGENT", "Sub-Zero/2" "SZ_USER_AGENT", "Sub-Zero/2"
) )
@ -161,13 +162,13 @@ class KtuvitProvider(Provider):
is_success = self.parse_d_response( is_success = self.parse_d_response(
r, "IsSuccess", False, "Authentication to the provider" r, "IsSuccess", False, "Authentication to the provider"
) )
except json.decoder.JSONDecodeError: except JSONDecodeError:
logger.info("Failed to Login to Ktuvit") logger.info("Failed to Login to Ktuvit")
if not is_success: if not is_success:
error_message = '' error_message = ''
try: try:
error_message = self.parse_d_response(r, "ErrorMessage", "[None]") error_message = self.parse_d_response(r, "ErrorMessage", "[None]")
except json.decode.JSONDecoderError: except JSONDecodeError:
raise AuthenticationError( raise AuthenticationError(
"Error Logging in to Ktuvit Provider: " + str(r.content) "Error Logging in to Ktuvit Provider: " + str(r.content)
) )
@ -473,8 +474,8 @@ class KtuvitProvider(Provider):
try: try:
response_content = response.json() response_content = response.json()
except json.decoder.JSONDecodeError as ex: except JSONDecodeError as ex:
raise json.decoder.JSONDecodeError( raise JSONDecodeError(
"Unable to parse JSON returned while getting " + message, ex.doc, ex.pos "Unable to parse JSON returned while getting " + message, ex.doc, ex.pos
) )
else: else:
@ -486,11 +487,11 @@ class KtuvitProvider(Provider):
value = response_content.get(field, default_value) value = response_content.get(field, default_value)
if not value and value != default_value: if not value and value != default_value:
raise json.decoder.JSONDecodeError( raise JSONDecodeError(
"Missing " + message, str(response_content), 0 "Missing " + message, str(response_content), 0
) )
else: else:
raise json.decoder.JSONDecodeError( raise JSONDecodeError(
"Incomplete JSON returned while getting " + message, "Incomplete JSON returned while getting " + message,
str(response_content), str(response_content),
0 0

View File

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import absolute_import from __future__ import absolute_import
from json import JSONDecodeError from requests.exceptions import JSONDecodeError
import logging import logging
import random import random
import re import re

View File

@ -34,7 +34,7 @@
"@testing-library/user-event": "^14.5.2", "@testing-library/user-event": "^14.5.2",
"@types/jest": "^29.5.12", "@types/jest": "^29.5.12",
"@types/lodash": "^4.17.0", "@types/lodash": "^4.17.0",
"@types/node": "^20.11.26", "@types/node": "^20.11.29",
"@types/react": "^18.2.65", "@types/react": "^18.2.65",
"@types/react-dom": "^18.2.21", "@types/react-dom": "^18.2.21",
"@types/react-table": "^7.7.19", "@types/react-table": "^7.7.19",
@ -3910,9 +3910,9 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.11.26", "version": "20.11.29",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.26.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.29.tgz",
"integrity": "sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==", "integrity": "sha512-P99thMkD/1YkCvAtOd6/zGedKNA0p2fj4ZpjCzcNiSCBWgm3cNRTBfa/qjFnsKkkojxu4vVLtWpesnZ9+ap+gA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "undici-types": "~5.26.4"

View File

@ -38,7 +38,7 @@
"@testing-library/user-event": "^14.5.2", "@testing-library/user-event": "^14.5.2",
"@types/jest": "^29.5.12", "@types/jest": "^29.5.12",
"@types/lodash": "^4.17.0", "@types/lodash": "^4.17.0",
"@types/node": "^20.11.26", "@types/node": "^20.11.29",
"@types/react": "^18.2.65", "@types/react": "^18.2.65",
"@types/react-dom": "^18.2.21", "@types/react-dom": "^18.2.21",
"@types/react-table": "^7.7.19", "@types/react-table": "^7.7.19",