コミット
5a1f982eb0
|
@ -891,6 +891,23 @@ class Client(YandexMusicObject):
|
||||||
|
|
||||||
@log
|
@log
|
||||||
def rotor_account_status(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Status]:
|
def rotor_account_status(self, timeout: Union[int, float] = None, *args, **kwargs) -> Optional[Status]:
|
||||||
|
"""Получение статуса пользователя с дополнителньыми полями.
|
||||||
|
|
||||||
|
Данный статус отличается от обычного наличием дополнительных полей, например, `skips_per_hour`.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
|
||||||
|
ответа от сервера вместо указанного при создании пула.
|
||||||
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
:obj:`yandex_music.Status`: Объекта класса :class:`yandex_music.Status`
|
||||||
|
представляющий статус пользователя с дополнительными полями от радио, иначе :obj:`None`.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
:class:`yandex_music.YandexMusicError`
|
||||||
|
"""
|
||||||
|
|
||||||
url = f'{self.base_url}/rotor/account/status'
|
url = f'{self.base_url}/rotor/account/status'
|
||||||
|
|
||||||
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
||||||
|
@ -900,6 +917,21 @@ class Client(YandexMusicObject):
|
||||||
@log
|
@log
|
||||||
def rotor_stations_dashboard(self, timeout: Union[int, float] = None,
|
def rotor_stations_dashboard(self, timeout: Union[int, float] = None,
|
||||||
*args, **kwargs) -> Optional[Dashboard]:
|
*args, **kwargs) -> Optional[Dashboard]:
|
||||||
|
"""Получение рекомендованных станций текущего пользователя.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
|
||||||
|
ответа от сервера вместо указанного при создании пула.
|
||||||
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
:obj:`yandex_music.Dashboard`: Объекта класса :class:`yandex_music.Dashboard`
|
||||||
|
представляющий рекомендованные станции, иначе :obj:`None`.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
:class:`yandex_music.YandexMusicError`
|
||||||
|
"""
|
||||||
|
|
||||||
url = f'{self.base_url}/rotor/stations/dashboard'
|
url = f'{self.base_url}/rotor/stations/dashboard'
|
||||||
|
|
||||||
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
||||||
|
@ -907,8 +939,26 @@ class Client(YandexMusicObject):
|
||||||
return Dashboard.de_json(result, self)
|
return Dashboard.de_json(result, self)
|
||||||
|
|
||||||
@log
|
@log
|
||||||
def rotor_stations_list(self, language: str = 'en', timeout: Union[int, float] = None,
|
def rotor_stations_list(self, language: str = 'ru', timeout: Union[int, float] = None,
|
||||||
*args, **kwargs) -> List[StationResult]:
|
*args, **kwargs) -> List[StationResult]:
|
||||||
|
"""Получение всех радиостанций с настройками пользователя.
|
||||||
|
|
||||||
|
Чтобы определить что за тип станции (жанры, настроения, занятие и т.д.) необходимо смотреть в пол `id_for_from`.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
language (:obj:`str`): Язык, на котором будет информация о станциях.
|
||||||
|
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
|
||||||
|
ответа от сервера вместо указанного при создании пула.
|
||||||
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
:obj:`list` из :obj:`yandex_music.StationResult`: Список объектов класса :class:`yandex_music.StationResult`
|
||||||
|
представляющих станцию, иначе :obj:`None`.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
:class:`yandex_music.YandexMusicError`
|
||||||
|
"""
|
||||||
|
|
||||||
url = f'{self.base_url}/rotor/stations/list'
|
url = f'{self.base_url}/rotor/stations/list'
|
||||||
|
|
||||||
result = self._request.get(url, {'language': language}, timeout=timeout, *args, **kwargs)
|
result = self._request.get(url, {'language': language}, timeout=timeout, *args, **kwargs)
|
||||||
|
@ -916,14 +966,42 @@ class Client(YandexMusicObject):
|
||||||
return StationResult.de_list(result, self)
|
return StationResult.de_list(result, self)
|
||||||
|
|
||||||
@log
|
@log
|
||||||
def rotor_station_genre_feedback(self, genre: str, type_: str, timestamp: int = None,
|
def rotor_station_feedback(self, station: str, type_: str, timestamp: Union[str, float, int] = None,
|
||||||
from_: str = None, batch_id: Union[str, int] = None,
|
from_: str = None, batch_id: str = None, total_played_seconds: Union[int, float] = None,
|
||||||
track_id: str = None, timeout: Union[int, float] = None,
|
track_id: Union[str, int] = None, timeout: Union[int, float] = None,
|
||||||
*args, **kwargs) -> bool:
|
*args, **kwargs) -> bool:
|
||||||
|
"""Отправка ответной реакции на происходящее при прослушивании радио.
|
||||||
|
|
||||||
|
Сообщения о начале прослушивания радио, начале и конце трека, его пропуска.
|
||||||
|
|
||||||
|
Известные типы фидбека: `radioStarted`, `trackStarted`, `trackFinished`, `skip`.
|
||||||
|
Пример `station`: `user:onyourwave`, `genre:allrock`.
|
||||||
|
Пример `from_`: `mobile-radio-user-123456789`.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
station (:obj:`str`): Станция.
|
||||||
|
type_ (:obj:`str`): Тип отправляемого фидбека.
|
||||||
|
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): Уникальной идентификатор трека.
|
||||||
|
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
|
||||||
|
ответа от сервера вместо указанного при создании пула.
|
||||||
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
:class:`yandex_music.YandexMusicError`
|
||||||
|
"""
|
||||||
|
|
||||||
if timestamp is None:
|
if timestamp is None:
|
||||||
timestamp = datetime.now().timestamp()
|
timestamp = datetime.now().timestamp()
|
||||||
|
|
||||||
url = f'{self.base_url}/rotor/station/genre:{genre}/feedback'
|
url = f'{self.base_url}/rotor/station/{station}/feedback'
|
||||||
|
|
||||||
params = {}
|
params = {}
|
||||||
data = {
|
data = {
|
||||||
|
@ -931,44 +1009,181 @@ class Client(YandexMusicObject):
|
||||||
'timestamp': timestamp
|
'timestamp': timestamp
|
||||||
}
|
}
|
||||||
|
|
||||||
if batch_id and track_id:
|
if batch_id:
|
||||||
data.update({'trackId': track_id})
|
|
||||||
params = {'batch-id': batch_id}
|
params = {'batch-id': batch_id}
|
||||||
|
|
||||||
|
if track_id:
|
||||||
|
data.update({'trackId': track_id})
|
||||||
|
|
||||||
if from_:
|
if from_:
|
||||||
data.update({'from': from_})
|
data.update({'from': from_})
|
||||||
|
|
||||||
|
if total_played_seconds:
|
||||||
|
data.update({'totalPlayedSeconds': total_played_seconds})
|
||||||
|
|
||||||
result = self._request.post(url, params=params, json=data, timeout=timeout, *args, **kwargs)
|
result = self._request.post(url, params=params, json=data, timeout=timeout, *args, **kwargs)
|
||||||
|
|
||||||
return result == 'ok'
|
return result == 'ok'
|
||||||
|
|
||||||
@log
|
@log
|
||||||
def rotor_station_genre_feedback_radio_started(self, genre: str, from_: str, timestamp: int = None,
|
def rotor_station_feedback_radio_started(self, station: str, from_: str, batch_id: str = None,
|
||||||
timeout: Union[int, float] = None, *args, **kwargs) -> bool:
|
timestamp: Union[str, float, int] = None,
|
||||||
return self.rotor_station_genre_feedback(genre, 'radioStarted', timestamp, from_, timeout, *args, **kwargs)
|
timeout: Union[int, float] = None, *args, **kwargs) -> bool:
|
||||||
|
"""Сокращение для::
|
||||||
|
|
||||||
|
client.rotor_station_feedback(station, 'radioStarted', timestamp, from, *args, **kwargs)
|
||||||
|
"""
|
||||||
|
return self.rotor_station_feedback(station, 'radioStarted', timestamp, from_=from_, batch_id=batch_id,
|
||||||
|
timeout=timeout, *args, **kwargs)
|
||||||
|
|
||||||
@log
|
@log
|
||||||
def rotor_station_genre_feedback_track_started(self, genre: str, track_id: str, batch_id: Union[str, int],
|
def rotor_station_feedback_track_started(self, station: str, track_id: Union[str, int], batch_id: str = None,
|
||||||
timestamp: int = None, timeout: Union[int, float] = None,
|
timestamp: Union[str, float, int] = None,
|
||||||
*args, **kwargs) -> bool:
|
timeout: Union[int, float] = None, *args, **kwargs) -> bool:
|
||||||
return self.rotor_station_genre_feedback(genre, 'trackStarted', timestamp, track_id=track_id, batch_id=batch_id,
|
"""Сокращение для::
|
||||||
timeout=timeout, *args, **kwargs)
|
|
||||||
|
client.rotor_station_feedback(station, 'trackStarted', timestamp, track_id, *args, **kwargs)
|
||||||
|
"""
|
||||||
|
return self.rotor_station_feedback(station, 'trackStarted', timestamp, track_id=track_id, batch_id=batch_id,
|
||||||
|
timeout=timeout, *args, **kwargs)
|
||||||
|
|
||||||
@log
|
@log
|
||||||
def rotor_station_genre_info(self, genre: str, timeout: Union[int, float] = None,
|
def rotor_station_feedback_track_finished(self, station: str, track_id: Union[str, int],
|
||||||
*args, **kwargs) -> List[StationResult]:
|
total_played_seconds: float, batch_id: str = None,
|
||||||
url = f'{self.base_url}/rotor/station/genre:{genre}/info'
|
timestamp: Union[str, float, int] = None,
|
||||||
|
timeout: Union[int, float] = None, *args, **kwargs) -> bool:
|
||||||
|
"""Сокращение для::
|
||||||
|
|
||||||
|
client.rotor_station_feedback(station, 'trackFinished', timestamp, track_id, total_played_seconds,
|
||||||
|
*args, **kwargs)
|
||||||
|
"""
|
||||||
|
return self.rotor_station_feedback(station, 'trackFinished', timestamp, track_id=track_id,
|
||||||
|
total_played_seconds=total_played_seconds, batch_id=batch_id,
|
||||||
|
timeout=timeout, *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,
|
||||||
|
timeout: Union[int, float] = None, *args, **kwargs) -> bool:
|
||||||
|
"""Сокращение для::
|
||||||
|
|
||||||
|
client.rotor_station_feedback(station, 'skip', timestamp, track_id, total_played_seconds,
|
||||||
|
*args, **kwargs)
|
||||||
|
"""
|
||||||
|
return self.rotor_station_feedback(station, 'skip', timestamp, track_id=track_id,
|
||||||
|
total_played_seconds=total_played_seconds, batch_id=batch_id,
|
||||||
|
timeout=timeout, *args, **kwargs)
|
||||||
|
|
||||||
|
@log
|
||||||
|
def rotor_station_info(self, station: str, timeout: Union[int, float] = None,
|
||||||
|
*args, **kwargs) -> List[StationResult]:
|
||||||
|
"""Получение информации о станции и пользовательских настроек на неё.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
station (:obj:`str`): Станция.
|
||||||
|
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
|
||||||
|
ответа от сервера вместо указанного при создании пула.
|
||||||
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
:obj:`list` из :obj:`yandex_music.StationResult`: Список из одного объекта класса
|
||||||
|
:class:`yandex_music.StationResult` представляющего информацию о станции, иначе :obj:`None`.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
:class:`yandex_music.YandexMusicError`
|
||||||
|
"""
|
||||||
|
|
||||||
|
url = f'{self.base_url}/rotor/station/{station}/info'
|
||||||
|
|
||||||
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
||||||
|
|
||||||
return StationResult.de_list(result, self)
|
return StationResult.de_list(result, self)
|
||||||
|
|
||||||
@log
|
@log
|
||||||
def rotor_station_genre_tracks(self, genre: str, timeout: Union[int, float] = None,
|
def rotor_station_settings2(self, station: str, mood_energy: str, diversity: str, language: str = 'not-russian',
|
||||||
*args, **kwargs) -> Optional[StationTracksResult]:
|
timeout: Union[int, float] = None, *args, **kwargs) -> bool:
|
||||||
url = f'{self.base_url}/rotor/station/genre:{genre}/tracks'
|
"""Изменение настроек определённой станции.
|
||||||
|
|
||||||
result = self._request.get(url, timeout=timeout, *args, **kwargs)
|
Доступные значения для `mood_energy`: `fun`, `active`, `calm`, `sad`, `all`.
|
||||||
|
Доступные значения для `diversity`: `favorite`, `popular`, `discover`, `default`.
|
||||||
|
Доступные значения для `language`: `not-russian`, `russian`, `any`.
|
||||||
|
|
||||||
|
У станций в `restrictions` есть Enum'ы, а в них `possible_values` - доступные значения для поля.
|
||||||
|
|
||||||
|
Не некоторых аккаунтах не меняется язык...
|
||||||
|
|
||||||
|
Args:
|
||||||
|
station (:obj:`str`): Станция.
|
||||||
|
mood_energy (:obj:`str`): Настроение.
|
||||||
|
diversity (:obj:`str`): Треки.
|
||||||
|
language (:obj:`str`): Язык.
|
||||||
|
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
|
||||||
|
ответа от сервера вместо указанного при создании пула.
|
||||||
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
:obj:`bool`: :obj:`True` при успешном выполнении запроса, иначе :obj:`False`.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
:class:`yandex_music.YandexMusicError`
|
||||||
|
"""
|
||||||
|
|
||||||
|
url = f'{self.base_url}/rotor/station/{station}/settings2'
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'moodEnergy': mood_energy,
|
||||||
|
'diversity': diversity
|
||||||
|
}
|
||||||
|
|
||||||
|
if language:
|
||||||
|
data.update({'language': language})
|
||||||
|
|
||||||
|
result = self._request.post(url, json=data, timeout=timeout, *args, **kwargs)
|
||||||
|
|
||||||
|
return result == 'ok'
|
||||||
|
|
||||||
|
@log
|
||||||
|
def rotor_station_tracks(self, station: str, settings2: bool = True, queue: Union[str, int] = None,
|
||||||
|
timeout: Union[int, float] = None, *args, **kwargs) -> Optional[StationTracksResult]:
|
||||||
|
"""Получение цепочки треков определённой станции.
|
||||||
|
|
||||||
|
Для продолжения цепочки треков необходимо:
|
||||||
|
1. Передавать ID трека, что был до этого (первый в цепочки).
|
||||||
|
2. Отправить фидбек о конче или скипе трека, что был передан в `queue`.
|
||||||
|
3. Отправить фидбек о начале следующего трека (второй в цепочки).
|
||||||
|
4. Выполнить запрос получения треков. В ответе придёт новые треки или произойдёт сдвиг цепочки на 1 элемент.
|
||||||
|
|
||||||
|
Проход по цепочке до коцна не изучен. Часто встречаются дубликаты.
|
||||||
|
|
||||||
|
Все официальные клиенты выполняют запросы с `settings2 = True`.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
station (:obj:`str`): Станция.
|
||||||
|
settings2 (:obj:`bool`, optional): Использовать ли второй набор настроек.
|
||||||
|
queue (:obj:`str` | :obj:`int` , optional): Уникальной идентификатор трека, который только что был.
|
||||||
|
timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания
|
||||||
|
ответа от сервера вместо указанного при создании пула.
|
||||||
|
**kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос).
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
:obj:`yandex_music.StationTracksResult`: Объекта класса :class:`yandex_music.StationTracksResult`
|
||||||
|
представляющий последовательность треков станции, иначе :obj:`None`.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
:class:`yandex_music.YandexMusicError`
|
||||||
|
"""
|
||||||
|
|
||||||
|
url = f'{self.base_url}/rotor/station/{station}/tracks'
|
||||||
|
|
||||||
|
params = {}
|
||||||
|
if settings2:
|
||||||
|
params = {'settings2': True}
|
||||||
|
|
||||||
|
if queue:
|
||||||
|
params = {'queue': queue}
|
||||||
|
|
||||||
|
result = self._request.get(url, params=params, timeout=timeout, *args, **kwargs)
|
||||||
|
|
||||||
return StationTracksResult.de_json(result, self)
|
return StationTracksResult.de_json(result, self)
|
||||||
|
|
||||||
|
@ -1264,6 +1479,8 @@ class Client(YandexMusicObject):
|
||||||
usersPlaylistsDelete = users_playlists_delete
|
usersPlaylistsDelete = users_playlists_delete
|
||||||
#: Псевдоним для :attr:`users_playlists_name`
|
#: Псевдоним для :attr:`users_playlists_name`
|
||||||
usersPlaylistsName = users_playlists_name
|
usersPlaylistsName = users_playlists_name
|
||||||
|
#: Псевдоним для :attr:`users_playlists_visibility`
|
||||||
|
usersPlaylistsVisibility = users_playlists_visibility
|
||||||
#: Псевдоним для :attr:`users_playlists_change`
|
#: Псевдоним для :attr:`users_playlists_change`
|
||||||
usersPlaylistsChange = users_playlists_change
|
usersPlaylistsChange = users_playlists_change
|
||||||
#: Псевдоним для :attr:`users_playlists_insert_track`
|
#: Псевдоним для :attr:`users_playlists_insert_track`
|
||||||
|
@ -1276,16 +1493,22 @@ class Client(YandexMusicObject):
|
||||||
rotorStationsDashboard = rotor_stations_dashboard
|
rotorStationsDashboard = rotor_stations_dashboard
|
||||||
#: Псевдоним для :attr:`rotor_stations_list`
|
#: Псевдоним для :attr:`rotor_stations_list`
|
||||||
rotorStationsList = rotor_stations_list
|
rotorStationsList = rotor_stations_list
|
||||||
#: Псевдоним для :attr:`rotor_station_genre_feedback`
|
#: Псевдоним для :attr:`rotor_station_feedback`
|
||||||
rotorStationGenreFeedback = rotor_station_genre_feedback
|
rotorStationFeedback = rotor_station_feedback
|
||||||
#: Псевдоним для :attr:`rotor_station_genre_feedback_radio_started`
|
#: Псевдоним для :attr:`rotor_station_feedback_radio_started`
|
||||||
rotorStationGenreFeedbackRadioStarted = rotor_station_genre_feedback_radio_started
|
rotorStationFeedbackRadioStarted = rotor_station_feedback_radio_started
|
||||||
#: Псевдоним для :attr:`rotor_station_genre_feedback_track_started`
|
#: Псевдоним для :attr:`rotor_station_feedback_track_started`
|
||||||
rotorStationGenreFeedbackTrackStarted = rotor_station_genre_feedback_track_started
|
rotorStationFeedbackTrackStarted = rotor_station_feedback_track_started
|
||||||
#: Псевдоним для :attr:`rotor_station_genre_info`
|
#: Псевдоним для :attr:`rotor_station_feedback_track_finished`
|
||||||
rotorStationGenreInfo = rotor_station_genre_info
|
rotorStationFeedbackTrackFinished = rotor_station_feedback_track_finished
|
||||||
#: Псевдоним для :attr:`rotor_station_genre_tracks`
|
#: Псевдоним для :attr:`rotor_station_feedback_skip`
|
||||||
rotorStationGenreTracks = rotor_station_genre_tracks
|
rotorStationFeedbackSkip = rotor_station_feedback_skip
|
||||||
|
#: Псевдоним для :attr:`rotor_station_info`
|
||||||
|
rotorStationInfo = rotor_station_info
|
||||||
|
#: Псевдоним для :attr:`rotor_station_settings2`
|
||||||
|
rotorStationSettings2 = rotor_station_settings2
|
||||||
|
#: Псевдоним для :attr:`rotor_station_tracks`
|
||||||
|
rotorStationTracks = rotor_station_tracks
|
||||||
#: Псевдоним для :attr:`artists_brief_info`
|
#: Псевдоним для :attr:`artists_brief_info`
|
||||||
artistsBriefInfo = artists_brief_info
|
artistsBriefInfo = artists_brief_info
|
||||||
#: Псевдоним для :attr:`artists_tracks`
|
#: Псевдоним для :attr:`artists_tracks`
|
||||||
|
|
|
@ -121,6 +121,8 @@ class Track(YandexMusicObject):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def track_id(self) -> str:
|
def track_id(self) -> str:
|
||||||
|
if self.albums:
|
||||||
|
return f'{self.id}:{self.albums[0].id}'
|
||||||
return f'{self.id}'
|
return f'{self.id}'
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
読み込み中…
新しいイシューから参照