feat: add extended playlist model
contains uri and artwork_url for AM and Spotify
This commit is contained in:
parent
b719fa461c
commit
e8d26f42cb
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue