Merge pull request #199 from MarshalX/issue-195

Добавлены настройки пользователя и их изменение
このコミットが含まれているのは:
Il'ya 2020-01-26 03:23:15 +03:00 committed by GitHub
コミット 8450d5937a
この署名に対応する既知のキーがデータベースに存在しません
GPGキーID: 4AEE18F83AFDEB23
44個のファイルの変更522行の追加122行の削除

15
docs/source/yandex_music.account.rst ノーマルファイル
ファイルの表示

@ -0,0 +1,15 @@
Пакет yandex_music.account
==========================
.. toctree::
yandex_music.account.status
yandex_music.account.account
yandex_music.account.passport_phone
yandex_music.account.plus
yandex_music.account.permissions
yandex_music.account.subscription
yandex_music.account.auto_renewable
yandex_music.account.product
yandex_music.account.price
yandex_music.account.user_settings

ファイルの表示

@ -0,0 +1,6 @@
yandex_music.UserSettings
=========================
.. autoclass:: yandex_music.UserSettings
:members:
:show-inheritance:

ファイルの表示

@ -8,7 +8,7 @@
yandex_music.utils yandex_music.utils
yandex_music.genre yandex_music.genre
yandex_music.track yandex_music.track
yandex_music.status yandex_music.account
yandex_music.likes yandex_music.likes
yandex_music.album yandex_music.album
yandex_music.search yandex_music.search

ファイルの表示

@ -1,14 +0,0 @@
Пакет yandex_music.status
=========================
.. toctree::
yandex_music.status.status
yandex_music.status.account
yandex_music.status.passport_phone
yandex_music.status.plus
yandex_music.status.permissions
yandex_music.status.subscription
yandex_music.status.auto_renewable
yandex_music.status.product
yandex_music.status.price

132
tests/test_user_settings.py ノーマルファイル
ファイルの表示

@ -0,0 +1,132 @@
import pytest
from yandex_music import UserSettings
@pytest.fixture(scope='class')
def user_settings(shot):
return UserSettings(TestUserSettings.uid, TestUserSettings.last_fm_scrobbling_enabled,
TestUserSettings.shuffle_enabled, TestUserSettings.volume_percents, TestUserSettings.modified,
TestUserSettings.facebook_scrobbling_enabled, TestUserSettings.add_new_track_on_playlist_top,
TestUserSettings.user_music_visibility, TestUserSettings.user_social_visibility,
TestUserSettings.rbt_disabled, TestUserSettings.theme, TestUserSettings.promos_disabled,
TestUserSettings.auto_play_radio, TestUserSettings.ads_disabled, TestUserSettings.disk_enabled,
TestUserSettings.show_disk_tracks_in_library)
class TestUserSettings:
uid = 1130000002804400
last_fm_scrobbling_enabled = False
shuffle_enabled = False
volume_percents = 70
modified = '2020-01-25T22:52:21+00:00'
facebook_scrobbling_enabled = False
add_new_track_on_playlist_top = False
user_music_visibility = 'public'
user_social_visibility = 'public'
rbt_disabled = False
theme = 'black'
promos_disabled = True
auto_play_radio = True
ads_disabled = None
disk_enabled = False
show_disk_tracks_in_library = False
def test_expected_values(self, user_settings):
assert user_settings.uid == self.uid
assert user_settings.last_fm_scrobbling_enabled == self.last_fm_scrobbling_enabled
assert user_settings.shuffle_enabled == self.shuffle_enabled
assert user_settings.volume_percents == self.volume_percents
assert user_settings.modified == self.modified
assert user_settings.facebook_scrobbling_enabled == self.facebook_scrobbling_enabled
assert user_settings.add_new_track_on_playlist_top == self.add_new_track_on_playlist_top
assert user_settings.user_music_visibility == self.user_music_visibility
assert user_settings.user_social_visibility == self.user_social_visibility
assert user_settings.rbt_disabled == self.rbt_disabled
assert user_settings.theme == self.theme
assert user_settings.promos_disabled == self.promos_disabled
assert user_settings.auto_play_radio == self.auto_play_radio
assert user_settings.ads_disabled == self.ads_disabled
assert user_settings.disk_enabled == self.disk_enabled
assert user_settings.show_disk_tracks_in_library == self.show_disk_tracks_in_library
def test_de_json_none(self, client):
assert UserSettings.de_json({}, client) is None
def test_de_json_required(self, client):
json_dict = {'uid': self.uid, 'last_fm_scrobbling_enabled': self.last_fm_scrobbling_enabled,
'shuffle_enabled': self.shuffle_enabled, 'volume_percents': self.volume_percents,
'modified': self.modified, 'facebook_scrobbling_enabled': self.facebook_scrobbling_enabled,
'add_new_track_on_playlist_top': self.add_new_track_on_playlist_top,
'user_music_visibility': self.user_music_visibility,
'user_social_visibility': self.user_social_visibility, 'rbt_disabled': self.rbt_disabled,
'theme': self.theme, 'promos_disabled': self.promos_disabled,
'auto_play_radio': self.auto_play_radio}
user_settings = UserSettings.de_json(json_dict, client)
assert user_settings.uid == self.uid
assert user_settings.last_fm_scrobbling_enabled == self.last_fm_scrobbling_enabled
assert user_settings.shuffle_enabled == self.shuffle_enabled
assert user_settings.volume_percents == self.volume_percents
assert user_settings.modified == self.modified
assert user_settings.facebook_scrobbling_enabled == self.facebook_scrobbling_enabled
assert user_settings.add_new_track_on_playlist_top == self.add_new_track_on_playlist_top
assert user_settings.user_music_visibility == self.user_music_visibility
assert user_settings.user_social_visibility == self.user_social_visibility
assert user_settings.rbt_disabled == self.rbt_disabled
assert user_settings.theme == self.theme
assert user_settings.promos_disabled == self.promos_disabled
assert user_settings.auto_play_radio == self.auto_play_radio
def test_de_json_all(self, client):
json_dict = {'uid': self.uid, 'last_fm_scrobbling_enabled': self.last_fm_scrobbling_enabled,
'shuffle_enabled': self.shuffle_enabled, 'volume_percents': self.volume_percents,
'modified': self.modified, 'facebook_scrobbling_enabled': self.facebook_scrobbling_enabled,
'add_new_track_on_playlist_top': self.add_new_track_on_playlist_top,
'user_music_visibility': self.user_music_visibility,
'user_social_visibility': self.user_social_visibility, 'rbt_disabled': self.rbt_disabled,
'theme': self.theme, 'promos_disabled': self.promos_disabled,
'auto_play_radio': self.auto_play_radio, 'ads_disabled': self.ads_disabled,
'disk_enabled': self.disk_enabled, 'show_disk_tracks_in_library': self.show_disk_tracks_in_library}
user_settings = UserSettings.de_json(json_dict, client)
assert user_settings.uid == self.uid
assert user_settings.last_fm_scrobbling_enabled == self.last_fm_scrobbling_enabled
assert user_settings.shuffle_enabled == self.shuffle_enabled
assert user_settings.volume_percents == self.volume_percents
assert user_settings.modified == self.modified
assert user_settings.facebook_scrobbling_enabled == self.facebook_scrobbling_enabled
assert user_settings.add_new_track_on_playlist_top == self.add_new_track_on_playlist_top
assert user_settings.user_music_visibility == self.user_music_visibility
assert user_settings.user_social_visibility == self.user_social_visibility
assert user_settings.rbt_disabled == self.rbt_disabled
assert user_settings.theme == self.theme
assert user_settings.promos_disabled == self.promos_disabled
assert user_settings.auto_play_radio == self.auto_play_radio
assert user_settings.ads_disabled == self.ads_disabled
assert user_settings.disk_enabled == self.disk_enabled
assert user_settings.show_disk_tracks_in_library == self.show_disk_tracks_in_library
def test_equality(self):
a = UserSettings(self.uid, self.last_fm_scrobbling_enabled, self.shuffle_enabled, self.volume_percents,
self.modified, self.facebook_scrobbling_enabled, self.add_new_track_on_playlist_top,
self.user_music_visibility, self.user_social_visibility, self.rbt_disabled, self.theme,
self.promos_disabled, self.auto_play_radio, self.ads_disabled, self.disk_enabled,
self.show_disk_tracks_in_library)
b = UserSettings(self.uid, self.last_fm_scrobbling_enabled, self.shuffle_enabled, self.volume_percents,
self.modified, self.facebook_scrobbling_enabled, self.add_new_track_on_playlist_top,
'private', self.user_social_visibility, self.rbt_disabled, 'white',
self.promos_disabled, self.auto_play_radio, self.ads_disabled, True,
self.show_disk_tracks_in_library)
c = UserSettings(self.uid, self.last_fm_scrobbling_enabled, self.shuffle_enabled, self.volume_percents,
self.modified, self.facebook_scrobbling_enabled, self.add_new_track_on_playlist_top,
self.user_music_visibility, self.user_social_visibility, self.rbt_disabled, self.theme,
self.promos_disabled, self.auto_play_radio, self.ads_disabled, self.disk_enabled,
self.show_disk_tracks_in_library)
assert a != b != c
assert hash(a) != hash(b) != hash(c)
assert a is not b is not c
assert a == c
assert hash(a) == hash(c)

ファイルの表示

@ -4,15 +4,16 @@ from .settings import Settings
from .permission_alerts import PermissionAlerts from .permission_alerts import PermissionAlerts
from .experiments import Experiments from .experiments import Experiments
from .status.status import Status from .account.status import Status
from .status.account import Account from .account.account import Account
from .status.plus import Plus from .account.plus import Plus
from .status.subscription import Subscription from .account.user_settings import UserSettings
from .status.price import Price from .account.subscription import Subscription
from .status.product import Product from .account.price import Price
from .status.auto_renewable import AutoRenewable from .account.product import Product
from .status.passport_phone import PassportPhone from .account.auto_renewable import AutoRenewable
from .status.permissions import Permissions from .account.passport_phone import PassportPhone
from .account.permissions import Permissions
from .album.album import Album from .album.album import Album
from .album.label import Label from .album.label import Label
@ -120,4 +121,4 @@ __all__ = ['YandexMusicObject', 'Client', 'Account', 'PassportPhone', 'Invocatio
'Icon', 'Images', 'Id', 'Station', 'Dashboard', 'RotorSettings', 'AdParams', 'Restrictions', 'Value', 'Enum', 'Icon', 'Images', 'Id', 'Station', 'Dashboard', 'RotorSettings', 'AdParams', 'Restrictions', 'Value', 'Enum',
'DiscreteScale', 'StationResult', 'Sequence', 'StationTracksResult', 'BriefInfo', 'Description', 'DiscreteScale', 'StationResult', 'Sequence', 'StationTracksResult', 'BriefInfo', 'Description',
'PlaylistId', 'Vinyl', 'Supplement', 'Lyrics', 'VideoSupplement', 'ArtistTracks', 'Pager', 'ArtistAlbums', 'PlaylistId', 'Vinyl', 'Supplement', 'Lyrics', 'VideoSupplement', 'ArtistTracks', 'Pager', 'ArtistAlbums',
'PlaylistAbsence', 'Shot', 'ShotEvent', 'ShotType', 'ShotData', 'SimilarTracks'] 'PlaylistAbsence', 'Shot', 'ShotEvent', 'ShotType', 'ShotData', 'SimilarTracks', 'UserSettings']

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class Account(YandexMusicObject): class Account(YandexMusicObject):
"""Класс предоставляющий основную информацию об аккаунте пользователя. """Класс, представляющий основную информацию об аккаунте пользователя.
Attributes: Attributes:
now (:obj:`str`): Текущая дата и время. now (:obj:`str`): Текущая дата и время.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class AutoRenewable(YandexMusicObject): class AutoRenewable(YandexMusicObject):
"""Класс представляющий автопродление подписки. """Класс, представляющий автопродление подписки.
Attributes: Attributes:
expires (:obj:`str`): Дата истечения подписки. expires (:obj:`str`): Дата истечения подписки.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class PassportPhone(YandexMusicObject): class PassportPhone(YandexMusicObject):
"""Класс представляющий номер телефона пользователя. """Класс, представляющий номер телефона пользователя.
Attributes: Attributes:
phone (:obj:`str`): Номер телефона. phone (:obj:`str`): Номер телефона.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class Permissions(YandexMusicObject): class Permissions(YandexMusicObject):
"""Класс предоставляющий информацию о правах пользователя, их изначальных значениях и даты окончания. """Класс, представляющий информацию о правах пользователя, их изначальных значениях и даты окончания.
Attributes: Attributes:
until (:obj:`str`): Дата окончания прав. until (:obj:`str`): Дата окончания прав.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class Plus(YandexMusicObject): class Plus(YandexMusicObject):
"""Класс представляющий Plus подписку. """Класс, представляющий Plus подписку.
Attributes: Attributes:
has_plus (:obj:`bool`): Наличие. has_plus (:obj:`bool`): Наличие.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class Price(YandexMusicObject): class Price(YandexMusicObject):
"""Класс представляющий цену. """Класс, представляющий цену.
Attributes: Attributes:
amount (:obj:`int`): Количество единиц. amount (:obj:`int`): Количество единиц.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class Product(YandexMusicObject): class Product(YandexMusicObject):
"""Класс представляющий продаваемый продукт. """Класс, представляющий продаваемый продукт.
Attributes: Attributes:
product_id (:obj:`str`): Уникальный идентификатор. product_id (:obj:`str`): Уникальный идентификатор.

ファイルの表示

@ -7,19 +7,19 @@ from yandex_music import YandexMusicObject
class Status(YandexMusicObject): class Status(YandexMusicObject):
"""Класс представляющий подробную информацию об аккаунте пользователя. """Класс, представляющий подробную информацию об аккаунте пользователя.
Attributes: Attributes:
account (:obj:`yandex_music.Account`): Объект класса :class:`yandex_music.Account` предоставляющий основную account (:obj:`yandex_music.Account`): Объект класса :class:`yandex_music.Account` представляющий основную
информацию об аккаунте. информацию об аккаунте.
permissions (:obj:`yandex_music.Permissions`): Объект класса :class:`yandex_music.Permissions` предоставляющий permissions (:obj:`yandex_music.Permissions`): Объект класса :class:`yandex_music.Permissions` представляющий
информацию о правах пользователя. информацию о правах пользователя.
subscription (:obj:`yandex_music.Subscription`): Объект класса :class:`yandex_music.Subscription` предоставляющий subscription (:obj:`yandex_music.Subscription`): Объект класса :class:`yandex_music.Subscription` представляющий
информацию о подписках информацию о подписках
cache_limit (:obj:`int`): Максимальное количество загруженных треков. cache_limit (:obj:`int`): Максимальное количество загруженных треков.
subeditor (:obj:`bool`): Наличие статуса модератора проверки корректности информации. subeditor (:obj:`bool`): Наличие статуса модератора проверки корректности информации.
subeditor_level (:obj:`int`): Уровень статуса модератора. subeditor_level (:obj:`int`): Уровень статуса модератора.
plus (:obj:`yandex_music.Plus`): Объект класса :class:`yandex_music.Plus` предоставляющий информацию о Plus plus (:obj:`yandex_music.Plus`): Объект класса :class:`yandex_music.Plus` представляющий информацию о Plus
подписке. подписке.
default_email (:obj:`str`): Основной e-mail адрес аккаунта. default_email (:obj:`str`): Основной e-mail адрес аккаунта.
skips_per_hour (:obj:`int`): Количество переключение треков на радио в час. skips_per_hour (:obj:`int`): Количество переключение треков на радио в час.
@ -29,16 +29,16 @@ class Status(YandexMusicObject):
Music. Music.
Args: Args:
account (:obj:`yandex_music.Account`): Объект класса :class:`yandex_music.Account` предоставляющий основную account (:obj:`yandex_music.Account`): Объект класса :class:`yandex_music.Account` представляющий основную
информацию об аккаунте. информацию об аккаунте.
permissions (:obj:`yandex_music.Permissions`): Объект класса :class:`yandex_music.Permissions` предоставляющий permissions (:obj:`yandex_music.Permissions`): Объект класса :class:`yandex_music.Permissions` представляющий
информацию о правах пользователя. информацию о правах пользователя.
subscription (:obj:`yandex_music.Subscription`): Объект класса :class:`yandex_music.Subscription` предоставляющий subscription (:obj:`yandex_music.Subscription`): Объект класса :class:`yandex_music.Subscription` представляющий
информацию о подписках информацию о подписках
cache_limit (:obj:`int`, optional): Максимальное количество загруженных треков. cache_limit (:obj:`int`, optional): Максимальное количество загруженных треков.
subeditor (:obj:`bool`, optional): Наличие статуса модератора проверки корректности информации. subeditor (:obj:`bool`, optional): Наличие статуса модератора проверки корректности информации.
subeditor_level (:obj:`int`, optional): Уровень статуса модератора. subeditor_level (:obj:`int`, optional): Уровень статуса модератора.
plus (:obj:`yandex_music.Plus`, optional): Объект класса :class:`yandex_music.Plus` предоставляющий информацию о plus (:obj:`yandex_music.Plus`, optional): Объект класса :class:`yandex_music.Plus` представляющий информацию о
Plus подписке. Plus подписке.
default_email (:obj:`str`, optional): Основной e-mail адрес аккаунта. default_email (:obj:`str`, optional): Основной e-mail адрес аккаунта.
skips_per_hour (:obj:`int`, optional): Количество переключение треков на радио в час. skips_per_hour (:obj:`int`, optional): Количество переключение треков на радио в час.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class Subscription(YandexMusicObject): class Subscription(YandexMusicObject):
"""Класс предоставляющий информацию о подписках пользователя. """Класс, представляющий информацию о подписках пользователя.
Attributes: Attributes:
auto_renewable (:obj:`list` из :obj:`yandex_music.AutoRenewable`): Список объектов класса auto_renewable (:obj:`list` из :obj:`yandex_music.AutoRenewable`): Список объектов класса

125
yandex_music/account/user_settings.py ノーマルファイル
ファイルの表示

@ -0,0 +1,125 @@
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
from yandex_music import Client
from yandex_music import YandexMusicObject
class UserSettings(YandexMusicObject):
"""Класс, представляющий настройки пользователя.
Note:
Доступные значения для поля `theme`: `white`, `black`.
Доступные значения для полей `user_music_visibility` и `user_social_visibility`: `private`, `public`.
Notes:
`promos_disabled`, `ads_disabled`, `rbt_disabled` устарели и не работают.
`last_fm_scrobbling_enabled`, `facebook_scrobbling_enabled` выглядят устаревшими.
Attributes:
uid (:obj:`int`): Уникальный идентификатор пользователя.
last_fm_scrobbling_enabled (:obj:`bool`): Скробблинг lastfm.
shuffle_enabled (:obj:`bool`): Переключать треки в случайном порядке.
volume_percents (:obj:`int`): Громкость звука в процентах.
modified (:obj:`str`): Дата изменения настроек.
facebook_scrobbling_enabled (:obj:`bool`): Скробблинг facebook.
add_new_track_on_playlist_top (:obj:`bool`): Добавлять новые треки в начало плейлиста.
user_music_visibility (:obj:`str`): Публичный доступ к моей фонотеке.
user_social_visibility (:obj:`str`): Показывать соцсети на странице.
rbt_disabled (:obj:`bool`): TODO (неиспользуемая фича).
theme (:obj:`str`): Тема оформления.
promos_disabled (:obj:`bool`): Не показывать рекламируемый контент).
auto_play_radio (:obj:`bool`): Бесконечный поток музыки.
ads_disabled (:obj:`bool`): Не показывать рекламу.
disk_enabled (:obj:`bool`): TODO.
show_disk_tracks_in_library (:obj:`bool`): Показывать локальные треки в библиотеке.
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client` представляющий клиент Yandex
Music.
Args:
uid (:obj:`int`): Уникальный идентификатор пользователя.
last_fm_scrobbling_enabled (:obj:`bool`): Скробблинг lastfm.
shuffle_enabled (:obj:`bool`): Переключать треки в случайном порядке.
volume_percents (:obj:`int`): Громкость звука в процентах.
modified (:obj:`str`): Дата изменения настроек.
facebook_scrobbling_enabled (:obj:`bool`): Скробблинг facebook.
add_new_track_on_playlist_top (:obj:`bool`): Добавлять новые треки в начало плейлиста.
user_music_visibility (:obj:`str`): Публичный доступ к моей фонотеке.
user_social_visibility (:obj:`str`): Показывать соцсети на странице.
rbt_disabled (:obj:`bool`): TODO (неиспользуемая фича).
theme (:obj:`str`): Тема оформления.
promos_disabled (:obj:`bool`): Не показывать рекламируемый контент).
auto_play_radio (:obj:`bool`): Бесконечный поток музыки.
ads_disabled (:obj:`bool`, optional): Не показывать рекламу.
disk_enabled (:obj:`bool`, optional): TODO.
show_disk_tracks_in_library (:obj:`bool`, optional): Показывать локальные треки в библиотеке.
client (:obj:`yandex_music.Client`, optional): Объект класса :class:`yandex_music.Client` представляющий клиент
Yandex Music.
**kwargs: Произвольные ключевые аргументы полученные от API.
"""
def __init__(self,
uid: int,
last_fm_scrobbling_enabled: bool,
shuffle_enabled: bool,
volume_percents: int,
modified: str,
facebook_scrobbling_enabled: bool,
add_new_track_on_playlist_top: bool,
user_music_visibility: str,
user_social_visibility: str,
rbt_disabled: bool,
theme: str,
promos_disabled: bool,
auto_play_radio: bool,
ads_disabled: Optional[bool] = None,
disk_enabled: Optional[bool] = None,
show_disk_tracks_in_library: Optional[bool] = None,
client: Optional['Client'] = None,
**kwargs) -> None:
self.uid = uid
self.last_fm_scrobbling_enabled = last_fm_scrobbling_enabled
self.shuffle_enabled = shuffle_enabled
self.volume_percents = volume_percents
self.modified = modified
self.facebook_scrobbling_enabled = facebook_scrobbling_enabled
self.add_new_track_on_playlist_top = add_new_track_on_playlist_top
self.user_music_visibility = user_music_visibility
self.user_social_visibility = user_social_visibility
self.rbt_disabled = rbt_disabled
self.theme = theme
self.promos_disabled = promos_disabled
self.auto_play_radio = auto_play_radio
self.ads_disabled = ads_disabled
self.disk_enabled = disk_enabled
self.show_disk_tracks_in_library = show_disk_tracks_in_library
self.client = client
self._id_attrs = (self.uid, self.last_fm_scrobbling_enabled, self.shuffle_enabled, self.volume_percents,
self.modified, self.facebook_scrobbling_enabled, self.add_new_track_on_playlist_top,
self.user_music_visibility, self.user_social_visibility, self.rbt_disabled, self.theme,
self.promos_disabled, self.auto_play_radio, self.ads_disabled, self.disk_enabled,
self.show_disk_tracks_in_library)
@classmethod
def de_json(cls, data: dict, client: 'Client') -> Optional['UserSettings']:
"""Десериализация объекта.
Args:
data (:obj:`dict`): Поля и значения десериализуемого объекта.
client (:obj:`yandex_music.Client`): Объект класса :class:`yandex_music.Client` представляющий клиент Yandex
Music.
Returns:
:obj:`yandex_music.UserSettings`: Объект класса :class:`yandex_music.UserSettings`.
"""
if not data:
return None
data = super(UserSettings, cls).de_json(data, client)
return cls(client=client, **data)

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class ArtistAlbums(YandexMusicObject): class ArtistAlbums(YandexMusicObject):
"""Класс представляющий страницу списка альбомов артиста. """Класс, представляющий страницу списка альбомов артиста.
Attributes: Attributes:
albums (:obj:`list` из :obj:`yandex_music.Album`): Список альбомов артиста. albums (:obj:`list` из :obj:`yandex_music.Album`): Список альбомов артиста.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class ArtistTracks(YandexMusicObject): class ArtistTracks(YandexMusicObject):
"""Класс представляющий страницу списка треков артиста. """Класс, представляющий страницу списка треков артиста.
Attributes: Attributes:
tracks (:obj:`list` из :obj:`yandex_music.Track`): Список треков артиста. tracks (:obj:`list` из :obj:`yandex_music.Track`): Список треков артиста.

ファイルの表示

@ -1,12 +1,13 @@
import logging import logging
import functools import functools
from datetime import datetime from datetime import datetime
from typing import Callable, Union, List, Optional from typing import Callable, Union, List, Optional, Dict
from yandex_music import YandexMusicObject, Status, Settings, PermissionAlerts, Experiments, Artist, Album, Playlist, \ from yandex_music import YandexMusicObject, Status, Settings, PermissionAlerts, Experiments, Artist, Album, Playlist, \
TracksList, Track, AlbumsLikes, ArtistsLikes, PlaylistsLikes, Feed, PromoCodeStatus, DownloadInfo, Search, \ TracksList, Track, AlbumsLikes, ArtistsLikes, PlaylistsLikes, Feed, PromoCodeStatus, DownloadInfo, Search, \
Suggestions, Landing, Genre, Dashboard, StationResult, StationTracksResult, BriefInfo, Supplement, ArtistTracks, \ Suggestions, Landing, Genre, Dashboard, StationResult, StationTracksResult, BriefInfo, Supplement, ArtistTracks, \
ArtistAlbums, ShotEvent, SimilarTracks ArtistAlbums, ShotEvent, SimilarTracks, UserSettings
from yandex_music.utils.request import Request from yandex_music.utils.request import Request
from yandex_music.utils.difference import Difference from yandex_music.utils.difference import Difference
from yandex_music.exceptions import InvalidToken, Captcha from yandex_music.exceptions import InvalidToken, Captcha
@ -48,17 +49,18 @@ def log(method):
class Client(YandexMusicObject): class Client(YandexMusicObject):
"""Класс представляющий клиент Yandex Music. """Класс, представляющий клиент Yandex Music.
При `fetch_account_status = False` многие сокращения перестанут работать в связи с тем, что неоткуда будет взять Note:
uid аккаунта для отправки запроса. Так же в большинстве методов придётся передавать uid явно. При `fetch_account_status = False` многие сокращения перестанут работать в связи с тем, что неоткуда будет взять
uid аккаунта для отправки запроса. Так же в большинстве методов придётся передавать `uid` явно.
Attributes: Attributes:
logger (:obj:`logging.Logger`): Объект логера. logger (:obj:`logging.Logger`): Объект логера.
token (:obj:`str`): Уникальный ключ для аутентификации. token (:obj:`str`): Уникальный ключ для аутентификации.
base_url (:obj:`str`): Ссылка на API Yandex Music. base_url (:obj:`str`): Ссылка на API Yandex Music.
oauth_url (:obj:`str`): Ссылка на OAuth Yandex Music. oauth_url (:obj:`str`): Ссылка на OAuth Yandex Music.
me (:obj:`yandex_music.Status`): Объект класса :class:`yandex_music.Status` предоставляющего основную me (:obj:`yandex_music.Status`): Объект класса :class:`yandex_music.Status` представляющего основную
информацию об аккаунте. информацию об аккаунте.
Args: Args:
@ -137,7 +139,8 @@ class Client(YandexMusicObject):
def from_token(cls, token: str, *args, **kwargs) -> 'Client': def from_token(cls, token: str, *args, **kwargs) -> 'Client':
"""Инициализция клиента по токену. """Инициализция клиента по токену.
Ничем не отличается от Client(token). Так исторически сложилось. Note:
Ничем не отличается от `Client(token)`. Так исторически сложилось.
Args: Args:
token (:obj:`str`, optional): Уникальный ключ для аутентификации. token (:obj:`str`, optional): Уникальный ключ для аутентификации.
@ -226,7 +229,7 @@ class Client(YandexMusicObject):
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
Returns: Returns:
:obj:`yandex_music.Status`: Объекта класса :class:`yandex_music.Status` предоставляющий информацию об :obj:`yandex_music.Status`: Объекта класса :class:`yandex_music.Status` представляющий информацию об
аккаунте если валиден, иначе :obj:`None`. аккаунте если валиден, иначе :obj:`None`.
Raises: Raises:
@ -239,6 +242,63 @@ class Client(YandexMusicObject):
return Status.de_json(result, self) return Status.de_json(result, self)
@log
def account_settings(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Settings]:
"""Получение настроек текущего пользователя.
Args:
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
ответа от сервера вместо указанного при создании пула.
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
Returns:
:obj:`yandex_music.UserSettings`: Объекта класса :class:`yandex_music.UserSettings` представляющий
настройки пользователя, иначе :obj:`None`.
Raises:
:class:`yandex_music.YandexMusicError`
"""
url = f'{self.base_url}/account/settings'
result = self._request.get(url, timeout=timeout, *args, **kwargs)
return UserSettings.de_json(result, self)
@log
def account_settings_set(self, param: str = None, value: Union[str, int, bool] = None,
data: Dict[str, Union[str, int, bool]] = None, timeout: Union[int, float] = None,
*args, **kwargs) -> Optional[Settings]:
"""Изменение настроек текущего пользователя.
Note:
Доступные названия параметров есть поля в классе :class:`yandex_music.UserSettings`, только в CamelCase.
Args:
param (:obj:`str`): Название параметра для изменения.
value (:obj:`str` | :obj:`int` | :obj:`bool`): Значение параметра.
data (:obj:`dict`): Словарь параметров и значений для множественного изменения.
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
ответа от сервера вместо указанного при создании пула.
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
Returns:
:obj:`yandex_music.UserSettings`: Объекта класса :class:`yandex_music.UserSettings` представляющий
настройки пользователя, иначе :obj:`None`.
Raises:
:class:`yandex_music.YandexMusicError`
"""
url = f'{self.base_url}/account/settings'
if not data:
data = {param: value}
result = self._request.post(url, data=data, timeout=timeout, *args, **kwargs)
return UserSettings.de_json(result, self)
@log @log
def settings(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Settings]: def settings(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Settings]:
"""Получение предложений по покупке. Нет обязательных параметров. """Получение предложений по покупке. Нет обязательных параметров.
@ -249,7 +309,7 @@ class Client(YandexMusicObject):
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
Returns: Returns:
:obj:`yandex_music.Settings`: Объекта класса :class:`yandex_music.Settings` предоставляющий информацию о :obj:`yandex_music.Settings`: Объекта класса :class:`yandex_music.Settings` представляющий информацию о
предлагаемых продуктах, иначе :obj:`None`. предлагаемых продуктах, иначе :obj:`None`.
Raises: Raises:
@ -370,8 +430,9 @@ class Client(YandexMusicObject):
*args, **kwargs) -> Optional[Landing]: *args, **kwargs) -> Optional[Landing]:
"""Получение лендинг-страницы содержащий блоки с новыми релизами, чартами, плейлистами с новинками и т.д. """Получение лендинг-страницы содержащий блоки с новыми релизами, чартами, плейлистами с новинками и т.д.
Поддерживаемые типы блоков: personalplaylists, promotions, new-releases, new-playlists, mixes,c hart, artists, Note:
albums, playlists, play_contexts. Поддерживаемые типы блоков: `personalplaylists`, `promotions`, `new-releases`, `new-playlists`, `mixes`,
`chart`, `artists`, `albums`, `playlists`, `play_contexts`.
Args: Args:
blocks (:obj:`str` | :obj:`list` из :obj:`str`): Блок или список блоков необходимых для выдачи. blocks (:obj:`str` | :obj:`list` из :obj:`str`): Блок или список блоков необходимых для выдачи.
@ -455,7 +516,7 @@ class Client(YandexMusicObject):
Returns: Returns:
:obj:`yandex_music.Supplement`: Объект класса `yandex_music.Supplement` представляющий дополнительную :obj:`yandex_music.Supplement`: Объект класса `yandex_music.Supplement` представляющий дополнительную
информацию о треке. информацию о треке.
Raises: Raises:
:class:`yandex_music.YandexMusicError` :class:`yandex_music.YandexMusicError`
@ -480,7 +541,7 @@ class Client(YandexMusicObject):
Returns: Returns:
:obj:`yandex_music.SimilarTracks`: Объект класса `yandex_music.SimilarTracks` представляющий список похожих :obj:`yandex_music.SimilarTracks`: Объект класса `yandex_music.SimilarTracks` представляющий список похожих
треков на другой трек. треков на другой трек.
Raises: Raises:
:class:`yandex_music.YandexMusicError` :class:`yandex_music.YandexMusicError`
@ -651,14 +712,46 @@ class Client(YandexMusicObject):
return Suggestions.de_json(result, self) return Suggestions.de_json(result, self)
@log @log
def users_playlists(self, kind: Union[List[Union[str, int]], str, int], user_id: str = None, def users_settings(self, user_id: Union[str, int] = None, timeout: Union[int, float] = None,
*args, **kwargs) -> Optional[Settings]:
"""Получение настроек пользователя.
Note:
Для получения настроек пользователя нужно быть авторизованным или владеть `user_id`.
Args:
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя чьи настройки хотим
получить.
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
ответа от сервера вместо указанного при создании пула.
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
Returns:
:obj:`yandex_music.UserSettings`: Объекта класса :class:`yandex_music.UserSettings` представляющий
настройки пользователя, иначе :obj:`None`.
Raises:
:class:`yandex_music.YandexMusicError`
"""
if user_id is None and self.me is not None:
user_id = self.me.account.uid
url = f'{self.base_url}/users/{user_id}/settings'
result = self._request.get(url, timeout=timeout, *args, **kwargs)
return UserSettings.de_json(result.get('user_settings'), self)
@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: Args:
kind (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста kind (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста
или их список. или их список.
user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
ответа от сервера вместо указанного при создании пула. ответа от сервера вместо указанного при создании пула.
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
@ -685,14 +778,14 @@ class Client(YandexMusicObject):
return Playlist.de_list(result, self) return Playlist.de_list(result, self)
@log @log
def users_playlists_create(self, title: str, visibility: str = 'public', user_id: str = None, def users_playlists_create(self, title: str, visibility: str = 'public', user_id: Union[str, int] = None,
timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]: timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]:
"""Создание плейлиста. """Создание плейлиста.
Args: Args:
title (:obj:`str`): Название. title (:obj:`str`): Название.
visibility (:obj:`str`, optional): Модификатор доступа. visibility (:obj:`str`, optional): Модификатор доступа.
user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
ответа от сервера вместо указанного при создании пула. ответа от сервера вместо указанного при создании пула.
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
@ -720,13 +813,13 @@ class Client(YandexMusicObject):
return Playlist.de_json(result, self) return Playlist.de_json(result, self)
@log @log
def users_playlists_delete(self, kind: Union[str, int], user_id: str = None, def users_playlists_delete(self, kind: Union[str, int], user_id: Union[str, int] = None,
timeout: Union[int, float] = None, *args, **kwargs) -> bool: timeout: Union[int, float] = None, *args, **kwargs) -> bool:
"""Удаление плейлиста. """Удаление плейлиста.
Args: Args:
kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
ответа от сервера вместо указанного при создании пула. ответа от сервера вместо указанного при создании пула.
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
@ -748,14 +841,14 @@ class Client(YandexMusicObject):
return result == 'ok' return result == 'ok'
@log @log
def users_playlists_name(self, kind: Union[str, int], name: str, user_id: str = None, def users_playlists_name(self, kind: Union[str, int], name: str, user_id: Union[str, int] = None,
timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]: timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]:
"""Изменение названия плейлиста. """Изменение названия плейлиста.
Args: Args:
kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
name (:obj:`str`): Новое название. name (:obj:`str`): Новое название.
user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
ответа от сервера вместо указанного при создании пула. ответа от сервера вместо указанного при создании пула.
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
@ -778,16 +871,17 @@ class Client(YandexMusicObject):
return Playlist.de_json(result, self) return Playlist.de_json(result, self)
@log @log
def users_playlists_visibility(self, kind: Union[str, int], visibility: str, user_id: str = None, def users_playlists_visibility(self, kind: Union[str, int], visibility: str, user_id: Union[str, int] = None,
timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]: timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]:
"""Изменение видимости плейлиста. """Изменение видимости плейлиста.
Видимость (visibility) может быть задана только одним из двух значений: private, public. Note:
Видимость (`visibility`) может быть задана только одним из двух значений: `private`, `public`.
Args: Args:
kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
visibility (:obj:`str`): Новое название. visibility (:obj:`str`): Новое название.
user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
ответа от сервера вместо указанного при создании пула. ответа от сервера вместо указанного при создании пула.
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
@ -810,18 +904,21 @@ class Client(YandexMusicObject):
return Playlist.de_json(result, self) return Playlist.de_json(result, self)
@log @log
def users_playlists_change(self, kind: Union[str, int], diff: str, revision: int = 1, user_id: str = None, def users_playlists_change(self, kind: Union[str, int], diff: str, revision: int = 1,
timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]: user_id: Union[str, int] = None, timeout: Union[int, float] = None,
*args, **kwargs) -> Optional[Playlist]:
"""Изменение плейлиста. """Изменение плейлиста.
Для получения отличий есть вспомогательный класс :class:`from yandex_music.utils.difference.Difference`. Note:
Так же существуют уже готовые методы-обёртки над операциями. Для получения отличий есть вспомогательный класс :class:`yandex_music.utils.difference.Difference`.
Так же существуют уже готовые методы-обёртки над операциями.
Args: Args:
kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
revision (:obj:`int`): TODO. revision (:obj:`int`): TODO.
diff (:obj:`str`): JSON представления отличий старого и нового плейлиста. diff (:obj:`str`): JSON представления отличий старого и нового плейлиста.
user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
ответа от сервера вместо указанного при создании пула. ответа от сервера вместо указанного при создании пула.
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
@ -851,11 +948,12 @@ class Client(YandexMusicObject):
@log @log
def users_playlists_insert_track(self, kind: Union[str, int], track_id: Union[str, int], album_id: Union[str, int], def users_playlists_insert_track(self, kind: Union[str, int], track_id: Union[str, int], album_id: Union[str, int],
at: int = 0, revision: int = 1, user_id: str = None, at: int = 0, revision: int = 1, user_id: Union[str, int] = None,
timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]: timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]:
"""Добавление трека в плейлист. """Добавление трека в плейлист.
Трек можно вставить с любое место плейлиста задав индекс вставки (аргумент at). Note:
Трек можно вставить с любое место плейлиста задав индекс вставки (аргумент `at`).
Args: Args:
kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
@ -863,7 +961,7 @@ class Client(YandexMusicObject):
album_id (:obj:`str` | :obj:`int`): Уникальный идентификатор альбома. album_id (:obj:`str` | :obj:`int`): Уникальный идентификатор альбома.
at (:obj:`int`): Индекс для вставки. at (:obj:`int`): Индекс для вставки.
revision (:obj:`int`): TODO. revision (:obj:`int`): TODO.
user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
ответа от сервера вместо указанного при создании пула. ответа от сервера вместо указанного при создании пула.
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
@ -885,18 +983,19 @@ class Client(YandexMusicObject):
@log @log
def users_playlists_delete_track(self, kind: Union[str, int], from_: int, to: int, revision: int = 1, def users_playlists_delete_track(self, kind: Union[str, int], from_: int, to: int, revision: int = 1,
user_id: str = None, timeout: Union[int, float] = None, user_id: Union[str, int] = None, timeout: Union[int, float] = None,
*args, **kwargs) -> Optional[Playlist]: *args, **kwargs) -> Optional[Playlist]:
"""Удаление треков из плейлиста. """Удаление треков из плейлиста.
Для удаление необходимо указать границы с какого по какой элемент (трек) удалить. Note:
Для удаление необходимо указать границы с какого по какой элемент (трек) удалить.
Args: Args:
kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
from_ (:obj:`int`): С какого индекса. from_ (:obj:`int`): С какого индекса.
to (:obj:`int`): По какой индекс. to (:obj:`int`): По какой индекс.
revision (:obj:`int`): TODO. revision (:obj:`int`): TODO.
user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
ответа от сервера вместо указанного при создании пула. ответа от сервера вместо указанного при создании пула.
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
@ -920,7 +1019,8 @@ class Client(YandexMusicObject):
def rotor_account_status(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Status]: def rotor_account_status(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Status]:
"""Получение статуса пользователя с дополнителньыми полями. """Получение статуса пользователя с дополнителньыми полями.
Данный статус отличается от обычного наличием дополнительных полей, например, `skips_per_hour`. Note:
Данный статус отличается от обычного наличием дополнительных полей, например, `skips_per_hour`.
Args: Args:
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
@ -970,7 +1070,9 @@ class Client(YandexMusicObject):
*args, **kwargs) -> List[StationResult]: *args, **kwargs) -> List[StationResult]:
"""Получение всех радиостанций с настройками пользователя. """Получение всех радиостанций с настройками пользователя.
Чтобы определить что за тип станции (жанры, настроения, занятие и т.д.) необходимо смотреть в пол `id_for_from`. Note:
Чтобы определить что за тип станции (жанры, настроения, занятие и т.д.) необходимо смотреть в поле
`id_for_from`.
Args: Args:
language (:obj:`str`): Язык, на котором будет информация о станциях. language (:obj:`str`): Язык, на котором будет информация о станциях.
@ -999,11 +1101,14 @@ class Client(YandexMusicObject):
*args, **kwargs) -> bool: *args, **kwargs) -> bool:
"""Отправка ответной реакции на происходящее при прослушивании радио. """Отправка ответной реакции на происходящее при прослушивании радио.
Сообщения о начале прослушивания радио, начале и конце трека, его пропуска. Note:
Сообщения о начале прослушивания радио, начале и конце трека, его пропуска.
Известные типы фидбека: `radioStarted`, `trackStarted`, `trackFinished`, `skip`. Известные типы фидбека: `radioStarted`, `trackStarted`, `trackFinished`, `skip`.
Пример `station`: `user:onyourwave`, `genre:allrock`.
Пример `from_`: `mobile-radio-user-123456789`. Пример `station`: `user:onyourwave`, `genre:allrock`.
Пример `from_`: `mobile-radio-user-123456789`.
Args: Args:
station (:obj:`str`): Станция. station (:obj:`str`): Станция.
@ -1059,6 +1164,12 @@ class Client(YandexMusicObject):
"""Сокращение для:: """Сокращение для::
client.rotor_station_feedback(station, 'radioStarted', timestamp, from, *args, **kwargs) client.rotor_station_feedback(station, 'radioStarted', timestamp, from, *args, **kwargs)
Returns:
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
Raises:
:class:`yandex_music.YandexMusicError`
""" """
return self.rotor_station_feedback(station, 'radioStarted', timestamp, from_=from_, batch_id=batch_id, return self.rotor_station_feedback(station, 'radioStarted', timestamp, from_=from_, batch_id=batch_id,
timeout=timeout, *args, **kwargs) timeout=timeout, *args, **kwargs)
@ -1070,6 +1181,12 @@ class Client(YandexMusicObject):
"""Сокращение для:: """Сокращение для::
client.rotor_station_feedback(station, 'trackStarted', timestamp, track_id, *args, **kwargs) client.rotor_station_feedback(station, 'trackStarted', timestamp, track_id, *args, **kwargs)
Returns:
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
Raises:
:class:`yandex_music.YandexMusicError`
""" """
return self.rotor_station_feedback(station, 'trackStarted', timestamp, track_id=track_id, batch_id=batch_id, return self.rotor_station_feedback(station, 'trackStarted', timestamp, track_id=track_id, batch_id=batch_id,
timeout=timeout, *args, **kwargs) timeout=timeout, *args, **kwargs)
@ -1082,7 +1199,13 @@ class Client(YandexMusicObject):
"""Сокращение для:: """Сокращение для::
client.rotor_station_feedback(station, 'trackFinished', timestamp, track_id, total_played_seconds, client.rotor_station_feedback(station, 'trackFinished', timestamp, track_id, total_played_seconds,
*args, **kwargs) *args, **kwargs)
Returns:
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
Raises:
:class:`yandex_music.YandexMusicError`
""" """
return self.rotor_station_feedback(station, 'trackFinished', timestamp, track_id=track_id, return self.rotor_station_feedback(station, 'trackFinished', timestamp, track_id=track_id,
total_played_seconds=total_played_seconds, batch_id=batch_id, total_played_seconds=total_played_seconds, batch_id=batch_id,
@ -1096,7 +1219,13 @@ class Client(YandexMusicObject):
"""Сокращение для:: """Сокращение для::
client.rotor_station_feedback(station, 'skip', timestamp, track_id, total_played_seconds, client.rotor_station_feedback(station, 'skip', timestamp, track_id, total_played_seconds,
*args, **kwargs) *args, **kwargs)
Returns:
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
Raises:
:class:`yandex_music.YandexMusicError`
""" """
return self.rotor_station_feedback(station, 'skip', timestamp, track_id=track_id, return self.rotor_station_feedback(station, 'skip', timestamp, track_id=track_id,
total_played_seconds=total_played_seconds, batch_id=batch_id, total_played_seconds=total_played_seconds, batch_id=batch_id,
@ -1132,13 +1261,14 @@ class Client(YandexMusicObject):
timeout: Union[int, float] = None, *args, **kwargs) -> bool: timeout: Union[int, float] = None, *args, **kwargs) -> bool:
"""Изменение настроек определённой станции. """Изменение настроек определённой станции.
Доступные значения для `mood_energy`: `fun`, `active`, `calm`, `sad`, `all`. Note:
Доступные значения для `diversity`: `favorite`, `popular`, `discover`, `default`. Доступные значения для `mood_energy`: `fun`, `active`, `calm`, `sad`, `all`.
Доступные значения для `language`: `not-russian`, `russian`, `any`.
У станций в `restrictions` есть Enum'ы, а в них `possible_values` - доступные значения для поля. Доступные значения для `diversity`: `favorite`, `popular`, `discover`, `default`.
Не некоторых аккаунтах не меняется язык... Доступные значения для `language`: `not-russian`, `russian`, `any`.
У станций в `restrictions` есть Enum'ы, а в них `possible_values` - доступные значения для поля.
Args: Args:
station (:obj:`str`): Станция. station (:obj:`str`): Станция.
@ -1175,15 +1305,17 @@ class Client(YandexMusicObject):
timeout: Union[int, float] = None, *args, **kwargs) -> Optional[StationTracksResult]: timeout: Union[int, float] = None, *args, **kwargs) -> Optional[StationTracksResult]:
"""Получение цепочки треков определённой станции. """Получение цепочки треков определённой станции.
Для продолжения цепочки треков необходимо: Note:
1. Передавать ID трека, что был до этого (первый в цепочки). Для продолжения цепочки треков необходимо:
2. Отправить фидбек о конче или скипе трека, что был передан в `queue`.
3. Отправить фидбек о начале следующего трека (второй в цепочки).
4. Выполнить запрос получения треков. В ответе придёт новые треки или произойдёт сдвиг цепочки на 1 элемент.
Проход по цепочке до коцна не изучен. Часто встречаются дубликаты. 1. Передавать `ID` трека, что был до этого (первый в цепочки).
2. Отправить фидбек о конче или скипе трека, что был передан в `queue`.
3. Отправить фидбек о начале следующего трека (второй в цепочки).
4. Выполнить запрос получения треков. В ответе придёт новые треки или произойдёт сдвиг цепочки на 1 элемент.
Все официальные клиенты выполняют запросы с `settings2 = True`. Проход по цепочке до коцна не изучен. Часто встречаются дубликаты.
Все официальные клиенты выполняют запросы с `settings2 = True`.
Args: Args:
station (:obj:`str`): Станция. station (:obj:`str`): Станция.
@ -1261,7 +1393,8 @@ class Client(YandexMusicObject):
*args, **kwargs) -> Optional[ArtistAlbums]: *args, **kwargs) -> Optional[ArtistAlbums]:
"""Получение альбомов артиста. """Получение альбомов артиста.
Известные значения для sort_by: year, rating. Note:
Известные значения для `sort_by`: `year`, `rating`.
Args: Args:
artist_id (:obj:`str` | :obj:`int`): Уникальный идентификатор артиста. artist_id (:obj:`str` | :obj:`int`): Уникальный идентификатор артиста.
@ -1476,15 +1609,17 @@ class Client(YandexMusicObject):
timeout: Union[int, float] = None, *args, **kwargs) -> Optional[ShotEvent]: timeout: Union[int, float] = None, *args, **kwargs) -> Optional[ShotEvent]:
"""Получение рекламы или шота от Алисы после трека. """Получение рекламы или шота от Алисы после трека.
При получения шота от Алисы `prev_track_id` можно не указывать. Note:
При получения шота от Алисы `prev_track_id` можно не указывать.
Если `context = 'playlist'`, то в `context_item` необходимо передать `{OWNER_PLAYLIST}:{ID_PLAYLIST}`. Если `context = 'playlist'`, то в `context_item` необходимо передать `{OWNER_PLAYLIST}:{ID_PLAYLIST}`.
Плейлист с Алисой имеет владельца с `id = 940441070`. Плейлист с Алисой имеет владельца с `id = 940441070`.
ID плейлиста можно получить из блоков landing'a. Получить шот чужого плейлиста нельзя. ID плейлиста можно получить из блоков landing'a. Получить шот чужого плейлиста нельзя.
Известные значения `context`: `playlist`. Известные значения `context`: `playlist`.
Известные значения `types`: `shot`, `ad`.
Известные значения `types`: `shot`, `ad`.
Args: Args:
prev_track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор предыдущего трека. prev_track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор предыдущего трека.
@ -1499,7 +1634,7 @@ class Client(YandexMusicObject):
Returns: Returns:
:obj:`yandex_music.ShotEvent`: Объекта класса :class:`yandex_music.ShotEvent` :obj:`yandex_music.ShotEvent`: Объекта класса :class:`yandex_music.ShotEvent`
представляющий шоты от Алисы, иначе :obj:`None`. представляющий шоты от Алисы, иначе :obj:`None`.
Raises: Raises:
:class:`yandex_music.YandexMusicError` :class:`yandex_music.YandexMusicError`

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class Cover(YandexMusicObject): class Cover(YandexMusicObject):
"""Класс представляющий обложку. """Класс, представляющий обложку.
Attributes: Attributes:
type (:obj:`str`): Тип обложки. type (:obj:`str`): Тип обложки.

ファイルの表示

@ -11,7 +11,7 @@ from yandex_music import YandexMusicObject
class DownloadInfo(YandexMusicObject): class DownloadInfo(YandexMusicObject):
"""Класс представляющий информацию о вариантах загрузки трека. """Класс, представляющий информацию о вариантах загрузки трека.
Attributes: Attributes:
codec (:obj:`str`): Кодек аудиофайла. codec (:obj:`str`): Кодек аудиофайла.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class Icon(YandexMusicObject): class Icon(YandexMusicObject):
"""Класс представляющий иконку. """Класс, представляющий иконку.
Attributes: Attributes:
background_color (:obj:`str`): Цвет заднего фона в HEX. background_color (:obj:`str`): Цвет заднего фона в HEX.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class InvocationInfo(YandexMusicObject): class InvocationInfo(YandexMusicObject):
"""Класс представляющий информацию о запросе. """Класс, представляющий информацию о запросе.
Attributes: Attributes:
hostname (:obj:`str`): Имя удалённого сервера. hostname (:obj:`str`): Имя удалённого сервера.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class Pager(YandexMusicObject): class Pager(YandexMusicObject):
"""Класс представляющий пагинатор. """Класс, представляющий пагинатор.
Attributes: Attributes:
total (:obj:`int`): Всего треков. total (:obj:`int`): Всего треков.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class PermissionAlerts(YandexMusicObject): class PermissionAlerts(YandexMusicObject):
"""Класс представляющий оповещения. """Класс, представляющий оповещения.
Attributes: Attributes:
alerts (:obj:`list` из :obj:`str`): Список оповещений. alerts (:obj:`list` из :obj:`str`): Список оповещений.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class PlaylistAbsence(YandexMusicObject): class PlaylistAbsence(YandexMusicObject):
"""Класс представляющий причину отсутствия плейлиста. """Класс, представляющий причину отсутствия плейлиста.
Attributes: Attributes:
kind (:obj:`int`): Уникальный идентификатор плейлиста. kind (:obj:`int`): Уникальный идентификатор плейлиста.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class User(YandexMusicObject): class User(YandexMusicObject):
"""Класс представляющий пользователя. """Класс, представляющий пользователя.
Attributes: Attributes:
uid (:obj:`int`): Идентификатор пользователя. uid (:obj:`int`): Идентификатор пользователя.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class PromoCodeStatus(YandexMusicObject): class PromoCodeStatus(YandexMusicObject):
"""Класс представляющий статус активации промо-кода. """Класс, представляющий статус активации промо-кода.
Attributes: Attributes:
status (:obj:`str`): Статус операции. status (:obj:`str`): Статус операции.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class Search(YandexMusicObject): class Search(YandexMusicObject):
"""Класс представляющий результаты поиска. """Класс, представляющий результаты поиска.
Attributes: Attributes:
search_request_id (:obj:`str`): ID запроса. search_request_id (:obj:`str`): ID запроса.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class Settings(YandexMusicObject): class Settings(YandexMusicObject):
"""Класс представляющий предложения по покупке. """Класс, представляющий предложения по покупке.
Attributes: Attributes:
in_app_products (:obj:`list` из :obj:`yandex_music.Product`): Список объектов класса in_app_products (:obj:`list` из :obj:`yandex_music.Product`): Список объектов класса

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class TrackShort(YandexMusicObject): class TrackShort(YandexMusicObject):
"""Класс представляющий укороченную версию трека с неполными данными. """Класс, представляющий укороченную версию трека с неполными данными.
Attributes: Attributes:
id (:obj:`str`): Уникальный идентификатор трека. id (:obj:`str`): Уникальный идентификатор трека.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class TracksList(YandexMusicObject): class TracksList(YandexMusicObject):
"""Класс представляющий список треков. """Класс, представляющий список треков.
Attributes: Attributes:
uid (:obj:`int`): Уникальный идентификатор пользователя. uid (:obj:`int`): Уникальный идентификатор пользователя.

ファイルの表示

@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject
class CaptchaResponse(YandexMusicObject): class CaptchaResponse(YandexMusicObject):
"""Класс представляющий ответ сервера с запросом на ввод капчи. """Класс, представляющий ответ сервера с запросом на ввод капчи.
Attributes: Attributes:
x_captcha_url (:obj:`str`): Ссылка на изображение с капчей. x_captcha_url (:obj:`str`): Ссылка на изображение с капчей.

ファイルの表示

@ -26,7 +26,7 @@ logging.getLogger('urllib3').setLevel(logging.WARNING)
class Request: class Request:
"""Вспомогателньный класс для yandex_music предоставляющий методы для выполнения POST и GET запросов, скачивания """Вспомогателньный класс для yandex_music представляющий методы для выполнения POST и GET запросов, скачивания
файлов. файлов.
Args: Args: