from typing import TYPE_CHECKING, Optional, List if TYPE_CHECKING: from yandex_music import Client, User, Cover, MadeFor, TrackShort, PlaylistAbsence, PlayCounter from yandex_music import YandexMusicObject class Playlist(YandexMusicObject): def __init__(self, owner: Optional['User'], cover: Optional['Cover'], made_for: Optional['MadeFor'], play_counter: Optional['PlayCounter'], playlist_absence: Optional['PlaylistAbsence'], uid=None, kind=None, title=None, track_count=None, tags=None, revision=None, snapshot=None, visibility=None, collective=None, created=None, modified=None, available=None, is_banner=None, is_premiere=None, duration_ms=None, og_image=None, tracks=None, prerolls=None, likes_count=None, generated_playlist_type=None, animated_cover_uri=None, ever_played=None, description=None, description_formatted=None, is_for_from=None, regions=None, client: Optional['Client'] = None, **kwargs) -> None: self.owner = owner self.cover = cover self.made_for = made_for self.play_counter = play_counter self.playlist_absence = playlist_absence self.uid = uid self.kind = kind self.title = title self.track_count = track_count self.revision = revision self.snapshot = snapshot self.visibility = visibility self.collective = collective self.created = created self.modified = modified self.available = available self.is_banner = is_banner self.is_premiere = is_premiere self.duration_ms = duration_ms self.og_image = og_image self.tracks = tracks self.prerolls = prerolls self.likes_count = likes_count self.animated_cover_uri = animated_cover_uri self.description = description self.description_formatted = description_formatted self.ever_played = ever_played self.generated_playlist_type = generated_playlist_type self.is_for_from = is_for_from self.regions = regions self.tags = tags self.client = client self._id_attrs = (self.uid, self.kind, self.title, self.playlist_absence) @property def is_mine(self) -> bool: return self.owner.uid == self.client.me.account.uid @property def playlist_id(self) -> str: return f'{self.owner.uid}:{self.kind}' def download_animated_cover(self, filename: str, size: Optional[str] = '200x200') -> None: """Загрузка анимированной обложки. Args: filename (:obj:`str`): Путь для сохранения файла с названием и расширением (GIF). size (:obj:`str`, optional): Размер анимированной обложки. """ self.client.request.download(f'https://{self.animated_cover_uri.replace("%%", size)}', filename) def download_og_image(self, filename: str, size: Optional[str] = '200x200') -> None: """Загрузка обложки. Используйте это только когда нет self.cover! Args: filename (:obj:`str`): Путь для сохранения файла с названием и расширением. size (:obj:`str`, optional): Размер обложки. """ self.client.request.download(f'https://{self.og_image.replace("%%", size)}', filename) def rename(self, name: str) -> None: client, kind = self.client, self.kind self.__dict__.clear() self.__dict__.update(client.users_playlists_name(kind, name).__dict__) def like(self, *args, **kwargs) -> bool: """Сокращение для:: client.users_likes_playlists_add(playlist.uid, user.id *args, **kwargs) """ return self.client.users_likes_playlists_add(self.uid, self.client.me.account.uid, *args, **kwargs) def dislike(self, *args, **kwargs) -> bool: """Сокращение для:: client.users_likes_playlists_remove(playlist.uid, user.id *args, **kwargs) """ return self.client.users_likes_playlists_remove(self.uid, self.client.me.account.uid, *args, **kwargs) @classmethod def de_json(cls, data: dict, client: 'Client') -> Optional['Playlist']: if not data: return None data = super(Playlist, cls).de_json(data, client) from yandex_music import User, MadeFor, Cover, PlayCounter, TrackShort, PlaylistAbsence data['owner'] = User.de_json(data.get('owner'), client) data['cover'] = Cover.de_json(data.get('cover'), client) data['made_for'] = MadeFor.de_json(data.get('made_for'), client) data['tracks'] = TrackShort.de_list(data.get('tracks'), client) data['play_counter'] = PlayCounter.de_json(data.get('play_counter'), client) data['playlist_absence'] = PlaylistAbsence.de_json(data.get('playlist_absence'), client) # на случай фикса if data.get('playlist_absense'): # очепятка яндуха data['playlist_absence'] = PlaylistAbsence.de_json(data.get('playlist_absense'), client) data.pop('playlist_absense') return cls(client=client, **data) @classmethod def de_list(cls, data: dict, client: 'Client') -> List['Playlist']: if not data: return [] playlists = list() for playlist in data: playlists.append(cls.de_json(playlist, client)) return playlists # camelCase псевдонимы #: Псевдоним для :attr:`is_mine` isMine = is_mine #: Псевдоним для :attr:`playlist_id` playlistId = playlist_id #: Псевдоним для :attr:`download_animated_cover` downloadAnimatedCover = download_animated_cover #: Псевдоним для :attr:`download_og_image` downloadOgImage = download_og_image