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 typing import List
from typing import Literal
from typing import Optional
from typing import Union
from discord.ext.commands import Context
from discord.user import _UserTag
from pydantic import Field
from pydantic import model_validator
from pydantic import TypeAdapter
from pomice.enums import PlaylistType
from pomice.enums import SearchType
@ -17,6 +20,10 @@ from pomice.models import BaseModel
__all__ = (
"Track",
"TrackInfo",
"Playlist",
"PlaylistInfo",
"PlaylistExtended",
"PlaylistModelAdapter",
)
@ -45,6 +52,7 @@ class Track(BaseModel):
search_type: SearchType = SearchType.YTSEARCH
filters: List[Filter] = Field(default_factory=list)
timestamp: Optional[float] = None
playlist: Optional[Playlist] = None
original: Optional[Track] = None
ctx: Optional[Context] = None
requester: Optional[_UserTag] = None
@ -107,17 +115,11 @@ class Playlist(BaseModel):
info: PlaylistInfo
tracks: List[Track]
playlist_type: PlaylistType
uri: str
artwork_url: Optional[str] = None
@property
def name(self) -> str:
return self.info.name
@property
def thumbnail(self) -> Optional[str]:
return self.artwork_url
@property
def selected_track(self) -> Optional[Track]:
if self.track_count <= 0:
@ -134,3 +136,29 @@ class Playlist(BaseModel):
def __repr__(self) -> str:
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)