📻 Радио

Радио (внутреннее название rotor) представляет собой бесконечный поток треков, который подбирается под пользователя и уточняется по ходу прослушивания. Сюда относятся «Моя волна», волны по занятиям и настроению, потоки по жанру, исполнителю, альбому или треку, а также генеративные станции с музыкой от нейросети.

Сиды и волны

Любая волна описывается набором сидов, строк вида тип:тег:

Сид

Что играет

user:onyourwave

Моя волна

activity:wake-up, mood:sad

Волна по занятию или настроению

genre:rock

Поток по жанру

artist:12345, album:12345, track:12345

Поток по исполнителю, альбому или треку

settingDiversity:discover, settingLanguage:russian

Настройки волны: характер, язык, настроение

Сиды можно комбинировать: ['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)

Обязательные поля зависят от типа события:

События

Обязательные поля, кроме timestamp

radioStarted, combinedQueueStarted, ad

нет

trackStarted, like, unlike, undislike

track_id

trackFinished, skip, dislike

track_id, total_played_seconds

playableItemStarted, playableItemLike, playableItemUnlike, playableItemUndislike

playable

playableItemFinished, playableItemSkip, playableItemDislike

playable, total_played_seconds

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 и другие

Радио