diff --git a/rip/config.py b/rip/config.py index 88adaa2..bd6f624 100644 --- a/rip/config.py +++ b/rip/config.py @@ -185,20 +185,27 @@ class Config: :param source: :type source: str """ + creds = None if source == "qobuz": - return self.qobuz_creds + creds = self.qobuz_creds if source == "tidal": - return self.tidal_creds + creds = self.tidal_creds if source == "deezer": - return {"arl": self.file["deezer"]["arl"]} + creds = {"arl": self.file["deezer"]["arl"]} if source == "soundcloud": soundcloud = self.file["soundcloud"] - return { + creds = { "client_id": soundcloud["client_id"], "app_version": soundcloud["app_version"], } - raise InvalidSourceError(source) + if creds is None: + raise InvalidSourceError(source) + + rpm = self.file["downloads"]["concurrency"]["requests_per_minute"] + if rpm > 0: + creds.update({"requests_per_min": rpm}) + return creds def __repr__(self) -> str: """Return a string representation of the config.""" diff --git a/rip/config.toml b/rip/config.toml index c37d715..e03acff 100644 --- a/rip/config.toml +++ b/rip/config.toml @@ -13,6 +13,9 @@ enabled = true # If you have very fast internet, you will benefit from a higher value, # A value that is too high for your bandwidth may cause slowdowns max_connections = 3 +# Max number of API requests to handle per minute +# Set to -1 for no limit +requests_per_minute = -1 [qobuz] # 1: 320kbps MP3, 2: 16/44.1, 3: 24/<=96, 4: 24/>=96 @@ -174,4 +177,4 @@ progress_bar = "dainty" [misc] # Metadata to identify this config file. Do not change. -version = "1.9.6" +version = "1.9.8" diff --git a/streamrip/clients.py b/streamrip/clients.py index ccc0cfc..23241f0 100644 --- a/streamrip/clients.py +++ b/streamrip/clients.py @@ -128,14 +128,16 @@ class QobuzClient(Client): return if not kwargs.get("app_id") or not kwargs.get("secrets"): - self._get_app_id_and_secrets() # can be async + # sets session + self._get_app_id_and_secrets(kwargs.get("requests_per_min")) # can be async else: self.app_id, self.secrets = ( str(kwargs["app_id"]), kwargs["secrets"], ) self.session = SRSession( - headers={"User-Agent": AGENT, "X-App-Id": self.app_id} + headers={"User-Agent": AGENT, "X-App-Id": self.app_id}, + requests_per_min=kwargs.get("requests_per_min"), ) self._validate_secrets() @@ -213,7 +215,7 @@ class QobuzClient(Client): # ---------- Private Methods --------------- - def _get_app_id_and_secrets(self): + def _get_app_id_and_secrets(self, rpm): if not hasattr(self, "app_id") or not hasattr(self, "secrets"): spoofer = Spoofer() self.app_id, self.secrets = ( @@ -224,7 +226,8 @@ class QobuzClient(Client): if not hasattr(self, "sec"): if not hasattr(self, "session"): self.session = SRSession( - headers={"User-Agent": AGENT, "X-App-Id": self.app_id} + headers={"User-Agent": AGENT, "X-App-Id": self.app_id}, + requests_per_min=rpm, ) self._validate_secrets() @@ -736,8 +739,6 @@ class TidalClient(Client): self.refresh_token = None self.expiry = None - self.session = SRSession() - def login( self, user_id=None, @@ -745,6 +746,7 @@ class TidalClient(Client): access_token=None, token_expiry=None, refresh_token=None, + **kwargs, ): """Login to Tidal using the browser. @@ -757,6 +759,9 @@ class TidalClient(Client): :param token_expiry: :param refresh_token: """ + self.session = SRSession( + requests_per_min=kwargs.get("requests_per_min"), + ) if access_token: self.token_expiry = float(token_expiry) self.refresh_token = refresh_token @@ -1110,13 +1115,14 @@ class SoundCloudClient(Client): def __init__(self): """Create a SoundCloudClient.""" + + def login(self, **kwargs): self.session = SRSession( headers={ "User-Agent": AGENT, - } + }, + requests_per_min=kwargs.get("requests_per_min"), ) - - def login(self, **kwargs): self.client_id = kwargs.get("client_id") self.app_version = kwargs.get("app_version") logger.debug("client_id: %s, app_version: %s", self.client_id, self.app_version)