diff --git a/docs/source/yandex_music.status.account.rst b/docs/source/yandex_music.account.account.rst similarity index 100% rename from docs/source/yandex_music.status.account.rst rename to docs/source/yandex_music.account.account.rst diff --git a/docs/source/yandex_music.status.auto_renewable.rst b/docs/source/yandex_music.account.auto_renewable.rst similarity index 100% rename from docs/source/yandex_music.status.auto_renewable.rst rename to docs/source/yandex_music.account.auto_renewable.rst diff --git a/docs/source/yandex_music.status.passport_phone.rst b/docs/source/yandex_music.account.passport_phone.rst similarity index 100% rename from docs/source/yandex_music.status.passport_phone.rst rename to docs/source/yandex_music.account.passport_phone.rst diff --git a/docs/source/yandex_music.status.permissions.rst b/docs/source/yandex_music.account.permissions.rst similarity index 100% rename from docs/source/yandex_music.status.permissions.rst rename to docs/source/yandex_music.account.permissions.rst diff --git a/docs/source/yandex_music.status.plus.rst b/docs/source/yandex_music.account.plus.rst similarity index 100% rename from docs/source/yandex_music.status.plus.rst rename to docs/source/yandex_music.account.plus.rst diff --git a/docs/source/yandex_music.status.price.rst b/docs/source/yandex_music.account.price.rst similarity index 100% rename from docs/source/yandex_music.status.price.rst rename to docs/source/yandex_music.account.price.rst diff --git a/docs/source/yandex_music.status.product.rst b/docs/source/yandex_music.account.product.rst similarity index 100% rename from docs/source/yandex_music.status.product.rst rename to docs/source/yandex_music.account.product.rst diff --git a/docs/source/yandex_music.account.rst b/docs/source/yandex_music.account.rst new file mode 100644 index 0000000..af404f9 --- /dev/null +++ b/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 \ No newline at end of file diff --git a/docs/source/yandex_music.status.status.rst b/docs/source/yandex_music.account.status.rst similarity index 100% rename from docs/source/yandex_music.status.status.rst rename to docs/source/yandex_music.account.status.rst diff --git a/docs/source/yandex_music.status.subscription.rst b/docs/source/yandex_music.account.subscription.rst similarity index 100% rename from docs/source/yandex_music.status.subscription.rst rename to docs/source/yandex_music.account.subscription.rst diff --git a/docs/source/yandex_music.account.user_settings.rst b/docs/source/yandex_music.account.user_settings.rst new file mode 100644 index 0000000..a6f5443 --- /dev/null +++ b/docs/source/yandex_music.account.user_settings.rst @@ -0,0 +1,6 @@ +yandex_music.UserSettings +========================= + +.. autoclass:: yandex_music.UserSettings + :members: + :show-inheritance: diff --git a/docs/source/yandex_music.rst b/docs/source/yandex_music.rst index b299884..2805572 100644 --- a/docs/source/yandex_music.rst +++ b/docs/source/yandex_music.rst @@ -8,7 +8,7 @@ yandex_music.utils yandex_music.genre yandex_music.track - yandex_music.status + yandex_music.account yandex_music.likes yandex_music.album yandex_music.search diff --git a/docs/source/yandex_music.status.rst b/docs/source/yandex_music.status.rst deleted file mode 100644 index a1886e4..0000000 --- a/docs/source/yandex_music.status.rst +++ /dev/null @@ -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 \ No newline at end of file diff --git a/tests/test_user_settings.py b/tests/test_user_settings.py new file mode 100644 index 0000000..a8b5000 --- /dev/null +++ b/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) diff --git a/yandex_music/__init__.py b/yandex_music/__init__.py index 8e8b1c9..1495b1a 100644 --- a/yandex_music/__init__.py +++ b/yandex_music/__init__.py @@ -4,15 +4,16 @@ from .settings import Settings from .permission_alerts import PermissionAlerts from .experiments import Experiments -from .status.status import Status -from .status.account import Account -from .status.plus import Plus -from .status.subscription import Subscription -from .status.price import Price -from .status.product import Product -from .status.auto_renewable import AutoRenewable -from .status.passport_phone import PassportPhone -from .status.permissions import Permissions +from .account.status import Status +from .account.account import Account +from .account.plus import Plus +from .account.user_settings import UserSettings +from .account.subscription import Subscription +from .account.price import Price +from .account.product import Product +from .account.auto_renewable import AutoRenewable +from .account.passport_phone import PassportPhone +from .account.permissions import Permissions from .album.album import Album 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', 'DiscreteScale', 'StationResult', 'Sequence', 'StationTracksResult', 'BriefInfo', 'Description', 'PlaylistId', 'Vinyl', 'Supplement', 'Lyrics', 'VideoSupplement', 'ArtistTracks', 'Pager', 'ArtistAlbums', - 'PlaylistAbsence', 'Shot', 'ShotEvent', 'ShotType', 'ShotData', 'SimilarTracks'] + 'PlaylistAbsence', 'Shot', 'ShotEvent', 'ShotType', 'ShotData', 'SimilarTracks', 'UserSettings'] diff --git a/yandex_music/status/__init__.py b/yandex_music/account/__init__.py similarity index 100% rename from yandex_music/status/__init__.py rename to yandex_music/account/__init__.py diff --git a/yandex_music/status/account.py b/yandex_music/account/account.py similarity index 97% rename from yandex_music/status/account.py rename to yandex_music/account/account.py index dc99a0e..d42dce2 100644 --- a/yandex_music/status/account.py +++ b/yandex_music/account/account.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class Account(YandexMusicObject): - """Класс предоставляющий основную информацию об аккаунте пользователя. + """Класс, представляющий основную информацию об аккаунте пользователя. Attributes: now (:obj:`str`): Текущая дата и время. diff --git a/yandex_music/status/auto_renewable.py b/yandex_music/account/auto_renewable.py similarity index 97% rename from yandex_music/status/auto_renewable.py rename to yandex_music/account/auto_renewable.py index 2c02460..3a1baa6 100644 --- a/yandex_music/status/auto_renewable.py +++ b/yandex_music/account/auto_renewable.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class AutoRenewable(YandexMusicObject): - """Класс представляющий автопродление подписки. + """Класс, представляющий автопродление подписки. Attributes: expires (:obj:`str`): Дата истечения подписки. diff --git a/yandex_music/status/passport_phone.py b/yandex_music/account/passport_phone.py similarity index 96% rename from yandex_music/status/passport_phone.py rename to yandex_music/account/passport_phone.py index 220584c..082d746 100644 --- a/yandex_music/status/passport_phone.py +++ b/yandex_music/account/passport_phone.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class PassportPhone(YandexMusicObject): - """Класс представляющий номер телефона пользователя. + """Класс, представляющий номер телефона пользователя. Attributes: phone (:obj:`str`): Номер телефона. diff --git a/yandex_music/status/permissions.py b/yandex_music/account/permissions.py similarity index 92% rename from yandex_music/status/permissions.py rename to yandex_music/account/permissions.py index 027084d..97988a6 100644 --- a/yandex_music/status/permissions.py +++ b/yandex_music/account/permissions.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class Permissions(YandexMusicObject): - """Класс предоставляющий информацию о правах пользователя, их изначальных значениях и даты окончания. + """Класс, представляющий информацию о правах пользователя, их изначальных значениях и даты окончания. Attributes: until (:obj:`str`): Дата окончания прав. diff --git a/yandex_music/status/plus.py b/yandex_music/account/plus.py similarity index 96% rename from yandex_music/status/plus.py rename to yandex_music/account/plus.py index b697f1e..b432c29 100644 --- a/yandex_music/status/plus.py +++ b/yandex_music/account/plus.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class Plus(YandexMusicObject): - """Класс представляющий Plus подписку. + """Класс, представляющий Plus подписку. Attributes: has_plus (:obj:`bool`): Наличие. diff --git a/yandex_music/status/price.py b/yandex_music/account/price.py similarity index 97% rename from yandex_music/status/price.py rename to yandex_music/account/price.py index 296af15..c7f0851 100644 --- a/yandex_music/status/price.py +++ b/yandex_music/account/price.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class Price(YandexMusicObject): - """Класс представляющий цену. + """Класс, представляющий цену. Attributes: amount (:obj:`int`): Количество единиц. diff --git a/yandex_music/status/product.py b/yandex_music/account/product.py similarity index 98% rename from yandex_music/status/product.py rename to yandex_music/account/product.py index c1c8fe8..3540159 100644 --- a/yandex_music/status/product.py +++ b/yandex_music/account/product.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class Product(YandexMusicObject): - """Класс представляющий продаваемый продукт. + """Класс, представляющий продаваемый продукт. Attributes: product_id (:obj:`str`): Уникальный идентификатор. diff --git a/yandex_music/status/status.py b/yandex_music/account/status.py similarity index 86% rename from yandex_music/status/status.py rename to yandex_music/account/status.py index 43e8e77..4275584 100644 --- a/yandex_music/status/status.py +++ b/yandex_music/account/status.py @@ -7,19 +7,19 @@ from yandex_music import YandexMusicObject class Status(YandexMusicObject): - """Класс представляющий подробную информацию об аккаунте пользователя. + """Класс, представляющий подробную информацию об аккаунте пользователя. 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`): Максимальное количество загруженных треков. subeditor (:obj:`bool`): Наличие статуса модератора проверки корректности информации. 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 адрес аккаунта. skips_per_hour (:obj:`int`): Количество переключение треков на радио в час. @@ -29,16 +29,16 @@ class Status(YandexMusicObject): Music. 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): Максимальное количество загруженных треков. subeditor (:obj:`bool`, 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 подписке. default_email (:obj:`str`, optional): Основной e-mail адрес аккаунта. skips_per_hour (:obj:`int`, optional): Количество переключение треков на радио в час. diff --git a/yandex_music/status/subscription.py b/yandex_music/account/subscription.py similarity index 96% rename from yandex_music/status/subscription.py rename to yandex_music/account/subscription.py index 0e47413..bead53b 100644 --- a/yandex_music/status/subscription.py +++ b/yandex_music/account/subscription.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class Subscription(YandexMusicObject): - """Класс предоставляющий информацию о подписках пользователя. + """Класс, представляющий информацию о подписках пользователя. Attributes: auto_renewable (:obj:`list` из :obj:`yandex_music.AutoRenewable`): Список объектов класса diff --git a/yandex_music/account/user_settings.py b/yandex_music/account/user_settings.py new file mode 100644 index 0000000..e4f6f14 --- /dev/null +++ b/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) diff --git a/yandex_music/artist/artist_albums.py b/yandex_music/artist/artist_albums.py index 6805614..1e24aba 100644 --- a/yandex_music/artist/artist_albums.py +++ b/yandex_music/artist/artist_albums.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class ArtistAlbums(YandexMusicObject): - """Класс представляющий страницу списка альбомов артиста. + """Класс, представляющий страницу списка альбомов артиста. Attributes: albums (:obj:`list` из :obj:`yandex_music.Album`): Список альбомов артиста. diff --git a/yandex_music/artist/artist_tracks.py b/yandex_music/artist/artist_tracks.py index cee4966..ffac16a 100644 --- a/yandex_music/artist/artist_tracks.py +++ b/yandex_music/artist/artist_tracks.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class ArtistTracks(YandexMusicObject): - """Класс представляющий страницу списка треков артиста. + """Класс, представляющий страницу списка треков артиста. Attributes: tracks (:obj:`list` из :obj:`yandex_music.Track`): Список треков артиста. diff --git a/yandex_music/client.py b/yandex_music/client.py index 826d93d..3d77b6d 100644 --- a/yandex_music/client.py +++ b/yandex_music/client.py @@ -1,12 +1,13 @@ import logging import functools + 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, \ TracksList, Track, AlbumsLikes, ArtistsLikes, PlaylistsLikes, Feed, PromoCodeStatus, DownloadInfo, Search, \ 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.difference import Difference from yandex_music.exceptions import InvalidToken, Captcha @@ -48,17 +49,18 @@ def log(method): class Client(YandexMusicObject): - """Класс представляющий клиент Yandex Music. + """Класс, представляющий клиент Yandex Music. - При `fetch_account_status = False` многие сокращения перестанут работать в связи с тем, что неоткуда будет взять - uid аккаунта для отправки запроса. Так же в большинстве методов придётся передавать uid явно. + Note: + При `fetch_account_status = False` многие сокращения перестанут работать в связи с тем, что неоткуда будет взять + uid аккаунта для отправки запроса. Так же в большинстве методов придётся передавать `uid` явно. Attributes: logger (:obj:`logging.Logger`): Объект логера. token (:obj:`str`): Уникальный ключ для аутентификации. base_url (:obj:`str`): Ссылка на API 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: @@ -137,7 +139,8 @@ class Client(YandexMusicObject): def from_token(cls, token: str, *args, **kwargs) -> 'Client': """Инициализция клиента по токену. - Ничем не отличается от Client(token). Так исторически сложилось. + Note: + Ничем не отличается от `Client(token)`. Так исторически сложилось. Args: token (:obj:`str`, optional): Уникальный ключ для аутентификации. @@ -226,7 +229,7 @@ class Client(YandexMusicObject): **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). Returns: - :obj:`yandex_music.Status`: Объекта класса :class:`yandex_music.Status` предоставляющий информацию об + :obj:`yandex_music.Status`: Объекта класса :class:`yandex_music.Status` представляющий информацию об аккаунте если валиден, иначе :obj:`None`. Raises: @@ -239,6 +242,63 @@ class Client(YandexMusicObject): 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 def settings(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Settings]: """Получение предложений по покупке. Нет обязательных параметров. @@ -249,7 +309,7 @@ class Client(YandexMusicObject): **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). Returns: - :obj:`yandex_music.Settings`: Объекта класса :class:`yandex_music.Settings` предоставляющий информацию о + :obj:`yandex_music.Settings`: Объекта класса :class:`yandex_music.Settings` представляющий информацию о предлагаемых продуктах, иначе :obj:`None`. Raises: @@ -370,8 +430,9 @@ class Client(YandexMusicObject): *args, **kwargs) -> Optional[Landing]: """Получение лендинг-страницы содержащий блоки с новыми релизами, чартами, плейлистами с новинками и т.д. - Поддерживаемые типы блоков: personalplaylists, promotions, new-releases, new-playlists, mixes,c hart, artists, - albums, playlists, play_contexts. + Note: + Поддерживаемые типы блоков: `personalplaylists`, `promotions`, `new-releases`, `new-playlists`, `mixes`, + `chart`, `artists`, `albums`, `playlists`, `play_contexts`. Args: blocks (:obj:`str` | :obj:`list` из :obj:`str`): Блок или список блоков необходимых для выдачи. @@ -455,7 +516,7 @@ class Client(YandexMusicObject): Returns: :obj:`yandex_music.Supplement`: Объект класса `yandex_music.Supplement` представляющий дополнительную - информацию о треке. + информацию о треке. Raises: :class:`yandex_music.YandexMusicError` @@ -480,7 +541,7 @@ class Client(YandexMusicObject): Returns: :obj:`yandex_music.SimilarTracks`: Объект класса `yandex_music.SimilarTracks` представляющий список похожих - треков на другой трек. + треков на другой трек. Raises: :class:`yandex_music.YandexMusicError` @@ -651,14 +712,46 @@ class Client(YandexMusicObject): return Suggestions.de_json(result, self) @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]: """Получение плейлиста или списка плейлистов по уникальным идентификаторам. Args: 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): Если это значение указано, используется как время ожидания ответа от сервера вместо указанного при создании пула. **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). @@ -685,14 +778,14 @@ class Client(YandexMusicObject): return Playlist.de_list(result, self) @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]: """Создание плейлиста. Args: title (:obj:`str`): Название. visibility (:obj:`str`, optional): Модификатор доступа. - user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. + user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания ответа от сервера вместо указанного при создании пула. **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). @@ -720,13 +813,13 @@ class Client(YandexMusicObject): return Playlist.de_json(result, self) @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: """Удаление плейлиста. Args: kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. - user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. + user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания ответа от сервера вместо указанного при создании пула. **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). @@ -748,14 +841,14 @@ class Client(YandexMusicObject): return result == 'ok' @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]: """Изменение названия плейлиста. Args: kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. name (:obj:`str`): Новое название. - user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. + user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания ответа от сервера вместо указанного при создании пула. **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). @@ -778,16 +871,17 @@ class Client(YandexMusicObject): return Playlist.de_json(result, self) @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]: """Изменение видимости плейлиста. - Видимость (visibility) может быть задана только одним из двух значений: private, public. + Note: + Видимость (`visibility`) может быть задана только одним из двух значений: `private`, `public`. Args: kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. visibility (:obj:`str`): Новое название. - user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. + user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания ответа от сервера вместо указанного при создании пула. **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). @@ -810,18 +904,21 @@ class Client(YandexMusicObject): return Playlist.de_json(result, self) @log - def users_playlists_change(self, kind: Union[str, int], diff: str, revision: int = 1, user_id: str = None, - timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Playlist]: + def users_playlists_change(self, kind: Union[str, int], diff: str, revision: int = 1, + 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: kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. revision (:obj:`int`): TODO. diff (:obj:`str`): JSON представления отличий старого и нового плейлиста. - user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. + user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания ответа от сервера вместо указанного при создании пула. **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). @@ -851,11 +948,12 @@ class Client(YandexMusicObject): @log 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]: """Добавление трека в плейлист. - Трек можно вставить с любое место плейлиста задав индекс вставки (аргумент at). + Note: + Трек можно вставить с любое место плейлиста задав индекс вставки (аргумент `at`). Args: kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. @@ -863,7 +961,7 @@ class Client(YandexMusicObject): album_id (:obj:`str` | :obj:`int`): Уникальный идентификатор альбома. at (:obj:`int`): Индекс для вставки. revision (:obj:`int`): TODO. - user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. + user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания ответа от сервера вместо указанного при создании пула. **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). @@ -885,18 +983,19 @@ class Client(YandexMusicObject): @log 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]: """Удаление треков из плейлиста. - Для удаление необходимо указать границы с какого по какой элемент (трек) удалить. + Note: + Для удаление необходимо указать границы с какого по какой элемент (трек) удалить. Args: kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. from_ (:obj:`int`): С какого индекса. to (:obj:`int`): По какой индекс. revision (:obj:`int`): TODO. - user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. + user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. timeout (:obj:`int` | :obj:`float`, 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]: """Получение статуса пользователя с дополнителньыми полями. - Данный статус отличается от обычного наличием дополнительных полей, например, `skips_per_hour`. + Note: + Данный статус отличается от обычного наличием дополнительных полей, например, `skips_per_hour`. Args: timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания @@ -970,7 +1070,9 @@ class Client(YandexMusicObject): *args, **kwargs) -> List[StationResult]: """Получение всех радиостанций с настройками пользователя. - Чтобы определить что за тип станции (жанры, настроения, занятие и т.д.) необходимо смотреть в пол `id_for_from`. + Note: + Чтобы определить что за тип станции (жанры, настроения, занятие и т.д.) необходимо смотреть в поле + `id_for_from`. Args: language (:obj:`str`): Язык, на котором будет информация о станциях. @@ -999,11 +1101,14 @@ class Client(YandexMusicObject): *args, **kwargs) -> bool: """Отправка ответной реакции на происходящее при прослушивании радио. - Сообщения о начале прослушивания радио, начале и конце трека, его пропуска. + Note: + Сообщения о начале прослушивания радио, начале и конце трека, его пропуска. - Известные типы фидбека: `radioStarted`, `trackStarted`, `trackFinished`, `skip`. - Пример `station`: `user:onyourwave`, `genre:allrock`. - Пример `from_`: `mobile-radio-user-123456789`. + Известные типы фидбека: `radioStarted`, `trackStarted`, `trackFinished`, `skip`. + + Пример `station`: `user:onyourwave`, `genre:allrock`. + + Пример `from_`: `mobile-radio-user-123456789`. Args: station (:obj:`str`): Станция. @@ -1059,6 +1164,12 @@ class Client(YandexMusicObject): """Сокращение для:: 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, timeout=timeout, *args, **kwargs) @@ -1070,6 +1181,12 @@ class Client(YandexMusicObject): """Сокращение для:: 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, timeout=timeout, *args, **kwargs) @@ -1082,7 +1199,13 @@ class Client(YandexMusicObject): """Сокращение для:: 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, 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, - *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, 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: """Изменение настроек определённой станции. - Доступные значения для `mood_energy`: `fun`, `active`, `calm`, `sad`, `all`. - Доступные значения для `diversity`: `favorite`, `popular`, `discover`, `default`. - Доступные значения для `language`: `not-russian`, `russian`, `any`. + Note: + Доступные значения для `mood_energy`: `fun`, `active`, `calm`, `sad`, `all`. - У станций в `restrictions` есть Enum'ы, а в них `possible_values` - доступные значения для поля. + Доступные значения для `diversity`: `favorite`, `popular`, `discover`, `default`. - Не некоторых аккаунтах не меняется язык... + Доступные значения для `language`: `not-russian`, `russian`, `any`. + + У станций в `restrictions` есть Enum'ы, а в них `possible_values` - доступные значения для поля. Args: station (:obj:`str`): Станция. @@ -1175,15 +1305,17 @@ class Client(YandexMusicObject): timeout: Union[int, float] = None, *args, **kwargs) -> Optional[StationTracksResult]: """Получение цепочки треков определённой станции. - Для продолжения цепочки треков необходимо: - 1. Передавать ID трека, что был до этого (первый в цепочки). - 2. Отправить фидбек о конче или скипе трека, что был передан в `queue`. - 3. Отправить фидбек о начале следующего трека (второй в цепочки). - 4. Выполнить запрос получения треков. В ответе придёт новые треки или произойдёт сдвиг цепочки на 1 элемент. + Note: + Для продолжения цепочки треков необходимо: - Проход по цепочке до коцна не изучен. Часто встречаются дубликаты. + 1. Передавать `ID` трека, что был до этого (первый в цепочки). + 2. Отправить фидбек о конче или скипе трека, что был передан в `queue`. + 3. Отправить фидбек о начале следующего трека (второй в цепочки). + 4. Выполнить запрос получения треков. В ответе придёт новые треки или произойдёт сдвиг цепочки на 1 элемент. - Все официальные клиенты выполняют запросы с `settings2 = True`. + Проход по цепочке до коцна не изучен. Часто встречаются дубликаты. + + Все официальные клиенты выполняют запросы с `settings2 = True`. Args: station (:obj:`str`): Станция. @@ -1261,7 +1393,8 @@ class Client(YandexMusicObject): *args, **kwargs) -> Optional[ArtistAlbums]: """Получение альбомов артиста. - Известные значения для sort_by: year, rating. + Note: + Известные значения для `sort_by`: `year`, `rating`. Args: artist_id (:obj:`str` | :obj:`int`): Уникальный идентификатор артиста. @@ -1476,15 +1609,17 @@ class Client(YandexMusicObject): timeout: Union[int, float] = None, *args, **kwargs) -> Optional[ShotEvent]: """Получение рекламы или шота от Алисы после трека. - При получения шота от Алисы `prev_track_id` можно не указывать. + Note: + При получения шота от Алисы `prev_track_id` можно не указывать. - Если `context = 'playlist'`, то в `context_item` необходимо передать `{OWNER_PLAYLIST}:{ID_PLAYLIST}`. - Плейлист с Алисой имеет владельца с `id = 940441070`. + Если `context = 'playlist'`, то в `context_item` необходимо передать `{OWNER_PLAYLIST}:{ID_PLAYLIST}`. + Плейлист с Алисой имеет владельца с `id = 940441070`. - ID плейлиста можно получить из блоков landing'a. Получить шот чужого плейлиста нельзя. + ID плейлиста можно получить из блоков landing'a. Получить шот чужого плейлиста нельзя. - Известные значения `context`: `playlist`. - Известные значения `types`: `shot`, `ad`. + Известные значения `context`: `playlist`. + + Известные значения `types`: `shot`, `ad`. Args: prev_track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор предыдущего трека. @@ -1499,7 +1634,7 @@ class Client(YandexMusicObject): Returns: :obj:`yandex_music.ShotEvent`: Объекта класса :class:`yandex_music.ShotEvent` - представляющий шоты от Алисы, иначе :obj:`None`. + представляющий шоты от Алисы, иначе :obj:`None`. Raises: :class:`yandex_music.YandexMusicError` diff --git a/yandex_music/cover.py b/yandex_music/cover.py index 9ddee4c..c40d307 100644 --- a/yandex_music/cover.py +++ b/yandex_music/cover.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class Cover(YandexMusicObject): - """Класс представляющий обложку. + """Класс, представляющий обложку. Attributes: type (:obj:`str`): Тип обложки. diff --git a/yandex_music/download_info.py b/yandex_music/download_info.py index 6f4d352..b7faf2c 100644 --- a/yandex_music/download_info.py +++ b/yandex_music/download_info.py @@ -11,7 +11,7 @@ from yandex_music import YandexMusicObject class DownloadInfo(YandexMusicObject): - """Класс представляющий информацию о вариантах загрузки трека. + """Класс, представляющий информацию о вариантах загрузки трека. Attributes: codec (:obj:`str`): Кодек аудиофайла. diff --git a/yandex_music/icon.py b/yandex_music/icon.py index 37c6134..319975d 100644 --- a/yandex_music/icon.py +++ b/yandex_music/icon.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class Icon(YandexMusicObject): - """Класс представляющий иконку. + """Класс, представляющий иконку. Attributes: background_color (:obj:`str`): Цвет заднего фона в HEX. diff --git a/yandex_music/invocation_info.py b/yandex_music/invocation_info.py index c00842c..deb4ec6 100644 --- a/yandex_music/invocation_info.py +++ b/yandex_music/invocation_info.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class InvocationInfo(YandexMusicObject): - """Класс представляющий информацию о запросе. + """Класс, представляющий информацию о запросе. Attributes: hostname (:obj:`str`): Имя удалённого сервера. diff --git a/yandex_music/pager.py b/yandex_music/pager.py index 5e24cd7..8154bef 100644 --- a/yandex_music/pager.py +++ b/yandex_music/pager.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class Pager(YandexMusicObject): - """Класс представляющий пагинатор. + """Класс, представляющий пагинатор. Attributes: total (:obj:`int`): Всего треков. diff --git a/yandex_music/permission_alerts.py b/yandex_music/permission_alerts.py index 7b1135b..38b1bd9 100644 --- a/yandex_music/permission_alerts.py +++ b/yandex_music/permission_alerts.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class PermissionAlerts(YandexMusicObject): - """Класс представляющий оповещения. + """Класс, представляющий оповещения. Attributes: alerts (:obj:`list` из :obj:`str`): Список оповещений. diff --git a/yandex_music/playlist/playlist_absence.py b/yandex_music/playlist/playlist_absence.py index 3290cbb..5b71b8c 100644 --- a/yandex_music/playlist/playlist_absence.py +++ b/yandex_music/playlist/playlist_absence.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class PlaylistAbsence(YandexMusicObject): - """Класс представляющий причину отсутствия плейлиста. + """Класс, представляющий причину отсутствия плейлиста. Attributes: kind (:obj:`int`): Уникальный идентификатор плейлиста. diff --git a/yandex_music/playlist/user.py b/yandex_music/playlist/user.py index 14ac693..8ab3fdf 100644 --- a/yandex_music/playlist/user.py +++ b/yandex_music/playlist/user.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class User(YandexMusicObject): - """Класс представляющий пользователя. + """Класс, представляющий пользователя. Attributes: uid (:obj:`int`): Идентификатор пользователя. diff --git a/yandex_music/promo_code_status.py b/yandex_music/promo_code_status.py index 45222f6..de2bb07 100644 --- a/yandex_music/promo_code_status.py +++ b/yandex_music/promo_code_status.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class PromoCodeStatus(YandexMusicObject): - """Класс представляющий статус активации промо-кода. + """Класс, представляющий статус активации промо-кода. Attributes: status (:obj:`str`): Статус операции. diff --git a/yandex_music/search/search.py b/yandex_music/search/search.py index 6c3e47b..4ac089b 100644 --- a/yandex_music/search/search.py +++ b/yandex_music/search/search.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class Search(YandexMusicObject): - """Класс представляющий результаты поиска. + """Класс, представляющий результаты поиска. Attributes: search_request_id (:obj:`str`): ID запроса. diff --git a/yandex_music/settings.py b/yandex_music/settings.py index adb95af..530a622 100644 --- a/yandex_music/settings.py +++ b/yandex_music/settings.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class Settings(YandexMusicObject): - """Класс представляющий предложения по покупке. + """Класс, представляющий предложения по покупке. Attributes: in_app_products (:obj:`list` из :obj:`yandex_music.Product`): Список объектов класса diff --git a/yandex_music/track_short.py b/yandex_music/track_short.py index 8cccee3..747c222 100644 --- a/yandex_music/track_short.py +++ b/yandex_music/track_short.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class TrackShort(YandexMusicObject): - """Класс представляющий укороченную версию трека с неполными данными. + """Класс, представляющий укороченную версию трека с неполными данными. Attributes: id (:obj:`str`): Уникальный идентификатор трека. diff --git a/yandex_music/tracks_list.py b/yandex_music/tracks_list.py index 668c1b3..e56eb77 100644 --- a/yandex_music/tracks_list.py +++ b/yandex_music/tracks_list.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class TracksList(YandexMusicObject): - """Класс представляющий список треков. + """Класс, представляющий список треков. Attributes: uid (:obj:`int`): Уникальный идентификатор пользователя. diff --git a/yandex_music/utils/captcha_response.py b/yandex_music/utils/captcha_response.py index 023c52a..8a1d70a 100644 --- a/yandex_music/utils/captcha_response.py +++ b/yandex_music/utils/captcha_response.py @@ -7,7 +7,7 @@ from yandex_music import YandexMusicObject class CaptchaResponse(YandexMusicObject): - """Класс представляющий ответ сервера с запросом на ввод капчи. + """Класс, представляющий ответ сервера с запросом на ввод капчи. Attributes: x_captcha_url (:obj:`str`): Ссылка на изображение с капчей. diff --git a/yandex_music/utils/request.py b/yandex_music/utils/request.py index 2934db7..0462df8 100644 --- a/yandex_music/utils/request.py +++ b/yandex_music/utils/request.py @@ -26,7 +26,7 @@ logging.getLogger('urllib3').setLevel(logging.WARNING) class Request: - """Вспомогателньный класс для yandex_music предоставляющий методы для выполнения POST и GET запросов, скачивания + """Вспомогателньный класс для yandex_music представляющий методы для выполнения POST и GET запросов, скачивания файлов. Args: