diff --git a/ytdl_subscribe/entries/entry.py b/ytdl_subscribe/entries/entry.py index 0d177abc..436e11b2 100644 --- a/ytdl_subscribe/entries/entry.py +++ b/ytdl_subscribe/entries/entry.py @@ -1,4 +1,5 @@ from abc import ABC +from dataclasses import dataclass from pathlib import Path from typing import Any from typing import Dict @@ -10,6 +11,13 @@ from ytdl_subscribe.validators.base.string_formatter_validators import StringFor from ytdl_subscribe.validators.config.overrides.overrides_validator import OverridesValidator +@dataclass +class PlaylistMetadata: + order_index: int + playlist_id: str + playlist_extractor: str + + # TODO: strip things out of entry into BaseEntry class BaseEntry(ABC): def __init__(self, **kwargs): @@ -41,14 +49,13 @@ class BaseEntry(ABC): return self.kwargs("extractor") @property - def order_index(self) -> int: + def playlist_metadata(self) -> Optional[PlaylistMetadata]: """ - Reserved for any child entry class that might have some kind of ordering to it. - Returns 1 unless overwritten. + Reserved for any child entry class that resides in a playlist. - :return: The order index (1-based) + :return: Playlist metadata for this entry """ - return 1 + return None def to_dict(self) -> Dict[str, str]: """Returns the entry's values as a dictionary""" diff --git a/ytdl_subscribe/entries/soundcloud.py b/ytdl_subscribe/entries/soundcloud.py index 010444f4..d337eecc 100644 --- a/ytdl_subscribe/entries/soundcloud.py +++ b/ytdl_subscribe/entries/soundcloud.py @@ -1,9 +1,11 @@ from typing import Dict from typing import List +from typing import Optional from sanitize_filename import sanitize from ytdl_subscribe.entries.entry import Entry +from ytdl_subscribe.entries.entry import PlaylistMetadata class SoundcloudTrack(Entry): @@ -65,23 +67,23 @@ class SoundcloudAlbumTrack(SoundcloudTrack): Entry object to represent a Soundcloud track yt-dlp that belongs to an album. """ - def __init__(self, album: str, album_year: int, track_number: int, **kwargs): + def __init__(self, album: str, album_year: int, playlist_metadata: PlaylistMetadata, **kwargs): """ Initialize the album track using album metadata and ytdl metadata for the specific track. """ super().__init__(**kwargs) self._album = album self._album_year = album_year - self._track_number = track_number + self._playlist_metadata = playlist_metadata + + @property + def playlist_metadata(self) -> Optional[PlaylistMetadata]: + return self._playlist_metadata @property def track_number(self) -> int: """Returns the entry's track number""" - return self._track_number - - @property - def order_index(self) -> int: - return self._track_number + return self._playlist_metadata.order_index @property def album(self) -> str: @@ -95,12 +97,16 @@ class SoundcloudAlbumTrack(SoundcloudTrack): @classmethod def from_soundcloud_entry( - cls, soundcloud_track: SoundcloudTrack, album: str, album_year: int, track_number: int + cls, + album: str, + album_year: int, + soundcloud_track: SoundcloudTrack, + playlist_metadata: PlaylistMetadata, ) -> "SoundcloudAlbumTrack": return SoundcloudAlbumTrack( album=album, album_year=album_year, - track_number=track_number, + playlist_metadata=playlist_metadata, **soundcloud_track._kwargs, ) @@ -130,10 +136,12 @@ class SoundcloudAlbum(Entry): album_tracks = [ SoundcloudAlbumTrack.from_soundcloud_entry( - soundcloud_track=track, album=self.title, album_year=self.album_year, - track_number=i + 1, + soundcloud_track=track, + playlist_metadata=PlaylistMetadata( + playlist_id=self.uid, playlist_extractor=self.extractor, order_index=i + 1 + ), ) for i, track in enumerate(tracks) ]