From bd8f966e5e7b674d965ab78a76a489d563390104 Mon Sep 17 00:00:00 2001 From: Il`ya Date: Wed, 22 Jan 2020 16:49:53 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=84=D0=B8=D0=B4=D0=B1=D0=B5=D0=BA=D0=B0=20=D0=B2=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B4=D0=B8=D0=BE.=20=D0=94=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1=8F.=20=D0=94=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BD=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D0=B9=20=D1=82=D0=B8=D0=BF=20=D1=84=D0=B8=D0=B4=D0=B1=D0=B5?= =?UTF-8?q?=D0=BA=D0=B0.=20#20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yandex_music/client.py | 130 +++++++++++++++++++++++++++++++---------- 1 file changed, 100 insertions(+), 30 deletions(-) diff --git a/yandex_music/client.py b/yandex_music/client.py index 921f4d7..84158d0 100644 --- a/yandex_music/client.py +++ b/yandex_music/client.py @@ -916,14 +916,41 @@ class Client(YandexMusicObject): return StationResult.de_list(result, self) @log - def rotor_station_genre_feedback(self, genre: str, type_: str, timestamp: int = None, - from_: str = None, batch_id: Union[str, int] = None, - track_id: str = None, timeout: Union[int, float] = None, - *args, **kwargs) -> bool: + 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: float = None, + track_id: Union[str, int] = None, timeout: Union[int, float] = None, + *args, **kwargs) -> bool: + """Отправка ответной реакции на происходящее при прослушивании радио. + + Сообщения о начале прослушивания радио, начале и конце трека, его пропуска. + + Известные типы фидбека: radioStarted, trackStarted, trackFinished, skip + Пример station: user:onyourwave, genre:allrock + Пример from_: mobile-radio-user-123456789 + + Args: + station (:obj:`str`): Станция. + type_ (:obj:`int`): Тип отправляемого фидбека. + timestamp (:obj:`int`): Текущее время и дата. + from_ (:obj:`int`): Откуда начато воспроизведение радио. + batch_id (:obj:`int`): Уникальный идентификатор партии треков. Возвращается при получении треков. + total_played_seconds (:obj:`int`): Сколько было проиграно секунд трека перед действием. + track_id (:obj:`int` | :obj:`str`): Уникальной идентификатор трека. + 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: timestamp = datetime.now().timestamp() - url = f'{self.base_url}/rotor/station/genre:{genre}/feedback' + url = f'{self.base_url}/rotor/station/{station}/feedback' params = {} data = { @@ -931,42 +958,85 @@ class Client(YandexMusicObject): 'timestamp': timestamp } - if batch_id and track_id: - data.update({'trackId': track_id}) + if batch_id: params = {'batch-id': batch_id} + if track_id: + data.update({'trackId': track_id}) + if 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) return result == 'ok' @log - def rotor_station_genre_feedback_radio_started(self, genre: str, from_: str, timestamp: int = None, - timeout: Union[int, float] = None, *args, **kwargs) -> bool: - return self.rotor_station_genre_feedback(genre, 'radioStarted', timestamp, from_, timeout, *args, **kwargs) + def rotor_station_feedback_radio_started(self, station: str, from_: str, batch_id: str = None, + timestamp: Union[str, float, int] = None, + 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 - def rotor_station_genre_feedback_track_started(self, genre: str, track_id: str, batch_id: Union[str, int], - timestamp: int = None, 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) + def rotor_station_feedback_track_started(self, station: str, track_id: Union[str, int], batch_id: str = None, + timestamp: Union[str, float, int] = None, + timeout: Union[int, float] = None, *args, **kwargs) -> bool: + """Сокращение для:: + + 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 - def rotor_station_genre_info(self, genre: str, timeout: Union[int, float] = None, - *args, **kwargs) -> List[StationResult]: - url = f'{self.base_url}/rotor/station/genre:{genre}/info' + 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, + 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]: + url = f'{self.base_url}/rotor/station/{station}/info' result = self._request.get(url, timeout=timeout, *args, **kwargs) return StationResult.de_list(result, self) @log - def rotor_station_genre_tracks(self, genre: str, timeout: Union[int, float] = None, - *args, **kwargs) -> Optional[StationTracksResult]: - url = f'{self.base_url}/rotor/station/genre:{genre}/tracks' + def rotor_station_tracks(self, station: str, timeout: Union[int, float] = None, + *args, **kwargs) -> Optional[StationTracksResult]: + url = f'{self.base_url}/rotor/station/{station}/tracks' result = self._request.get(url, timeout=timeout, *args, **kwargs) @@ -1276,16 +1346,16 @@ class Client(YandexMusicObject): rotorStationsDashboard = rotor_stations_dashboard #: Псевдоним для :attr:`rotor_stations_list` rotorStationsList = rotor_stations_list - #: Псевдоним для :attr:`rotor_station_genre_feedback` - rotorStationGenreFeedback = rotor_station_genre_feedback - #: Псевдоним для :attr:`rotor_station_genre_feedback_radio_started` - rotorStationGenreFeedbackRadioStarted = rotor_station_genre_feedback_radio_started - #: Псевдоним для :attr:`rotor_station_genre_feedback_track_started` - rotorStationGenreFeedbackTrackStarted = rotor_station_genre_feedback_track_started + #: Псевдоним для :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 #: Псевдоним для :attr:`rotor_station_genre_info` - rotorStationGenreInfo = rotor_station_genre_info - #: Псевдоним для :attr:`rotor_station_genre_tracks` - rotorStationGenreTracks = rotor_station_genre_tracks + rotorStationInfo = rotor_station_info + #: Псевдоним для :attr:`rotor_station_tracks` + rotorStationTracks = rotor_station_tracks #: Псевдоним для :attr:`artists_brief_info` artistsBriefInfo = artists_brief_info #: Псевдоним для :attr:`artists_tracks` From bb410d0ca0e4721721d3617545f7e3f826693adc Mon Sep 17 00:00:00 2001 From: Il`ya Date: Wed, 22 Jan 2020 18:08:08 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B0=D1=80=D0=B3=D1=83=D0=BC=D0=B5=D0=BD=D1=82=20?= =?UTF-8?q?=D0=B8=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=85=D0=BE=D0=B4=D0=B0=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D1=86=D0=B5=D0=BF=D0=BE=D1=87=D0=BA=D0=B8=20=D1=82=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2=20=D0=B2=20=D1=80=D0=B0=D0=B4=D0=B8=D0=BE.?= =?UTF-8?q?=20=D0=98=D0=94=20=D1=82=D1=80=D0=B5=D0=BA=D0=B0,=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B8,=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89?= =?UTF-8?q?=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D1=81=20=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=B1=D0=BE=D0=BC=D0=BE=D0=BC.=20=D0=94=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BA=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8E=20=D1=82=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D0=BE=D0=B2.=20#20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yandex_music/client.py | 60 +++++++++++++++++++++++++++++-------- yandex_music/track/track.py | 2 ++ 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/yandex_music/client.py b/yandex_music/client.py index 84158d0..0377c5b 100644 --- a/yandex_music/client.py +++ b/yandex_music/client.py @@ -917,25 +917,26 @@ class Client(YandexMusicObject): @log 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: float = None, + from_: str = None, batch_id: str = None, total_played_seconds: Union[int, float] = None, track_id: Union[str, int] = None, timeout: Union[int, float] = None, *args, **kwargs) -> bool: """Отправка ответной реакции на происходящее при прослушивании радио. Сообщения о начале прослушивания радио, начале и конце трека, его пропуска. - Известные типы фидбека: radioStarted, trackStarted, trackFinished, skip - Пример station: user:onyourwave, genre:allrock - Пример from_: mobile-radio-user-123456789 + Известные типы фидбека: radioStarted, trackStarted, trackFinished, skip. + Пример station: user:onyourwave, genre:allrock. + Пример from_: mobile-radio-user-123456789. Args: station (:obj:`str`): Станция. - type_ (:obj:`int`): Тип отправляемого фидбека. - timestamp (:obj:`int`): Текущее время и дата. - from_ (:obj:`int`): Откуда начато воспроизведение радио. - batch_id (:obj:`int`): Уникальный идентификатор партии треков. Возвращается при получении треков. - total_played_seconds (:obj:`int`): Сколько было проиграно секунд трека перед действием. - track_id (:obj:`int` | :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): Произвольные аргументы (будут переданы в запрос). @@ -1034,11 +1035,44 @@ class Client(YandexMusicObject): return StationResult.de_list(result, self) @log - def rotor_station_tracks(self, station: str, timeout: Union[int, float] = None, - *args, **kwargs) -> Optional[StationTracksResult]: + def rotor_station_tracks(self, station: str, settings2: bool = True, queue: Union[str, int] = None, + timeout: Union[int, float] = None, *args, **kwargs) -> Optional[StationTracksResult]: + """Получение 5 треков определённой станции. + + Для продолжения цепочки треков необходимо: + 1. Передавать ID трека, что был до этого (первый в цепочки). + 2. Отправить фидбек о конче или скипе трека, что был передан в `queue`. + 3. Отправить фидбек о начале следующего трека (второй в цепочки). + 4. Выполнить запрос получения треков. В ответе придёт новые треки или произойдёт сдвиг цепочки на 1 элемент. + + Проход по цепочке до коцна не изучен. Часто встречаются дубликаты. + + 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' - result = self._request.get(url, timeout=timeout, *args, **kwargs) + 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) diff --git a/yandex_music/track/track.py b/yandex_music/track/track.py index fcadae2..48d0306 100644 --- a/yandex_music/track/track.py +++ b/yandex_music/track/track.py @@ -121,6 +121,8 @@ class Track(YandexMusicObject): @property def track_id(self) -> str: + if self.albums: + return f'{self.id}:{self.albums[0].id}' return f'{self.id}' @classmethod From 4ef2c8878d066378c7c1ffbf33e01e320ed33b62 Mon Sep 17 00:00:00 2001 From: Il`ya Date: Wed, 22 Jan 2020 19:43:03 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D1=88=D0=B8=D0=B5?= =?UTF-8?q?=D1=81=D1=8F=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=81=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B4=D0=B8=D0=BE.=20=D0=94=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BA=20=D0=BD?= =?UTF-8?q?=D0=B8=D0=BC=20#20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yandex_music/client.py | 76 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 4 deletions(-) diff --git a/yandex_music/client.py b/yandex_music/client.py index 0377c5b..f22ba1d 100644 --- a/yandex_music/client.py +++ b/yandex_music/client.py @@ -891,6 +891,23 @@ class Client(YandexMusicObject): @log 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' result = self._request.get(url, timeout=timeout, *args, **kwargs) @@ -900,6 +917,21 @@ class Client(YandexMusicObject): @log def rotor_stations_dashboard(self, timeout: Union[int, float] = None, *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' result = self._request.get(url, timeout=timeout, *args, **kwargs) @@ -907,8 +939,26 @@ class Client(YandexMusicObject): return Dashboard.de_json(result, self) @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]: + """Получение всех радиостанций. + + Чтобы определить что за тип станции (жанры, настроения, занятие и т.д.) необходимо смотреть в пол `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' result = self._request.get(url, {'language': language}, timeout=timeout, *args, **kwargs) @@ -924,9 +974,9 @@ class Client(YandexMusicObject): Сообщения о начале прослушивания радио, начале и конце трека, его пропуска. - Известные типы фидбека: radioStarted, trackStarted, trackFinished, skip. - Пример station: user:onyourwave, genre:allrock. - Пример from_: mobile-radio-user-123456789. + Известные типы фидбека: `radioStarted`, `trackStarted`, `trackFinished`, `skip`. + Пример `station`: `user:onyourwave`, `genre:allrock`. + Пример `from_`: `mobile-radio-user-123456789`. Args: station (:obj:`str`): Станция. @@ -1028,6 +1078,22 @@ class Client(YandexMusicObject): @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) @@ -1047,6 +1113,8 @@ class Client(YandexMusicObject): Проход по цепочке до коцна не изучен. Часто встречаются дубликаты. + Все официальные клиенты выполняют запросы с `settings2 = True`. + Args: station (:obj:`str`): Станция. settings2 (:obj:`bool`, optional): Использовать ли второй набор настроек. From 85f935f506419affd488e943cf6057bb209811d4 Mon Sep 17 00:00:00 2001 From: Il`ya Date: Wed, 22 Jan 2020 23:41:42 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BD?= =?UTF-8?q?=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D1=86=D0=B8=D0=B8.=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BF=D0=B2=D1=81=D0=B5=D0=B2=D0=B4?= =?UTF-8?q?=D0=BE=D0=BD=D0=B8=D0=BC=D1=8B=20#20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yandex_music/client.py | 59 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/yandex_music/client.py b/yandex_music/client.py index f22ba1d..37c8692 100644 --- a/yandex_music/client.py +++ b/yandex_music/client.py @@ -941,7 +941,7 @@ class Client(YandexMusicObject): @log def rotor_stations_list(self, language: str = 'ru', timeout: Union[int, float] = None, *args, **kwargs) -> List[StationResult]: - """Получение всех радиостанций. + """Получение всех радиостанций с настройками пользователя. Чтобы определить что за тип станции (жанры, настроения, занятие и т.д.) необходимо смотреть в пол `id_for_from`. @@ -1078,7 +1078,7 @@ class Client(YandexMusicObject): @log def rotor_station_info(self, station: str, timeout: Union[int, float] = None, *args, **kwargs) -> List[StationResult]: - """Получение информации о станции. + """Получение информации о станции и пользовательских настроек на неё. Args: station (:obj:`str`): Станция. @@ -1100,10 +1100,53 @@ class Client(YandexMusicObject): return StationResult.de_list(result, self) + @log + def rotor_station_settings2(self, station: str, mood_energy: str, diversity: str, language: str = 'not-russian', + timeout: Union[int, float] = None, *args, **kwargs) -> bool: + """Изменение настроек определённой станции. + + Доступные значения для `mood_energy`: `fun`, `active`, `calm`, `sad`, `all`. + Доступные значения для `diversity`: `favorite`, `popular`, `discover`, `default`. + Доступные значения для `language`: `not-russian`, `russian`, `any`. + + У станций в `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]: - """Получение 5 треков определённой станции. + """Получение цепочки треков определённой станции. Для продолжения цепочки треков необходимо: 1. Передавать ID трека, что был до этого (первый в цепочки). @@ -1436,6 +1479,8 @@ class Client(YandexMusicObject): usersPlaylistsDelete = users_playlists_delete #: Псевдоним для :attr:`users_playlists_name` usersPlaylistsName = users_playlists_name + #: Псевдоним для :attr:`users_playlists_visibility` + usersPlaylistsVisibility = users_playlists_visibility #: Псевдоним для :attr:`users_playlists_change` usersPlaylistsChange = users_playlists_change #: Псевдоним для :attr:`users_playlists_insert_track` @@ -1454,8 +1499,14 @@ class Client(YandexMusicObject): rotorStationFeedbackRadioStarted = rotor_station_feedback_radio_started #: Псевдоним для :attr:`rotor_station_feedback_track_started` rotorStationFeedbackTrackStarted = rotor_station_feedback_track_started - #: Псевдоним для :attr:`rotor_station_genre_info` + #: Псевдоним для :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` rotorStationInfo = rotor_station_info + #: Псевдоним для :attr:`rotor_station_settings2` + rotorStationSettings2 = rotor_station_settings2 #: Псевдоним для :attr:`rotor_station_tracks` rotorStationTracks = rotor_station_tracks #: Псевдоним для :attr:`artists_brief_info`