65 lines
1.8 KiB
Python
65 lines
1.8 KiB
Python
from abc import ABC
|
|
from typing import Generic
|
|
from typing import TypeVar
|
|
|
|
from ytdl_sub.downloaders.downloader import Downloader
|
|
from ytdl_sub.downloaders.downloader import DownloaderValidator
|
|
from ytdl_sub.entries.soundcloud import SoundcloudTrack
|
|
from ytdl_sub.validators.validators import BoolValidator
|
|
|
|
|
|
class SoundcloudDownloaderOptions(DownloaderValidator, ABC):
|
|
"""
|
|
Abstract source validator for all soundcloud sources.
|
|
"""
|
|
|
|
_optional_keys = {"skip_premiere_tracks"}
|
|
|
|
def __init__(self, name: str, value: dict):
|
|
super().__init__(name=name, value=value)
|
|
self._skip_premiere_tracks = self._validate_key(
|
|
"skip_premiere_tracks", BoolValidator, default=True
|
|
)
|
|
|
|
@property
|
|
def skip_premiere_tracks(self) -> bool:
|
|
"""
|
|
Optional. True to skip tracks that require purchasing. False otherwise. Defaults to True.
|
|
"""
|
|
return self._skip_premiere_tracks.value
|
|
|
|
|
|
SoundcloudDownloaderOptionsT = TypeVar(
|
|
"SoundcloudDownloaderOptionsT", bound=SoundcloudDownloaderOptions
|
|
)
|
|
|
|
|
|
class SoundcloudDownloader(
|
|
Downloader[SoundcloudDownloaderOptionsT, SoundcloudTrack],
|
|
Generic[SoundcloudDownloaderOptionsT],
|
|
ABC,
|
|
):
|
|
"""
|
|
Class that handles downloading soundcloud entries via ytdl and converting them into
|
|
SoundcloudTrack / SoundcloudAlbumTrack objects
|
|
"""
|
|
|
|
downloader_entry_type = SoundcloudTrack
|
|
|
|
@classmethod
|
|
def artist_albums_url(cls, artist_url: str) -> str:
|
|
"""
|
|
Returns
|
|
-------
|
|
Full artist album url
|
|
"""
|
|
return f"{artist_url}/albums"
|
|
|
|
@classmethod
|
|
def artist_tracks_url(cls, artist_url: str) -> str:
|
|
"""
|
|
Returns
|
|
-------
|
|
Full artist tracks url
|
|
"""
|
|
return f"{artist_url}/tracks"
|