Her aday klip transkribe olduktan hemen sonra otomatik olarak video-render kuyruğuna giriyor. Yeni Python worker (video_render.py): - Klibi ffmpeg ile keser - OpenCV + MediaPipe Face Detector (Tasks API — yeni mediapipe sürümlerinde eski solutions API'si kalktı, .tflite model dosyası Docker build'de indiriliyor) ile örneklenmiş karelerde yüz merkezi tespit eder, yumuşatır (moving average); hiç yüz bulunamazsa sabit merkez crop'a düşer, hata saymaz - Kırpılmış kareleri OpenCV'den ffmpeg'e pipe'layıp tek geçişte orijinal sesi map'ler ve transcript_json'dan ürettiği .ass altyazıyı yakar - Sonucu /shared-media/shorts/<candidate_id>.mp4'e yazar Yeni ShortVideo modeli (PENDING/RENDERING/READY/FAILED). Panelde (segments + kanal detay sayfaları) render durumu + READY olunca video önizleme/indirme. VIDEO_RENDER_CONCURRENCY ayrı ve düşük (varsayılan 2) — bu iş diğerlerinden çok daha ağır. Kapsam: sadece tekil konuşmacı şablonu (çoklu konuşmacı/split-screen sonraki bir iterasyona bırakıldı — aktif-konuşmacı tespiti gerektiriyor). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
97 lines
2.7 KiB
YAML
97 lines
2.7 KiB
YAML
services:
|
|
sc_redis:
|
|
image: redis:7-alpine
|
|
restart: unless-stopped
|
|
ports:
|
|
- "6379:6379"
|
|
volumes:
|
|
- redis-data:/data
|
|
|
|
sc_postgres:
|
|
image: postgres:16-alpine
|
|
restart: unless-stopped
|
|
environment:
|
|
POSTGRES_USER: streamclipper
|
|
POSTGRES_PASSWORD: streamclipper
|
|
POSTGRES_DB: streamclipper
|
|
ports:
|
|
- "5432:5432"
|
|
volumes:
|
|
- postgres-data:/var/lib/postgresql/data
|
|
|
|
sc_pot_provider:
|
|
image: brainicism/bgutil-ytdlp-pot-provider
|
|
restart: unless-stopped
|
|
|
|
sc_api_daemon:
|
|
build:
|
|
context: .
|
|
dockerfile: apps/api-daemon/Dockerfile
|
|
restart: unless-stopped
|
|
environment:
|
|
REDIS_URL: redis://sc_redis:6379
|
|
DATABASE_URL: postgresql://streamclipper:streamclipper@sc_postgres:5432/streamclipper
|
|
SHARED_MEDIA_ROOT: /shared-media
|
|
POLL_INTERVAL_MS: ${POLL_INTERVAL_MS:-60000}
|
|
SEGMENT_TIME_SEC: ${SEGMENT_TIME_SEC:-900}
|
|
API_DAEMON_PORT: ${API_DAEMON_PORT:-4001}
|
|
FORCE_LIVE_URL: ${FORCE_LIVE_URL:-}
|
|
TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN:-}
|
|
TELEGRAM_CHAT_ID: ${TELEGRAM_CHAT_ID:-}
|
|
YTDLP_POT_PROVIDER_URL: http://sc_pot_provider:4416
|
|
MAX_CONCURRENT_CAPTURES: ${MAX_CONCURRENT_CAPTURES:-10}
|
|
PROXY_URL: ${PROXY_URL:-}
|
|
RAW_SEGMENT_TTL_HOURS: ${RAW_SEGMENT_TTL_HOURS:-24}
|
|
volumes:
|
|
- shared-media:/shared-media
|
|
ports:
|
|
- "4001:4001"
|
|
depends_on:
|
|
- sc_redis
|
|
- sc_postgres
|
|
- sc_pot_provider
|
|
|
|
sc_heavy_worker:
|
|
build:
|
|
context: .
|
|
dockerfile: apps/worker/Dockerfile
|
|
restart: unless-stopped
|
|
environment:
|
|
REDIS_URL: redis://sc_redis:6379
|
|
DATABASE_URL: postgresql://streamclipper:streamclipper@sc_postgres:5432/streamclipper
|
|
SHARED_MEDIA_ROOT: /shared-media
|
|
SEGMENT_TIME_SEC: ${SEGMENT_TIME_SEC:-900}
|
|
OPENAI_API_KEY: ${OPENAI_API_KEY:-}
|
|
TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN:-}
|
|
TELEGRAM_CHAT_ID: ${TELEGRAM_CHAT_ID:-}
|
|
WORKER_CONCURRENCY: ${WORKER_CONCURRENCY:-5}
|
|
VIDEO_RENDER_CONCURRENCY: ${VIDEO_RENDER_CONCURRENCY:-2}
|
|
volumes:
|
|
- shared-media:/shared-media
|
|
depends_on:
|
|
- sc_redis
|
|
- sc_postgres
|
|
|
|
sc_frontend:
|
|
build:
|
|
context: .
|
|
dockerfile: apps/frontend/Dockerfile
|
|
restart: unless-stopped
|
|
environment:
|
|
DATABASE_URL: postgresql://streamclipper:streamclipper@sc_postgres:5432/streamclipper
|
|
API_DAEMON_URL: http://sc_api_daemon:4001
|
|
SHARED_MEDIA_ROOT: /shared-media
|
|
SESSION_SECRET: ${SESSION_SECRET:?SESSION_SECRET must be set}
|
|
volumes:
|
|
- shared-media:/shared-media
|
|
ports:
|
|
- "3000:3000"
|
|
depends_on:
|
|
- sc_postgres
|
|
- sc_api_daemon
|
|
|
|
volumes:
|
|
redis-data:
|
|
postgres-data:
|
|
shared-media:
|