{"id":"c0027","filename":"c0027_faza3_univerzalni_media.dok.json","weise3_id":"","tip":"plan_faza","naziv":"c0027 — FAZA 3: Univerzalni Media modul (audio/video/image/text/document)","kreator":"CC","datum":"2026-05-03T13:44:22.604125+00:00","snippet":"","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"plan_faza","kreator":"CC","nastao":"2026-05-03T13:44:22.604125+00:00","naziv":"c0027 — FAZA 3: Univerzalni Media modul (audio/video/image/text/document)","prev_chain":"c0025","parent_master":"c0024","cilj":"Jedan API obrazac za upload/storage/streaming/preview svih tipova medija. Svaki upload = dokarh + datoteka + thumbnail.","koraci":{"3.1":{"naziv":"services/media.py — uniform interface","akcije":["put_media(bytes, mime, kreator, kontekst, tenant_id, lang=\"hr\") -> dict (weise3, storage_path, thumbnail_path, dokarh)","detektiraj media_tip iz mime: audio/* | video/* | image/* | text/* | application/pdf | application/json | ...","sha256 + weise3 (sha3 GENESIS::MEDIA::sha256::kreator::kontekst::FENIX2026)","storage: /var/www/genesis/media/dokarh/{tip}/{wid[0:2]}/{wid}.{ext}","sidecar dokarh: /var/www/genesis/media/dokarh/{tip}/{wid[0:2]}/{wid}.dokarh","thumbnail/preview: ovisi o tipu (vidi 3.2)"],"fajlovi":["services/media.py"]},"3.2":{"naziv":"Thumbnail/preview generatori","akcije":["image -> resize 256x256 thumbnail (Pillow), preview 1024x1024 webp","video -> ffmpeg extract frame @ 5s -> jpg thumbnail; preview = 30s mp4 lowres","audio -> ffmpeg waveform PNG (sox/ffmpeg) thumbnail; preview = first 60s mp3 lowres","pdf -> first page render PNG (pdftoppm/poppler) -> thumbnail","text -> font monospace render prvih 30 redaka -> PNG thumbnail"],"fajlovi":["services/media_thumb.py","install: ffmpeg, poppler-utils, Pillow"]},"3.3":{"naziv":"api/media.py — REST endpointi","akcije":["POST /api/v1/media/ (multipart upload) -> {weise3_id, mime, media_tip, storage_url, thumbnail_url, preview_url}","GET  /api/v1/media/{wid}                  — sirovi fajl (s Content-Type)","GET  /api/v1/media/{wid}/thumbnail        — thumbnail (PNG)","GET  /api/v1/media/{wid}/preview          — preview (lowres za AV / webp za img)","GET  /api/v1/media/{wid}/dokarh.json      — sirovi metadata dokarh","GET  /api/v1/media/{wid}/stream           — Range request streaming (AV)","DELETE — soft delete (oznaceno status=archived; ne brise iz Krunice)"],"fajlovi":["api/media.py"]},"3.4":{"naziv":"BunkerSeal L0 integracija","akcije":["Sva media koja izlazi iz sustava (GET) prolazi kroz opp_seal_apply (Prior Art Seal)","Glazbeni rad ucitan u Genesis -> automatski prior art zapis -> nemoguce je da netko drugi patentira/kopira","Audit log: tko je preuzeo media, kada, IP/user-agent (Membrana ulaz)"],"fajlovi":["services/media.py"]}},"acceptance_kriteriji":["POST /media/ s MP3 -> dobiva weise3, thumbnail (waveform PNG), preview (60s mp3 lowres)","POST /media/ s PDF -> thumbnail = first page PNG","POST /media/ s MP4 -> thumbnail @ 5s frame, preview 30s mp4","POST /media/ s JPG -> resize 256x256 thumbnail, 1024x1024 webp preview","GET /media/{wid}/stream s Range: bytes=0-1023 -> 206 Partial Content","Playwright: 5 testova (po jedan po media tipu) — upload, dohvati, thumbnail, preview, dokarh"]}}