From 89ddd0d3a6a1385977ea3eae10739f9e20e45bdb Mon Sep 17 00:00:00 2001 From: nathom Date: Mon, 12 Apr 2021 10:44:55 -0700 Subject: [PATCH] Fix misc bugs related to multithreading --- streamrip/clients.py | 10 ++++++++++ streamrip/downloader.py | 14 ++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/streamrip/clients.py b/streamrip/clients.py index 6b478fa..c6432e8 100644 --- a/streamrip/clients.py +++ b/streamrip/clients.py @@ -450,6 +450,11 @@ class TidalClient(ClientInterface): self.refresh_token = None self.expiry = None + self.session = requests.Session() + # for multithreading + adapter = requests.adapters.HTTPAdapter(pool_connections=200, pool_maxsize=200) + self.session.mount('https://', adapter) + def login( self, user_id=None, @@ -617,6 +622,7 @@ class TidalClient(ClientInterface): self.country_code = resp["user"]["countryCode"] self.access_token = resp["access_token"] self.token_expiry = resp["expires_in"] + time.time() + self._update_authorization() def _login_by_access_token(self, token, user_id=None): headers = {"authorization": f"Bearer {token}"} @@ -630,6 +636,7 @@ class TidalClient(ClientInterface): self.user_id = resp["userId"] self.country_code = resp["countryCode"] self.access_token = token + self._update_authorization() def _api_get(self, item_id: str, media_type: str) -> dict: url = f"{media_type}s/{item_id}" @@ -667,6 +674,9 @@ class TidalClient(ClientInterface): r = requests.post(url, data=data, auth=auth, verify=False).json() return r + def _update_authorization(self): + self.session.headers.update({'authorization': f"Bearer {self.access_token}"}) + class SoundCloudClient(ClientInterface): source = "soundcloud" diff --git a/streamrip/downloader.py b/streamrip/downloader.py index 9603eda..7a2389f 100644 --- a/streamrip/downloader.py +++ b/streamrip/downloader.py @@ -610,11 +610,17 @@ class Tracklist(list): processes = [] for item in self: proc = threading.Thread(target=target, args=(item,), kwargs=kwargs) + proc.daemon = True proc.start() processes.append(proc) - for proc in processes: - proc.join() + try: + for proc in processes: + proc.join() + except (KeyboardInterrupt, SystemExit): + click.echo("Aborted!") + exit() + else: for item in self: target(item, **kwargs) @@ -859,6 +865,8 @@ class Album(Tracklist): self.cover_obj = self.get_cover_obj( cover_path, self.quality, self.client.source ) + else: + self.cover_obj = None def _download_item( self, @@ -871,6 +879,8 @@ class Album(Tracklist): if self.disctotal > 1: disc_folder = os.path.join(self.folder, f"Disc {track.meta.discnumber}") kwargs["parent_folder"] = disc_folder + else: + kwargs['parent_folder'] = self.folder track.download( quality=quality, database=database, **kwargs