📻 Радио
Радио (внутреннее название rotor) представляет собой бесконечный поток треков, который подбирается под пользователя и уточняется по ходу прослушивания. Сюда относятся «Моя волна», волны по занятиям и настроению, потоки по жанру, исполнителю, альбому или треку, а также генеративные станции с музыкой от нейросети.
Сиды и волны
Любая волна описывается набором сидов, строк вида тип:тег:
Сид |
Что играет |
|---|---|
|
Моя волна |
|
Волна по занятию или настроению |
|
Поток по жанру |
|
Поток по исполнителю, альбому или треку |
|
Настройки волны: характер, язык, настроение |
Сиды можно комбинировать: ['user:onyourwave', 'settingDiversity:discover'] даёт «Моя волна» только с незнакомыми треками.
Доступные занятия и значения настроек возвращает rotor_wave_settings. У каждого значения настройки есть готовый сид в поле serialized_seed:
settings = client.rotor_wave_settings()
for block in settings.blocks:
for station in block.items:
print(station.name, f'{station.id.type}:{station.id.tag}') # Просыпаюсь activity:wake-up
for value in settings.setting_restrictions.diversity.possible_values:
print(value.name, value.serialized_seed) # Незнакомое settingDiversity:discover
Сессии радио
Сессия является актуальным способом слушать радио, им пользуются приложения Яндекс Музыки. Сессия создаётся по сидам, выдаёт треки партиями и принимает обратную связь о прослушивании, по которой подбирает следующие треки.
session = client.rotor_session_new(['user:onyourwave'])
client.rotor_session_feedback_radio_started(session.radio_session_id, session.batch_id)
played = []
for item in session.sequence:
track = item.track
played.append(track.track_id)
client.rotor_session_feedback_track_started(session.radio_session_id, track.id, session.batch_id)
# ... воспроизведение трека ...
client.rotor_session_feedback_track_finished(
session.radio_session_id, track.id, track.duration_ms / 1000, session.batch_id
)
# Следующая партия: передайте уже сыгранные треки, чтобы они не повторились
more = client.rotor_session_tracks(session.radio_session_id, queue=played)
Полный интерактивный пример с воспроизведением: консольное радио «Моя волна».
Обратная связь
Для частых событий есть отдельные методы: rotor_session_feedback_radio_started, ..._track_started, ..._track_finished и ..._skip. Остальные события отправляются через rotor_session_feedback с моделью yandex_music.SessionEvent:
from yandex_music import SessionEvent, SessionPlayable
event = SessionEvent('like', '2024-01-01T12:00:00.000Z', track_id='12345')
client.rotor_session_feedback(session.radio_session_id, event, session.batch_id)
# События playableItem* описывают проигрываемый объект: трек или клип
event = SessionEvent('playableItemStarted', '2024-01-01T12:00:00.000Z', playable=SessionPlayable('clip', id='12345'))
client.rotor_session_feedback(session.radio_session_id, event)
Обязательные поля зависят от типа события:
События |
Обязательные поля, кроме |
|---|---|
|
нет |
|
|
|
|
|
|
|
|
Note
События like и dislike влияют только на рекомендации в текущей сессии и не меняют коллекцию пользователя. Чтобы трек попал в «Мне нравится», используйте users_likes_tracks_add.
Время события передавайте строкой в формате ISO 8601 (2024-01-01T12:00:00.000Z). Методы-сокращения подставляют текущее время сами.
Несколько событий можно отправить одним запросом: rotor_session_feedbacks для одной сессии и rotor_sessions_feedbacks сразу для нескольких. Обратную связь можно передать и вместе с запросом следующей партии: параметр feedbacks у rotor_session_tracks.
Последняя волна
rotor_wave_last возвращает волну, которую пользователь запускал последней (она обновляется при создании сессии), а rotor_wave_last_reset сбрасывает её на «Мою волну».
Комбинированные сессии
Комбинированная сессия смешивает треки и клипы (например, подборка «Время клипов»). Витрину возвращает rotor_combined_session_landing, сессию создаёт rotor_combined_session_new:
landing = client.rotor_combined_session_landing(['CLIP', 'TRACK'])
for item in landing.list:
print(item.type, item.data.title) # CLIP Pieces
Генеративные станции
Генеративные станции (generative:focus, generative:energy, generative:calm, generative:relax) играют бесконечный поток музыки, созданной нейросетью. Вместо треков у них один аудиопоток:
stream = client.rotor_station_stream('generative:focus')
print(stream.data.title, stream.stream.url) # Вдохновение https://...
state = client.rotor_station_stream_feedback('generative:focus', 'streamPlay', stream.stream.id)
print(state.not_paused) # True
Известные типы обратной связи генеративных станций: streamStarted, streamPlay, streamPause.
Станции (устаревший интерфейс)
До появления сессий радио работало через станции: rotor_station_tracks выдаёт партию треков, а rotor_station_feedback принимает обратную связь. Этот интерфейс по-прежнему работает, но для нового кода лучше использовать сессии: ответ станции уже содержит идентификатор сессии (radio_session_id), а новые возможности (события playableItem*, комбинированные сессии) доступны только в сессиях.
Интерфейс станций остаётся полезным для получения информации о станциях: rotor_stations_list, rotor_stations_dashboard, rotor_station_info и сохранённых настроек волны rotor_station_settings2.
Справочник
rotor_session_new, rotor_session_tracks, rotor_session_clone, rotor_session_feedback, rotor_session_feedbacks, rotor_sessions_feedbacks, rotor_combined_session_new, rotor_combined_session_next, rotor_combined_session_landing
rotor_wave_last, rotor_wave_last_reset, rotor_wave_settings
rotor_stations_list, rotor_stations_dashboard, rotor_station_info, rotor_station_tracks, rotor_station_feedback, rotor_station_settings2, rotor_station_stream, rotor_station_stream_feedback, rotor_account_status
RotorSession, RotorSessionTracks, SessionEvent, SessionFeedback, CombinedSession, GenerativeStream, Station, Sequence и другие