Merge pull request #232 from MarshalX/issue-231

Классы отметок "мне нравится" объединены в один
このコミットが含まれているのは:
Il'ya 2020-02-04 15:36:34 +03:00 committed by GitHub
コミット 13bec4a1a7
この署名に対応する既知のキーがデータベースに存在しません
GPGキーID: 4AEE18F83AFDEB23
11個のファイルの変更199行の追加410行の削除

ファイルの表示

@ -1,49 +0,0 @@
import pytest
from yandex_music import AlbumsLikes
@pytest.fixture(scope='class')
def albums_likes(album):
return AlbumsLikes(TestAlbumsLikes.timestamp, TestAlbumsLikes.id, album)
class TestAlbumsLikes:
id = 5246018
timestamp = '2019-09-03T19:59:56+00:00'
def test_expected_values(self, albums_likes, album):
assert albums_likes.timestamp == self.timestamp
assert albums_likes.id == self.id
assert albums_likes.album == album
def test_de_json_none(self, client):
assert AlbumsLikes.de_json({}, client) is None
def test_de_list_none(self, client):
assert AlbumsLikes.de_list({}, client) == []
def test_de_json_required(self, client):
json_dict = {'timestamp': self.timestamp}
albums_likes = AlbumsLikes.de_json(json_dict, client)
assert albums_likes.timestamp == self.timestamp
def test_de_json_all(self, client, album):
json_dict = {'timestamp': self.timestamp, 'id_': self.id, 'album': album.to_dict()}
albums_likes = AlbumsLikes.de_json(json_dict, client)
assert albums_likes.timestamp == self.timestamp
assert albums_likes.id == self.id
assert albums_likes.album == album
def test_equality(self, album):
a = AlbumsLikes(self.timestamp, self.id, album)
b = AlbumsLikes(self.timestamp, self.id, None)
c = AlbumsLikes(self.timestamp, self.id, album)
assert a != b
assert hash(a) != hash(b)
assert a is not b
assert a == c

ファイルの表示

@ -1,47 +0,0 @@
import pytest
from yandex_music import ArtistsLikes
@pytest.fixture(scope='class')
def artists_likes(artist):
return ArtistsLikes(TestArtistsLikes.id, artist, TestArtistsLikes.timestamp)
class TestArtistsLikes:
id = None
timestamp = '2019-11-09T10:28:39+00:00'
def test_expected_values(self, artists_likes, artist):
assert artists_likes.id == self.id
assert artists_likes.artist == artist
assert artists_likes.timestamp == self.timestamp
def test_de_json_none(self, client):
assert ArtistsLikes.de_json({}, client) is None
def test_de_list_none(self, client):
assert ArtistsLikes.de_list({}, client) == []
def test_de_json_required(self, client):
json_dict = {}
artists_likes = ArtistsLikes.de_json(json_dict, client)
def test_de_json_all(self, client, artist):
json_dict = {'id_': self.id, 'artist': artist.to_dict(), 'timestamp': self.timestamp}
artists_likes = ArtistsLikes.de_json(json_dict, client)
assert artists_likes.id == self.id
assert artists_likes.artist == artist
assert artists_likes.timestamp == self.timestamp
def test_equality(self, artist):
a = ArtistsLikes(self.id, artist, self.timestamp)
b = ArtistsLikes(self.id, None, self.timestamp)
c = ArtistsLikes(self.id, artist, self.timestamp)
assert a != b
assert hash(a) != hash(b)
assert a is not b
assert a == c

55
tests/test_like.py ノーマルファイル
ファイルの表示

@ -0,0 +1,55 @@
import pytest
from yandex_music import Like
@pytest.fixture(scope='class', params=[2, 3, 4])
def like_with_param(request, results, types):
return Like(types[request.param], TestLike.id, TestLike.timestamp,
**{types[request.param]: results[request.param]}), request.param
class TestLike:
id = 5246018
timestamp = '2019-09-03T19:59:56+00:00'
def test_expected_values(self, results, types, like_with_param):
like, param = like_with_param
assert like.type == types[param]
assert like.id == self.id
assert like.timestamp == self.timestamp
assert getattr(like, like.type) == results[param]
def test_de_json_none(self, client):
assert Like.de_json({}, client) is None
def test_de_list_none(self, client):
assert Like.de_list({}, client) == []
@pytest.mark.parametrize('param', [2, 3, 4])
def test_de_json_all(self, results, types, client, param):
result, type_ = results[param], types[param]
json_dict = {'timestamp': self.timestamp, 'id_': self.id, type_: result.to_dict()}
like = Like.de_json(json_dict, client, type_)
assert like.type == type_
assert like.id == self.id
assert like.timestamp == self.timestamp
assert getattr(like, type_) == result
@pytest.mark.parametrize('param', [2, 3, 4])
def test_equality(self, results, types, param):
result, type_ = results[param], types[param]
a = Like(type_, self.id, self.timestamp, **{type_: result})
b = Like(type_, '', self.timestamp, **{type_: result})
c = Like(type_, self.id, '', **{type_: result})
d = Like(type_, self.id, self.timestamp, **{type_: result})
assert a != b != c
assert hash(a) != hash(b) != hash(c)
assert a is not b is not c
assert a == d

ファイルの表示

@ -1,49 +0,0 @@
import pytest
from yandex_music import PlaylistsLikes
@pytest.fixture(scope='class')
def playlists_likes(playlist):
return PlaylistsLikes(TestPlaylistsLikes.timestamp, TestPlaylistsLikes.id, playlist)
class TestPlaylistsLikes:
id = None
timestamp = '2019-06-21T05:41:46+00:00'
def test_expected_values(self, playlists_likes, playlist):
assert playlists_likes.timestamp == self.timestamp
assert playlists_likes.id == self.id
assert playlists_likes.playlist == playlist
def test_de_json_none(self, client):
assert PlaylistsLikes.de_json({}, client) is None
def test_de_list_none(self, client):
assert PlaylistsLikes.de_list({}, client) == []
def test_de_json_required(self, client):
json_dict = {'timestamp': self.timestamp}
playlists_likes = PlaylistsLikes.de_json(json_dict, client)
assert playlists_likes.timestamp == self.timestamp
def test_de_json_all(self, client, playlist):
json_dict = {'timestamp': self.timestamp, 'id_': self.id, 'playlist': playlist.to_dict()}
playlists_likes = PlaylistsLikes.de_json(json_dict, client)
assert playlists_likes.timestamp == self.timestamp
assert playlists_likes.id == self.id
assert playlists_likes.playlist == playlist
def test_equality(self, playlist):
a = PlaylistsLikes(self.timestamp, self.id, playlist)
b = PlaylistsLikes(self.timestamp, self.id, None)
c = PlaylistsLikes(self.timestamp, self.id, playlist)
assert a != b
assert hash(a) != hash(b)
assert a is not b
assert a == c

ファイルの表示

@ -47,10 +47,6 @@ from .track.normalization import Normalization
from .track.track import Track
from .track.tracks_similar import SimilarTracks
from .likes.albums_likes import AlbumsLikes
from .likes.artists_likes import ArtistsLikes
from .likes.playlists_likes import PlaylistsLikes
from .feed.generated_playlist import GeneratedPlaylist
from .feed.album_event import AlbumEvent
from .feed.artist_event import ArtistEvent
@ -102,6 +98,7 @@ from .supplement.supplement import Supplement
from .supplement.lyrics import Lyrics
from .supplement.video_supplement import VideoSupplement
from .like import Like
from .pager import Pager
from .cover import Cover
from .invocation_info import InvocationInfo
@ -114,11 +111,11 @@ __all__ = ['YandexMusicObject', 'Client', 'Account', 'PassportPhone', 'Invocatio
'Subscription', 'Status', 'Price', 'Product', 'AutoRenewable', 'Settings', 'PermissionAlerts', 'Experiments',
'Cover', 'Ratings', 'Counts', 'Link', 'Artist', 'User', 'CaseForms', 'MadeFor', 'Label', 'Album',
'PlayCounter', 'Playlist', 'TrackShort', 'TracksList', 'Major', 'Normalization', 'TrackPosition', 'Track',
'AlbumsLikes', 'ArtistsLikes', 'PlaylistsLikes', 'GeneratedPlaylist', 'TrackWithAds', 'Day', 'ArtistEvent',
'AlbumEvent', 'Feed', 'Event', 'PromoCodeStatus', 'DownloadInfo', 'Video', 'SearchResult', 'Best', 'Search',
'Suggestions', 'MixLink', 'BlockEntity', 'Block', 'PlayContextsData', 'TrackId', 'TrackShortOld',
'PersonalPlaylistsData', 'Promotion', 'Landing', 'Chart', 'ChartItem', 'PlayContext', 'Title', 'Genre',
'Icon', 'Images', 'Id', 'Station', 'Dashboard', 'RotorSettings', 'AdParams', 'Restrictions', 'Value', 'Enum',
'DiscreteScale', 'StationResult', 'Sequence', 'StationTracksResult', 'BriefInfo', 'Description',
'PlaylistId', 'Vinyl', 'Supplement', 'Lyrics', 'VideoSupplement', 'ArtistTracks', 'Pager', 'ArtistAlbums',
'PlaylistAbsence', 'Shot', 'ShotEvent', 'ShotType', 'ShotData', 'SimilarTracks', 'UserSettings']
'Like', 'GeneratedPlaylist', 'TrackWithAds', 'Day', 'ArtistEvent', 'AlbumEvent', 'Feed', 'Event',
'PromoCodeStatus', 'DownloadInfo', 'Video', 'SearchResult', 'Best', 'Search', 'Suggestions', 'MixLink',
'BlockEntity', 'Block', 'PlayContextsData', 'TrackId', 'TrackShortOld', 'PersonalPlaylistsData', 'Promotion',
'Landing', 'Chart', 'ChartItem', 'PlayContext', 'Title', 'Genre', 'Icon', 'Images', 'Id', 'Station',
'Dashboard', 'RotorSettings', 'AdParams', 'Restrictions', 'Value', 'Enum', 'DiscreteScale', 'StationResult',
'Sequence', 'StationTracksResult', 'BriefInfo', 'Description', 'PlaylistId', 'Vinyl', 'Supplement', 'Lyrics',
'VideoSupplement', 'ArtistTracks', 'Pager', 'ArtistAlbums', 'PlaylistAbsence', 'Shot', 'ShotEvent',
'ShotType', 'ShotData', 'SimilarTracks', 'UserSettings']

ファイルの表示

@ -1,16 +1,15 @@
import logging
import functools
import logging
from datetime import datetime
from typing import Callable, Union, List, Optional, Dict
from typing import Callable, Dict, List, Optional, Union
from yandex_music import YandexMusicObject, Status, Settings, PermissionAlerts, Experiments, Artist, Album, Playlist, \
TracksList, Track, AlbumsLikes, ArtistsLikes, PlaylistsLikes, Feed, PromoCodeStatus, DownloadInfo, Search, \
Suggestions, Landing, Genre, Dashboard, StationResult, StationTracksResult, BriefInfo, Supplement, ArtistTracks, \
ArtistAlbums, ShotEvent, SimilarTracks, UserSettings
from yandex_music.utils.request import Request
from yandex_music import Album, Artist, ArtistAlbums, ArtistTracks, BriefInfo, Dashboard, DownloadInfo, Experiments, \
Feed, Genre, Landing, Like, PermissionAlerts, Playlist, PromoCodeStatus, Search, Settings, ShotEvent, SimilarTracks, \
StationResult, StationTracksResult, Status, Suggestions, Supplement, Track, TracksList, UserSettings, \
YandexMusicObject
from yandex_music.exceptions import Captcha, InvalidToken
from yandex_music.utils.difference import Difference
from yandex_music.exceptions import InvalidToken, Captcha
from yandex_music.utils.request import Request
CLIENT_ID = '23cabbbdc6cd418abb4b39c32c41195d'
CLIENT_SECRET = '53bc75238f0c4d08a118e51fe9203300'
@ -22,12 +21,6 @@ de_list = {
'playlist': Playlist.de_list,
}
de_list_likes = {
'artist': ArtistsLikes.de_list,
'album': AlbumsLikes.de_list,
'playlist': PlaylistsLikes.de_list,
}
logging.getLogger(__name__).addHandler(logging.NullHandler())
@ -745,7 +738,7 @@ class Client(YandexMusicObject):
@log
def users_playlists(self, kind: Union[List[Union[str, int]], str, int], user_id: Union[str, int] = None,
timeout: Union[int, float] = None, *args, **kwargs) -> List[Playlist]:
timeout: Union[int, float] = None, *args, **kwargs) -> List[Playlist]:
"""Получение плейлиста или списка плейлистов по уникальным идентификаторам.
Args:
@ -1531,8 +1524,7 @@ class Client(YandexMusicObject):
return Playlist.de_list(result, self)
def _get_likes(self, object_type: str, user_id: Union[str, int] = None, params: dict = None,
timeout: Union[int, float] = None, *args, **kwargs) \
-> Union[List[ArtistsLikes], List[AlbumsLikes], List[PlaylistsLikes], Optional[TracksList]]:
timeout: Union[int, float] = None, *args, **kwargs) -> Union[List[Like], Optional[TracksList]]:
if user_id is None and self.me is not None:
user_id = self.me.account.uid
@ -1543,7 +1535,7 @@ class Client(YandexMusicObject):
if object_type == 'track':
return TracksList.de_json(result.get('library'), self)
return de_list_likes.get(object_type)(result, self)
return Like.de_list(result, self, object_type)
@log
def users_likes_tracks(self, user_id: Union[str, int] = None, if_modified_since_revision: int = 0,
@ -1553,17 +1545,17 @@ class Client(YandexMusicObject):
@log
def users_likes_albums(self, user_id: Union[str, int] = None, rich: bool = True, timeout: Union[int, float] = None,
*args, **kwargs) -> List[AlbumsLikes]:
*args, **kwargs) -> List[Like]:
return self._get_likes('album', user_id, {'rich': rich}, timeout, *args, **kwargs)
@log
def users_likes_artists(self, user_id: Union[str, int] = None, with_timestamps: bool = True,
timeout: Union[int, float] = None, *args, **kwargs) -> List[ArtistsLikes]:
timeout: Union[int, float] = None, *args, **kwargs) -> List[Like]:
return self._get_likes('artist', user_id, {'with-timestamps': with_timestamps}, timeout, *args, **kwargs)
@log
def users_likes_playlists(self, user_id: Union[str, int] = None, timeout: Union[int, float] = None,
*args, **kwargs) -> List[PlaylistsLikes]:
*args, **kwargs) -> List[Like]:
return self._get_likes('playlist', user_id, timeout=timeout, *args, **kwargs)
@log

121
yandex_music/like.py ノーマルファイル
ファイルの表示

@ -0,0 +1,121 @@
from typing import List, Optional, TYPE_CHECKING
from yandex_music import Album, Artist, Playlist, YandexMusicObject
if TYPE_CHECKING:
from yandex_music import Client
de_list = {
'album': Album.de_json,
'playlist': Playlist.de_json,
}
class Like(YandexMusicObject):
"""Класс, представляющий объект с отметкой "мне нравится".
None:
В поле `type` содержится одно из трёх значений: `artist`, `playlist`, `album`. Обозначает поле, в котором
содержится информация.
Attributes:
type (:obj:`str`): Тип объекта с отметкой.
id (:obj:`str`): Уникальный идентификатор отметки.
timestamp (:obj:`str`): Дата и время добавления отметки.
album (:obj:`yandex_music.Album`): Объект класса :class:`yandex_music.Album`, представляющий понравившейся
альбом.
artist (:obj:`yandex_music.Artist`): Объект класса :class:`yandex_music.Artist`, представляющий понравившегося
артиста.
playlist (:obj:`yandex_music.Playlist`): Объект класса :class:`yandex_music.Playlist`, представляющий
понравившейся плейлист.
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
Args:
type (:obj:`str`): Тип объекта с отметкой.
id (:obj:`str`, optional): Уникальный идентификатор отметки.
timestamp (:obj:`str`, optional): Дата и время добавления отметки.
album (:obj:`yandex_music.Album`, optional): Объект класса :class:`yandex_music.Album`, представляющий
понравившейся альбом
artist (:obj:`yandex_music.Artist`, optional): Объект класса :class:`yandex_music.Artist`, представляющий
понравившегося артиста.
playlist (:obj:`yandex_music.Playlist`, optional): Объект класса :class:`yandex_music.Playlist`, представляющий
понравившейся плейлист.
client (:obj:`yandex_music.Client`, optional): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
**kwargs: Произвольные ключевые аргументы полученные от API.
"""
def __init__(self,
type_: str,
id_=None,
timestamp: Optional[str] = None,
album: Optional['Album'] = None,
artist: Optional['Artist'] = None,
playlist: Optional['Playlist'] = None,
client: Optional['Client'] = None,
**kwargs) -> None:
self.id = id_
self.type = type_
self.album = album
self.artist = artist
self.playlist = playlist
self.timestamp = timestamp
self.client = client
self._id_attrs = (self.id, self.type, self.timestamp, self.album, self.artist, self.playlist)
@classmethod
def de_json(cls, data: dict, client: 'Client', type_: str = None) -> Optional['Like']:
"""Десериализация объекта.
Args:
data (:obj:`dict`): Поля и значения десериализуемого объекта.
type_ (:obj:`str`, optional): Тип объекта с отметкой "мне нравится".
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
Returns:
:obj:`yandex_music.Like`: Объект класса :class:`yandex_music.Like`.
"""
if not data:
return None
data = super(Like, cls).de_json(data, client)
if type_ == 'artist':
if 'artist' not in data:
temp_data = data.copy()
data.clear()
data[type_] = Artist.de_json(temp_data, client)
else:
data[type_] = Artist.de_json(data.get('artist'), client)
else:
data[type_] = de_list[type_](data.get(type_), client)
data['type_'] = type_
return cls(client=client, **data)
@classmethod
def de_list(cls, data: dict, client: 'Client', type_: str = None) -> List['Like']:
"""Десериализация списка объектов.
Args:
data (:obj:`list`): Список словарей с полями и значениями десериализуемого объекта.
type_ (:obj:`str`, optional): Тип объекта с отметкой "мне нравится".
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
Returns:
:obj:`list` из :obj:`yandex_music.Like`: Список объектов класса :class:`yandex_music.Like`.
"""
if not data:
return []
likes = list()
for like in data:
likes.append(cls.de_json(like, client, type_))
return likes

ファイルの表示

ファイルの表示

@ -1,75 +0,0 @@
from typing import TYPE_CHECKING, Optional, List
from yandex_music import YandexMusicObject
if TYPE_CHECKING:
from yandex_music import Client, Album
class AlbumsLikes(YandexMusicObject):
"""Класс, представляющий .
Attributes:
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
Args:
client (:obj:`yandex_music.Client`, optional): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
**kwargs: Произвольные ключевые аргументы полученные от API.
"""
def __init__(self,
timestamp: str,
id_: Optional[int] = None,
album: Optional['Album'] = None,
client: Optional['Client'] = None,
**kwargs) -> None:
self.id = id_
self.album = album
self.timestamp = timestamp
self.client = client
self._id_attrs = (self.id, self.album)
@classmethod
def de_json(cls, data: dict, client: 'Client') -> Optional['AlbumsLikes']:
"""Десериализация объекта.
Args:
data (:obj:`dict`): Поля и значения десериализуемого объекта.
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
Returns:
:obj:`yandex_music.AlbumsLikes`: Объект класса :class:`yandex_music.AlbumsLikes`.
"""
if not data:
return None
data = super(AlbumsLikes, cls).de_json(data, client)
from yandex_music import Album
data['album'] = Album.de_json(data.get('album'), client)
return cls(client=client, **data)
@classmethod
def de_list(cls, data: dict, client: 'Client') -> List['AlbumsLikes']:
"""Десериализация списка объектов.
Args:
data (:obj:`list`): Список словарей с полями и значениями десериализуемого объекта.
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
Returns:
:obj:`list` из :obj:`yandex_music.AlbumsLikes`: Список объектов класса :class:`yandex_music.AlbumsLikes`.
"""
if not data:
return []
albums_likes = list()
for album_like in data:
albums_likes.append(cls.de_json(album_like, client))
return albums_likes

ファイルの表示

@ -1,80 +0,0 @@
from typing import TYPE_CHECKING, Optional, List
from yandex_music import YandexMusicObject
if TYPE_CHECKING:
from yandex_music import Client, Artist
class ArtistsLikes(YandexMusicObject):
"""Класс, представляющий .
Attributes:
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
Args:
client (:obj:`yandex_music.Client`, optional): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
**kwargs: Произвольные ключевые аргументы полученные от API.
"""
def __init__(self,
id_=None,
artist: Optional['Artist'] = None,
timestamp: str = None,
client: Optional['Client'] = None,
**kwargs) -> None:
self.id = id_
self.artist = artist
self.timestamp = timestamp
self.client = client
self._id_attrs = (self.id, self.artist)
@classmethod
def de_json(cls, data: dict, client: 'Client') -> Optional['ArtistsLikes']:
"""Десериализация объекта.
Args:
data (:obj:`dict`): Поля и значения десериализуемого объекта.
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
Returns:
:obj:`yandex_music.ArtistsLikes`: Объект класса :class:`yandex_music.ArtistsLikes`.
"""
if not data:
return None
data = super(ArtistsLikes, cls).de_json(data, client)
from yandex_music import Artist
if 'artist' not in data:
temp_data = data.copy()
data.clear()
data['artist'] = Artist.de_json(temp_data, client)
else:
data['artist'] = Artist.de_json(data.get('artist'), client)
return cls(client=client, **data)
@classmethod
def de_list(cls, data: dict, client: 'Client') -> List['ArtistsLikes']:
"""Десериализация списка объектов.
Args:
data (:obj:`list`): Список словарей с полями и значениями десериализуемого объекта.
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
Returns:
:obj:`list` из :obj:`yandex_music.ArtistsLikes`: Список объектов класса :class:`yandex_music.ArtistsLikes`.
"""
if not data:
return []
artists_likes = list()
for artist_like in data:
artists_likes.append(cls.de_json(artist_like, client))
return artists_likes

ファイルの表示

@ -1,76 +0,0 @@
from typing import TYPE_CHECKING, Optional, List
from yandex_music import YandexMusicObject
if TYPE_CHECKING:
from yandex_music import Client, Playlist
class PlaylistsLikes(YandexMusicObject):
"""Класс, представляющий .
Attributes:
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
Args:
client (:obj:`yandex_music.Client`, optional): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
**kwargs: Произвольные ключевые аргументы полученные от API.
"""
def __init__(self,
timestamp: str,
id_=None,
playlist: Optional['Playlist'] = None,
client: Optional['Client'] = None,
**kwargs) -> None:
self.id = id_
self.playlist = playlist
self.timestamp = timestamp
self.client = client
self._id_attrs = (self.id, self.playlist)
@classmethod
def de_json(cls, data: dict, client: 'Client') -> Optional['PlaylistsLikes']:
"""Десериализация объекта.
Args:
data (:obj:`dict`): Поля и значения десериализуемого объекта.
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
Returns:
:obj:`yandex_music.PlaylistsLikes`: Объект класса :class:`yandex_music.PlaylistsLikes`.
"""
if not data:
return None
data = super(PlaylistsLikes, cls).de_json(data, client)
from yandex_music import Playlist
data['playlist'] = Playlist.de_json(data.get('playlist'), client)
return cls(client=client, **data)
@classmethod
def de_list(cls, data: dict, client: 'Client') -> List['PlaylistsLikes']:
"""Десериализация списка объектов.
Args:
data (:obj:`list`): Список словарей с полями и значениями десериализуемого объекта.
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client`, представляющий клиент
Yandex Music.
Returns:
:obj:`list` из :obj:`yandex_music.PlaylistsLikes`: Список объектов класса
:class:`yandex_music.PlaylistsLikes`.
"""
if not data:
return []
playlists_likes = list()
for playlist_like in data:
playlists_likes.append(cls.de_json(playlist_like, client))
return playlists_likes