Перейти к основному содержимому

Audio source

Бот не подключается к голосовому каналу и не работает с медиа сам. Он только даёт ссылку на источник (source_url), а платформа проигрывает её в канале односторонне. Бот не слышит участников — у него физически нет принимающей сессии (см. Voice playback).

Эта страница — про source_url: что туда можно положить и каким требованиям ссылка должна удовлетворять.

Что можно передать в source_url

source_url — это публичная http(s)-ссылка на аудио. Платформа сама скачивает/тянет источник и воспроизводит его в канале.

Трек

Прямая ссылка на аудиофайл (например https://cdn.example.com/track.mp3).

Плейлист

Ссылка на плейлист — последовательное воспроизведение треков.

HLS

Ссылка на HLS-манифест для потокового воспроизведения.

Icecast / поток

Ссылка на Icecast/онлайн-радио — live-поток в канал.

Файл может быть как статическим (трек), так и потоковым (HLS, Icecast) — платформа обрабатывает оба случая.

Требования к ссылке

source_url валидируется так же строго, как webhook-URL: разрешён только публичный http(s). Приватные и локальные адреса (localhost, 127.0.0.1, 10.0.0.0/8, 192.168.0.0/16, link-local и т. п.) отклоняются — это защита от SSRF.

  • Схема — только http или https.
  • Адрес — публично резолвимый. Приватные/локальные хосты и IP → ответ 400.
  • Длина — у source_url есть лимит длины; слишком длинная ссылка → 400.

Бот не знает ничего о голосовом сервере и не передаёт никаких параметров подключения — только ссылку на контент.

Запуск воспроизведения

POST /api/bot/spaces/{space_id}/voice/{channel_id}/play

curl -X POST https://api.reasonspace.ru/api/bot/spaces/{space_id}/voice/{channel_id}/play \
-H "Authorization: Bot bot_..." \
-H "Content-Type: application/json" \
-d '{
"source_url": "https://cdn.example.com/track.mp3",
"loop": false,
"volume": 100
}'
await bot.client.voice_play(
channel_id,
"https://cdn.example.com/track.mp3",
space_id=space_id,
loop=False,
volume=100,
)
{
"session_id": "019c3851-...",
"status": "playing"
}
ПолеТипПо умолчаниюОписание
source_urlstringПубличная http(s)-ссылка на аудио (обязательно)
loopboolfalseЗацикливать источник
volumeint100Громкость воспроизведения (0–100)

Требования: scope voice.publish_audio, channel_idallowed_channel_ids, бот в статусе active.

Зацикливание и громкость

  • loop: true — источник проигрывается заново после окончания (удобно для ambient-петель и фоновой музыки).
  • volume — уровень громкости от 0 до 100; значение по умолчанию 100.
await bot.client.voice_play(
channel_id,
"https://cdn.example.com/ambient-loop.mp3",
space_id=space_id,
loop=True,
volume=60,
)

Остановка

POST /api/bot/spaces/{space_id}/voice/{channel_id}/stop204.

await bot.client.voice_stop(channel_id, space_id=space_id)

Отдельной «тишины» по таймеру реализовывать не нужно — платформа сама держит воспроизведение и останавливает его по stop либо по окончании источника (если loop=false).

Ошибки

КодКогда
400Невалидный или небезопасный source_url (приватный адрес, не http(s), превышен лимит длины)
403Нет scope voice.publish_audio либо voice выключен на сервере
501Voice playback не сконфигурирован на сервере
429Превышен rate-limit

Дальше