2019-12-27 18:14:51 +09:00
|
|
|
|
from typing import TYPE_CHECKING, Optional, List
|
|
|
|
|
|
2020-01-26 21:19:22 +09:00
|
|
|
|
from yandex_music import YandexMusicObject
|
|
|
|
|
|
2019-12-27 18:14:51 +09:00
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
|
from yandex_music import Client, User, Cover, MadeFor, TrackShort, PlaylistAbsence, PlayCounter
|
|
|
|
|
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
|
|
|
|
class Playlist(YandexMusicObject):
|
|
|
|
|
def __init__(self,
|
2019-12-27 18:14:51 +09:00
|
|
|
|
owner: Optional['User'],
|
|
|
|
|
cover: Optional['Cover'],
|
|
|
|
|
made_for: Optional['MadeFor'],
|
|
|
|
|
play_counter: Optional['PlayCounter'],
|
|
|
|
|
playlist_absence: Optional['PlaylistAbsence'],
|
2019-12-28 22:25:09 +09:00
|
|
|
|
uid: Optional[int] = None,
|
|
|
|
|
kind: Optional[int] = None,
|
|
|
|
|
title: Optional[str] = None,
|
|
|
|
|
track_count: Optional[int] = None,
|
|
|
|
|
tags: Optional[list] = None,
|
|
|
|
|
revision: Optional[int] = None,
|
|
|
|
|
snapshot: Optional[int] = None,
|
|
|
|
|
visibility: Optional[str] = None,
|
|
|
|
|
collective: Optional[bool] = None,
|
|
|
|
|
created: Optional[str] = None,
|
|
|
|
|
modified: Optional[str] = None,
|
|
|
|
|
available: Optional[bool] = None,
|
|
|
|
|
is_banner: Optional[bool] = None,
|
|
|
|
|
is_premiere: Optional[bool] = None,
|
|
|
|
|
duration_ms: Optional[int] = None,
|
|
|
|
|
og_image: Optional[str] = None,
|
|
|
|
|
tracks: List['TrackShort'] = None,
|
|
|
|
|
prerolls: Optional[list] = None,
|
|
|
|
|
likes_count: Optional[int] = None,
|
|
|
|
|
generated_playlist_type: Optional[str] = None,
|
|
|
|
|
animated_cover_uri: Optional[str] = None,
|
|
|
|
|
ever_played: Optional[bool] = None,
|
|
|
|
|
description: Optional[str] = None,
|
|
|
|
|
description_formatted: Optional[str] = None,
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
is_for_from=None,
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
regions=None,
|
2019-12-27 18:14:51 +09:00
|
|
|
|
client: Optional['Client'] = None,
|
|
|
|
|
**kwargs) -> None:
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
self.owner = owner
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
self.cover = cover
|
|
|
|
|
self.made_for = made_for
|
|
|
|
|
self.play_counter = play_counter
|
2019-11-24 07:51:45 +09:00
|
|
|
|
self.playlist_absence = playlist_absence
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
|
2019-11-24 07:51:45 +09:00
|
|
|
|
self.uid = uid
|
|
|
|
|
self.kind = kind
|
|
|
|
|
self.title = title
|
|
|
|
|
self.track_count = track_count
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
self.revision = revision
|
|
|
|
|
self.snapshot = snapshot
|
|
|
|
|
self.visibility = visibility
|
|
|
|
|
self.collective = collective
|
2019-11-08 04:52:26 +09:00
|
|
|
|
self.created = created
|
|
|
|
|
self.modified = modified
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
self.available = available
|
|
|
|
|
self.is_banner = is_banner
|
|
|
|
|
self.is_premiere = is_premiere
|
|
|
|
|
self.duration_ms = duration_ms
|
|
|
|
|
self.og_image = og_image
|
2019-06-01 17:23:28 +09:00
|
|
|
|
self.tracks = tracks
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
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
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
self.regions = regions
|
New supported objects: Landing, Block, BlockEntity, Chart, ChartItem, MixLink, PersonalPlaylistsData, PlayContext, PlayContextsData, Promotion, TrackId, TrackShorOld (YEAH!)
The following method are wrapped:
- /landing3
Added the ability to download covers
The following field are optional: Playlist.tags
Now, when parsing json, the "client" key is replaced with "client_"
2019-05-25 02:10:39 +09:00
|
|
|
|
self.tags = tags
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
|
|
|
|
self.client = client
|
2019-11-24 07:51:45 +09:00
|
|
|
|
self._id_attrs = (self.uid, self.kind, self.title, self.playlist_absence)
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2019-06-01 15:04:15 +09:00
|
|
|
|
@property
|
2019-12-27 18:14:51 +09:00
|
|
|
|
def is_mine(self) -> bool:
|
2019-12-24 06:20:07 +09:00
|
|
|
|
return self.owner.uid == self.client.me.account.uid
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
2019-05-19 05:59:14 +09:00
|
|
|
|
@property
|
2019-12-27 18:14:51 +09:00
|
|
|
|
def playlist_id(self) -> str:
|
2019-05-19 05:59:14 +09:00
|
|
|
|
return f'{self.owner.uid}:{self.kind}'
|
|
|
|
|
|
2019-12-27 21:32:50 +09:00
|
|
|
|
def download_animated_cover(self, filename: str, size: str = '200x200') -> None:
|
2019-08-18 23:44:46 +09:00
|
|
|
|
"""Загрузка анимированной обложки.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
filename (:obj:`str`): Путь для сохранения файла с названием и расширением (GIF).
|
|
|
|
|
size (:obj:`str`, optional): Размер анимированной обложки.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
self.client.request.download(f'https://{self.animated_cover_uri.replace("%%", size)}', filename)
|
|
|
|
|
|
2019-12-27 21:32:50 +09:00
|
|
|
|
def download_og_image(self, filename: str, size: str = '200x200') -> None:
|
2019-08-18 23:44:46 +09:00
|
|
|
|
"""Загрузка обложки.
|
|
|
|
|
|
|
|
|
|
Используйте это только когда нет self.cover!
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
filename (:obj:`str`): Путь для сохранения файла с названием и расширением.
|
|
|
|
|
size (:obj:`str`, optional): Размер обложки.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
self.client.request.download(f'https://{self.og_image.replace("%%", size)}', filename)
|
|
|
|
|
|
2019-12-27 18:14:51 +09:00
|
|
|
|
def rename(self, name: str) -> None:
|
2019-06-01 15:04:15 +09:00
|
|
|
|
client, kind = self.client, self.kind
|
|
|
|
|
|
|
|
|
|
self.__dict__.clear()
|
|
|
|
|
self.__dict__.update(client.users_playlists_name(kind, name).__dict__)
|
|
|
|
|
|
2019-12-27 18:14:51 +09:00
|
|
|
|
def like(self, *args, **kwargs) -> bool:
|
2019-10-07 02:06:28 +09:00
|
|
|
|
"""Сокращение для::
|
|
|
|
|
|
|
|
|
|
client.users_likes_playlists_add(playlist.uid, user.id *args, **kwargs)
|
|
|
|
|
"""
|
2019-12-24 06:20:07 +09:00
|
|
|
|
return self.client.users_likes_playlists_add(self.uid, self.client.me.account.uid, *args, **kwargs)
|
2019-10-07 02:06:28 +09:00
|
|
|
|
|
2019-12-27 18:14:51 +09:00
|
|
|
|
def dislike(self, *args, **kwargs) -> bool:
|
2019-10-07 02:06:28 +09:00
|
|
|
|
"""Сокращение для::
|
|
|
|
|
|
|
|
|
|
client.users_likes_playlists_remove(playlist.uid, user.id *args, **kwargs)
|
|
|
|
|
"""
|
2019-12-24 06:20:07 +09:00
|
|
|
|
return self.client.users_likes_playlists_remove(self.uid, self.client.me.account.uid, *args, **kwargs)
|
2019-10-07 02:06:28 +09:00
|
|
|
|
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
@classmethod
|
2019-12-27 18:14:51 +09:00
|
|
|
|
def de_json(cls, data: dict, client: 'Client') -> Optional['Playlist']:
|
2020-01-26 22:17:09 +09:00
|
|
|
|
"""Десериализация объекта.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
data (:obj:`dict`): Поля и значения десериализуемого объекта.
|
|
|
|
|
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client` представляющий клиент Yandex
|
|
|
|
|
Music.
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`yandex_music.Playlist`: Объект класса :class:`yandex_music.Playlist`.
|
|
|
|
|
"""
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
if not data:
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
data = super(Playlist, cls).de_json(data, client)
|
2019-11-24 07:51:45 +09:00
|
|
|
|
from yandex_music import User, MadeFor, Cover, PlayCounter, TrackShort, PlaylistAbsence
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
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)
|
2019-06-01 17:23:28 +09:00
|
|
|
|
data['tracks'] = TrackShort.de_list(data.get('tracks'), client)
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
data['play_counter'] = PlayCounter.de_json(data.get('play_counter'), client)
|
2019-11-24 08:23:24 +09:00
|
|
|
|
|
|
|
|
|
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')
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
|
|
|
|
return cls(client=client, **data)
|
|
|
|
|
|
|
|
|
|
@classmethod
|
2019-12-27 18:14:51 +09:00
|
|
|
|
def de_list(cls, data: dict, client: 'Client') -> List['Playlist']:
|
2020-01-26 22:17:09 +09:00
|
|
|
|
"""Десериализация списка объектов.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
data (:obj:`list`): Список словарей с полями и значениями десериализуемого объекта.
|
|
|
|
|
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client` представляющий клиент Yandex
|
|
|
|
|
Music.
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`list` из :obj:`yandex_music.Playlist`: Список объектов класса :class:`yandex_music.Playlist`.
|
|
|
|
|
"""
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
if not data:
|
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
playlists = list()
|
|
|
|
|
for playlist in data:
|
|
|
|
|
playlists.append(cls.de_json(playlist, client))
|
|
|
|
|
|
|
|
|
|
return playlists
|
2019-08-18 18:54:13 +09:00
|
|
|
|
|
|
|
|
|
# camelCase псевдонимы
|
|
|
|
|
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`is_mine`
|
2019-08-18 18:54:13 +09:00
|
|
|
|
isMine = is_mine
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`playlist_id`
|
2019-08-18 18:54:13 +09:00
|
|
|
|
playlistId = playlist_id
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`download_animated_cover`
|
2019-08-18 23:44:46 +09:00
|
|
|
|
downloadAnimatedCover = download_animated_cover
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`download_og_image`
|
2019-08-18 23:44:46 +09:00
|
|
|
|
downloadOgImage = download_og_image
|