Графики онлайна
Создание, правка и удаление графиков, генерация кривой и расчёт онлайна.
График онлайна задаёт, сколько зрителей держать в каждую минуту эфира. Кривая хранится в процентах от числа зрителей запуска, поэтому один график подходит каналам разного размера. Назначается график каналу в его настройках.
Читать графики может любой ключ. Создавать, менять и удалять их — ключ с правом channels.
Как устроена кривая
| Поле | Что задаёт |
|---|---|
duration_minutes | Длина кривой, минуты от старта графика: от 30 до 1440 |
points | Точки: минута и доля от числа зрителей запуска, %. Первая точка — на минуте 0, минуты по возрастанию, последняя — не позже duration_minutes. Между точками кривая плавная; после последней точки до конца кривой держится её значение |
after_end | Что после конца кривой, если эфир идёт: hold — держать последнее значение; decay — плавно снизить до нуля и снять зрителей до следующего эфира |
decay_minutes | За сколько минут снижать до нуля при decay: от 1 до 360 |
channel_ids | Каналы, которым график назначен. Только в ответе |
Отсчёт идёт от старта зрителей, а не от начала эфира. График, назначенный во время эфира, начинает отсчёт с момента назначения.
Число зрителей не поднимается выше числа зрителей запуска: 100% — это ровно run.viewers. Доля округляется вверх до целого потока зрителей, поэтому при небольшом запуске соседние доли дают одно и то же число.
Создать
Точками:
/graphscurl https://api.skystream.su/app/v1/graphs \ -X POST \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Вечерний эфир", "duration_minutes": 240, "points": [ { "minute": 0, "percent": 40 }, { "minute": 30, "percent": 80 }, { "minute": 90, "percent": 100 }, { "minute": 180, "percent": 100 }, { "minute": 240, "percent": 70 } ], "after_end": "decay", "decay_minutes": 30 }'API_KEYИли генерацией — как кнопка «Сгенерировать» в панели:
/graphscurl https://api.skystream.su/app/v1/graphs \ -X POST \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Сгенерированный", "duration_minutes": 180, "generate": { "average_percent": 60, "ramp_minutes": 15, "smoothing": "high", "seed": 42 } }'API_KEYПоле generate | Что задаёт |
|---|---|
average_percent | Средний уровень кривой, %: от 3 до 98 |
ramp_minutes | За сколько минут онлайн поднимается с нуля до рабочего уровня. 0 — сразу. Не больше половины длины кривой и не больше 120 |
smoothing | high — почти чистая форма, medium — живая кривая с одним провалом, low — заметные колебания и два провала |
seed | Зерно случайности: с тем же seed и параметрами получается та же кривая. Без него — каждый раз новая |
Ответ — созданный график с точками; сгенерированную кривую можно поправить точками в PATCH /graphs/{id}. Передавать points и generate вместе нельзя.
Значения за границами отклоняются с ошибкой parameter_invalid, где param указывает поле, а не поджимаются молча: сохраняется ровно то, что передано. Сколько графиков можно создать — max_graphs в GET /account; сверх этого создание отклоняется с ошибкой graph_limit_reached.
Изменить
PATCH /graphs/{id} меняет только переданные поля:
/graphs/gr_3curl https://api.skystream.su/app/v1/graphs/gr_3 \ -X PATCH \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Вечер пятницы", "after_end": "hold" }'API_KEYКривая заменяется целиком — новыми points или generate. Если кривую не передать, она остаётся прежней, и тогда новая duration_minutes не может быть короче её последней точки.
Правка сразу доходит до каналов из channel_ids: идущие на них запуски ведут онлайн по новой кривой со следующей минуты, отсчёт от старта графика не сбрасывается. Поэтому менять графики может только ключ с правом channels, даже если у него нет права viewers.
Удалить
/graphs/gr_5curl https://api.skystream.su/app/v1/graphs/gr_5 \ -X DELETE \ -H "Authorization: Bearer $API_KEY"API_KEYГрафик, назначенный каналам, без force=true не удаляется: ответ — 409 graph_in_use, и ничего не меняется. С force=true назначения снимаются, и каналы, в том числе с идущими запусками, возвращаются к обычным настройкам онлайна — разгону и плавающему онлайну:
/graphs/gr_3?force=truecurl "https://api.skystream.su/app/v1/graphs/gr_3?force=true" \ -X DELETE \ -H "Authorization: Bearer $API_KEY"API_KEYВ ответе unassigned_channel_ids — каналы, с которых график снят.
Рассчитать онлайн
GET /graphs/{id}/preview считает, сколько зрителей будет держаться по минутам, если на канале с этим графиком идёт запуск на viewers зрителей:
/graphs/gr_3/preview?viewers=150&step_minutes=30curl "https://api.skystream.su/app/v1/graphs/gr_3/preview?viewers=150&step_minutes=30" \ -H "Authorization: Bearer $API_KEY"API_KEYРасчёт идёт по той же кривой и с тем же округлением до потоков, что у сервиса запусков. step_minutes — шаг отсчётов, от 1 до 60, по умолчанию 1; последняя минута в ответе есть всегда. platform — площадка канала, по умолчанию twitch: на старте Twitch поднимает не меньше одного потока зрителей, Kick — не меньше одного зрителя.
ends_at_minute — минута, на которой зрители снимаются до следующего эфира:
- доиграл спад после конца кривой (
after_end: decay); - кривая опустилась так низко, что от
viewersне остаётся ни одного зрителя.
Второе важно для небольших запусков: точка с малой долей посреди кривой у запуска на 40 зрителей — это ноль зрителей, и на этой минуте зрители снимутся до конца эфира. Проверьте график расчётом с числом зрителей вашего запуска. Если ends_at_minute раньше, чем вы ждёте, поднимите низкие точки кривой.
Нулевая минута — старт, она так не проверяется: кривая, начатая с 0%, поднимает на старте минимум и растёт дальше. Но график, назначенный посреди эфира, отсчитывается с момента назначения, и его нулевая минута проверяется сразу: если она даёт ноль зрителей, зрители снимутся в момент назначения.
Расчёт приблизительный: мелкие отклонения от цели сервис запусков не исправляет, чтобы не дёргать зрителей каждую минуту.
Ошибки
| Код | Когда |
|---|---|
resource_missing | Графика нет, он чужой или идентификатор не того вида |
parameter_invalid | Значение за границами, точки не по порядку, точка за концом кривой, points и generate вместе |
graph_limit_reached | Создано наибольшее число графиков |
graph_in_use | Удаление назначенного каналам графика без force=true |