def test_equality(self, user, cover, made_for, play_counter, playlist_absence): a = Playlist(user, cover, made_for, play_counter, playlist_absence) b = Playlist(user, cover, made_for, play_counter, None) c = Playlist(user, None, made_for, play_counter, playlist_absence) d = Playlist(user, cover, made_for, play_counter, playlist_absence) assert a != b != c assert hash(a) != hash(b) != hash(c) assert a is not b is not c assert a == d
def test_equality(self, user, cover, made_for, play_counter): a = Playlist(user, self.uid, self.kind, self.title, self.track_count, cover, made_for, play_counter) b = Playlist(user, 123, self.kind, self.title, 10, cover, made_for, play_counter) c = Playlist(user, self.uid, 321, self.title, self.track_count, None, made_for, play_counter) d = Playlist(user, self.uid, self.kind, self.title, self.track_count, cover, made_for, play_counter) assert a != b != c assert hash(a) != hash(b) != hash(c) assert a is not b is not c assert a == d
def de_json(cls, data: dict, client: 'Client') -> Optional['BriefInfo']: """Десериализация объекта. Args: data (:obj:`dict`): Поля и значения десериализуемого объекта. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music. Returns: :obj:`yandex_music.BriefInfo`: Информация об артисте. """ if not data: return None data = super(BriefInfo, cls).de_json(data, client) from yandex_music import Artist, Track, Album, Cover, PlaylistId, Video, Chart, Vinyl, Playlist data['playlists'] = Playlist.de_list(data.get('playlists'), client) data['artist'] = Artist.de_json(data.get('artist'), client) data['similar_artists'] = Artist.de_list(data.get('similar_artists'), client) data['popular_tracks'] = Track.de_list(data.get('popular_tracks'), client) data['albums'] = Album.de_list(data.get('albums'), client) data['also_albums'] = Album.de_list(data.get('also_albums'), client) data['last_releases'] = Album.de_list(data.get('last_releases'), client) data['all_covers'] = Cover.de_list(data.get('all_covers'), client) data['playlist_ids'] = PlaylistId.de_list(data.get('playlist_ids'), client) data['videos'] = Video.de_list(data.get('videos'), client) data['tracks_in_chart'] = Chart.de_list(data.get('tracks_in_chart'), client) data['vinyls'] = Vinyl.de_list(data.get('vinyls'), client) return cls(client=client, **data)
def users_playlists(self, kind: str or int or list, user_id: str = None, timeout=None, *args, **kwargs): """Получение плейлиста или списка плейлистов по уникальным идентификаторам. Args: kind (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста или их список. user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания ответа от сервера вместо указанного при создании пула. **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). Returns: :obj:`list` из :obj:`yandex_music.Playlist`: Список объектов класса :class:`yandex_music.Playlist` представляющих плейлист, иначе :obj:`None`. Raises: :class:`yandex_music.YandexMusicError` """ if user_id is None: user_id = self.account.uid url = f'{self.base_url}/users/{user_id}/playlists' data = { 'kinds': kind } result = self._request.post(url, data, timeout=timeout, *args, **kwargs) return Playlist.de_list(result, self)
def users_playlists_create(self, title: str, visibility: str = 'public', user_id: str = None, timeout=None, *args, **kwargs): """Создание плейлиста. Args: title (:obj:`str`): Название. visibility (:obj:`str`, optional): Модификатор доступа. user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания ответа от сервера вместо указанного при создании пула. **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). Returns: :obj:`yandex_music.Playlist`: Объекта класса :class:`yandex_music.Playlist` представляющий созданный плейлист, иначе :obj:`None`. Raises: :class:`yandex_music.YandexMusicError` """ if user_id is None: user_id = self.account.uid url = f'{self.base_url}/users/{user_id}/playlists/create' data = { 'title': title, 'visibility': visibility } result = self._request.post(url, data, timeout=timeout, *args, **kwargs) return Playlist.de_json(result, self)
def users_playlists_name(self, kind: str or int, name: str, user_id: str = None, timeout=None, *args, **kwargs): """Изменение названия плейлиста. Args: kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. name (:obj:`str`): Новое название. user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания ответа от сервера вместо указанного при создании пула. **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). Returns: :obj:`yandex_music.Playlist`: Объекта класса :class:`yandex_music.Playlist` представляющий изменённый плейлист, иначе :obj:`None`. Raises: :class:`yandex_music.YandexMusicError` """ if user_id is None: user_id = self.account.uid url = f'{self.base_url}/users/{user_id}/playlists/{kind}/name' result = self._request.post(url, {'value': name}, timeout=timeout, *args, **kwargs) return Playlist.de_json(result, self)
def get(self, similar_playlists, last_owner_playlists): return Playlist( user, cover, made_for, play_counter, playlist_absence, TestPlaylist.uid, TestPlaylist.kind, TestPlaylist.title, TestPlaylist.track_count, TestPlaylist.tags, TestPlaylist.revision, TestPlaylist.snapshot, TestPlaylist.visibility, TestPlaylist.collective, TestPlaylist.url_part, TestPlaylist.created, TestPlaylist.modified, TestPlaylist.available, TestPlaylist.is_banner, TestPlaylist.is_premiere, TestPlaylist.duration_ms, TestPlaylist.og_image, TestPlaylist.og_title, TestPlaylist.og_description, TestPlaylist.image, cover, contest, TestPlaylist.background_color, TestPlaylist.text_color, TestPlaylist.id_for_from, TestPlaylist.dummy_description, TestPlaylist.dummy_page_description, cover, cover, open_graph_data, brand, TestPlaylist.metrika_id, TestPlaylist.coauthors, [artist], [track_id], [track_short], TestPlaylist.prerolls, TestPlaylist.likes_count, similar_playlists, last_owner_playlists, TestPlaylist.generated_playlist_type, TestPlaylist.animated_cover_uri, TestPlaylist.ever_played, TestPlaylist.description, TestPlaylist.description_formatted, TestPlaylist.playlist_uuid, TestPlaylist.type, TestPlaylist.ready, TestPlaylist.is_for_from, TestPlaylist.regions, )
def de_json(cls, data, client): if not data: return None data = super(PlaylistSearchResult, cls).de_json(data, client) from yandex_music import Playlist data['results'] = Playlist.de_list(data.get('results'), client) return cls(client=client, **data)
def de_json(cls, data, client): 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)
def de_json(cls, data, client): if not data: return None data = super(GeneratedPlaylist, cls).de_json(data, client) from yandex_music import Playlist data['data'] = Playlist.de_json(data.get('data'), client) return cls(client=client, **data)
def get(self): return Playlist(user, cover, made_for, play_counter, playlist_absence, TestPlaylist.uid, TestPlaylist.kind, TestPlaylist.title, TestPlaylist.track_count, TestPlaylist.tags, TestPlaylist.revision, TestPlaylist.snapshot, TestPlaylist.visibility, TestPlaylist.collective, TestPlaylist.created, TestPlaylist.modified, TestPlaylist.available, TestPlaylist.is_banner, TestPlaylist.is_premiere, TestPlaylist.duration_ms, TestPlaylist.og_image, [track_short], TestPlaylist.prerolls, TestPlaylist.likes_count, TestPlaylist.generated_playlist_type, TestPlaylist.animated_cover_uri, TestPlaylist.ever_played, TestPlaylist.description, TestPlaylist.description_formatted, TestPlaylist.is_for_from, TestPlaylist.regions)
def users_playlists_list(self, user_id: int or str = None, timeout=None, *args, **kwargs): if user_id is None: user_id = self.account.uid url = f'{self.base_url}/users/{user_id}/playlists/list' result = self._request.get(url, timeout=timeout, *args, **kwargs) return Playlist.de_list(result, self)
def test_de_json_required(self, client, user, cover, made_for, play_counter, playlist_absence): json_dict = { 'owner': user.to_dict(), 'cover': cover.to_dict(), 'made_for': made_for.to_dict(), 'play_counter': play_counter.to_dict(), 'playlist_absence': playlist_absence.to_dict(), } playlist = Playlist.de_json(json_dict, client) assert playlist.owner == user assert playlist.cover == cover assert playlist.made_for == made_for assert playlist.play_counter == play_counter assert playlist.playlist_absence == playlist_absence
def de_json(cls, data, client): """Десериализация объекта. Args: data (:obj:`dict`): Поля и значения десериализуемого объекта. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music. Returns: :obj:`yandex_music.ChartInfo`: Чарт. """ if not data: return None data = super(ChartInfo, cls).de_json(data, client) data['chart'] = Playlist.de_json(data.get('chart'), client) data['menu'] = ChartInfoMenu.de_json(data.get('menu'), client) return cls(client=client, **data)
def users_playlists_name(self, kind: str or int, name: str, user_id: str = None, timeout=None, *args, **kwargs): if user_id is None: user_id = self.account.uid url = f'{self.base_url}/users/{user_id}/playlists/{kind}/name' result = self._request.post(url, {'value': name}, timeout=timeout, *args, **kwargs) return Playlist.de_json(result, self)
def de_json(cls, data: dict, client: 'Client') -> Optional['GeneratedPlaylist']: """Десериализация объекта. Args: data (:obj:`dict`): Поля и значения десериализуемого объекта. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music. Returns: :obj:`yandex_music.GeneratedPlaylist`: Автоматически сгенерированный плейлист. """ if not data: return None data = super(GeneratedPlaylist, cls).de_json(data, client) from yandex_music import Playlist data['data'] = Playlist.de_json(data.get('data'), client) return cls(client=client, **data)
def de_json(cls, data, client): """Десериализация объекта. Args: data (:obj:`dict`): Поля и значения десериализуемого объекта. client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client`, представляющий клиент Yandex Music. Returns: :obj:`yandex_music.GeneratedPlaylist`: Объект класса :class:`yandex_music.GeneratedPlaylist`. """ if not data: return None data = super(GeneratedPlaylist, cls).de_json(data, client) from yandex_music import Playlist data['data'] = Playlist.de_json(data.get('data'), client) return cls(client=client, **data)
def users_playlists(self, kind: str or int or list, user_id: str = None, timeout=None, *args, **kwargs): if user_id is None: user_id = self.account.uid url = f'{self.base_url}/users/{user_id}/playlists' data = {'kinds': kind} result = self._request.post(url, data, timeout=timeout, *args, **kwargs) return Playlist.de_list(result, self)
def users_playlists_create(self, title: str, visibility: str = 'public', user_id: str = None, timeout=None, *args, **kwargs): if user_id is None: user_id = self.account.uid url = f'{self.base_url}/users/{user_id}/playlists/create' data = {'title': title, 'visibility': visibility} result = self._request.post(url, data, timeout=timeout, *args, **kwargs) return Playlist.de_json(result, self)
def users_playlists_change(self, kind: str or int, diff: str, revision: int = 1, user_id: str = None, timeout=None, *args, **kwargs): if user_id is None: user_id = self.account.uid url = f'{self.base_url}/users/{user_id}/playlists/{kind}/change' data = {'kind': kind, 'revision': revision, 'diff': diff} result = self._request.post(url, data, timeout=timeout, *args, **kwargs) return Playlist.de_json(result, self)
def test_de_json_required(self, client, user, cover, made_for, play_counter): json_dict = { 'owner': user.to_dict(), 'uid': self.uid, 'kind': self.kind, 'title': self.title, 'track_count': self.track_count, 'cover': cover.to_dict(), 'made_for': made_for.to_dict(), 'play_counter': play_counter.to_dict() } playlist = Playlist.de_json(json_dict, client) assert playlist.owner == user assert playlist.uid == self.uid assert playlist.kind == self.kind assert playlist.title == self.title assert playlist.track_count == self.track_count assert playlist.cover == cover assert playlist.made_for == made_for assert playlist.play_counter == play_counter
def users_playlists_change(self, kind: str or int, diff: str, revision: int = 1, user_id: str = None, timeout=None, *args, **kwargs): """Изменение плейлиста. Для получения отличий есть вспомогательный класс :class:`from yandex_music.utils.difference.Difference`. Так же существуют уже готовые методы-обёртки над операциями. Args: kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. revision (:obj:`int`): TODO. diff (:obj:`str`): JSON представления отличий старого и нового плейлиста. user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания ответа от сервера вместо указанного при создании пула. **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). Returns: :obj:`yandex_music.Playlist`: Объекта класса :class:`yandex_music.Playlist` представляющий изменённый плейлист, иначе :obj:`None`. Raises: :class:`yandex_music.YandexMusicError` """ if user_id is None: user_id = self.account.uid url = f'{self.base_url}/users/{user_id}/playlists/{kind}/change' data = { 'kind': kind, 'revision': revision, 'diff': diff } result = self._request.post(url, data, timeout=timeout, *args, **kwargs) return Playlist.de_json(result, self)
def test_de_json_all( self, client, user, cover, made_for, track_short, play_counter, playlist_absence, playlist_without_nested_playlists, artist, track_id, contest, open_graph_data, brand, ): json_dict = { 'owner': user.to_dict(), 'uid': self.uid, 'kind': self.kind, 'title': self.title, 'track_count': self.track_count, 'cover': cover.to_dict(), 'made_for': made_for.to_dict(), 'play_counter': play_counter.to_dict(), 'playlist_absence': playlist_absence.to_dict(), 'tags': self.tags, 'revision': self.revision, 'snapshot': self.snapshot, 'visibility': self.visibility, 'collective': self.collective, 'created': self.created, 'modified': self.modified, 'available': self.available, 'is_banner': self.is_banner, 'is_premiere': self.is_premiere, 'duration_ms': self.duration_ms, 'og_image': self.og_image, 'tracks': [track_short.to_dict()], 'prerolls': self.prerolls, 'likes_count': self.likes_count, 'generated_playlist_type': self.generated_playlist_type, 'url_part': self.url_part, 'animated_cover_uri': self.animated_cover_uri, 'ever_played': self.ever_played, 'description': self.description, 'description_formatted': self.description_formatted, 'is_for_from': self.is_for_from, 'regions': self.regions, 'og_title': self.og_title, 'image': self.image, 'id_for_from': self.id_for_from, 'background_color': self.background_color, 'text_color': self.text_color, 'cover_without_text': cover.to_dict(), 'coauthors': self.coauthors, 'similar_playlists': [playlist_without_nested_playlists.to_dict()], 'last_owner_playlists': [playlist_without_nested_playlists.to_dict()], 'og_description': self.og_description, 'top_artist': [artist.to_dict()], 'recent_tracks': [track_id.to_dict()], 'metrika_id': self.metrika_id, 'contest': contest.to_dict(), 'dummy_description': self.dummy_description, 'dummy_page_description': self.dummy_page_description, 'dummy_cover': cover.to_dict(), 'dummy_rollover_cover': cover.to_dict(), 'og_data': open_graph_data.to_dict(), 'branding': brand.to_dict(), 'playlist_uuid': self.playlist_uuid, 'type_': self.type, 'ready': self.ready, } playlist = Playlist.de_json(json_dict, client) assert playlist.owner == user assert playlist.uid == self.uid assert playlist.kind == self.kind assert playlist.title == self.title assert playlist.track_count == self.track_count assert playlist.cover == cover assert playlist.made_for == made_for assert playlist.play_counter == play_counter assert playlist.playlist_absence == playlist_absence assert playlist.tags == self.tags assert playlist.revision == self.revision assert playlist.snapshot == self.snapshot assert playlist.visibility == self.visibility assert playlist.collective == self.collective assert playlist.url_part == self.url_part assert playlist.created == self.created assert playlist.modified == self.modified assert playlist.available == self.available assert playlist.is_banner == self.is_banner assert playlist.is_premiere == self.is_premiere assert playlist.duration_ms == self.duration_ms assert playlist.og_image == self.og_image assert playlist.og_title == self.og_title assert playlist.og_description == self.og_description assert playlist.image == self.image assert playlist.cover_without_text == cover assert playlist.contest == contest assert playlist.background_color == self.background_color assert playlist.text_color == self.text_color assert playlist.id_for_from == self.id_for_from assert playlist.dummy_description == self.dummy_description assert playlist.dummy_page_description == self.dummy_page_description assert playlist.dummy_cover == cover assert playlist.dummy_rollover_cover == cover assert playlist.og_data == open_graph_data assert playlist.branding == brand assert playlist.metrika_id == self.metrika_id assert playlist.coauthors == self.coauthors assert playlist.top_artist == [artist] assert playlist.recent_tracks == [track_id] assert playlist.tracks == [track_short] assert playlist.prerolls == self.prerolls assert playlist.likes_count == self.likes_count assert playlist.similar_playlists == [playlist_without_nested_playlists] assert playlist.last_owner_playlists == [playlist_without_nested_playlists] assert playlist.generated_playlist_type == self.generated_playlist_type assert playlist.animated_cover_uri == self.animated_cover_uri assert playlist.ever_played == self.ever_played assert playlist.description == self.description assert playlist.description_formatted == self.description_formatted assert playlist.playlist_uuid == self.playlist_uuid assert playlist.type == self.type assert playlist.ready == self.ready assert playlist.is_for_from == self.is_for_from assert playlist.regions == self.regions
def test_de_list_none(self, client): assert Playlist.de_list({}, client) == []
def test_de_json_none(self, client): assert Playlist.de_json({}, client) is None
def test_de_json_all(self, client, user, cover, made_for, track_short, play_counter, playlist_absence): json_dict = { 'owner': user.to_dict(), 'uid': self.uid, 'kind': self.kind, 'title': self.title, 'track_count': self.track_count, 'cover': cover.to_dict(), 'made_for': made_for.to_dict(), 'play_counter': play_counter.to_dict(), 'playlist_absence': playlist_absence.to_dict(), 'tags': self.tags, 'revision': self.revision, 'snapshot': self.snapshot, 'visibility': self.visibility, 'collective': self.collective, 'created': self.created, 'modified': self.modified, 'available': self.available, 'is_banner': self.is_banner, 'is_premiere': self.is_premiere, 'duration_ms': self.duration_ms, 'og_image': self.og_image, 'tracks': [track_short.to_dict()], 'prerolls': self.prerolls, 'likes_count': self.likes_count, 'generated_playlist_type': self.generated_playlist_type, 'animated_cover_uri': self.animated_cover_uri, 'ever_played': self.ever_played, 'description': self.description, 'description_formatted': self.description_formatted, 'is_for_from': self.is_for_from, 'regions': self.regions } playlist = Playlist.de_json(json_dict, client) assert playlist.owner == user assert playlist.uid == self.uid assert playlist.kind == self.kind assert playlist.title == self.title assert playlist.track_count == self.track_count assert playlist.cover == cover assert playlist.made_for == made_for assert playlist.play_counter == play_counter assert playlist.playlist_absence == playlist_absence assert playlist.tags == self.tags assert playlist.revision == self.revision assert playlist.snapshot == self.snapshot assert playlist.visibility == self.visibility assert playlist.collective == self.collective assert playlist.created == self.created assert playlist.modified == self.modified assert playlist.available == self.available assert playlist.is_banner == self.is_banner assert playlist.is_premiere == self.is_premiere assert playlist.duration_ms == self.duration_ms assert playlist.og_image == self.og_image assert playlist.tracks == [track_short] assert playlist.prerolls == self.prerolls assert playlist.likes_count == self.likes_count assert playlist.generated_playlist_type == self.generated_playlist_type assert playlist.animated_cover_uri == self.animated_cover_uri assert playlist.ever_played == self.ever_played assert playlist.description == self.description assert playlist.description_formatted == self.description_formatted assert playlist.is_for_from == self.is_for_from assert playlist.regions == self.regions