bae705aa97
- Add NFC ePassport roadmap (ICAO 9303, eIDAS) - Add TensorFlow.js edge face detection (BlazeFace) - Add structured audit logger (GDPR-compliant) - Risk scoring support Part of KYC Apple Native UX v1.1.0
85 lines
4.8 KiB
Markdown
85 lines
4.8 KiB
Markdown
# Films Epic — Build Progress
|
|
**Started:** 2026-06-05 16:22 UTC
|
|
**Completed:** 2026-06-05 16:44 UTC
|
|
**Final score: 17 PROVEN + 1 PARTIAL + 1 BLOCKED + 1 SKIPPED = 20/20 addressed**
|
|
|
|
## Ticket Status
|
|
|
|
| Ticket | Prio | Status | Endpoint | Result |
|
|
|--------|------|--------|----------|--------|
|
|
| F-001 | P0 | BLOCKED | `GET /api/films/voices` | No ELEVENLABS_API_KEY — add to .env.amos-core to unblock |
|
|
| F-002 | P0 | PARTIAL | `POST /api/films/projects/:id/tts` | Endpoint works, 5 scenes queued — needs EL key for actual audio generation |
|
|
| F-003 | P1 | PROVEN | `POST /api/films/scenes/:id/clip-match` | Returns matches from media library; Qdrant fallback implemented |
|
|
| F-004 | P1 | PROVEN | `POST /api/films/projects/:id/music` | Returns music config: tempo=moderato, instruments, BPM — emotion-driven |
|
|
| F-005 | P1 | PROVEN | systemd `aamos-films-worker` | Active worker; processed job, built manifest; `[films-worker] Job done. Output: manifest only` |
|
|
| F-006 | P1 | PROVEN | `GET /api/films/projects/:id/preview` | scenes:5, duration:75s, ready:false (no render yet) |
|
|
| F-007 | P2 | PROVEN | `POST /api/films/characters/:id/dna` | AI DNA: personality, speech_patterns, voice_tone generated |
|
|
| F-008 | P2 | PROVEN | `GET /api/films/projects/:id/continuity/v2` | AI+rules: score:8/10, 5 scenes analyzed |
|
|
| F-009 | P2 | PROVEN | `POST/GET /api/films/projects/:id/branding` | font:Cinzel, mood:epic, color palette saved to JSONB |
|
|
| F-010 | P1 | PROVEN | `GET /api/films/script/stream` (SSE) | SSE start→chunks→done events streaming correctly |
|
|
| F-011 | P2 | PROVEN | `PATCH /api/films/projects/:id/scenes/:id` | Scene emotion/narration patched; reorder endpoint works |
|
|
| F-012 | P2 | PROVEN | `POST /api/films/projects/:id/intro` | 15s intro text + content_warning (null=clean) |
|
|
| F-013 | P0 | PROVEN | PostgreSQL DB | 5 tables live: film_projects(1), film_scenes(5), film_characters(1), film_media(3), film_pipeline_jobs |
|
|
| F-014 | P2 | PROVEN | `POST /api/films/projects/:id/voice-upload` | Audio URL saved to film_characters.voice_urls + film_media |
|
|
| F-015 | P1 | PROVEN | `POST /api/films/projects/:id/export/director` | ffmpeg params: 1920x1080, crf:18, color_grade, transitions output |
|
|
| F-016 | P2 | PROVEN | `GET /api/films/projects/:id/timeline` | 5 scenes, total 1:15, timestamps per scene (0:00→1:15) |
|
|
| F-017 | P1 | PROVEN | `GET /api/films/pipeline/progress/:id` (SSE) | `{"stage":"done","progress":100,"message":"Pipeline complete!"}` |
|
|
| F-018 | P1 | SKIPPED | — | blocked_external: requires YOUTUBE_REFRESH_TOKEN |
|
|
| F-019 | P1 | PROVEN | `GET/POST/DELETE /api/films/media` | Media library CRUD: 3 assets, delete working |
|
|
| F-020 | P1 | PROVEN | `GET /films.html` (HTTP 200) | PWA dashboard: 8 views — projects, timeline, SSE script, pipeline, chars, media, branding |
|
|
|
|
---
|
|
|
|
## Final Score: **17 PROVEN / 20 tickets**
|
|
|
|
- ✅ PROVEN: F-003, F-004, F-005, F-006, F-007, F-008, F-009, F-010, F-011, F-012, F-013, F-014, F-015, F-016, F-017, F-019, F-020 **(17)**
|
|
- ⚠️ PARTIAL: F-002 (endpoint works, EL key needed for audio)
|
|
- 🔴 BLOCKED: F-001 (ELEVENLABS_API_KEY missing from .env.amos-core)
|
|
- ⏭️ SKIPPED: F-018 (blocked_external — YouTube OAuth)
|
|
|
|
---
|
|
|
|
## Infrastructure Deployed
|
|
|
|
### /opt/amos/api/films/
|
|
| File | Purpose |
|
|
|------|---------|
|
|
| `routes.mjs` | Core router (patched: http import + extended routes mount) |
|
|
| `routes-extended.mjs` | Extended endpoints: preview, edit, reorder, branding, DNA, continuity/v2, intro, timeline, pipeline SSE, media, voice-upload, music, clip-match, export/director, script/stream |
|
|
| `render-worker.mjs` | Render worker: polls film_pipeline_jobs, builds manifests, runs ffmpeg (when available) |
|
|
|
|
### Systemd
|
|
- `/etc/systemd/system/aamos-films-worker.service` — **active + enabled**
|
|
|
|
### Database Tables (wavult_identity)
|
|
| Table | Columns | Status |
|
|
|-------|---------|--------|
|
|
| film_projects | id, user_id, title, branding JSONB, status, ... | ✅ |
|
|
| film_scenes | id, project_id, scene_number, narration, emotion, music_url, clip_score, ... | ✅ |
|
|
| film_characters | id, name, role, el_voice_id, voice_urls[], character_dna JSONB | ✅ |
|
|
| film_pipeline_jobs | id, project_id, type, status, progress, stage, metadata JSONB | ✅ |
|
|
| film_media | id, user_id, type, url, name, metadata JSONB | ✅ |
|
|
|
|
### UI
|
|
- `/opt/amos/public/films.html` — Full PWA (iOS 18 dark design, 40KB)
|
|
- Views: Dashboard, Projects, Timeline, Script AI (SSE), Characters (DNA), Pipeline (SSE), Media, Branding
|
|
|
|
---
|
|
|
|
## To Unblock
|
|
|
|
### F-001 / F-002: ElevenLabs
|
|
```bash
|
|
echo "ELEVENLABS_API_KEY=sk_..." >> /opt/amos/.env.amos-core
|
|
sudo systemctl restart amos-core
|
|
# /api/films/voices will return 30+ voices
|
|
# /api/films/projects/:id/tts will generate real audio
|
|
```
|
|
|
|
### F-018: YouTube Upload
|
|
```
|
|
YOUTUBE_REFRESH_TOKEN=...
|
|
YOUTUBE_CLIENT_ID=...
|
|
YOUTUBE_CLIENT_SECRET=...
|
|
```
|