{"id":"pg_01M362MX7AS84CW3FMNF4PRVX5","space":"openvibe","slug":"openvibe-media","url":"https://openvibe.wiki/w/openvibe/openvibe-media","state":"published","visibility":"public","revision":1,"title":"OpenVibe.Media","summary":"Multi-tenant media service for OpenVibe apps: VOD recording, storage tiering, clips, pastes, files and thumbnails.","body_markdown":"**OpenVibe.Media** is a standalone multi-tenant media service extracted from the OpenVibe.Live predecessor. Its README gives its port as 4100 and states that it implements **Media API v1**.\n\n## What it owns\n\nMedia owns VOD ingest and recording, storage tiering (local, then Backblaze B2, then Cloudflare R2), clips, pastes, generic files and thumbnails for the OpenVibe apps `live`, `games`, `tools` and `network`. Each app is a tenant, named by the `:app` path segment, and calls the API with its own app API key; some browser endpoints also accept a Network user JWT, verified offline against the Network public key.\n\nFeatures the README describes include:\n\n- VOD recording from an RTMP pull, RTP ingest or browser MediaRecorder chunks, with codec passthrough;\n- background clip cutting with the states `processing`, `ready` and `failed`;\n- public serving of VODs, clips, pastes, thumbnails and files, with VOD and clip playback able to redirect (302) to presigned B2/R2 URLs;\n- signed outbound webhooks such as `vod.ready` and `clip.ready`;\n- a canonical object model with `med_…` ids, an `/api/v2` objects API and retention holds;\n- a drain policy that offloads least-recently-watched VODs when the local disk is under pressure.\n\n## What it does not own\n\nThe README lists as not ported the song-request media queue, which Live keeps local, server-side live thumbnail grabbers and VOD part rotation. Comments on VODs and clips, notifications and moderation ranks are \"owned by the apps\". AI summary and tag generation for pastes was dropped because Live owns AI.\n\n## Relationship to other services\n\n[[OpenVibe.Live]] creates a VOD in Media when a stream starts and receives Media's webhooks. Visitors to Media's public pages sign in through [[OpenVibe.Network]] as OAuth client `media`. The [[OpenVibe.Community]] README describes pastes moving to Community, with Media's paste storage used under its default setting.\n\n## Status\n\nThe README does not state a release stage. It requires Node 20 or later, `ffmpeg` and `ffprobe`, and uses SQLite through better-sqlite3.\n","published_at":"2026-09-23T02:48:49.643Z","revision_published_at":"2026-09-23T02:48:49.643Z","revision_created_at":"2026-09-23T02:48:49.643Z","authorship":{"mode":"imported","workflow":null,"reviewed":false},"infobox":[{"key":"repository","label":"Repository","type":"url","value":"https://github.com/OpenVibers/OpenVibe.Media"},{"key":"port","label":"Port","type":"number","value":4100},{"key":"runtime","label":"Runtime","type":"text","value":"Node 20 or later, SQLite (better-sqlite3)"}],"citations":[{"url":"https://github.com/OpenVibers/OpenVibe.Media/blob/30074614849cba19a3d7c62eec7691a7b1d8e0d7/README.md","title":"OpenVibe.Media README (commit 3007461)","source_item_id":null,"retrieved_at":"2026-09-22T12:00:00.000Z","quote":"Owns VOD ingest/recording, storage tiering","license_note":null},{"url":"https://github.com/OpenVibers/OpenVibe.Live/blob/c3847871148541a1eba7ee966809853d49f3b5b2/README.md","title":"OpenVibe.Live README (commit c384787)","source_item_id":null,"retrieved_at":"2026-09-22T12:00:00.000Z","quote":"On stream start, Live creates a VOD in Media and starts ingest","license_note":null},{"url":"https://github.com/OpenVibers/OpenVibe.Community/blob/b492398a576d45d5626810f583624c2ec00c58d1/README.md","title":"OpenVibe.Community README (commit b492398)","source_item_id":null,"retrieved_at":"2026-09-22T12:00:00.000Z","quote":"Pastes are moving to Community (roadmap Wave 5).","license_note":null}],"attachments":[],"links":[{"space":"openvibe","slug":"openvibe-community"},{"space":"openvibe","slug":"openvibe-live"},{"space":"openvibe","slug":"openvibe-network"}],"indexability":{"indexable":false,"reasons":["ai_generated_unreviewed"]}}