Add ability to choose downloader via config

This commit is contained in:
rlaphoenix 2023-05-12 06:42:33 +01:00
parent b92708ef45
commit cb82febb7c
7 changed files with 33 additions and 13 deletions

View File

@ -128,6 +128,15 @@ AMZN:
bitrate: CVBR bitrate: CVBR
``` ```
## downloader (str)
Choose what software to use to download data throughout Devine where needed.
Options:
- `aria2c` (default) - https://github.com/aria2/aria2
- `saldl` - https://github.com/saldl/saldl
## headers (dict) ## headers (dict)
Case-Insensitive dictionary of headers that all Services begin their Request Session state with. Case-Insensitive dictionary of headers that all Services begin their Request Session state with.

View File

@ -1,6 +1,5 @@
from __future__ import annotations from __future__ import annotations
import asyncio
import html import html
import logging import logging
import math import math
@ -43,7 +42,7 @@ from devine.core.config import config
from devine.core.console import console from devine.core.console import console
from devine.core.constants import AnyTrack, context_settings from devine.core.constants import AnyTrack, context_settings
from devine.core.credential import Credential from devine.core.credential import Credential
from devine.core.downloaders import aria2c from devine.core.downloaders import downloader
from devine.core.drm import DRM_T, Widevine from devine.core.drm import DRM_T, Widevine
from devine.core.manifests import DASH, HLS from devine.core.manifests import DASH, HLS
from devine.core.proxies import Basic, Hola, NordVPN from devine.core.proxies import Basic, Hola, NordVPN
@ -906,13 +905,13 @@ class dl:
if self.DL_POOL_SKIP.is_set(): if self.DL_POOL_SKIP.is_set():
progress(downloaded="[yellow]SKIPPED") progress(downloaded="[yellow]SKIPPED")
else: else:
asyncio.run(aria2c( downloader(
uri=track.url, uri=track.url,
out=save_path, out=save_path,
headers=service.session.headers, headers=service.session.headers,
proxy=proxy if track.needs_proxy else None, proxy=proxy if track.needs_proxy else None,
progress=progress progress=progress
)) )
track.path = save_path track.path = save_path

View File

@ -49,6 +49,8 @@ class Config:
continue continue
setattr(self.directories, name, Path(path).expanduser()) setattr(self.directories, name, Path(path).expanduser())
self.downloader = kwargs.get("downloader") or "aria2c"
self.filenames = self._Filenames() self.filenames = self._Filenames()
for name, filename in (kwargs.get("filenames") or {}).items(): for name, filename in (kwargs.get("filenames") or {}).items():
setattr(self.filenames, name, filename) setattr(self.filenames, name, filename)

View File

@ -1,4 +1,5 @@
from .aria2c import aria2c from .aria2c import aria2c
from .saldl import saldl from .saldl import saldl
from .downloader import downloader
__ALL__ = (aria2c, saldl) __ALL__ = (downloader, aria2c, saldl)

View File

@ -0,0 +1,11 @@
import asyncio
from functools import partial
from devine.core.config import config
from devine.core.downloaders import aria2c, saldl
downloader = {
"aria2c": partial(asyncio.run, aria2c),
"saldl": partial(asyncio.run, saldl)
}[config.downloader]

View File

@ -1,6 +1,5 @@
from __future__ import annotations from __future__ import annotations
import asyncio
import base64 import base64
import logging import logging
import math import math
@ -26,7 +25,7 @@ from requests import Session
from rich import filesize from rich import filesize
from devine.core.constants import AnyTrack from devine.core.constants import AnyTrack
from devine.core.downloaders import aria2c from devine.core.downloaders import downloader
from devine.core.drm import Widevine from devine.core.drm import Widevine
from devine.core.tracks import Audio, Subtitle, Tracks, Video from devine.core.tracks import Audio, Subtitle, Tracks, Video
from devine.core.utilities import is_close_match from devine.core.utilities import is_close_match
@ -487,14 +486,14 @@ class DASH:
segment_save_path.parent.mkdir(parents=True, exist_ok=True) segment_save_path.parent.mkdir(parents=True, exist_ok=True)
segment_save_path.write_bytes(res.content) segment_save_path.write_bytes(res.content)
else: else:
asyncio.run(aria2c( downloader(
uri=segment_uri, uri=segment_uri,
out=segment_save_path, out=segment_save_path,
headers=session.headers, headers=session.headers,
proxy=proxy, proxy=proxy,
silent=attempts != 5, silent=attempts != 5,
segmented=True segmented=True
)) )
break break
except Exception as ee: except Exception as ee:
if stop_event.is_set() or attempts == 5: if stop_event.is_set() or attempts == 5:

View File

@ -1,6 +1,5 @@
from __future__ import annotations from __future__ import annotations
import asyncio
import logging import logging
import re import re
import sys import sys
@ -24,7 +23,7 @@ from requests import Session
from rich import filesize from rich import filesize
from devine.core.constants import AnyTrack from devine.core.constants import AnyTrack
from devine.core.downloaders import aria2c from devine.core.downloaders import downloader
from devine.core.drm import DRM_T, ClearKey, Widevine from devine.core.drm import DRM_T, ClearKey, Widevine
from devine.core.tracks import Audio, Subtitle, Tracks, Video from devine.core.tracks import Audio, Subtitle, Tracks, Video
from devine.core.utilities import is_close_match from devine.core.utilities import is_close_match
@ -308,14 +307,14 @@ class HLS:
segment_save_path.parent.mkdir(parents=True, exist_ok=True) segment_save_path.parent.mkdir(parents=True, exist_ok=True)
segment_save_path.write_bytes(res.content) segment_save_path.write_bytes(res.content)
else: else:
asyncio.run(aria2c( downloader(
uri=segment.uri, uri=segment.uri,
out=segment_save_path, out=segment_save_path,
headers=session.headers, headers=session.headers,
proxy=proxy, proxy=proxy,
silent=attempts != 5, silent=attempts != 5,
segmented=True segmented=True
)) )
break break
except Exception as ee: except Exception as ee:
if stop_event.is_set() or attempts == 5: if stop_event.is_set() or attempts == 5: