mirror of https://github.com/morpheus65535/bazarr
69 lines
1.8 KiB
Python
69 lines
1.8 KiB
Python
|
from codecs import open as codecs_open
|
||
|
from urllib.request import urlopen
|
||
|
from typing import Optional
|
||
|
|
||
|
from .exceptions import (
|
||
|
TldIOError,
|
||
|
TldImproperlyConfigured,
|
||
|
)
|
||
|
from .helpers import project_dir
|
||
|
from .registry import Registry
|
||
|
|
||
|
__author__ = 'Artur Barseghyan'
|
||
|
__copyright__ = '2013-2020 Artur Barseghyan'
|
||
|
__license__ = 'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later'
|
||
|
__all__ = ('BaseTLDSourceParser',)
|
||
|
|
||
|
|
||
|
class BaseTLDSourceParser(metaclass=Registry):
|
||
|
"""Base TLD source parser."""
|
||
|
|
||
|
uid: Optional[str] = None
|
||
|
source_url: str
|
||
|
local_path: str
|
||
|
|
||
|
@classmethod
|
||
|
def validate(cls):
|
||
|
"""Constructor."""
|
||
|
if not cls.uid:
|
||
|
raise TldImproperlyConfigured(
|
||
|
"The `uid` property of the TLD source parser shall be defined."
|
||
|
)
|
||
|
|
||
|
@classmethod
|
||
|
def get_tld_names(cls, fail_silently: bool = False, retry_count: int = 0):
|
||
|
"""Get tld names.
|
||
|
|
||
|
:param fail_silently:
|
||
|
:param retry_count:
|
||
|
:return:
|
||
|
"""
|
||
|
cls.validate()
|
||
|
raise NotImplementedError(
|
||
|
"Your TLD source parser shall implement `get_tld_names` method."
|
||
|
)
|
||
|
|
||
|
@classmethod
|
||
|
def update_tld_names(cls, fail_silently: bool = False) -> bool:
|
||
|
"""Update the local copy of the TLD file.
|
||
|
|
||
|
:param fail_silently:
|
||
|
:return:
|
||
|
"""
|
||
|
try:
|
||
|
remote_file = urlopen(cls.source_url)
|
||
|
local_file = codecs_open(
|
||
|
project_dir(cls.local_path),
|
||
|
'wb',
|
||
|
encoding='utf8'
|
||
|
)
|
||
|
local_file.write(remote_file.read().decode('utf8'))
|
||
|
local_file.close()
|
||
|
remote_file.close()
|
||
|
except Exception as err:
|
||
|
if fail_silently:
|
||
|
return False
|
||
|
raise TldIOError(err)
|
||
|
|
||
|
return True
|