feat: add extended playlist model

contains uri and artwork_url for AM and Spotify
This commit is contained in:
NiceAesth 2024-02-23 18:29:12 +02:00
parent b719fa461c
commit e8d26f42cb
1 changed files with 34 additions and 6 deletions

View File

@ -1,12 +1,15 @@
from __future__ import annotations from __future__ import annotations
from typing import List from typing import List
from typing import Literal
from typing import Optional from typing import Optional
from typing import Union
from discord.ext.commands import Context from discord.ext.commands import Context
from discord.user import _UserTag from discord.user import _UserTag
from pydantic import Field from pydantic import Field
from pydantic import model_validator from pydantic import model_validator
from pydantic import TypeAdapter
from pomice.enums import PlaylistType from pomice.enums import PlaylistType
from pomice.enums import SearchType from pomice.enums import SearchType
@ -17,6 +20,10 @@ from pomice.models import BaseModel
__all__ = ( __all__ = (
"Track", "Track",
"TrackInfo", "TrackInfo",
"Playlist",
"PlaylistInfo",
"PlaylistExtended",
"PlaylistModelAdapter",
) )
@ -45,6 +52,7 @@ class Track(BaseModel):
search_type: SearchType = SearchType.YTSEARCH search_type: SearchType = SearchType.YTSEARCH
filters: List[Filter] = Field(default_factory=list) filters: List[Filter] = Field(default_factory=list)
timestamp: Optional[float] = None timestamp: Optional[float] = None
playlist: Optional[Playlist] = None
original: Optional[Track] = None original: Optional[Track] = None
ctx: Optional[Context] = None ctx: Optional[Context] = None
requester: Optional[_UserTag] = None requester: Optional[_UserTag] = None
@ -107,17 +115,11 @@ class Playlist(BaseModel):
info: PlaylistInfo info: PlaylistInfo
tracks: List[Track] tracks: List[Track]
playlist_type: PlaylistType playlist_type: PlaylistType
uri: str
artwork_url: Optional[str] = None
@property @property
def name(self) -> str: def name(self) -> str:
return self.info.name return self.info.name
@property
def thumbnail(self) -> Optional[str]:
return self.artwork_url
@property @property
def selected_track(self) -> Optional[Track]: def selected_track(self) -> Optional[Track]:
if self.track_count <= 0: if self.track_count <= 0:
@ -134,3 +136,29 @@ class Playlist(BaseModel):
def __repr__(self) -> str: def __repr__(self) -> str:
return f"<Pomice.Playlist name={self.info.name!r} total_tracks={self.track_count}>" return f"<Pomice.Playlist name={self.info.name!r} total_tracks={self.track_count}>"
@model_validator(mode="after")
def _set_playlist(self) -> Playlist:
for track in self.tracks:
track.playlist = self
return self
class PlaylistExtended(Playlist):
"""Playlist object with additional information for external services."""
playlist_type: Union[Literal[PlaylistType.APPLE_MUSIC, PlaylistType.SPOTIFY]]
uri: str
artwork_url: str
@property
def thumbnail(self) -> Optional[str]:
return self.artwork_url
PlaylistModelType = Union[Playlist, PlaylistExtended]
PlaylistModelAdapter = lambda **kwargs: TypeAdapter(
PlaylistModelType,
Playlist,
PlaylistExtended,
).validate_python(kwargs)