INFRA Factoryaimediaproduction.ru185.178.46.187 | VPS Backend:3001 | ?72.56.113.83

CREATIVE BRIEF

Техническое задание на генерацию уникальных видеороликов

Параметры
Структура
Ассеты
Сводка

Быстрые пресеты

🎵
TikTok 15s
Hook 3s + 3 mid + CTA 2s
📱
Reels 30s
Hook 5s + 6 mid + CTA 3s
▶️
Shorts 60s
Hook 5s + 12 mid + CTA 5s
🛠️
Кастом
Настроить вручную

1 Основные параметры

10s30s60s90s
2s5s8s
21020
135
2s5s8s

🎬 Визуальная структура ролика

0:00 0:30
4s
Hook
23s
Mid (6 шотов × 3.8s)
3s
CTA

📊 Объём генерации

10 000
итого роликов
100 мастеров × 100 мутантов

📂 Рекомендуемый объём ассетов для вашей структуры:

10-20
🔥 Хуков
20-40
🧠 Мидов
3-5
🎯 CTA
3-5
📝 Субтитры
3-10
🎵 Аудио
'; } function downloadBriefHTML() { const html = generateBriefHTMLContent(); const b = buildBriefObject(); const blob = new Blob([html], { type: 'text/html;charset=utf-8' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = 'brief_' + (b.project_name || 'project').replace(/\s/g, '_') + '_' + new Date().toISOString().slice(0, 10) + '.html'; link.click(); showToast('Brief HTML скачан — можно переслать по почте'); } function downloadBriefJSON() { const brief = buildBriefObject(); const json = JSON.stringify(brief, null, 2); const blob = new Blob([json], { type: 'application/json' }); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = 'brief_' + (brief.project_name || 'project').replace(/\s/g, '_') + '_' + new Date().toISOString().slice(0, 10) + '.json'; a.click(); showToast('Brief JSON скачан'); } function resetBrief() { if (!confirm('Сбросить все настройки?')) return; document.getElementById('project-name').value = ''; uploadedFiles = { hooks: [], mids: [], ctas: [], audio: [], subs: [] }; createdProjectId = null; ['hooks','mids','ctas'].forEach(t => { document.getElementById('urls-' + t).value = ''; renderFileList(t); }); ['audio','subs'].forEach(t => renderFileList(t)); applyPreset('reels30'); goToStep(1); showToast('Бриф сброшен'); } // ============================================ // UTILS // ============================================ function fmt(n) { return Number(n).toLocaleString('ru-RU'); } function formatTime(sec) { return Math.floor(sec/60) + ':' + String(sec%60).padStart(2, '0'); } function showToast(text, type='success') { const t = document.getElementById('toast'); document.getElementById('toast-icon').textContent = type==='success'?'✅':type==='error'?'❌':'⚠️'; document.getElementById('toast-text').textContent = text; t.classList.add('show'); setTimeout(()=>t.classList.remove('show'), 3000); }