@se-studio/media-pipeline
v0.6.5
Published
Normalize designer media into short-lived CMS-ready packs (no Contentful writes)
Maintainers
Readme
@se-studio/media-pipeline
Normalize designer media into CMS-ready files for short-lived packs.
Hard rules
- Never writes to Contentful (no CMA tokens, no asset create).
- Host (
apps/media-pipeline) stores ready files on Vercel Blob and returns public HTTPS URLs. - cms-edit uploads with
asset upload --url <readyUrl>.
Package API
import {
processSourceFiles,
buildManifest,
resolveProfileForTenant,
createJobId,
CASE_STUDY_V1,
} from '@se-studio/media-pipeline';
const resolved = resolveProfileForTenant('se', 'case-study-v1');
// processSourceFiles([{ sourceName, buffer }], { tenant, jobId, profile, … })
// buildManifest({ job, status, ready, gaps, urls })Profiles
| Id | Purpose |
|----|---------|
| case-study-v1 | Images ≤ 3.5MB, long edge ≤ 2400; video H.264 mp4 ≤ 3.5MB, height ≤ 1080, loops strip audio |
encodeHeroLoop (hero mute loops): probe + optional 720/1080 H.264 (no audio). Rejects duration > 30s but still returns probe dimensions. Host stores {slug}-720.mp4 / {slug}-1080.mp4 / {slug}-poster.webp (slug from the source filename).
Tenants (config only — not CMS spaces)
| Id | Prefix default |
|----|----------------|
| se | se- |
| om1 | om1- |
Host app
See apps/media-pipeline — Vercel Blob + Vercel Workflows:
POST /api/v1/jobs→202+ workflow run (google_drive_folderorinline_files)- Per-file steps: Drive download → encode → put
sleep(expiresAt)then pack deleteGET /api/v1/jobs/:id?tenant=
Encode targets
| Limit | Value |
|-------|-------|
| Default max ready bytes | 3.5MB (under hosted staged 4MB) |
| Hard ceiling for cms-edit --url | 10MB (we stay under 9.5MB) |
| Video | H.264 + yuv420p + faststart via ffmpeg (ffmpeg-static or system) |
Development
pnpm --filter @se-studio/media-pipeline test
pnpm --filter @se-studio/media-pipeline build