diff --git a/CONFIG.md b/CONFIG.md index 8b4d450..77c40b5 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -153,6 +153,13 @@ For example to set the default primary language to download to German, lang: de ``` +to set how many tracks to download concurrently to 4 and download threads to 16, + +```yaml +downloads: 4 +workers: 16 +``` + to set `--bitrate=CVBR` for the AMZN service, ```yaml diff --git a/devine/commands/dl.py b/devine/commands/dl.py index a9c4538..61ae360 100644 --- a/devine/commands/dl.py +++ b/devine/commands/dl.py @@ -131,6 +131,8 @@ class dl: help="Disable folder creation for TV Shows.") @click.option("--no-source", is_flag=True, default=False, help="Disable the source tag from the output file name and path.") + @click.option("--workers", type=int, default=None, + help="Max workers/threads to download with per-track. Default depends on the downloader.") @click.option("--downloads", type=int, default=1, help="Amount of tracks to download concurrently.") @click.pass_context @@ -275,6 +277,7 @@ def result( no_proxy: bool, no_folder: bool, no_source: bool, + workers: Optional[int], downloads: int, *_: Any, **__: Any @@ -528,6 +531,7 @@ def result( vaults_only=vaults_only, export=export ), + max_workers=workers, progress=tracks_progress_callables[i] ) for i, track in enumerate(title.tracks) diff --git a/devine/core/manifests/dash.py b/devine/core/manifests/dash.py index ec3a731..c7eab18 100644 --- a/devine/core/manifests/dash.py +++ b/devine/core/manifests/dash.py @@ -236,6 +236,7 @@ def download_track( progress: partial, session: Optional[Session] = None, proxy: Optional[str] = None, + max_workers: Optional[int] = None, license_widevine: Optional[Callable] = None ): if not session: @@ -472,7 +473,7 @@ def download_track( headers=session.headers, cookies=session.cookies, proxy=proxy, - max_workers=16 + max_workers=max_workers ): file_downloaded = status_update.get("file_downloaded") if file_downloaded: diff --git a/devine/core/manifests/hls.py b/devine/core/manifests/hls.py index d371030..deb0967 100644 --- a/devine/core/manifests/hls.py +++ b/devine/core/manifests/hls.py @@ -197,6 +197,7 @@ def download_track( progress: partial, session: Optional[Session] = None, proxy: Optional[str] = None, + max_workers: Optional[int] = None, license_widevine: Optional[Callable] = None ) -> None: if not session: @@ -280,7 +281,7 @@ def download_track( headers=session.headers, cookies=session.cookies, proxy=proxy, - max_workers=16 + max_workers=max_workers ): file_downloaded = status_update.get("file_downloaded") if file_downloaded: diff --git a/devine/core/tracks/track.py b/devine/core/tracks/track.py index 7dadf3f..f91e678 100644 --- a/devine/core/tracks/track.py +++ b/devine/core/tracks/track.py @@ -135,6 +135,7 @@ def download( self, session: Session, prepare_drm: partial, + max_workers: Optional[int] = None, progress: Optional[partial] = None ): """Download and optionally Decrypt this Track.""" @@ -191,6 +192,7 @@ def cleanup(): progress=progress, session=session, proxy=proxy, + max_workers=max_workers, license_widevine=prepare_drm ) elif self.descriptor == self.Descriptor.DASH: @@ -201,6 +203,7 @@ def cleanup(): progress=progress, session=session, proxy=proxy, + max_workers=max_workers, license_widevine=prepare_drm ) elif self.descriptor == self.Descriptor.URL: @@ -236,7 +239,8 @@ def cleanup(): filename=save_path.name, headers=session.headers, cookies=session.cookies, - proxy=proxy + proxy=proxy, + max_workers=max_workers ): file_downloaded = status_update.get("file_downloaded") if not file_downloaded: