summaryrefslogtreecommitdiff
path: root/tidal_dl_ng/config.py
diff options
context:
space:
mode:
authorRobert Honz <exislow+github@gmail.com>2023-12-19 23:58:57 +0100
committerRobert Honz <exislow+github@gmail.com>2023-12-19 23:58:57 +0100
commit0d4a9d6b8740035346d098f5bc28ebca64f6cd4d (patch)
treef52c9569509565e581b03b6e60fe32e611b79ad2 /tidal_dl_ng/config.py
parent82a8fe96aa08903919a90a76030bacba9f93b8e0 (diff)
downloadtidal-dl-ng-0d4a9d6b8740035346d098f5bc28ebca64f6cd4d.tar.gz
🌟 Re-add all project files.
Diffstat (limited to 'tidal_dl_ng/config.py')
-rw-r--r--tidal_dl_ng/config.py132
1 files changed, 132 insertions, 0 deletions
diff --git a/tidal_dl_ng/config.py b/tidal_dl_ng/config.py
new file mode 100644
index 0000000..bdcc70d
--- /dev/null
+++ b/tidal_dl_ng/config.py
@@ -0,0 +1,132 @@
+from typing import Any
+
+from collections.abc import Callable
+from json import JSONDecodeError
+
+import tidalapi
+from tidal_dl_ng.helper.decorator import SingletonMeta
+from tidal_dl_ng.helper.path import path_file_settings, path_file_token
+from tidal_dl_ng.model.cfg import Settings as ModelSettings
+from tidal_dl_ng.model.cfg import Token as ModelToken
+from requests import HTTPError
+
+
+class BaseConfig:
+ data: ModelSettings | ModelToken = None
+ file_path: str = None
+ cls_model: object = None
+
+ def save(self) -> None:
+ data_json = self.data.to_json()
+
+ with open(self.file_path, encoding="utf-8", mode="w") as f:
+ f.write(data_json)
+
+ def set_option(self, key: str, value: Any) -> None:
+ setattr(self.data, key, value)
+
+ def read(self, path: str) -> bool:
+ result = False
+
+ try:
+ with open(path, encoding="utf-8") as f:
+ settings_json = f.read()
+
+ self.data = self.cls_model.from_json(settings_json)
+ result = True
+ except (JSONDecodeError, TypeError, FileNotFoundError):
+ self.data = self.cls_model()
+ self.save()
+
+ return result
+
+
+class Settings(BaseConfig, metaclass=SingletonMeta):
+ cls_model = ModelSettings
+ data = None
+
+ def __init__(self):
+ self.file_path = path_file_settings()
+ self.read(self.file_path)
+
+
+class Tidal(BaseConfig, metaclass=SingletonMeta):
+ cls_model = ModelToken
+ session: tidalapi.Session = None
+ data: ModelToken = None
+ token_from_storage: bool = False
+ settings: Settings = None
+
+ def __init__(self, settings: Settings = None):
+ self.session = tidalapi.Session()
+ self.session.video_quality = tidalapi.VideoQuality.high
+ self.file_path = path_file_token()
+ self.token_from_storage = self.read(self.file_path)
+ self.login_token()
+
+ if settings:
+ self.settings = settings
+ self.settings_apply()
+
+ def settings_apply(self, settings: Settings = None) -> bool:
+ if settings:
+ self.settings = settings
+
+ self.session.audio_quality = self.settings.data.quality_audio
+
+ return True
+
+ def login_token(self) -> bool:
+ result = False
+
+ if self.token_from_storage:
+ try:
+ result = self.session.load_oauth_session(
+ self.data.token_type, self.data.access_token, self.data.refresh_token, self.data.expiry_time
+ )
+ except HTTPError:
+ result = False
+
+ return result
+
+ def login_oauth_start(self, function=print) -> None:
+ self.session.login_oauth_simple(function)
+
+ def login_oauth_finish(self) -> bool:
+ result = self.session.check_login()
+
+ if result:
+ self.token_persist()
+
+ return result
+
+ def token_persist(self) -> None:
+ self.set_option("token_type", self.session.token_type)
+ self.set_option("access_token", self.session.access_token)
+ self.set_option("refresh_token", self.session.refresh_token)
+ self.set_option("expiry_time", self.session.expiry_time)
+ self.save()
+
+ def login(self, fn_print: Callable) -> bool:
+ is_token = self.login_token()
+ result = False
+
+ if is_token:
+ fn_print("Yep, looks good! You are logged in.")
+
+ result = True
+ elif not is_token:
+ fn_print("You either do not have a token or your token is invalid.")
+ fn_print("No worries, we will handle this...")
+ self.login_oauth_start(fn_print)
+
+ is_login = self.login_oauth_finish()
+
+ if is_login:
+ fn_print("The login was successful. I have stored your credentials (token).")
+
+ result = True
+ else:
+ fn_print("Something went wrong. Did you login using your browser correctly? May try again...")
+
+ return result