Skip to content

Commit

Permalink
Improved multiple exceptions catching and fixed some other providers …
Browse files Browse the repository at this point in the history
…issues

* Backup files should be listed with newest ones first

Just like Sonarr and Radarr and everyone else.

* Add check_parser_binary() validation method

This is mainly to prevent the user from selecting mediainfo as the subtitles parser if it has not yet been installed on the user's system somewhere in the PATH.

* import JSONDecodeError from requests.exceptions  instead of json

Because sometimes it will return the simplejson one instead and that one won't be caught by the except clause.

* import JSONDecodeError from requests.exceptions  instead of json

Because sometimes it will return the simplejson one instead and that one won't be caught by the except clause.

Also fixed User-Agent assignment.
  • Loading branch information
JaiZed committed Mar 17, 2024
1 parent 1c25d12 commit ec85f6e
Show file tree
Hide file tree
Showing 7 changed files with 29 additions and 19 deletions.
11 changes: 10 additions & 1 deletion bazarr/app/config.py
Expand Up @@ -7,6 +7,7 @@
import re

from urllib.parse import quote_plus
from utilities.binaries import BinaryNotFound, get_binary
from literals import EXIT_VALIDATION_ERROR
from utilities.central import stop_bazarr
from subliminal.cache import region
Expand Down Expand Up @@ -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 = [
# general section
Validator('general.flask_secret_key', must_exist=True, default=hexlify(os.urandom(16)).decode(),
Expand Down Expand Up @@ -119,7 +128,7 @@ class Validator(OriginalValidator):
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.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_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),
Expand Down
8 changes: 4 additions & 4 deletions bazarr/radarr/info.py
Expand Up @@ -3,7 +3,7 @@
import logging
import requests
import datetime
import json
from requests.exceptions import JSONDecodeError

from dogpile.cache import make_region

Expand Down Expand Up @@ -34,13 +34,13 @@ def version():
if 'version' in radarr_json:
radarr_version = radarr_json['version']
else:
raise json.decoder.JSONDecodeError
except json.decoder.JSONDecodeError:
raise JSONDecodeError
except JSONDecodeError:
try:
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,
headers=headers).json()['version']
except json.decoder.JSONDecodeError:
except JSONDecodeError:
logging.debug('BAZARR cannot get Radarr version')
radarr_version = 'unknown'
except Exception:
Expand Down
8 changes: 4 additions & 4 deletions bazarr/sonarr/info.py
Expand Up @@ -3,7 +3,7 @@
import logging
import requests
import datetime
import json
from requests.exceptions import JSONDecodeError

from dogpile.cache import make_region

Expand Down Expand Up @@ -34,13 +34,13 @@ def version():
if 'version' in sonarr_json:
sonarr_version = sonarr_json['version']
else:
raise json.decoder.JSONDecodeError
except json.decoder.JSONDecodeError:
raise JSONDecodeError
except JSONDecodeError:
try:
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,
headers=headers).json()['version']
except json.decoder.JSONDecodeError:
except JSONDecodeError:
logging.debug('BAZARR cannot get Sonarr version')
sonarr_version = 'unknown'
except Exception:
Expand Down
2 changes: 1 addition & 1 deletion bazarr/utilities/backup.py
Expand Up @@ -33,7 +33,7 @@ def get_restore_path():
def get_backup_files(fullpath=True):
backup_file_pattern = os.path.join(get_backup_path(), 'bazarr_backup_v*.zip')
file_list = glob(backup_file_pattern)
file_list.sort(key=os.path.getmtime)
file_list.sort(key=os.path.getmtime, reverse=True)
if fullpath:
return file_list
else:
Expand Down
2 changes: 1 addition & 1 deletion custom_libs/subliminal_patch/providers/hdbits.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
import functools
from json import JSONDecodeError
from requests.exceptions import JSONDecodeError
import logging
import re
import time
Expand Down
15 changes: 8 additions & 7 deletions custom_libs/subliminal_patch/providers/ktuvit.py
Expand Up @@ -3,6 +3,7 @@
import logging
import os
import json
from requests.exceptions import JSONDecodeError

from subzero.language import Language
from guessit import guessit
Expand Down Expand Up @@ -144,7 +145,7 @@ def initialize(self):
self.session.headers["Pragma"] = "no-cache"
self.session.headers["Cache-Control"] = "no-cache"
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"
)

Expand All @@ -161,13 +162,13 @@ def initialize(self):
is_success = self.parse_d_response(
r, "IsSuccess", False, "Authentication to the provider"
)
except json.decoder.JSONDecodeError:
except JSONDecodeError:
logger.info("Failed to Login to Ktuvit")
if not is_success:
error_message = ''
try:
error_message = self.parse_d_response(r, "ErrorMessage", "[None]")
except json.decode.JSONDecoderError:
except JSONDecodeError:
raise AuthenticationError(
"Error Logging in to Ktuvit Provider: " + str(r.content)
)
Expand Down Expand Up @@ -473,8 +474,8 @@ def parse_d_response(self, response, field, default_value=None, message=None):

try:
response_content = response.json()
except json.decoder.JSONDecodeError as ex:
raise json.decoder.JSONDecodeError(
except JSONDecodeError as ex:
raise JSONDecodeError(
"Unable to parse JSON returned while getting " + message, ex.doc, ex.pos
)
else:
Expand All @@ -486,11 +487,11 @@ def parse_d_response(self, response, field, default_value=None, message=None):
value = response_content.get(field, default_value)

if not value and value != default_value:
raise json.decoder.JSONDecodeError(
raise JSONDecodeError(
"Missing " + message, str(response_content), 0
)
else:
raise json.decoder.JSONDecodeError(
raise JSONDecodeError(
"Incomplete JSON returned while getting " + message,
str(response_content),
0
Expand Down
2 changes: 1 addition & 1 deletion custom_libs/subliminal_patch/providers/subdivx.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import

from json import JSONDecodeError
from requests.exceptions import JSONDecodeError
import logging
import random
import re
Expand Down

0 comments on commit ec85f6e

Please sign in to comment.