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

Нарезка длинных видео на клипы

Длинное видео (стрим, подкаст, вебинар) → готовые вертикальные клипы с субтитрами и постинг-паком. Тот же пайплайн, что в боте и веб-студии: цена считается по факту длительности, при сбое оценка возвращается полностью. Все вызовы — с заголовком X-API-Key: pp_..., кроме скачивания файлов (там сама подписанная ссылка).

Базовый URL: https://api.piratepress.fun/public/v1.

Шаг 1. Оценить ссылку — POST /clips/probe​

curl -X POST https://api.piratepress.fun/public/v1/clips/probe \
-H "X-API-Key: pp_..." \
-H "Content-Type: application/json" \
-d '{"url": "https://youtube.com/watch?v=..."}'
{ "duration_s": 3720.0, "title": "Подкаст про нейросети", "estimated_cost": 240 }

Это оценка: списание при заказе — по ней, а после нарезки считается факт (разница возвращается на баланс или досписывается). Битая, приватная или 18+ ссылка — 422 invalid_params, не 500.

Шаг 2. Заказать нарезку — POST /clips​

Заголовок Idempotency-Key обязателен (без него 400, чужой ключ — 409 idempotency_conflict). Повтор со своим ключом вернёт исходный заказ без повторного списания (200 вместо 201).

curl -X POST https://api.piratepress.fun/public/v1/clips \
-H "X-API-Key: pp_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: clips-order-0001" \
-d '{
"source_url": "https://youtube.com/watch?v=...",
"estimated_seconds": 3720,
"lang": "ru",
"top_n": 5,
"captions": true,
"split_layout": 50,
"split_bottom_preset": "lofi_game",
"banner_asset_id": "ast_...",
"banner_rules": "показать 2 раза подряд с середины, с паузой"
}'

Тело (PublicClipOrderCreate):

ПолеТипПо умолчаниюЧто значит
source_urlstring—Ссылка на видео (http/https, yt-dlp). Ровно один из source_url/source_asset_id обязателен
source_asset_idstring—Источник из медиатеки (id из GET /assets)
estimated_secondsnumber0Подсказка длительности для превью цены (см. probe)
langstring"en"Язык субтитров и метаданных
top_nint 1–50всеСколько лучших клипов вернуть
captionsbooltrueВстроенные субтитры
split_layout0/33/50/600Сплит-вью: % верхнего слота (контент + залипалка снизу)
split_bottom_presetstring—Пресет для низа сплита (id из каталога генератора)
smart_cropboolfalseУмный кроп 3-слота для стримов; требует split_layout: 33
banner_asset_idstring—Готовый офферный баннер (ассет из медиатеки) поверх клипов
banner_rulesstring—Условия показа баннера текстом: тайминги, loops, расписание
uniquifyoff/soft/strong/custom"off"Уникализация клипов (анти-тень): незаметные правки кадра и звука против склейки дублей платформами. Доплата +30 🪙 при любом режиме ≠ off
uniquify_optsobject—Обязателен при custom: тогглы mirror/speed/pitch/zoom/hue/grain (bool)
variantsint 1–51Версий каждого клипа (clip_01.mp4, clip_01_v2.mp4…); +10 🪙 за каждую версию сверх первой
resolutionstring"720x1280"Вертикаль клипов: 720x1280 или 1080x1920
caption_fontstring—Шрифт субтитров: имя пула (montserrat/inter/bebas/oswald/rubik/manrope/golos) или asset:<id> своего шрифта (ассет вида font)
caption_colorstring—Основной цвет субтитров, hex #RRGGBB
caption_hot_colorstring—Цвет текущего слова, hex
caption_highlight_colorstring—Цвет караоке-подсветки, hex
caption_positionstring—top/center/bottom

Не передал caption-поля — применяется стиль аккаунта (шрифт/палитра юзера; у новых аккаунтов он генерируется случайно, чтобы клипы разных пользователей не выглядели штампованными).

Ответ 201:

{ "id": "ord_a1b2c3", "status": "queued", "cost": 240, "eta_seconds": 900 }

Заказ нарезки ест ту же квоту, что и ролики: 10 активных задач на ключ общих на всё (см. Коды ошибок).

Шаг 3. Забрать результат — GET /clips/{id}​

curl https://api.piratepress.fun/public/v1/clips/ord_a1b2c3 \
-H "X-API-Key: pp_..."

По ходу работы в ответе stage/stage_detail («Резка клипов», «3/12»). При status: "done":

{
"id": "ord_a1b2c3",
"status": "done",
"title": "Подкаст про нейросети",
"clips": [
{
"name": "clip_01.mp4",
"title": "Почему нейросети не заменят монтажёра",
"url": "https://api.piratepress.fun/public/v1/clips/files/eyJ...",
"description": "…",
"hashtags": ["нейросети", "подкаст"]
}
],
"zip_url": "https://api.piratepress.fun/public/v1/clips/files/eyJ...",
"estimated_cost": 240,
"actual_cost": 236,
"created_at": "2026-10-19T12:00:00Z",
"finished_at": "2026-10-19T12:20:00Z"
}

Статусы: queued|running|done|error|refunded. При error/refunded оценка возвращена на баланс. Ссылки в url/zip_url — подписанные (HMAC, TTL 7 дней), ключ для скачивания не нужен:

curl -L -o clips.zip "<zip_url>"

Не хочешь поллить — подпишись на clip.done/clip.error: Вебхуки.

Список нарезок — GET /clips​

curl "https://api.piratepress.fun/public/v1/clips?limit=20&offset=0" \
-H "X-API-Key: pp_..."

Новые первыми; в строке: id, статус, title, source_url, is_file, clips_count, cost (факт после done, до — оценка), created_at, error.

AI-баннер для нарезки​

POST /clips/banner — генерирует баннер по описанию (цена как у AI-баннера в генерации: триал/квота adveristor/дублоны):

curl -X POST https://api.piratepress.fun/public/v1/clips/banner \
-H "X-API-Key: pp_..." \
-H "Content-Type: application/json" \
-d '{"prompt": "баннер магазина наушников, неон, тёмный фон", "lang": "ru"}'
# → { "job_id": "ban_...", "cost": 50 }

GET /clips/banner/{job_id} — поллинг: при done в ответе asset_id (ассет появился в медиатеке, его id передавай в banner_asset_id заказа нарезки); при error дублоны рефандятся автоматически. Опционально в теле source_asset_id — пак исходников из медиатеки для VIP-режима на генераторе.

Куда дальше​