2019-08-28 04:28:23 +09:00
|
|
|
|
import functools
|
2020-02-04 21:34:11 +09:00
|
|
|
|
import logging
|
2019-05-17 00:29:49 +09:00
|
|
|
|
from datetime import datetime
|
2022-09-10 19:18:21 +09:00
|
|
|
|
from typing import Dict, List, Optional, Union, TypeVar, Callable, Any
|
2019-05-07 06:02:21 +09:00
|
|
|
|
|
2021-02-03 21:28:10 +09:00
|
|
|
|
from yandex_music import (
|
|
|
|
|
Album,
|
|
|
|
|
Artist,
|
|
|
|
|
ArtistAlbums,
|
|
|
|
|
ArtistTracks,
|
|
|
|
|
BriefInfo,
|
|
|
|
|
Dashboard,
|
|
|
|
|
DownloadInfo,
|
|
|
|
|
Experiments,
|
|
|
|
|
Feed,
|
|
|
|
|
Genre,
|
|
|
|
|
Landing,
|
|
|
|
|
Like,
|
|
|
|
|
PermissionAlerts,
|
|
|
|
|
Playlist,
|
|
|
|
|
PromoCodeStatus,
|
|
|
|
|
Search,
|
|
|
|
|
Settings,
|
|
|
|
|
ShotEvent,
|
|
|
|
|
Supplement,
|
|
|
|
|
StationResult,
|
|
|
|
|
StationTracksResult,
|
|
|
|
|
Status,
|
|
|
|
|
Suggestions,
|
|
|
|
|
SimilarTracks,
|
2022-11-14 13:10:00 +09:00
|
|
|
|
TrackLyrics,
|
2021-02-03 21:28:10 +09:00
|
|
|
|
Track,
|
|
|
|
|
TracksList,
|
|
|
|
|
UserSettings,
|
|
|
|
|
YandexMusicObject,
|
|
|
|
|
ChartInfo,
|
|
|
|
|
TagResult,
|
|
|
|
|
PlaylistRecommendations,
|
|
|
|
|
LandingList,
|
|
|
|
|
QueueItem,
|
|
|
|
|
Queue,
|
|
|
|
|
__copyright__,
|
|
|
|
|
__license__,
|
|
|
|
|
__version__,
|
|
|
|
|
)
|
2022-02-21 06:15:27 +09:00
|
|
|
|
from yandex_music.exceptions import BadRequestError
|
2019-06-01 15:04:15 +09:00
|
|
|
|
from yandex_music.utils.difference import Difference
|
2020-02-04 21:34:11 +09:00
|
|
|
|
from yandex_music.utils.request import Request
|
2022-11-14 13:10:00 +09:00
|
|
|
|
from yandex_music.utils.sign_request import get_sign_request
|
2019-05-07 06:02:21 +09:00
|
|
|
|
|
2019-07-06 17:09:47 +09:00
|
|
|
|
de_list = {
|
|
|
|
|
'artist': Artist.de_list,
|
|
|
|
|
'album': Album.de_list,
|
|
|
|
|
'track': Track.de_list,
|
|
|
|
|
'playlist': Playlist.de_list,
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
logging.getLogger(__name__).addHandler(logging.NullHandler())
|
|
|
|
|
|
2022-09-10 19:18:21 +09:00
|
|
|
|
F = TypeVar('F', bound=Callable[..., Any])
|
2019-08-25 17:49:02 +09:00
|
|
|
|
|
2022-09-10 19:18:21 +09:00
|
|
|
|
|
|
|
|
|
def log(method: F) -> F:
|
2019-08-25 17:49:02 +09:00
|
|
|
|
logger = logging.getLogger(method.__module__)
|
|
|
|
|
|
2019-08-28 04:28:23 +09:00
|
|
|
|
@functools.wraps(method)
|
2022-09-10 19:18:21 +09:00
|
|
|
|
def wrapper(*args, **kwargs) -> Any:
|
2019-08-25 17:49:02 +09:00
|
|
|
|
logger.debug(f'Entering: {method.__name__}')
|
|
|
|
|
|
|
|
|
|
result = method(*args, **kwargs)
|
|
|
|
|
logger.debug(result)
|
|
|
|
|
|
|
|
|
|
logger.debug(f'Exiting: {method.__name__}')
|
|
|
|
|
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
return wrapper
|
|
|
|
|
|
|
|
|
|
|
2019-05-07 06:02:21 +09:00
|
|
|
|
class Client(YandexMusicObject):
|
2020-01-26 08:55:56 +09:00
|
|
|
|
"""Класс, представляющий клиент Yandex Music.
|
2019-06-04 22:30:33 +09:00
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Note:
|
2020-06-20 22:54:46 +09:00
|
|
|
|
Доступные языки: en, uz, uk, us, ru, kk, hy.
|
|
|
|
|
|
|
|
|
|
Поле `device` используется только при работе с очередью прослушивания.
|
|
|
|
|
|
2019-06-15 01:49:56 +09:00
|
|
|
|
Attributes:
|
2020-06-06 23:06:23 +09:00
|
|
|
|
logger (:obj:`logging.Logger`): Объект логгера.
|
2019-06-15 01:49:56 +09:00
|
|
|
|
token (:obj:`str`): Уникальный ключ для аутентификации.
|
|
|
|
|
base_url (:obj:`str`): Ссылка на API Yandex Music.
|
2020-03-22 06:29:34 +09:00
|
|
|
|
me (:obj:`yandex_music.Status`): Информация об аккаунте.
|
2020-06-20 22:54:46 +09:00
|
|
|
|
device (:obj:`str`): Строка, содержащая сведения об устройстве, с которого выполняются запросы.
|
2021-09-19 22:47:19 +09:00
|
|
|
|
report_unknown_fields (:obj:`bool`): Включены ли предупреждения о неизвестных полях от API,
|
|
|
|
|
которых нет в библиотеке.
|
2019-06-15 01:49:56 +09:00
|
|
|
|
|
2019-06-04 22:30:33 +09:00
|
|
|
|
Args:
|
2019-06-15 01:49:56 +09:00
|
|
|
|
token (:obj:`str`, optional): Уникальный ключ для аутентификации.
|
|
|
|
|
base_url (:obj:`str`, optional): Ссылка на API Yandex Music.
|
2019-06-13 04:56:38 +09:00
|
|
|
|
request (:obj:`yandex_music.utils.request.Request`, optional): Пре-инициализация
|
2019-07-05 02:21:54 +09:00
|
|
|
|
:class:`yandex_music.utils.request.Request`.
|
2022-11-11 07:28:26 +09:00
|
|
|
|
language (:obj:`str`, optional): Язык, на котором будут приходить ответы от API. По умолчанию русский.
|
2022-02-20 03:29:39 +09:00
|
|
|
|
report_unknown_fields (:obj:`bool`, optional): Включить предупреждения о неизвестных полях от API,
|
2021-09-19 22:47:19 +09:00
|
|
|
|
которых нет в библиотеке.
|
2019-06-04 22:30:33 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2022-11-11 07:07:35 +09:00
|
|
|
|
__notice_displayed = False
|
2021-02-03 21:00:21 +09:00
|
|
|
|
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def __init__(
|
|
|
|
|
self,
|
|
|
|
|
token: str = None,
|
|
|
|
|
base_url: str = None,
|
|
|
|
|
request: Request = None,
|
|
|
|
|
language: str = 'ru',
|
2022-02-20 03:29:39 +09:00
|
|
|
|
report_unknown_fields=False,
|
2021-02-03 21:28:10 +09:00
|
|
|
|
) -> None:
|
2022-11-11 07:07:35 +09:00
|
|
|
|
if not Client.__notice_displayed:
|
2021-02-03 21:00:21 +09:00
|
|
|
|
print(f'Yandex Music API v{__version__}, {__copyright__}')
|
|
|
|
|
print(f'Licensed under the terms of the {__license__}', end='\n\n')
|
2022-11-11 07:07:35 +09:00
|
|
|
|
Client.__notice_displayed = True
|
2021-02-03 21:00:21 +09:00
|
|
|
|
|
2019-05-07 06:02:21 +09:00
|
|
|
|
self.logger = logging.getLogger(__name__)
|
2019-05-17 00:29:49 +09:00
|
|
|
|
self.token = token
|
2019-05-07 06:02:21 +09:00
|
|
|
|
|
|
|
|
|
if base_url is None:
|
|
|
|
|
base_url = 'https://api.music.yandex.net'
|
|
|
|
|
|
|
|
|
|
self.base_url = base_url
|
2019-05-16 23:06:05 +09:00
|
|
|
|
|
2022-02-21 08:18:29 +09:00
|
|
|
|
self.report_unknown_fields = report_unknown_fields
|
2020-06-07 21:56:37 +09:00
|
|
|
|
|
2019-11-19 05:54:46 +09:00
|
|
|
|
if request:
|
|
|
|
|
self._request = request
|
|
|
|
|
self._request.set_and_return_client(self)
|
|
|
|
|
else:
|
|
|
|
|
self._request = Request(self)
|
2019-05-16 23:06:05 +09:00
|
|
|
|
|
2021-02-28 03:50:04 +09:00
|
|
|
|
self.language = language
|
|
|
|
|
self._request.set_language(self.language)
|
2020-06-20 22:54:46 +09:00
|
|
|
|
|
2021-02-03 21:28:10 +09:00
|
|
|
|
self.device = (
|
|
|
|
|
'os=Python; os_version=; manufacturer=Marshal; '
|
|
|
|
|
'model=Yandex Music API; clid=; device_id=random; uuid=random'
|
|
|
|
|
)
|
2020-06-20 22:54:46 +09:00
|
|
|
|
|
2019-12-23 16:14:46 +09:00
|
|
|
|
self.me = None
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2019-05-07 06:02:21 +09:00
|
|
|
|
@property
|
2019-12-24 08:59:10 +09:00
|
|
|
|
def request(self) -> Request:
|
2019-07-05 02:21:54 +09:00
|
|
|
|
""":obj:`yandex_music.utils.request.Request`: Объект вспомогательного класса для отправки запросов."""
|
2019-05-07 06:02:21 +09:00
|
|
|
|
return self._request
|
|
|
|
|
|
2022-02-20 02:59:53 +09:00
|
|
|
|
@log
|
|
|
|
|
def init(self):
|
|
|
|
|
"""Получение информацию об аккаунте использующихся в других запросах."""
|
|
|
|
|
self.me = self.account_status()
|
|
|
|
|
return self
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def account_status(self, *args, **kwargs) -> Optional[Status]:
|
2019-06-15 01:49:56 +09:00
|
|
|
|
"""Получение статуса аккаунта. Нет обязательных параметров.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.Status` | :obj:`None`: Информация об аккаунте если он валиден, иначе :obj:`None`.
|
2019-06-15 01:49:56 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-06-15 01:49:56 +09:00
|
|
|
|
"""
|
2019-07-15 22:39:18 +09:00
|
|
|
|
|
2019-05-07 06:02:21 +09:00
|
|
|
|
url = f'{self.base_url}/account/status'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2019-05-07 06:02:21 +09:00
|
|
|
|
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
return Status.de_json(result, self)
|
2019-05-11 05:01:32 +09:00
|
|
|
|
|
2020-01-26 03:09:03 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def account_settings(self, *args, **kwargs) -> Optional[UserSettings]:
|
2020-01-26 03:09:03 +09:00
|
|
|
|
"""Получение настроек текущего пользователя.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.UserSettings` | :obj:`None`: Настройки пользователя если аккаунт валиден,
|
|
|
|
|
иначе :obj:`None`.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/account/settings'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2020-01-26 03:09:03 +09:00
|
|
|
|
|
|
|
|
|
return UserSettings.de_json(result, self)
|
|
|
|
|
|
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def account_settings_set(
|
|
|
|
|
self,
|
|
|
|
|
param: str = None,
|
|
|
|
|
value: Union[str, int, bool] = None,
|
|
|
|
|
data: Dict[str, Union[str, int, bool]] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Optional[UserSettings]:
|
2020-01-26 03:09:03 +09:00
|
|
|
|
"""Изменение настроек текущего пользователя.
|
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Note:
|
|
|
|
|
Доступные названия параметров есть поля в классе :class:`yandex_music.UserSettings`, только в CamelCase.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
2020-01-26 08:55:56 +09:00
|
|
|
|
param (:obj:`str`): Название параметра для изменения.
|
|
|
|
|
value (:obj:`str` | :obj:`int` | :obj:`bool`): Значение параметра.
|
|
|
|
|
data (:obj:`dict`): Словарь параметров и значений для множественного изменения.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.UserSettings` | :obj:`None`: Настройки пользователя или :obj:`None`.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/account/settings'
|
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
if not data:
|
2022-02-20 08:42:30 +09:00
|
|
|
|
data = {param: str(value)}
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, data=data, *args, **kwargs)
|
2020-01-26 03:09:03 +09:00
|
|
|
|
|
|
|
|
|
return UserSettings.de_json(result, self)
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def settings(self, *args, **kwargs) -> Optional[Settings]:
|
2019-07-03 21:28:54 +09:00
|
|
|
|
"""Получение предложений по покупке. Нет обязательных параметров.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.Settings` | :obj:`None`: Информацию о предлагаемых продуктах если аккаунт валиден
|
|
|
|
|
или :obj:`None`.
|
2019-07-03 21:28:54 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-03 21:28:54 +09:00
|
|
|
|
"""
|
2019-07-15 22:39:18 +09:00
|
|
|
|
|
2019-05-11 05:01:32 +09:00
|
|
|
|
url = f'{self.base_url}/settings'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2019-05-11 05:01:32 +09:00
|
|
|
|
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
return Settings.de_json(result, self)
|
2019-05-11 05:01:32 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def permission_alerts(self, *args, **kwargs) -> Optional[PermissionAlerts]:
|
2019-07-03 21:28:54 +09:00
|
|
|
|
"""Получение оповещений. Нет обязательных параметров.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.PermissionAlerts` | :obj:`None`: Оповещения если аккаунт валиден или :obj:`None`.
|
2019-07-03 21:28:54 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-03 21:28:54 +09:00
|
|
|
|
"""
|
2019-07-15 22:39:18 +09:00
|
|
|
|
|
2019-05-11 05:01:32 +09:00
|
|
|
|
url = f'{self.base_url}/permission-alerts'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2019-05-11 05:01:32 +09:00
|
|
|
|
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
return PermissionAlerts.de_json(result, self)
|
2019-05-11 05:01:32 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def account_experiments(self, *args, **kwargs) -> Optional[Experiments]:
|
2019-07-03 21:28:54 +09:00
|
|
|
|
"""Получение значений экспериментальных функций аккаунта.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.Experiments` | :obj:`None`: Состояние экспериментальных функций или :obj:`None`.
|
2019-07-03 21:28:54 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-03 21:28:54 +09:00
|
|
|
|
"""
|
2019-07-15 22:39:18 +09:00
|
|
|
|
|
2019-05-11 05:01:32 +09:00
|
|
|
|
url = f'{self.base_url}/account/experiments'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2019-05-11 05:01:32 +09:00
|
|
|
|
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
return Experiments.de_json(result, self)
|
2019-05-11 17:37:47 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-11-11 07:28:26 +09:00
|
|
|
|
def consume_promo_code(
|
|
|
|
|
self, code: str, language: Optional[str] = None, *args, **kwargs
|
|
|
|
|
) -> Optional[PromoCodeStatus]:
|
2019-07-15 22:39:18 +09:00
|
|
|
|
"""Активация промо-кода.
|
|
|
|
|
|
2022-11-11 07:28:26 +09:00
|
|
|
|
Note:
|
|
|
|
|
Доступные языки: en, uz, uk, us, ru, kk, hy.
|
|
|
|
|
|
2019-07-15 22:39:18 +09:00
|
|
|
|
Args:
|
|
|
|
|
code (:obj:`str`): Промо-код.
|
2022-11-11 07:28:26 +09:00
|
|
|
|
language (:obj:`str`, optional): Язык ответа API в ISO 639-1. По умолчанию язык клиента.
|
2019-07-15 22:39:18 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.PromoCodeStatus` | :obj:`None`: Информация об активации промо-кода или :obj:`None`.
|
2019-07-15 22:39:18 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-15 22:39:18 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2019-05-17 00:29:49 +09:00
|
|
|
|
url = f'{self.base_url}/account/consume-promo-code'
|
|
|
|
|
|
2022-11-11 07:28:26 +09:00
|
|
|
|
if not language:
|
|
|
|
|
language = self.language
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, {'code': code, 'language': language}, *args, **kwargs)
|
2019-05-17 00:29:49 +09:00
|
|
|
|
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
return PromoCodeStatus.de_json(result, self)
|
2019-05-17 00:29:49 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def feed(self, *args, **kwargs) -> Optional[Feed]:
|
2019-07-15 22:39:18 +09:00
|
|
|
|
"""Получение потока информации (фида) подобранного под пользователя. Содержит умные плейлисты.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.Feed` | :obj:`None`: Умные плейлисты пользователя или :obj:`None`.
|
2019-07-15 22:39:18 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-15 22:39:18 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2019-05-16 04:38:39 +09:00
|
|
|
|
url = f'{self.base_url}/feed'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2019-05-16 04:38:39 +09:00
|
|
|
|
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
return Feed.de_json(result, self)
|
2019-05-16 04:38:39 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def feed_wizard_is_passed(self, *args, **kwargs) -> bool:
|
2019-06-01 17:23:28 +09:00
|
|
|
|
url = f'{self.base_url}/feed/wizard/is-passed'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2019-06-01 17:23:28 +09:00
|
|
|
|
|
|
|
|
|
return result.get('is_wizard_passed') or False
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def landing(self, blocks: Union[str, List[str]], *args, **kwargs) -> Optional[Landing]:
|
2019-07-15 22:39:18 +09:00
|
|
|
|
"""Получение лендинг-страницы содержащий блоки с новыми релизами, чартами, плейлистами с новинками и т.д.
|
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Note:
|
|
|
|
|
Поддерживаемые типы блоков: `personalplaylists`, `promotions`, `new-releases`, `new-playlists`, `mixes`,
|
|
|
|
|
`chart`, `artists`, `albums`, `playlists`, `play_contexts`.
|
2019-07-15 22:39:18 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
blocks (:obj:`str` | :obj:`list` из :obj:`str`): Блок или список блоков необходимых для выдачи.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.Landing` | :obj:`None`: Лендинг-страница или :obj:`None`.
|
2019-07-15 22:39:18 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-15 22:39:18 +09:00
|
|
|
|
"""
|
|
|
|
|
|
New supported objects: Landing, Block, BlockEntity, Chart, ChartItem, MixLink, PersonalPlaylistsData, PlayContext, PlayContextsData, Promotion, TrackId, TrackShorOld (YEAH!)
The following method are wrapped:
- /landing3
Added the ability to download covers
The following field are optional: Playlist.tags
Now, when parsing json, the "client" key is replaced with "client_"
2019-05-25 02:10:39 +09:00
|
|
|
|
url = f'{self.base_url}/landing3'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, {'blocks': blocks, 'eitherUserId': '10254713668400548221'}, *args, **kwargs)
|
2022-11-01 00:12:59 +09:00
|
|
|
|
# TODO (MarshalX) что тут делает константа с чьим-то User ID
|
|
|
|
|
# https://github.com/MarshalX/yandex-music-api/issues/553
|
New supported objects: Landing, Block, BlockEntity, Chart, ChartItem, MixLink, PersonalPlaylistsData, PlayContext, PlayContextsData, Promotion, TrackId, TrackShorOld (YEAH!)
The following method are wrapped:
- /landing3
Added the ability to download covers
The following field are optional: Playlist.tags
Now, when parsing json, the "client" key is replaced with "client_"
2019-05-25 02:10:39 +09:00
|
|
|
|
|
|
|
|
|
return Landing.de_json(result, self)
|
|
|
|
|
|
2020-05-15 03:02:34 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def chart(self, chart_option: str = '', *args, **kwargs) -> Optional[ChartInfo]:
|
2020-05-15 03:02:34 +09:00
|
|
|
|
"""Получение чарта.
|
|
|
|
|
|
|
|
|
|
Note:
|
|
|
|
|
`chart_option` - это постфикс к запросу из поля `menu` чарта.
|
|
|
|
|
Например, на сайте можно выбрать глобальный (world) чарт или российский (russia).
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
chart_option (:obj:`str` optional): Параметры чарта.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`yandex_music.ChartInfo`: Чарт.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/landing3/chart'
|
|
|
|
|
|
|
|
|
|
if chart_option:
|
|
|
|
|
url = f'{url}/{chart_option}'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2020-05-15 03:02:34 +09:00
|
|
|
|
|
|
|
|
|
return ChartInfo.de_json(result, self)
|
|
|
|
|
|
2020-05-16 07:00:52 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def new_releases(self, *args, **kwargs) -> Optional[LandingList]:
|
2020-05-16 07:00:52 +09:00
|
|
|
|
"""Получение полного списка всех новых релизов (альбомов).
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`yandex_music.LandingList`: Список новых альбомов.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/landing3/new-releases'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2020-05-16 07:00:52 +09:00
|
|
|
|
|
|
|
|
|
return LandingList.de_json(result, self)
|
|
|
|
|
|
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def new_playlists(self, *args, **kwargs) -> Optional[LandingList]:
|
2020-05-16 07:00:52 +09:00
|
|
|
|
"""Получение полного списка всех новых плейлистов.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`yandex_music.LandingList`: Список новых плейлистов.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/landing3/new-playlists'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2020-05-16 07:00:52 +09:00
|
|
|
|
|
|
|
|
|
return LandingList.de_json(result, self)
|
|
|
|
|
|
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def podcasts(self, *args, **kwargs) -> Optional[LandingList]:
|
2020-05-16 07:00:52 +09:00
|
|
|
|
"""Получение подкастов с лендинга.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2022-10-31 23:29:38 +09:00
|
|
|
|
:obj:`yandex_music.LandingList`: Список подкастов.
|
2020-05-16 07:00:52 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/landing3/podcasts'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2020-05-16 07:00:52 +09:00
|
|
|
|
|
|
|
|
|
return LandingList.de_json(result, self)
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def genres(self, *args, **kwargs) -> List[Genre]:
|
2019-07-15 22:39:18 +09:00
|
|
|
|
"""Получение жанров музыки.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`list` из :obj:`yandex_music.Genre` | :obj:`None`: Жанры музыки или :obj:`None`.
|
2019-07-15 22:39:18 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-15 22:39:18 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2019-06-01 17:23:28 +09:00
|
|
|
|
url = f'{self.base_url}/genres'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2019-06-01 17:23:28 +09:00
|
|
|
|
|
|
|
|
|
return Genre.de_list(result, self)
|
|
|
|
|
|
2020-05-15 04:44:57 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def tags(self, tag_id: str, *args, **kwargs) -> Optional[TagResult]:
|
2020-05-15 04:44:57 +09:00
|
|
|
|
"""Получение тега (подборки).
|
|
|
|
|
|
|
|
|
|
Note:
|
|
|
|
|
Теги есть в `MixLink` у `Landing`, а также плейлистов в `.tags`.
|
|
|
|
|
|
|
|
|
|
У `MixLink` есть `URL`, но `tag_id` только его последняя часть.
|
|
|
|
|
Например, `/tag/belarus/`. `Tag` - `belarus`.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
tag_id (:obj:`str`): Уникальный идентификатор тега.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-05-15 06:35:36 +09:00
|
|
|
|
:obj:`yandex_music.TagResult`: Тег с плейлистами.
|
2020-05-15 04:44:57 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/tags/{tag_id}/playlist-ids'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2020-05-15 04:44:57 +09:00
|
|
|
|
|
|
|
|
|
return TagResult.de_json(result, self)
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def tracks_download_info(
|
|
|
|
|
self,
|
|
|
|
|
track_id: Union[str, int],
|
|
|
|
|
get_direct_links: bool = False,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> List[DownloadInfo]:
|
2019-07-15 22:39:18 +09:00
|
|
|
|
"""Получение информации о доступных вариантах загрузки трека.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
track_id (:obj:`str` | :obj:`list` из :obj:`str`): Уникальный идентификатор трека или треков.
|
|
|
|
|
get_direct_links (:obj:`bool`, optional): Получить ли при вызове метода прямую ссылку на загрузку.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`list` из :obj:`yandex_music.DownloadInfo` | :obj:`None`: Варианты загрузки трека или :obj:`None`.
|
2019-07-15 22:39:18 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-15 22:39:18 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2019-05-17 00:29:49 +09:00
|
|
|
|
url = f'{self.base_url}/tracks/{track_id}/download-info'
|
2019-05-16 21:45:25 +09:00
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2019-05-16 21:45:25 +09:00
|
|
|
|
|
2019-05-23 18:10:14 +09:00
|
|
|
|
return DownloadInfo.de_list(result, self, get_direct_links)
|
2019-05-17 00:29:49 +09:00
|
|
|
|
|
2019-10-17 05:10:52 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def track_supplement(self, track_id: Union[str, int], *args, **kwargs) -> Optional[Supplement]:
|
2019-10-17 12:35:24 +09:00
|
|
|
|
"""Получение дополнительной информации о треке.
|
|
|
|
|
|
|
|
|
|
Args:
|
2022-11-14 03:33:00 +09:00
|
|
|
|
track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор трека.
|
2019-10-17 12:35:24 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.Supplement`: Дополнительная информация о треке.
|
2019-10-17 12:35:24 +09:00
|
|
|
|
|
2020-01-26 01:55:44 +09:00
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-10-17 12:35:24 +09:00
|
|
|
|
"""
|
2019-10-19 05:44:17 +09:00
|
|
|
|
|
2019-10-17 05:10:52 +09:00
|
|
|
|
url = f'{self.base_url}/tracks/{track_id}/supplement'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2019-10-17 05:10:52 +09:00
|
|
|
|
|
|
|
|
|
return Supplement.de_json(result, self)
|
|
|
|
|
|
2022-11-14 13:10:00 +09:00
|
|
|
|
@log
|
|
|
|
|
def tracks_lyrics(
|
|
|
|
|
self,
|
|
|
|
|
track_id: Union[str, int],
|
|
|
|
|
format: str = 'TEXT',
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Optional[TrackLyrics]:
|
|
|
|
|
"""Получение текста трека.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор трека.
|
|
|
|
|
format (:obj:`str`): Формат текста.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
TODO
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/tracks/{track_id}/lyrics'
|
|
|
|
|
|
|
|
|
|
sign = get_sign_request(track_id)
|
|
|
|
|
params = {
|
|
|
|
|
'format': format,
|
|
|
|
|
'timeStamp': sign.timestamp,
|
|
|
|
|
'sign': sign.value,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result = self._request.get(url, params=params, **kwargs)
|
|
|
|
|
|
|
|
|
|
return TrackLyrics.de_json(result, self)
|
|
|
|
|
|
2020-01-26 01:46:25 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def tracks_similar(self, track_id: Union[str, int], *args, **kwargs) -> Optional[SimilarTracks]:
|
2020-01-26 01:55:44 +09:00
|
|
|
|
"""Получение похожих треков.
|
|
|
|
|
|
|
|
|
|
Args:
|
2022-11-14 03:33:00 +09:00
|
|
|
|
track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор трека.
|
2020-01-26 01:55:44 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.SimilarTracks`: Похожие треки на другой трек.
|
2020-01-26 01:55:44 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-26 01:55:44 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2020-01-26 01:46:25 +09:00
|
|
|
|
url = f'{self.base_url}/tracks/{track_id}/similar'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2020-01-26 01:46:25 +09:00
|
|
|
|
|
2020-01-26 02:03:00 +09:00
|
|
|
|
return SimilarTracks.de_json(result, self)
|
2020-01-26 01:46:25 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def play_audio(
|
|
|
|
|
self,
|
|
|
|
|
track_id: Union[str, int],
|
|
|
|
|
from_: str,
|
|
|
|
|
album_id: Union[str, int],
|
|
|
|
|
playlist_id: str = None,
|
|
|
|
|
from_cache: bool = False,
|
|
|
|
|
play_id: str = None,
|
|
|
|
|
uid: int = None,
|
|
|
|
|
timestamp: str = None,
|
|
|
|
|
track_length_seconds: int = 0,
|
|
|
|
|
total_played_seconds: int = 0,
|
|
|
|
|
end_position_seconds: int = 0,
|
|
|
|
|
client_now: str = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2019-07-15 23:12:04 +09:00
|
|
|
|
"""Метод для отправки текущего состояния прослушиваемого трека.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор трека.
|
|
|
|
|
from_ (:obj:`str`): Наименования клиента с которого происходит прослушивание.
|
|
|
|
|
album_id (:obj:`str` | :obj:`int`): Уникальный идентификатор альбома.
|
|
|
|
|
playlist_id (:obj:`str`, optional): Уникальный идентификатор плейлиста, если таковой прослушивается.
|
|
|
|
|
from_cache (:obj:`bool`, optional): Проигрывается ли трек с кеша.
|
|
|
|
|
play_id (:obj:`str`, optional): Уникальный идентификатор проигрывания.
|
|
|
|
|
uid (:obj:`int`, optional): Уникальный идентификатор пользователя.
|
|
|
|
|
timestamp (:obj:`str`, optional): Текущая дата и время в ISO.
|
|
|
|
|
track_length_seconds (:obj:`int`, optional): Продолжительность трека в секундах.
|
|
|
|
|
total_played_seconds (:obj:`int`, optional): Сколько было всего воспроизведено трека в секундах.
|
|
|
|
|
end_position_seconds (:obj:`int`, optional): Окончательное значение воспроизведенных секунд.
|
|
|
|
|
client_now (:obj:`str`, optional): Текущая дата и время клиента в ISO.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2019-07-16 00:58:59 +09:00
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
2019-07-15 23:12:04 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-15 23:12:04 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2019-12-24 06:20:07 +09:00
|
|
|
|
if uid is None and self.me is not None:
|
|
|
|
|
uid = self.me.account.uid
|
|
|
|
|
|
2019-05-17 00:29:49 +09:00
|
|
|
|
url = f'{self.base_url}/play-audio'
|
2019-05-16 21:45:25 +09:00
|
|
|
|
|
2019-05-17 00:29:49 +09:00
|
|
|
|
data = {
|
|
|
|
|
'track-id': track_id,
|
2022-02-20 08:31:02 +09:00
|
|
|
|
'from-cache': str(from_cache),
|
2019-05-17 00:29:49 +09:00
|
|
|
|
'from': from_,
|
|
|
|
|
'play-id': play_id or '',
|
2019-12-24 06:20:07 +09:00
|
|
|
|
'uid': uid,
|
2019-05-17 00:29:49 +09:00
|
|
|
|
'timestamp': timestamp or f'{datetime.now().isoformat()}Z',
|
|
|
|
|
'track-length-seconds': track_length_seconds,
|
|
|
|
|
'total-played-seconds': total_played_seconds,
|
|
|
|
|
'end-position-seconds': end_position_seconds,
|
|
|
|
|
'album-id': album_id,
|
|
|
|
|
'playlist-id': playlist_id,
|
2021-02-03 21:28:10 +09:00
|
|
|
|
'client-now': client_now or f'{datetime.now().isoformat()}Z',
|
2019-05-17 00:29:49 +09:00
|
|
|
|
}
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, data, *args, **kwargs)
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
|
|
|
|
|
return result == 'ok'
|
|
|
|
|
|
2022-02-20 02:59:53 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def albums_with_tracks(self, album_id: Union[str, int], *args, **kwargs) -> Optional[Album]:
|
2019-08-28 04:07:42 +09:00
|
|
|
|
"""Получение альбома по его уникальному идентификатору вместе с треками.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
album_id (:obj:`str` | :obj:`int`): Уникальный идентификатор альбома.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`list` из :obj:`yandex_music.Album` | :obj:`None`: Альбом или :obj:`None`.
|
2019-08-28 04:07:42 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-08-28 04:07:42 +09:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/albums/{album_id}/with-tracks'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2019-08-28 04:07:42 +09:00
|
|
|
|
|
|
|
|
|
return Album.de_json(result, self)
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def search(
|
|
|
|
|
self,
|
|
|
|
|
text: str,
|
|
|
|
|
nocorrect: bool = False,
|
|
|
|
|
type_: str = 'all',
|
|
|
|
|
page: int = 0,
|
|
|
|
|
playlist_in_best: bool = True,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Optional[Search]:
|
2019-08-28 04:07:42 +09:00
|
|
|
|
"""Осуществление поиска по запросу и типу, получение результатов.
|
2019-07-15 23:12:04 +09:00
|
|
|
|
|
Метод de_list в TrackId.
Поля coauthors и recent_tracks в Playlist.
Поле regions в User.
Поля users, podcasts, podcast_episodes, type_, page, per_page в Search.
Поддержка новых типов поиска: подкасты, выпуски, пользователи.
Поля short_description, description, is_premiere, is_banner в Like.
Документация и тесты к новым поля. #339
2020-06-07 18:55:30 +09:00
|
|
|
|
Note:
|
|
|
|
|
Известные значения для поля `type_`: `all`, `artist`, `user`, `album`, `playlist`, `track`, `podcast`,
|
|
|
|
|
`podcast_episode`.
|
|
|
|
|
|
|
|
|
|
При поиске `type=all` не возвращаются подкасты и эпизоды. Указывайте конкретный тип для поиска.
|
|
|
|
|
|
2019-07-15 23:12:04 +09:00
|
|
|
|
Args:
|
|
|
|
|
text (:obj:`str`): Текст запроса.
|
2020-03-23 00:48:54 +09:00
|
|
|
|
nocorrect (:obj:`bool`): Если :obj:`False`, то ошибочный запрос будет исправлен. Например, запрос
|
|
|
|
|
"Гражданская абарона" будет исправлен на "Гражданская оборона".
|
Метод de_list в TrackId.
Поля coauthors и recent_tracks в Playlist.
Поле regions в User.
Поля users, podcasts, podcast_episodes, type_, page, per_page в Search.
Поддержка новых типов поиска: подкасты, выпуски, пользователи.
Поля short_description, description, is_premiere, is_banner в Like.
Документация и тесты к новым поля. #339
2020-06-07 18:55:30 +09:00
|
|
|
|
type_ (:obj:`str`): Среди какого типа искать (трек, плейлист, альбом, исполнитель, пользователь, подкаст).
|
2019-07-16 00:58:59 +09:00
|
|
|
|
page (:obj:`int`): Номер страницы.
|
2019-07-15 23:12:04 +09:00
|
|
|
|
playlist_in_best (:obj:`bool`): Выдавать ли плейлисты лучшим вариантом поиска.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.Search` | :obj:`None`: Результаты поиска или :obj:`None`.
|
2019-07-15 23:12:04 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-15 23:12:04 +09:00
|
|
|
|
"""
|
|
|
|
|
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
url = f'{self.base_url}/search'
|
|
|
|
|
|
|
|
|
|
params = {
|
|
|
|
|
'text': text,
|
2022-02-20 08:31:02 +09:00
|
|
|
|
'nocorrect': str(nocorrect),
|
2019-07-15 23:12:04 +09:00
|
|
|
|
'type': type_,
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
'page': page,
|
2022-02-20 08:31:02 +09:00
|
|
|
|
'playlist-in-best': str(playlist_in_best),
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
}
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, params, *args, **kwargs)
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
|
2022-02-20 08:16:11 +09:00
|
|
|
|
if isinstance(result, str):
|
2022-02-21 06:15:27 +09:00
|
|
|
|
raise BadRequestError(result)
|
2022-02-20 08:16:11 +09:00
|
|
|
|
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
return Search.de_json(result, self)
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def search_suggest(self, part: str, *args, **kwargs) -> Optional[Suggestions]:
|
2019-07-15 23:12:04 +09:00
|
|
|
|
"""Получение подсказок по введенной части поискового запроса.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
part (:obj:`str`): Часть поискового запроса.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.Suggestions` | :obj:`None`: Подсказки для запроса или :obj:`None`.
|
2019-07-15 23:12:04 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-15 23:12:04 +09:00
|
|
|
|
"""
|
|
|
|
|
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
url = f'{self.base_url}/search/suggest'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, {'part': part}, *args, **kwargs)
|
New supported objects: Search, Suggestions, Video, Best, AlbumSearchResult, ArtistSearchResult, PlaylistSearchResult, TrackSearchResult, VideoSearchResult,
The following methods are wrapped:
- /search
- /search/suggest
The following classes received optional fields instead of required ones: Album, Artist, Playlist, Track
Added "params" arg to the GET request
Code refactoring
2019-05-18 01:20:34 +09:00
|
|
|
|
|
|
|
|
|
return Suggestions.de_json(result, self)
|
2019-05-16 21:45:25 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def users_settings(self, user_id: Union[str, int] = None, *args, **kwargs) -> Optional[UserSettings]:
|
2020-01-26 03:09:03 +09:00
|
|
|
|
"""Получение настроек пользователя.
|
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Note:
|
|
|
|
|
Для получения настроек пользователя нужно быть авторизованным или владеть `user_id`.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
2020-01-26 08:55:56 +09:00
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя чьи настройки хотим
|
|
|
|
|
получить.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.UserSettings` | :obj:`None`: Настройки пользователя или :obj:`None`.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
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'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2020-01-26 03:09:03 +09:00
|
|
|
|
|
|
|
|
|
return UserSettings.de_json(result.get('user_settings'), self)
|
|
|
|
|
|
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_playlists(
|
|
|
|
|
self,
|
|
|
|
|
kind: Union[List[Union[str, int]], str, int],
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Union[Playlist, List[Playlist]]:
|
2019-07-16 00:58:59 +09:00
|
|
|
|
"""Получение плейлиста или списка плейлистов по уникальным идентификаторам.
|
|
|
|
|
|
2020-05-06 22:16:17 +09:00
|
|
|
|
Note:
|
|
|
|
|
Если передан один `kind`, то вернётся не список плейлистов, а один плейлист.
|
|
|
|
|
|
2019-07-16 00:58:59 +09:00
|
|
|
|
Args:
|
|
|
|
|
kind (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста
|
|
|
|
|
или их список.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-05-06 22:16:17 +09:00
|
|
|
|
:obj:`list` из :obj:`yandex_music.Playlist` | :obj:`yandex_music.Playlist` | :obj:`None`:
|
|
|
|
|
Список плейлистов или плейлист, иначе :obj:`None`.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2019-12-24 06:20:07 +09:00
|
|
|
|
if user_id is None and self.me is not None:
|
|
|
|
|
user_id = self.me.account.uid
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
2020-05-06 22:16:17 +09:00
|
|
|
|
if isinstance(kind, list):
|
|
|
|
|
url = f'{self.base_url}/users/{user_id}/playlists'
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
2021-02-03 21:28:10 +09:00
|
|
|
|
data = {'kinds': kind}
|
2019-06-01 17:23:28 +09:00
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, data, *args, **kwargs)
|
2020-05-06 22:16:17 +09:00
|
|
|
|
|
|
|
|
|
return Playlist.de_list(result, self)
|
|
|
|
|
else:
|
|
|
|
|
url = f'{self.base_url}/users/{user_id}/playlists/{kind}'
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
2020-05-06 22:16:17 +09:00
|
|
|
|
return Playlist.de_json(result, self)
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
2020-05-07 16:08:05 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def users_playlists_recommendations(self, kind: Union[str, int], user_id: Union[str, int] = None, *args, **kwargs):
|
2020-05-07 16:21:35 +09:00
|
|
|
|
"""Получение рекомендаций для плейлиста.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`): Уникальный идентификатор пользователя владеющим плейлистом.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-05-15 05:36:47 +09:00
|
|
|
|
:obj:`yandex_music.PlaylistRecommendations` | :obj:`None`: Рекомендации для плейлиста или :obj:`None`.
|
2020-05-07 16:21:35 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2020-05-07 16:08:05 +09:00
|
|
|
|
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}/playlists/{kind}/recommendations'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2020-05-07 16:08:05 +09:00
|
|
|
|
|
2020-05-07 17:09:12 +09:00
|
|
|
|
return PlaylistRecommendations.de_json(result, self)
|
2020-05-07 16:08:05 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_playlists_create(
|
|
|
|
|
self,
|
|
|
|
|
title: str,
|
|
|
|
|
visibility: str = 'public',
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Optional[Playlist]:
|
2019-07-16 00:58:59 +09:00
|
|
|
|
"""Создание плейлиста.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
title (:obj:`str`): Название.
|
|
|
|
|
visibility (:obj:`str`, optional): Модификатор доступа.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.Playlist` | :obj:`None`: Созданный плейлист или :obj:`None`.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2019-12-24 06:20:07 +09:00
|
|
|
|
if user_id is None and self.me is not None:
|
|
|
|
|
user_id = self.me.account.uid
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/users/{user_id}/playlists/create'
|
|
|
|
|
|
2021-02-03 21:28:10 +09:00
|
|
|
|
data = {'title': title, 'visibility': visibility}
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, data, *args, **kwargs)
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
|
|
|
|
return Playlist.de_json(result, self)
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def users_playlists_delete(self, kind: Union[str, int], user_id: Union[str, int] = None, *args, **kwargs) -> bool:
|
2019-07-16 00:58:59 +09:00
|
|
|
|
"""Удаление плейлиста.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2019-12-24 06:20:07 +09:00
|
|
|
|
if user_id is None and self.me is not None:
|
|
|
|
|
user_id = self.me.account.uid
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/users/{user_id}/playlists/{kind}/delete'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, *args, **kwargs)
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
|
|
|
|
return result == 'ok'
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_playlists_name(
|
|
|
|
|
self,
|
|
|
|
|
kind: Union[str, int],
|
|
|
|
|
name: str,
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Optional[Playlist]:
|
2019-07-16 00:58:59 +09:00
|
|
|
|
"""Изменение названия плейлиста.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
|
|
|
|
|
name (:obj:`str`): Новое название.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.Playlist` | :obj:`None`: Изменённый плейлист или :obj:`None`.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2019-12-24 06:20:07 +09:00
|
|
|
|
if user_id is None and self.me is not None:
|
|
|
|
|
user_id = self.me.account.uid
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/users/{user_id}/playlists/{kind}/name'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, {'value': name}, *args, **kwargs)
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
|
|
|
|
return Playlist.de_json(result, self)
|
|
|
|
|
|
2020-01-15 17:14:55 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_playlists_visibility(
|
|
|
|
|
self,
|
|
|
|
|
kind: Union[str, int],
|
|
|
|
|
visibility: str,
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Optional[Playlist]:
|
2020-01-15 17:14:55 +09:00
|
|
|
|
"""Изменение видимости плейлиста.
|
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Note:
|
|
|
|
|
Видимость (`visibility`) может быть задана только одним из двух значений: `private`, `public`.
|
2020-01-15 17:14:55 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
|
|
|
|
|
visibility (:obj:`str`): Новое название.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
|
2020-01-15 17:14:55 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.Playlist` | :obj:`None`: Изменённый плейлист или :obj:`None`.
|
2020-01-15 17:14:55 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-15 17:14:55 +09:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
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}/playlists/{kind}/visibility'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, {'value': visibility}, *args, **kwargs)
|
2020-01-15 17:14:55 +09:00
|
|
|
|
|
|
|
|
|
return Playlist.de_json(result, self)
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_playlists_change(
|
|
|
|
|
self,
|
|
|
|
|
kind: Union[str, int],
|
|
|
|
|
diff: str,
|
|
|
|
|
revision: int = 1,
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Optional[Playlist]:
|
2019-07-16 00:58:59 +09:00
|
|
|
|
"""Изменение плейлиста.
|
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Note:
|
|
|
|
|
Для получения отличий есть вспомогательный класс :class:`yandex_music.utils.difference.Difference`.
|
|
|
|
|
|
|
|
|
|
Так же существуют уже готовые методы-обёртки над операциями.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
|
|
|
|
|
revision (:obj:`int`): TODO.
|
|
|
|
|
diff (:obj:`str`): JSON представления отличий старого и нового плейлиста.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.Playlist`: Изменённый плейлист или :obj:`None`.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2019-12-24 06:20:07 +09:00
|
|
|
|
if user_id is None and self.me is not None:
|
|
|
|
|
user_id = self.me.account.uid
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/users/{user_id}/playlists/{kind}/change'
|
|
|
|
|
|
2021-02-03 21:28:10 +09:00
|
|
|
|
data = {'kind': kind, 'revision': revision, 'diff': diff}
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, data, *args, **kwargs)
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
|
|
|
|
return Playlist.de_json(result, self)
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
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: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Optional[Playlist]:
|
2019-07-16 00:58:59 +09:00
|
|
|
|
"""Добавление трека в плейлист.
|
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Note:
|
|
|
|
|
Трек можно вставить с любое место плейлиста задав индекс вставки (аргумент `at`).
|
2019-07-16 00:58:59 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
|
|
|
|
|
track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор трека.
|
|
|
|
|
album_id (:obj:`str` | :obj:`int`): Уникальный идентификатор альбома.
|
|
|
|
|
at (:obj:`int`): Индекс для вставки.
|
|
|
|
|
revision (:obj:`int`): TODO.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.Playlist`: Изменённый плейлист или :obj:`None`.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2019-12-24 06:20:07 +09:00
|
|
|
|
if user_id is None and self.me is not None:
|
|
|
|
|
user_id = self.me.account.uid
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
|
|
|
|
diff = Difference().add_insert(at, {'id': track_id, 'album_id': album_id})
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self.users_playlists_change(kind, diff.to_json(), revision, user_id, *args, **kwargs)
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_playlists_delete_track(
|
|
|
|
|
self,
|
|
|
|
|
kind: Union[str, int],
|
|
|
|
|
from_: int,
|
|
|
|
|
to: int,
|
|
|
|
|
revision: int = 1,
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Optional[Playlist]:
|
2019-07-16 00:58:59 +09:00
|
|
|
|
"""Удаление треков из плейлиста.
|
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Note:
|
|
|
|
|
Для удаление необходимо указать границы с какого по какой элемент (трек) удалить.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста.
|
|
|
|
|
from_ (:obj:`int`): С какого индекса.
|
|
|
|
|
to (:obj:`int`): По какой индекс.
|
|
|
|
|
revision (:obj:`int`): TODO.
|
2020-01-26 03:09:03 +09:00
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.Playlist` | :obj:`None`: Изменённый плейлист или :obj:`None`.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-07-16 00:58:59 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2019-12-24 06:20:07 +09:00
|
|
|
|
if user_id is None and self.me is not None:
|
|
|
|
|
user_id = self.me.account.uid
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
|
|
|
|
diff = Difference().add_delete(from_, to)
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self.users_playlists_change(kind, diff.to_json(), revision, user_id, *args, **kwargs)
|
2019-06-01 15:04:15 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def rotor_account_status(self, *args, **kwargs) -> Optional[Status]:
|
2022-10-31 23:29:38 +09:00
|
|
|
|
"""Получение статуса пользователя с дополнительными полями.
|
2020-01-23 01:43:03 +09:00
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Note:
|
|
|
|
|
Данный статус отличается от обычного наличием дополнительных полей, например, `skips_per_hour`.
|
2020-01-23 01:43:03 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:obj:`yandex_music.Status` | :obj:`None`: Статус пользователя с дополнительными полями от радио или
|
|
|
|
|
:obj:`None`.
|
2020-01-23 01:43:03 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-23 01:43:03 +09:00
|
|
|
|
"""
|
|
|
|
|
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
url = f'{self.base_url}/rotor/account/status'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
|
|
|
|
|
return Status.de_json(result, self)
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def rotor_stations_dashboard(self, *args, **kwargs) -> Optional[Dashboard]:
|
2020-01-23 01:43:03 +09:00
|
|
|
|
"""Получение рекомендованных станций текущего пользователя.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.Dashboard` | :obj:`None`: Рекомендованные станции или :obj:`None`.
|
2020-01-23 01:43:03 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-23 01:43:03 +09:00
|
|
|
|
"""
|
|
|
|
|
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
url = f'{self.base_url}/rotor/stations/dashboard'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
|
|
|
|
|
return Dashboard.de_json(result, self)
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-11-11 07:28:26 +09:00
|
|
|
|
def rotor_stations_list(self, language: Optional[str] = None, *args, **kwargs) -> List[StationResult]:
|
2020-01-23 05:41:42 +09:00
|
|
|
|
"""Получение всех радиостанций с настройками пользователя.
|
2020-01-23 01:43:03 +09:00
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Note:
|
2022-11-11 07:28:26 +09:00
|
|
|
|
Доступные языки: en, uz, uk, us, ru, kk, hy.
|
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Чтобы определить что за тип станции (жанры, настроения, занятие и т.д.) необходимо смотреть в поле
|
|
|
|
|
`id_for_from`.
|
2020-01-23 01:43:03 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
2022-11-11 07:28:26 +09:00
|
|
|
|
language (:obj:`str`, optional): Язык, на котором будет информация о станциях. По умолчанию язык клиента.
|
2020-01-23 01:43:03 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2022-11-11 07:28:26 +09:00
|
|
|
|
:obj:`list` из :obj:`yandex_music.StationResult`: Список станций.
|
2020-01-23 01:43:03 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-23 01:43:03 +09:00
|
|
|
|
"""
|
|
|
|
|
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
url = f'{self.base_url}/rotor/stations/list'
|
|
|
|
|
|
2022-11-11 07:28:26 +09:00
|
|
|
|
if not language:
|
|
|
|
|
language = self.language
|
2022-10-31 22:57:28 +09:00
|
|
|
|
|
|
|
|
|
result = self._request.get(url, {'language': language}, *args, **kwargs)
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
|
|
|
|
|
return StationResult.de_list(result, self)
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def rotor_station_feedback(
|
|
|
|
|
self,
|
|
|
|
|
station: str,
|
|
|
|
|
type_: str,
|
|
|
|
|
timestamp: Union[str, float, int] = None,
|
|
|
|
|
from_: str = None,
|
|
|
|
|
batch_id: str = None,
|
|
|
|
|
total_played_seconds: Union[int, float] = None,
|
|
|
|
|
track_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2022-10-31 23:29:38 +09:00
|
|
|
|
"""Отправка обратной связи на действия при прослушивании радио.
|
2020-01-22 22:49:53 +09:00
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Note:
|
|
|
|
|
Сообщения о начале прослушивания радио, начале и конце трека, его пропуска.
|
|
|
|
|
|
2022-10-31 23:29:38 +09:00
|
|
|
|
Известные типы обратной связи: `radioStarted`, `trackStarted`, `trackFinished`, `skip`.
|
2020-01-22 22:49:53 +09:00
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Пример `station`: `user:onyourwave`, `genre:allrock`.
|
|
|
|
|
|
|
|
|
|
Пример `from_`: `mobile-radio-user-123456789`.
|
2020-01-22 22:49:53 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
station (:obj:`str`): Станция.
|
2022-10-31 23:29:38 +09:00
|
|
|
|
type_ (:obj:`str`): Тип отправляемого отзыва.
|
2020-01-23 00:08:08 +09:00
|
|
|
|
timestamp (:obj:`str` | :obj:`float` | :obj:`int`, optional): Текущее время и дата.
|
|
|
|
|
from_ (:obj:`str`, optional): Откуда начато воспроизведение радио.
|
|
|
|
|
batch_id (:obj:`str`, optional): Уникальный идентификатор партии треков. Возвращается при получении треков.
|
|
|
|
|
total_played_seconds (:obj:`int` |:obj:`float`, optional): Сколько было проиграно секунд трека
|
|
|
|
|
перед действием.
|
|
|
|
|
track_id (:obj:`int` | :obj:`str`, optional): Уникальной идентификатор трека.
|
2020-01-22 22:49:53 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-22 22:49:53 +09:00
|
|
|
|
"""
|
|
|
|
|
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
if timestamp is None:
|
|
|
|
|
timestamp = datetime.now().timestamp()
|
|
|
|
|
|
2020-01-22 22:49:53 +09:00
|
|
|
|
url = f'{self.base_url}/rotor/station/{station}/feedback'
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
|
|
|
|
|
params = {}
|
2021-02-03 21:28:10 +09:00
|
|
|
|
data = {'type': type_, 'timestamp': timestamp}
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
|
2020-01-22 22:49:53 +09:00
|
|
|
|
if batch_id:
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
params = {'batch-id': batch_id}
|
|
|
|
|
|
2020-01-22 22:49:53 +09:00
|
|
|
|
if track_id:
|
|
|
|
|
data.update({'trackId': track_id})
|
|
|
|
|
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
if from_:
|
|
|
|
|
data.update({'from': from_})
|
|
|
|
|
|
2020-01-22 22:49:53 +09:00
|
|
|
|
if total_played_seconds:
|
|
|
|
|
data.update({'totalPlayedSeconds': total_played_seconds})
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, params=params, json=data, *args, **kwargs)
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
|
|
|
|
|
return result == 'ok'
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def rotor_station_feedback_radio_started(
|
|
|
|
|
self,
|
|
|
|
|
station: str,
|
|
|
|
|
from_: str,
|
|
|
|
|
batch_id: str = None,
|
|
|
|
|
timestamp: Union[str, float, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-01-22 22:49:53 +09:00
|
|
|
|
"""Сокращение для::
|
|
|
|
|
|
|
|
|
|
client.rotor_station_feedback(station, 'radioStarted', timestamp, from, *args, **kwargs)
|
2020-01-26 08:55:56 +09:00
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-22 22:49:53 +09:00
|
|
|
|
"""
|
2021-02-03 21:28:10 +09:00
|
|
|
|
return self.rotor_station_feedback(
|
2022-10-31 22:57:28 +09:00
|
|
|
|
station, 'radioStarted', timestamp, from_=from_, batch_id=batch_id, *args, **kwargs
|
2021-02-03 21:28:10 +09:00
|
|
|
|
)
|
2020-01-22 22:49:53 +09:00
|
|
|
|
|
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def rotor_station_feedback_track_started(
|
|
|
|
|
self,
|
|
|
|
|
station: str,
|
|
|
|
|
track_id: Union[str, int],
|
|
|
|
|
batch_id: str = None,
|
|
|
|
|
timestamp: Union[str, float, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-01-22 22:49:53 +09:00
|
|
|
|
"""Сокращение для::
|
|
|
|
|
|
|
|
|
|
client.rotor_station_feedback(station, 'trackStarted', timestamp, track_id, *args, **kwargs)
|
2020-01-26 08:55:56 +09:00
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-22 22:49:53 +09:00
|
|
|
|
"""
|
2021-02-03 21:28:10 +09:00
|
|
|
|
return self.rotor_station_feedback(
|
2022-10-31 22:57:28 +09:00
|
|
|
|
station, 'trackStarted', timestamp, track_id=track_id, batch_id=batch_id, *args, **kwargs
|
2021-02-03 21:28:10 +09:00
|
|
|
|
)
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def rotor_station_feedback_track_finished(
|
|
|
|
|
self,
|
|
|
|
|
station: str,
|
|
|
|
|
track_id: Union[str, int],
|
|
|
|
|
total_played_seconds: float,
|
|
|
|
|
batch_id: str = None,
|
|
|
|
|
timestamp: Union[str, float, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-01-22 22:49:53 +09:00
|
|
|
|
"""Сокращение для::
|
|
|
|
|
|
|
|
|
|
client.rotor_station_feedback(station, 'trackFinished', timestamp, track_id, total_played_seconds,
|
2020-01-26 08:55:56 +09:00
|
|
|
|
*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-22 22:49:53 +09:00
|
|
|
|
"""
|
2021-02-03 21:28:10 +09:00
|
|
|
|
return self.rotor_station_feedback(
|
|
|
|
|
station,
|
|
|
|
|
'trackFinished',
|
|
|
|
|
timestamp,
|
|
|
|
|
track_id=track_id,
|
|
|
|
|
total_played_seconds=total_played_seconds,
|
|
|
|
|
batch_id=batch_id,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
@log
|
|
|
|
|
def rotor_station_feedback_skip(
|
|
|
|
|
self,
|
|
|
|
|
station: str,
|
|
|
|
|
track_id: Union[str, int],
|
|
|
|
|
total_played_seconds: float,
|
|
|
|
|
batch_id: str = None,
|
|
|
|
|
timestamp: Union[str, float, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-01-22 22:49:53 +09:00
|
|
|
|
"""Сокращение для::
|
|
|
|
|
|
|
|
|
|
client.rotor_station_feedback(station, 'skip', timestamp, track_id, total_played_seconds,
|
2020-01-26 08:55:56 +09:00
|
|
|
|
*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-22 22:49:53 +09:00
|
|
|
|
"""
|
2021-02-03 21:28:10 +09:00
|
|
|
|
return self.rotor_station_feedback(
|
|
|
|
|
station,
|
|
|
|
|
'skip',
|
|
|
|
|
timestamp,
|
|
|
|
|
track_id=track_id,
|
|
|
|
|
total_played_seconds=total_played_seconds,
|
|
|
|
|
batch_id=batch_id,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
)
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def rotor_station_info(self, station: str, *args, **kwargs) -> List[StationResult]:
|
2020-01-23 05:41:42 +09:00
|
|
|
|
"""Получение информации о станции и пользовательских настроек на неё.
|
2020-01-23 01:43:03 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
station (:obj:`str`): Станция.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`list` из :obj:`yandex_music.StationResult` | :obj:`None`: Информация о станции или :obj:`None`.
|
2020-01-23 01:43:03 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-23 01:43:03 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2020-01-22 22:49:53 +09:00
|
|
|
|
url = f'{self.base_url}/rotor/station/{station}/info'
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
|
|
|
|
|
return StationResult.de_list(result, self)
|
|
|
|
|
|
2020-01-23 05:41:42 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def rotor_station_settings2(
|
|
|
|
|
self,
|
|
|
|
|
station: str,
|
|
|
|
|
mood_energy: str,
|
|
|
|
|
diversity: str,
|
2022-11-01 00:12:59 +09:00
|
|
|
|
language: str = 'not-russian', # TODO (MarshalX) почему не any https://github.com/MarshalX/yandex-music-api/issues/555
|
2021-02-03 21:28:10 +09:00
|
|
|
|
type_: str = 'rotor',
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-01-23 05:41:42 +09:00
|
|
|
|
"""Изменение настроек определённой станции.
|
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Note:
|
|
|
|
|
Доступные значения для `mood_energy`: `fun`, `active`, `calm`, `sad`, `all`.
|
|
|
|
|
|
|
|
|
|
Доступные значения для `diversity`: `favorite`, `popular`, `discover`, `default`.
|
2020-01-23 05:41:42 +09:00
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Доступные значения для `language`: `not-russian`, `russian`, `any`.
|
2021-02-03 21:28:10 +09:00
|
|
|
|
|
2021-01-19 17:34:01 +09:00
|
|
|
|
Доступные значения для `type_`: `rotor`, `generative`.
|
2020-01-23 05:41:42 +09:00
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
У станций в `restrictions` есть Enum'ы, а в них `possible_values` - доступные значения для поля.
|
2020-01-23 05:41:42 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
station (:obj:`str`): Станция.
|
|
|
|
|
mood_energy (:obj:`str`): Настроение.
|
|
|
|
|
diversity (:obj:`str`): Треки.
|
|
|
|
|
language (:obj:`str`): Язык.
|
2021-01-19 17:34:01 +09:00
|
|
|
|
type_ (:obj:`str`): Тип.
|
2020-01-23 05:41:42 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-23 05:41:42 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2021-01-19 17:34:01 +09:00
|
|
|
|
url = f'{self.base_url}/rotor/station/{station}/settings3'
|
2020-01-23 05:41:42 +09:00
|
|
|
|
|
2021-02-03 21:28:10 +09:00
|
|
|
|
data = {'moodEnergy': mood_energy, 'diversity': diversity, 'type': type_}
|
2020-01-23 05:41:42 +09:00
|
|
|
|
|
|
|
|
|
if language:
|
|
|
|
|
data.update({'language': language})
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, json=data, *args, **kwargs)
|
2020-01-23 05:41:42 +09:00
|
|
|
|
|
|
|
|
|
return result == 'ok'
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def rotor_station_tracks(
|
|
|
|
|
self,
|
|
|
|
|
station: str,
|
|
|
|
|
settings2: bool = True,
|
|
|
|
|
queue: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Optional[StationTracksResult]:
|
2020-01-23 05:41:42 +09:00
|
|
|
|
"""Получение цепочки треков определённой станции.
|
2020-01-23 00:08:08 +09:00
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Note:
|
Добавлены новые классы: Brand, Contest, OpenGraphData.
Поля contest, dummy_description, dummy_page_description, dummy_cover, dummy_rollover_cover, og_data, branding классу Playlist.
Добавлена информацию по поводу запуска потока по треку, плейлисту и т.д.
Документация и тесты к новым полям, классам #339
2020-06-15 04:11:38 +09:00
|
|
|
|
Запуск потока по сущности сервиса осуществляется через станцию `<type>:<id>`.
|
|
|
|
|
Например, станцией для запуска потока по треку будет `track:1234`.
|
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Для продолжения цепочки треков необходимо:
|
|
|
|
|
|
|
|
|
|
1. Передавать `ID` трека, что был до этого (первый в цепочки).
|
2022-07-11 06:02:49 +09:00
|
|
|
|
2. Отправить фидбек о конце или скипе трека, что был передан в `queue`.
|
2020-01-26 08:55:56 +09:00
|
|
|
|
3. Отправить фидбек о начале следующего трека (второй в цепочки).
|
|
|
|
|
4. Выполнить запрос получения треков. В ответе придёт новые треки или произойдёт сдвиг цепочки на 1 элемент.
|
2020-01-23 00:08:08 +09:00
|
|
|
|
|
2022-10-31 23:29:38 +09:00
|
|
|
|
Проход по цепочке до конца не изучен. Часто встречаются дубликаты.
|
2020-01-23 00:08:08 +09:00
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Все официальные клиенты выполняют запросы с `settings2 = True`.
|
2020-01-23 01:43:03 +09:00
|
|
|
|
|
2020-01-23 00:08:08 +09:00
|
|
|
|
Args:
|
|
|
|
|
station (:obj:`str`): Станция.
|
|
|
|
|
settings2 (:obj:`bool`, optional): Использовать ли второй набор настроек.
|
|
|
|
|
queue (:obj:`str` | :obj:`int` , optional): Уникальной идентификатор трека, который только что был.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.StationTracksResult` | :obj:`None`: Последовательность треков станции или :obj:`None`.
|
2020-01-23 00:08:08 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-23 00:08:08 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2020-01-22 22:49:53 +09:00
|
|
|
|
url = f'{self.base_url}/rotor/station/{station}/tracks'
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
|
2020-01-23 00:08:08 +09:00
|
|
|
|
params = {}
|
|
|
|
|
if settings2:
|
2022-02-20 08:31:02 +09:00
|
|
|
|
params = {'settings2': str(True)}
|
2020-01-23 00:08:08 +09:00
|
|
|
|
|
|
|
|
|
if queue:
|
|
|
|
|
params = {'queue': queue}
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, params=params, *args, **kwargs)
|
New supported objects: Station, StationResult, StationTrackResult, Value, Sequence, RotorSettings, Restrictions, Id, Enum, DiscreteScale, DashBoard, AdParams
The following methods are wrapped:
- /rotor/account/status
- /rotor/stations/dashboard
- /rotor/stations/list
- /rotor/station/genre:{genre}/feedback
- /rotor/station/genre:{genre}/info
- /rotor/station/genre:{genre}/tracks
The following fields are now optional: Account[region, passport_phones], Status[cache_limit, subeditor, subeditor_level, plus], Subscription[auto_renewable, can_start_trial, mcdonalds]
Added new fields: Subscription.end, Status[skips_per_hour, station_exists, premium_region], Track..preview_duration_ms
Fixed downloading the cover of the track
2019-06-03 22:16:24 +09:00
|
|
|
|
|
|
|
|
|
return StationTracksResult.de_json(result, self)
|
|
|
|
|
|
Добавлен метод получения информации об артисте (Brief Info https://github.com/MarshalX/yandex-music-api/issues/9).
Добавлены следующие классы: BriefInfo, Description, Vinyl, PlaylistId.
Класс Video вынесен из пакета Search в корень.
Добавлен de_list в Cover.
Добавлены следующие поля в класс Artist: likes_count, full_names, description, countries, en_wikipedia_link, db_aliases, aliases, init_date, end_date.
Добавлено поле track_id в класс Chart.
Добавлено поле available_full_without_permission в класс Track.
Класс Video расширен для поддержки второго типа (используется в brief info, спасибо яндух) видео (добавлены необязательные поля cover, embed_url, provider, provider_video_id).
Обновлена документация.
2019-09-13 00:32:43 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def artists_brief_info(self, artist_id: Union[str, int], *args, **kwargs) -> Optional[BriefInfo]:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Получение информации об артисте.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
artist_id (:obj:`str` | :obj:`int`): Уникальный идентификатор исполнителя.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`yandex_music.BriefInfo` | :obj:`None`: Информация об артисте или :obj:`None`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
Добавлен метод получения информации об артисте (Brief Info https://github.com/MarshalX/yandex-music-api/issues/9).
Добавлены следующие классы: BriefInfo, Description, Vinyl, PlaylistId.
Класс Video вынесен из пакета Search в корень.
Добавлен de_list в Cover.
Добавлены следующие поля в класс Artist: likes_count, full_names, description, countries, en_wikipedia_link, db_aliases, aliases, init_date, end_date.
Добавлено поле track_id в класс Chart.
Добавлено поле available_full_without_permission в класс Track.
Класс Video расширен для поддержки второго типа (используется в brief info, спасибо яндух) видео (добавлены необязательные поля cover, embed_url, provider, provider_video_id).
Обновлена документация.
2019-09-13 00:32:43 +09:00
|
|
|
|
url = f'{self.base_url}/artists/{artist_id}/brief-info'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
Добавлен метод получения информации об артисте (Brief Info https://github.com/MarshalX/yandex-music-api/issues/9).
Добавлены следующие классы: BriefInfo, Description, Vinyl, PlaylistId.
Класс Video вынесен из пакета Search в корень.
Добавлен de_list в Cover.
Добавлены следующие поля в класс Artist: likes_count, full_names, description, countries, en_wikipedia_link, db_aliases, aliases, init_date, end_date.
Добавлено поле track_id в класс Chart.
Добавлено поле available_full_without_permission в класс Track.
Класс Video расширен для поддержки второго типа (используется в brief info, спасибо яндух) видео (добавлены необязательные поля cover, embed_url, provider, provider_video_id).
Обновлена документация.
2019-09-13 00:32:43 +09:00
|
|
|
|
|
|
|
|
|
return BriefInfo.de_json(result, self)
|
|
|
|
|
|
2019-10-21 23:47:31 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def artists_tracks(
|
|
|
|
|
self,
|
|
|
|
|
artist_id: Union[str, int],
|
|
|
|
|
page: int = 0,
|
|
|
|
|
page_size: int = 20,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Optional[ArtistTracks]:
|
2019-10-27 23:14:11 +09:00
|
|
|
|
"""Получение треков артиста.
|
2019-10-22 00:08:24 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
artist_id (:obj:`str` | :obj:`int`): Уникальный идентификатор артиста.
|
2019-10-27 23:14:11 +09:00
|
|
|
|
page (:obj:`int`, optional): Номер страницы.
|
|
|
|
|
page_size (:obj:`int`, optional): Количество треков на странице.
|
2019-10-22 00:08:24 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.ArtistsTracks` | :obj:`None`: Страница списка треков артиста или :obj:`None`.
|
2019-11-21 01:13:49 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-10-22 00:08:24 +09:00
|
|
|
|
"""
|
2019-10-27 23:14:11 +09:00
|
|
|
|
|
2019-10-21 23:47:31 +09:00
|
|
|
|
url = f'{self.base_url}/artists/{artist_id}/tracks'
|
2019-10-27 23:14:11 +09:00
|
|
|
|
|
2021-02-03 21:28:10 +09:00
|
|
|
|
params = {'page': page, 'page-size': page_size}
|
2019-10-21 23:47:31 +09:00
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, params, *args, **kwargs)
|
2019-10-21 23:47:31 +09:00
|
|
|
|
|
2019-10-27 23:14:11 +09:00
|
|
|
|
return ArtistTracks.de_json(result, self)
|
2019-10-21 23:47:31 +09:00
|
|
|
|
|
2019-11-20 02:30:07 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def artists_direct_albums(
|
|
|
|
|
self,
|
|
|
|
|
artist_id: Union[str, int],
|
|
|
|
|
page: int = 0,
|
|
|
|
|
page_size: int = 20,
|
|
|
|
|
sort_by: str = 'year',
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Optional[ArtistAlbums]:
|
2019-11-20 03:33:52 +09:00
|
|
|
|
"""Получение альбомов артиста.
|
2019-11-20 02:52:17 +09:00
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Note:
|
|
|
|
|
Известные значения для `sort_by`: `year`, `rating`.
|
2019-11-21 01:13:49 +09:00
|
|
|
|
|
2019-11-20 02:52:17 +09:00
|
|
|
|
Args:
|
|
|
|
|
artist_id (:obj:`str` | :obj:`int`): Уникальный идентификатор артиста.
|
|
|
|
|
page (:obj:`int`, optional): Номер страницы.
|
2019-11-20 03:33:52 +09:00
|
|
|
|
page_size (:obj:`int`, optional): Количество альбомов на странице.
|
2019-11-21 01:13:49 +09:00
|
|
|
|
sort_by (:obj:`str`, optional): Параметр для сортировки.
|
2019-11-20 02:52:17 +09:00
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.ArtistAlbums` | :obj:`None`: Страница списка альбомов артиста или :obj:`None`.
|
2019-11-21 01:13:49 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2019-11-20 02:52:17 +09:00
|
|
|
|
"""
|
|
|
|
|
|
2019-11-20 02:30:07 +09:00
|
|
|
|
url = f'{self.base_url}/artists/{artist_id}/direct-albums'
|
|
|
|
|
|
2021-02-03 21:28:10 +09:00
|
|
|
|
params = {'sort-by': sort_by, 'page': page, 'page-size': page_size}
|
2019-11-20 02:30:07 +09:00
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, params, *args, **kwargs)
|
2019-11-20 02:30:07 +09:00
|
|
|
|
|
|
|
|
|
return ArtistAlbums.de_json(result, self)
|
|
|
|
|
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def _like_action(
|
|
|
|
|
self,
|
|
|
|
|
object_type: str,
|
|
|
|
|
ids: Union[List[Union[str, int]], str, int],
|
|
|
|
|
remove: bool = False,
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Действия с отметкой "Мне нравится".
|
|
|
|
|
|
|
|
|
|
Note:
|
|
|
|
|
Типы объектов: `track` - трек, `artist` - исполнитель, `playlist` - плейлист, `album` - альбом.
|
|
|
|
|
|
2020-05-08 20:47:16 +09:00
|
|
|
|
Идентификатор плейлиста указывается в формате `owner_id:playlist_id`. Где `playlist_id` - идентификатор
|
2020-03-23 00:48:54 +09:00
|
|
|
|
плейлиста, `owner_id` - уникальный идентификатор владельца плейлиста.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
object_type (:obj:`str`): Тип объекта.
|
|
|
|
|
ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор объекта или объектов.
|
|
|
|
|
remove (:obj:`bool`, optional): Если :obj:`True` то снимает отметку, иначе ставит.
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2019-12-24 06:20:07 +09:00
|
|
|
|
if user_id is None and self.me is not None:
|
|
|
|
|
user_id = self.me.account.uid
|
2019-05-11 17:37:47 +09:00
|
|
|
|
|
2019-05-19 05:59:14 +09:00
|
|
|
|
action = 'remove' if remove else 'add-multiple'
|
|
|
|
|
url = f'{self.base_url}/users/{user_id}/likes/{object_type}s/{action}'
|
2019-05-11 17:37:47 +09:00
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, {f'{object_type}-ids': ids}, *args, **kwargs)
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2019-05-19 05:59:14 +09:00
|
|
|
|
if object_type == 'track':
|
|
|
|
|
return 'revision' in result
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2019-05-19 05:59:14 +09:00
|
|
|
|
return result == 'ok'
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_likes_tracks_add(
|
|
|
|
|
self,
|
|
|
|
|
track_ids: Union[List[Union[str, int]], str, int],
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Поставить отметку "Мне нравится" треку/трекам.
|
|
|
|
|
|
|
|
|
|
Note:
|
|
|
|
|
Так же снимает отметку "Не рекомендовать" если она есть.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
track_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор трека или треков.
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._like_action('track', track_ids, False, user_id, *args, **kwargs)
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_likes_tracks_remove(
|
|
|
|
|
self,
|
|
|
|
|
track_ids: Union[List[Union[str, int]], str, int],
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Снять отметку "Мне нравится" у трека/треков.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
track_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор трека или треков.
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._like_action('track', track_ids, True, user_id, *args, **kwargs)
|
2019-05-15 05:38:15 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_likes_artists_add(
|
|
|
|
|
self,
|
|
|
|
|
artist_ids: Union[List[Union[str, int]], str, int],
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Поставить отметку "Мне нравится" исполнителю/исполнителям.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
artist_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор артиста или артистов.
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._like_action('artist', artist_ids, False, user_id, *args, **kwargs)
|
2019-05-15 05:38:15 +09:00
|
|
|
|
|
2022-02-20 02:59:53 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_likes_artists_remove(
|
|
|
|
|
self,
|
|
|
|
|
artist_ids: Union[List[Union[str, int]], str, int],
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Снять отметку "Мне нравится" у исполнителя/исполнителей.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
artist_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор артиста или артистов.
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-11-01 00:12:59 +09:00
|
|
|
|
# TODO (MarshalX) что за True. Переделать на named argument
|
|
|
|
|
# https://github.com/MarshalX/yandex-music-api/issues/550
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._like_action('artist', artist_ids, True, user_id, *args, **kwargs)
|
2019-05-15 05:38:15 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_likes_playlists_add(
|
|
|
|
|
self,
|
|
|
|
|
playlist_ids: Union[List[Union[str, int]], str, int],
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Поставить отметку "Мне нравится" плейлисту/плейлистам.
|
|
|
|
|
|
|
|
|
|
Note:
|
2020-05-08 20:47:16 +09:00
|
|
|
|
Идентификатор плейлиста указывается в формате `owner_id:playlist_id`. Где `playlist_id` - идентификатор
|
2020-03-23 00:48:54 +09:00
|
|
|
|
плейлиста, `owner_id` - уникальный идентификатор владельца плейлиста.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
playlist_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор плейлиста или плейлистов.
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._like_action('playlist', playlist_ids, False, user_id, *args, **kwargs)
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_likes_playlists_remove(
|
|
|
|
|
self,
|
|
|
|
|
playlist_ids: Union[List[Union[str, int]], str, int],
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Снять отметку "Мне нравится" у плейлиста/плейлистов.
|
|
|
|
|
|
|
|
|
|
Note:
|
2020-05-08 20:47:16 +09:00
|
|
|
|
Идентификатор плейлиста указывается в формате `owner_id:playlist_id`. Где `playlist_id` - идентификатор
|
2020-03-23 00:48:54 +09:00
|
|
|
|
плейлиста, `owner_id` - уникальный идентификатор владельца плейлиста.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
playlist_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор плейлиста или плейлистов.
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._like_action('playlist', playlist_ids, True, user_id, *args, **kwargs)
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_likes_albums_add(
|
|
|
|
|
self,
|
|
|
|
|
album_ids: Union[List[Union[str, int]], str, int],
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Поставить отметку "Мне нравится" альбому/альбомам.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
album_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор артиста или артистов.
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._like_action('album', album_ids, False, user_id, *args, **kwargs)
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_likes_albums_remove(
|
|
|
|
|
self,
|
|
|
|
|
album_ids: Union[List[Union[str, int]], str, int],
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Снять отметку "Мне нравится" у альбома/альбомов.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
album_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор артиста или артистов.
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._like_action('album', album_ids, True, user_id, *args, **kwargs)
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def _get_list(
|
|
|
|
|
self,
|
|
|
|
|
object_type: str,
|
|
|
|
|
ids: Union[List[Union[str, int]], int, str],
|
|
|
|
|
params: dict = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> List[Union[Artist, Album, Track, Playlist]]:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Получение объекта/объектов.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
object_type (:obj:`str`): Тип объекта.
|
|
|
|
|
ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор объекта или объектов.
|
|
|
|
|
params (:obj:`dict`, optional): Параметры, которые будут переданы в запрос.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`list` из :obj:`yandex_music.Artist` | :obj:`list` из :obj:`yandex_music.Album` |
|
|
|
|
|
:obj:`list` из :obj:`yandex_music.Track` | :obj:`list` из :obj:`yandex_music.Playlist`: Запрошенный
|
|
|
|
|
объект.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2019-05-19 05:59:14 +09:00
|
|
|
|
if params is None:
|
|
|
|
|
params = {}
|
|
|
|
|
params.update({f'{object_type}-ids': ids})
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2019-05-19 05:59:14 +09:00
|
|
|
|
url = f'{self.base_url}/{object_type}s' + ('/list' if object_type == 'playlist' else '')
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, params, *args, **kwargs)
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2022-02-20 02:59:53 +09:00
|
|
|
|
return de_list[object_type](result, self)
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def artists(self, artist_ids: Union[List[Union[str, int]], int, str], *args, **kwargs) -> List[Artist]:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Получение исполнителя/исполнителей.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
artist_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор исполнителя или исполнителей.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`list` из :obj:`yandex_music.Artist`: Исполнитель или исполнители.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._get_list('artist', artist_ids, *args, **kwargs)
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def albums(self, album_ids: Union[List[Union[str, int]], int, str], *args, **kwargs) -> List[Album]:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Получение альбома/альбомов.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
album_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор альбома или альбомов.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`list` из :obj:`yandex_music.Album`: Альбом или альбомы.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._get_list('album', album_ids, *args, **kwargs)
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def tracks(
|
|
|
|
|
self,
|
|
|
|
|
track_ids: Union[List[Union[str, int]], int, str],
|
|
|
|
|
with_positions: bool = True,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> List[Track]:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Получение трека/треков.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
track_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор трека или треков.
|
|
|
|
|
with_positions (:obj:`bool`, optional): С позициями TODO.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`list` из :obj:`yandex_music.Track`: Трек или Треки.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._get_list('track', track_ids, {'with-positions': str(with_positions)}, *args, **kwargs)
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def playlists_list(self, playlist_ids: Union[List[Union[str, int]], int, str], *args, **kwargs) -> List[Playlist]:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Получение плейлиста/плейлистов.
|
|
|
|
|
|
|
|
|
|
Note:
|
2020-05-08 20:47:16 +09:00
|
|
|
|
Идентификатор плейлиста указывается в формате `owner_id:playlist_id`. Где `playlist_id` - идентификатор
|
2020-03-23 00:48:54 +09:00
|
|
|
|
плейлиста, `owner_id` - уникальный идентификатор владельца плейлиста.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
playlist_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор плейлиста или плейлистов.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`list` из :obj:`yandex_music.Playlist`: Плейлист или плейлисты.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._get_list('playlist', playlist_ids, *args, **kwargs)
|
2019-05-19 05:59:14 +09:00
|
|
|
|
|
2020-05-07 17:44:08 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def playlists_collective_join(self, user_id: int, token: str, *args, **kwargs) -> bool:
|
2020-05-15 06:22:52 +09:00
|
|
|
|
"""Присоединение к плейлисту как соавтор.
|
2020-05-07 17:44:08 +09:00
|
|
|
|
|
|
|
|
|
Note:
|
2020-05-15 06:22:52 +09:00
|
|
|
|
В качестве `user_id` принимается исключительно числовой уникальный идентификатор пользователя, не username.
|
2020-05-07 17:44:08 +09:00
|
|
|
|
|
2020-05-15 06:22:52 +09:00
|
|
|
|
Токен можно получить в Web-версии. Для этого, на странице плейлиста нужно нажать на
|
|
|
|
|
"Добавить соавтора". В полученной ссылке GET параметр `token` и будет токеном для присоединения.
|
2020-05-07 17:44:08 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
2020-05-15 06:22:52 +09:00
|
|
|
|
user_id (:obj:`int`): Владелец плейлиста.
|
2020-05-07 17:44:08 +09:00
|
|
|
|
token (:obj:`str`): Токен для присоединения.
|
|
|
|
|
**kwargs: Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
|
|
|
|
url = f'{self.base_url}/playlists/collective/join'
|
|
|
|
|
|
2021-02-03 21:28:10 +09:00
|
|
|
|
params = {'uid': user_id, 'token': token}
|
2020-05-07 17:44:08 +09:00
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, params=params, *args, **kwargs)
|
2020-05-07 17:44:08 +09:00
|
|
|
|
|
|
|
|
|
return result == 'ok'
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def users_playlists_list(self, user_id: Union[str, int] = None, *args, **kwargs) -> List[Playlist]:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Получение списка плейлистов пользователя.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`list` из :obj:`yandex_music.Playlist`: Плейлисты пользователя.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2019-12-24 06:20:07 +09:00
|
|
|
|
if user_id is None and self.me is not None:
|
|
|
|
|
user_id = self.me.account.uid
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2019-05-19 05:59:14 +09:00
|
|
|
|
url = f'{self.base_url}/users/{user_id}/playlists/list'
|
New supported objects: Album, CaseForms, Label, Library, MadeFor, Major, Normalization, PlayCounter, Playlist, Track, TrackPosition, TrackShort, User
The following methods are wrapped:
- albums;
- playlists/list;
- users/{user_id}/playlists/list;
- tracks;
- users/{user_id}/likes/tracks.
Added property to get full track ID
Cover received more optional fields
Ability to pass arguments to the request
Removed unnecessary type conversions
2019-05-13 02:39:12 +09:00
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2019-05-15 05:38:15 +09:00
|
|
|
|
|
2019-05-19 05:59:14 +09:00
|
|
|
|
return Playlist.de_list(result, self)
|
|
|
|
|
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def _get_likes(
|
|
|
|
|
self,
|
|
|
|
|
object_type: str,
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
params: dict = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Union[List[Like], Optional[TracksList]]:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Получение объектов с отметкой "Мне нравится".
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
object_type (:obj:`str`): Тип объекта.
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
params (:obj:`dict`, optional): Параметры, которые будут переданы в запрос.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`list` из :obj:`yandex_music.Like` | :obj:`yandex_music.TracksList`: Объекты с отметкой "Мне нравится".
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2019-12-24 06:20:07 +09:00
|
|
|
|
if user_id is None and self.me is not None:
|
|
|
|
|
user_id = self.me.account.uid
|
2019-05-15 05:38:15 +09:00
|
|
|
|
|
2019-05-19 05:59:14 +09:00
|
|
|
|
url = f'{self.base_url}/users/{user_id}/likes/{object_type}s'
|
2019-05-15 05:38:15 +09:00
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, params, *args, **kwargs)
|
2019-05-15 05:38:15 +09:00
|
|
|
|
|
2019-05-19 05:59:14 +09:00
|
|
|
|
if object_type == 'track':
|
2019-07-06 17:09:47 +09:00
|
|
|
|
return TracksList.de_json(result.get('library'), self)
|
2019-05-16 04:38:39 +09:00
|
|
|
|
|
2020-02-04 21:34:11 +09:00
|
|
|
|
return Like.de_list(result, self, object_type)
|
2019-05-16 04:38:39 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_likes_tracks(
|
|
|
|
|
self,
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
if_modified_since_revision: int = 0,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Optional[TracksList]:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Получение треков с отметкой "Мне нравится".
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
if_modified_since_revision (:obj:`int`, optional): TODO.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`yandex_music.TracksList`: Треки с отметкой "Мне нравится".
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2021-02-03 21:28:10 +09:00
|
|
|
|
return self._get_likes(
|
2022-10-31 22:57:28 +09:00
|
|
|
|
'track', user_id, {'if-modified-since-revision': if_modified_since_revision}, *args, **kwargs
|
2021-02-03 21:28:10 +09:00
|
|
|
|
)
|
2019-05-16 04:38:39 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def users_likes_albums(self, user_id: Union[str, int] = None, rich: bool = True, *args, **kwargs) -> List[Like]:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Получение альбомов с отметкой "Мне нравится".
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
rich (:obj:`bool`, optional): Если False, то приходит укороченная версия.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`list` из :obj:`yandex_music.Like`: Альбомы с отметкой "Мне нравится".
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._get_likes('album', user_id, {'rich': str(rich)}, *args, **kwargs)
|
2019-05-16 04:38:39 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_likes_artists(
|
|
|
|
|
self,
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
with_timestamps: bool = True,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> List[Like]:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Получение артистов с отметкой "Мне нравится".
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
with_timestamps (:obj:`bool`, optional): С временными метками TODO.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`list` из :obj:`yandex_music.Like`: Артисты с отметкой "Мне нравится".
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._get_likes('artist', user_id, {'with-timestamps': str(with_timestamps)}, *args, **kwargs)
|
2019-05-19 05:59:14 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def users_likes_playlists(self, user_id: Union[str, int] = None, *args, **kwargs) -> List[Like]:
|
2020-05-15 04:59:42 +09:00
|
|
|
|
"""Получение плейлистов с отметкой "Мне нравится".
|
2020-03-23 00:48:54 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`list` из :obj:`yandex_music.Like`: Плейлисты с отметкой "Мне нравится".
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._get_likes('playlist', user_id, *args, **kwargs)
|
2019-07-06 17:09:47 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_dislikes_tracks(
|
|
|
|
|
self,
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
if_modified_since_revision: int = 0,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Optional[TracksList]:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Получение треков с отметкой "Не рекомендовать".
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
if_modified_since_revision (:obj:`bool`, optional): TODO.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`list` из :obj:`yandex_music.TracksList`: Треки с отметкой "Не рекомендовать".
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2019-12-24 06:20:07 +09:00
|
|
|
|
if user_id is None and self.me is not None:
|
|
|
|
|
user_id = self.me.account.uid
|
2019-07-06 17:09:47 +09:00
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/users/{user_id}/dislikes/tracks'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, {'if_modified_since_revision': if_modified_since_revision}, *args, **kwargs)
|
2019-07-06 17:09:47 +09:00
|
|
|
|
|
|
|
|
|
return TracksList.de_json(result.get('library'), self)
|
|
|
|
|
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def _dislike_action(
|
|
|
|
|
self,
|
|
|
|
|
ids: Union[List[Union[str, int]], str, int],
|
|
|
|
|
remove: bool = False,
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Действия с отметкой "Не рекомендовать".
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор объекта или объектов.
|
|
|
|
|
remove (:obj:`bool`, optional): Если :obj:`True`, то снимает отметку, иначе ставит.
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2019-12-24 06:20:07 +09:00
|
|
|
|
if user_id is None and self.me is not None:
|
|
|
|
|
user_id = self.me.account.uid
|
2019-07-06 17:09:47 +09:00
|
|
|
|
|
|
|
|
|
action = 'remove' if remove else 'add-multiple'
|
|
|
|
|
url = f'{self.base_url}/users/{user_id}/dislikes/tracks/{action}'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, {f'track-ids': ids}, *args, **kwargs)
|
2019-07-06 17:09:47 +09:00
|
|
|
|
|
|
|
|
|
return 'revision' in result
|
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_dislikes_tracks_add(
|
|
|
|
|
self,
|
|
|
|
|
track_ids: Union[List[Union[str, int]], str, int],
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Поставить отметку "Не рекомендовать" треку/трекам.
|
|
|
|
|
|
|
|
|
|
Note:
|
|
|
|
|
Так же снимает отметку "Мне нравится" если она есть.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
track_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор трека или треков.
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._dislike_action(track_ids, False, user_id, *args, **kwargs)
|
2019-07-06 17:09:47 +09:00
|
|
|
|
|
2019-08-25 17:49:02 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def users_dislikes_tracks_remove(
|
|
|
|
|
self,
|
|
|
|
|
track_ids: Union[List[Union[str, int]], str, int],
|
|
|
|
|
user_id: Union[str, int] = None,
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> bool:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
"""Снять отметку "Не рекомендовать" у трека/треков.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
track_ids (:obj:`str` | :obj:`int` | :obj:`list` из :obj:`str` | :obj:`list` из :obj:`int`): Уникальный
|
|
|
|
|
идентификатор трека или треков.
|
|
|
|
|
user_id (:obj:`str` | :obj:`int`, optional): Уникальный идентификатор пользователя. Если не указан
|
|
|
|
|
используется ID текущего пользователя.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
2022-10-31 22:57:28 +09:00
|
|
|
|
return self._dislike_action(track_ids, True, user_id, *args, **kwargs)
|
2019-08-05 05:05:17 +09:00
|
|
|
|
|
2020-01-24 08:18:27 +09:00
|
|
|
|
@log
|
2021-02-03 21:28:10 +09:00
|
|
|
|
def after_track(
|
|
|
|
|
self,
|
|
|
|
|
next_track_id: Union[str, int],
|
|
|
|
|
context_item: str,
|
|
|
|
|
prev_track_id: Union[str, int] = None,
|
|
|
|
|
context: str = 'playlist',
|
|
|
|
|
types: str = 'shot',
|
|
|
|
|
from_: str = 'mobile-landing-origin-default',
|
|
|
|
|
*args,
|
|
|
|
|
**kwargs,
|
|
|
|
|
) -> Optional[ShotEvent]:
|
2020-01-24 08:18:27 +09:00
|
|
|
|
"""Получение рекламы или шота от Алисы после трека.
|
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Note:
|
|
|
|
|
При получения шота от Алисы `prev_track_id` можно не указывать.
|
|
|
|
|
|
|
|
|
|
Если `context = 'playlist'`, то в `context_item` необходимо передать `{OWNER_PLAYLIST}:{ID_PLAYLIST}`.
|
|
|
|
|
Плейлист с Алисой имеет владельца с `id = 940441070`.
|
2020-01-24 23:47:50 +09:00
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
ID плейлиста можно получить из блоков landing'a. Получить шот чужого плейлиста нельзя.
|
2020-01-24 23:47:50 +09:00
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Известные значения `context`: `playlist`.
|
2020-01-24 23:47:50 +09:00
|
|
|
|
|
2020-01-26 08:55:56 +09:00
|
|
|
|
Известные значения `types`: `shot`, `ad`.
|
2020-01-24 08:18:27 +09:00
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
prev_track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор предыдущего трека.
|
|
|
|
|
next_track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор следующего трека.
|
2020-01-24 23:47:50 +09:00
|
|
|
|
context_item (:obj:`str`): Уникальный идентификатор контекста.
|
2020-01-24 08:18:27 +09:00
|
|
|
|
context (:obj:`str`, optional): Место, откуда было вызвано получение.
|
|
|
|
|
types (:obj:`str`, optional): Тип того, что вернуть после трека.
|
|
|
|
|
from_ (:obj:`str`, optional): Место, с которого попали в контекст.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
2020-03-22 06:29:34 +09:00
|
|
|
|
:obj:`yandex_music.ShotEvent`: Шот от Алисы или :obj:`None`.
|
2020-01-24 08:18:27 +09:00
|
|
|
|
|
|
|
|
|
Raises:
|
2020-03-23 00:48:54 +09:00
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
2020-01-24 08:18:27 +09:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/after-track'
|
|
|
|
|
|
|
|
|
|
params = {
|
|
|
|
|
'from': from_,
|
|
|
|
|
'prevTrackId': prev_track_id,
|
|
|
|
|
'nextTrackId': next_track_id,
|
|
|
|
|
'context': context,
|
|
|
|
|
'contextItem': context_item,
|
|
|
|
|
'types': types,
|
|
|
|
|
}
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, params=params, *args, **kwargs)
|
2020-01-24 08:18:27 +09:00
|
|
|
|
|
2022-10-31 23:29:38 +09:00
|
|
|
|
# TODO (MarshalX) судя по всему ручка ещё возвращает рекламу после треков для пользователей без подписки.
|
2022-11-01 00:12:59 +09:00
|
|
|
|
# https://github.com/MarshalX/yandex-music-api/issues/557
|
2020-01-24 23:47:50 +09:00
|
|
|
|
return ShotEvent.de_json(result.get('shot_event'), self)
|
2020-01-24 08:18:27 +09:00
|
|
|
|
|
2020-06-20 22:54:46 +09:00
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def queues_list(self, device: str = None, *args, **kwargs) -> List[QueueItem]:
|
2020-06-20 22:54:46 +09:00
|
|
|
|
"""Получение всех очередей треков с разных устройств для синхронизации между ними.
|
|
|
|
|
|
|
|
|
|
Note:
|
|
|
|
|
Именно к `device` привязывается очередь. На одном устройстве может быть создана одна очередь.
|
|
|
|
|
|
|
|
|
|
Аргумент `device` имеет следующий формат: `ключ=значение; ключ2=значение2`. Обязательные паля указы в
|
|
|
|
|
значении по умолчанию.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
device (:obj:`str`, optional): Содержит информацию об устройстве с которого выполняется запрос.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`list` из :obj:`yandex_music.QueueItem`: Элементы очереди всех устройств.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
|
|
|
|
if not device:
|
|
|
|
|
device = self.device
|
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/queues'
|
|
|
|
|
|
|
|
|
|
self._request.headers['X-Yandex-Music-Device'] = device
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2020-06-20 22:54:46 +09:00
|
|
|
|
|
|
|
|
|
return QueueItem.de_list(result.get('queues'), self)
|
|
|
|
|
|
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def queue(self, queue_id: str, *args, **kwargs) -> Optional[Queue]:
|
2020-06-20 22:54:46 +09:00
|
|
|
|
"""Получение информации об очереди треков и самих треков в ней.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
queue_id (:obj:`str`): Уникальный идентификатор очереди.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`yandex_music.Queue`: Очередь или :obj:`None`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
|
|
|
|
url = f'{self.base_url}/queues/{queue_id}'
|
|
|
|
|
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.get(url, *args, **kwargs)
|
2020-06-20 22:54:46 +09:00
|
|
|
|
|
|
|
|
|
return Queue.de_json(result, self)
|
|
|
|
|
|
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def queue_update_position(self, queue_id: str, current_index: int, device: str = None, *args, **kwargs) -> bool:
|
2020-06-20 22:54:46 +09:00
|
|
|
|
"""Установка текущего индекса проигрываемого трека в очереди треков.
|
|
|
|
|
|
|
|
|
|
Note:
|
|
|
|
|
Изменить можно только у той очереди, которая была создана с переданного `device`!
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
queue_id (:obj:`str`): Уникальный идентификатор очереди.
|
|
|
|
|
current_index (:obj:`int`): Текущий индекс.
|
|
|
|
|
device (:obj:`str`, optional): Содержит информацию об устройстве с которого выполняется запрос.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
|
|
|
|
if not device:
|
|
|
|
|
device = self.device
|
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/queues/{queue_id}/update-position'
|
|
|
|
|
|
|
|
|
|
self._request.headers['X-Yandex-Music-Device'] = device
|
2021-02-03 21:28:10 +09:00
|
|
|
|
result = self._request.post(
|
2022-10-31 22:57:28 +09:00
|
|
|
|
url, {'isInteractive': False}, params={'currentIndex': current_index}, *args, **kwargs
|
2021-02-03 21:28:10 +09:00
|
|
|
|
)
|
2020-06-20 22:54:46 +09:00
|
|
|
|
|
|
|
|
|
return result.get('status') == 'ok'
|
|
|
|
|
|
|
|
|
|
@log
|
2022-10-31 22:57:28 +09:00
|
|
|
|
def queue_create(self, queue: Union[Queue, str], device: str = None, *args, **kwargs) -> Optional[str]:
|
2020-06-20 22:54:46 +09:00
|
|
|
|
"""Создание новой очереди треков.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
queue (:obj:`yandex_music.Queue` | :obj:`str`): Объект очереди или JSON строка с этим объектом.
|
|
|
|
|
device (:obj:`str`, optional): Содержит информацию об устройстве с которого выполняется запрос.
|
|
|
|
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
:obj:`str`: Вернёт уникальный идентификатор созданной очереди, иначе :obj:`None`.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
:class:`yandex_music.exceptions.YandexMusicError`: Базовое исключение библиотеки.
|
|
|
|
|
"""
|
|
|
|
|
if not device:
|
|
|
|
|
device = self.device
|
|
|
|
|
|
|
|
|
|
if isinstance(queue, Queue):
|
|
|
|
|
queue = queue.to_json(True)
|
|
|
|
|
|
|
|
|
|
url = f'{self.base_url}/queues'
|
|
|
|
|
|
|
|
|
|
self._request.headers['X-Yandex-Music-Device'] = device
|
2022-10-31 22:57:28 +09:00
|
|
|
|
result = self._request.post(url, queue, *args, **kwargs)
|
2020-06-20 22:54:46 +09:00
|
|
|
|
|
|
|
|
|
return result.get('id_')
|
|
|
|
|
|
2019-08-05 05:05:17 +09:00
|
|
|
|
# camelCase псевдонимы
|
|
|
|
|
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`account_status`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
accountStatus = account_status
|
2020-05-15 05:36:47 +09:00
|
|
|
|
#: Псевдоним для :attr:`account_settings`
|
|
|
|
|
accountSettings = account_settings
|
|
|
|
|
#: Псевдоним для :attr:`account_settings_set`
|
|
|
|
|
accountSettingsSet = account_settings_set
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`permission_alerts`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
permissionAlerts = permission_alerts
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`account_experiments`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
accountExperiments = account_experiments
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`consume_promo_code`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
consumePromoCode = consume_promo_code
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`feed_wizard_is_passed`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
feedWizardIsPassed = feed_wizard_is_passed
|
2020-05-16 07:00:52 +09:00
|
|
|
|
#: Псевдоним для :attr:`new_releases`
|
|
|
|
|
newReleases = new_releases
|
|
|
|
|
#: Псевдоним для :attr:`new_playlists`
|
|
|
|
|
newPlaylists = new_playlists
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`tracks_download_info`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
tracksDownloadInfo = tracks_download_info
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`track_supplement`
|
2019-10-17 12:35:24 +09:00
|
|
|
|
trackSupplement = track_supplement
|
2022-11-14 13:10:00 +09:00
|
|
|
|
#: Псевдоним для :attr:`tracks_lyrics`
|
|
|
|
|
tracksLyrics = tracks_lyrics
|
2020-01-26 02:13:20 +09:00
|
|
|
|
#: Псевдоним для :attr:`tracks_similar`
|
|
|
|
|
tracksSimilar = tracks_similar
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`play_audio`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
playAudio = play_audio
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`albums_with_tracks`
|
2019-08-28 04:07:42 +09:00
|
|
|
|
albumsWithTracks = albums_with_tracks
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`search_suggest`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
searchSuggest = search_suggest
|
2020-05-15 05:36:47 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_settings`
|
|
|
|
|
usersSettings = users_settings
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_playlists`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersPlaylists = users_playlists
|
2020-05-07 17:46:56 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_playlists_recommendations`
|
|
|
|
|
usersPlaylistsRecommendations = users_playlists_recommendations
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_playlists_create`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersPlaylistsCreate = users_playlists_create
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_playlists_delete`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersPlaylistsDelete = users_playlists_delete
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_playlists_name`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersPlaylistsName = users_playlists_name
|
2020-01-23 05:41:42 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_playlists_visibility`
|
|
|
|
|
usersPlaylistsVisibility = users_playlists_visibility
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_playlists_change`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersPlaylistsChange = users_playlists_change
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_playlists_insert_track`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersPlaylistsInsertTrack = users_playlists_insert_track
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_playlists_delete_track`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersPlaylistsDeleteTrack = users_playlists_delete_track
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`rotor_account_status`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
rotorAccountStatus = rotor_account_status
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`rotor_stations_dashboard`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
rotorStationsDashboard = rotor_stations_dashboard
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`rotor_stations_list`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
rotorStationsList = rotor_stations_list
|
2020-01-22 22:49:53 +09:00
|
|
|
|
#: Псевдоним для :attr:`rotor_station_feedback`
|
|
|
|
|
rotorStationFeedback = rotor_station_feedback
|
|
|
|
|
#: Псевдоним для :attr:`rotor_station_feedback_radio_started`
|
|
|
|
|
rotorStationFeedbackRadioStarted = rotor_station_feedback_radio_started
|
|
|
|
|
#: Псевдоним для :attr:`rotor_station_feedback_track_started`
|
|
|
|
|
rotorStationFeedbackTrackStarted = rotor_station_feedback_track_started
|
2020-01-23 05:41:42 +09:00
|
|
|
|
#: Псевдоним для :attr:`rotor_station_feedback_track_finished`
|
|
|
|
|
rotorStationFeedbackTrackFinished = rotor_station_feedback_track_finished
|
|
|
|
|
#: Псевдоним для :attr:`rotor_station_feedback_skip`
|
|
|
|
|
rotorStationFeedbackSkip = rotor_station_feedback_skip
|
|
|
|
|
#: Псевдоним для :attr:`rotor_station_info`
|
2020-01-22 22:49:53 +09:00
|
|
|
|
rotorStationInfo = rotor_station_info
|
2020-01-23 05:41:42 +09:00
|
|
|
|
#: Псевдоним для :attr:`rotor_station_settings2`
|
|
|
|
|
rotorStationSettings2 = rotor_station_settings2
|
2020-01-22 22:49:53 +09:00
|
|
|
|
#: Псевдоним для :attr:`rotor_station_tracks`
|
|
|
|
|
rotorStationTracks = rotor_station_tracks
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`artists_brief_info`
|
2019-10-19 05:44:17 +09:00
|
|
|
|
artistsBriefInfo = artists_brief_info
|
2019-10-22 00:29:02 +09:00
|
|
|
|
#: Псевдоним для :attr:`artists_tracks`
|
|
|
|
|
artistsTracks = artists_tracks
|
2019-11-20 22:32:54 +09:00
|
|
|
|
#: Псевдоним для :attr:`artists_direct_albums`
|
|
|
|
|
artistsDirectAlbums = artists_direct_albums
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_likes_tracks_add`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersLikesTracksAdd = users_likes_tracks_add
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_likes_tracks_remove`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersLikesTracksRemove = users_likes_tracks_remove
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_likes_artists_add`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersLikesArtistsAdd = users_likes_artists_add
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_likes_artists_remove`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersLikesArtistsRemove = users_likes_artists_remove
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_likes_playlists_add`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersLikesPlaylistsAdd = users_likes_playlists_add
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_likes_playlists_remove`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersLikesPlaylistsRemove = users_likes_playlists_remove
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_likes_albums_add`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersLikesAlbumsAdd = users_likes_albums_add
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_likes_albums_remove`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersLikesAlbumsRemove = users_likes_albums_remove
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`playlists_list`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
playlistsList = playlists_list
|
2020-05-07 17:44:08 +09:00
|
|
|
|
#: Псевдоним для :attr:`playlists_collective_join`
|
|
|
|
|
playlistsCollectiveJoin = playlists_collective_join
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_playlists_list`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersPlaylistsList = users_playlists_list
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_likes_tracks`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersLikesTracks = users_likes_tracks
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_likes_albums`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersLikesAlbums = users_likes_albums
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_likes_artists`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersLikesArtists = users_likes_artists
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_likes_playlists`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersLikesPlaylists = users_likes_playlists
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_dislikes_tracks`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersDislikesTracks = users_dislikes_tracks
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_dislikes_tracks_add`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersDislikesTracksAdd = users_dislikes_tracks_add
|
2019-10-19 17:55:45 +09:00
|
|
|
|
#: Псевдоним для :attr:`users_dislikes_tracks_remove`
|
2019-08-05 05:05:17 +09:00
|
|
|
|
usersDislikesTracksRemove = users_dislikes_tracks_remove
|
2020-01-24 08:18:27 +09:00
|
|
|
|
#: Псевдоним для :attr:`after_track`
|
|
|
|
|
afterTrack = after_track
|
2020-06-20 22:54:46 +09:00
|
|
|
|
#: Псевдоним для :attr:`queues_list`
|
|
|
|
|
queuesList = queues_list
|
|
|
|
|
#: Псевдоним для :attr:`queue_update_position`
|
|
|
|
|
queueUpdatePosition = queue_update_position
|
|
|
|
|
#: Псевдоним для :attr:`queue_create`
|
|
|
|
|
queueCreate = queue_create
|