ytdl-sub/ytdl_subscribe/subscriptions/soundcloud.py
2022-04-05 18:06:46 +00:00

62 lines
2.1 KiB
Python

from typing import List
from ytdl_subscribe.downloaders.soundcloud_downloader import SoundcloudDownloader
from ytdl_subscribe.entries.soundcloud import SoundcloudAlbum
from ytdl_subscribe.entries.soundcloud import SoundcloudTrack
from ytdl_subscribe.subscriptions.subscription import Subscription
from ytdl_subscribe.validators.config.source_options.soundcloud_validators import (
SoundcloudAlbumsAndSinglesDownloadValidator,
)
from ytdl_subscribe.validators.config.source_options.soundcloud_validators import (
SoundcloudSourceValidator,
)
class SoundcloudSubscription(Subscription):
source_validator_type = SoundcloudSourceValidator
downloader_type = SoundcloudDownloader
@property
def source_options(self) -> SoundcloudSourceValidator:
return super().source_options
@property
def downloader(self) -> SoundcloudDownloader:
return super().downloader
class SoundcloudAlbumsAndSinglesSubscription(SoundcloudSubscription):
download_strategy_type = SoundcloudAlbumsAndSinglesDownloadValidator
@property
def download_strategy_options(self) -> SoundcloudAlbumsAndSinglesDownloadValidator:
return super().download_strategy_options
def extract_info(
self,
):
tracks: List[SoundcloudTrack] = []
# Get the album info first. This tells us which track ids belong
# to an album. Unfortunately we cannot use download_archive or info.json for this
albums: List[SoundcloudAlbum] = self.downloader.download_albums(
artist_name=self.download_strategy_options.username.value
)
for album in albums:
tracks += album.album_tracks(
skip_premiere_tracks=self.source_options.skip_premiere_tracks.value
)
# only add tracks that are not part of an album
single_tracks = self.downloader.download_tracks(
artist_name=self.download_strategy_options.username.value
)
tracks += [
track
for track in single_tracks
if not any(album.contains(track) for album in albums)
]
for entry in tracks:
self.post_process_entry(entry)