{"service":"media","entries":[{"service":"media","sha":"9de5cb9afcac6b06beacf3dfbc83964dec8eb284","short":"9de5cb9","subject":"Channel lookups through Live's canonical lineage resolver (D20): the dev-data API's @username selector asks OpenVibe.Live /internal/lineage/resolve with Media's service token (live.lineage.resolve) for the channel and its Live user id…","author":"OpenVibers","committed_at":"2026-09-24T04:51:53Z","deployed_at":"2026-09-24T04:51:53.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/9de5cb9afcac6b06beacf3dfbc83964dec8eb284","post_id":"pst_01M39313D833G8QVPQ9FGEEF5E"},{"service":"media","sha":"984e7ad9364971286ed1a9665159c5f304372344","short":"984e7ad","subject":"SECURITY.md: how to report a vulnerability (contact@openvibe.network, 7-day reply, scope, supported versions)","author":"OpenVibers","committed_at":"2026-09-24T02:27:39Z","deployed_at":"2026-09-24T04:51:53.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/984e7ad9364971286ed1a9665159c5f304372344","post_id":"pst_01M39313D833G8QVPQ9FGEEF5E"},{"service":"media","sha":"7114433029433e4f48518de8f82bb57b8081af2b","short":"7114433","subject":"R2 tier decisions are recorded and explainable: every promotion to and demotion from the R2 popularity cache gets a media_tier_decisions row with the inputs it saw (view_count, last_accessed_at, provider, recording, hold, size…","author":"OpenVibers","committed_at":"2026-09-24T01:47:33Z","deployed_at":"2026-09-24T04:51:53.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/7114433029433e4f48518de8f82bb57b8081af2b","post_id":"pst_01M39313D833G8QVPQ9FGEEF5E"},{"service":"media","sha":"5099c972981b5baa06400ac6fc1bae30cd948d0d","short":"5099c97","subject":"thumbnail.regenerate refuses a recording with nothing to take a frame from. The five failed jobs on production (all at 2026-09-23 21:36:41, created by app:live, generate_failed) were Live asking for thumbnails of VODs 3044, 5537, 5540…","author":"OpenVibers","committed_at":"2026-09-24T01:42:14Z","deployed_at":"2026-09-24T04:51:53.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/5099c972981b5baa06400ac6fc1bae30cd948d0d","post_id":"pst_01M39313D833G8QVPQ9FGEEF5E"},{"service":"media","sha":"039dc48a0d9d5c4d893ce0df804309ac95b40c8f","short":"039dc48","subject":"Events media.object.deleted and media.object.visibility_changed through the outbox, so consumers (Search, Live, Community) learn that an object went away or stopped being public (Media emitted neither). Payloads are minimal…","author":"OpenVibers","committed_at":"2026-09-24T01:38:26Z","deployed_at":"2026-09-24T04:51:53.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/039dc48a0d9d5c4d893ce0df804309ac95b40c8f","post_id":"pst_01M39313D833G8QVPQ9FGEEF5E"},{"service":"media","sha":"a90d0ed76725129a344cc464ead08fff142c448c","short":"a90d0ed","subject":"Crawler basics at the openvibe.media origin: /robots.txt (openvibe-shared seo.robotsTxt: AI and search crawlers named; /api/, /auth/, /internal/, /o/, /metrics, /release-metrics and the /live/ dev-data endpoints disallowed; the sitemap)…","author":"OpenVibers","committed_at":"2026-09-24T01:33:39Z","deployed_at":"2026-09-24T04:51:53.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/a90d0ed76725129a344cc464ead08fff142c448c","post_id":"pst_01M39313D833G8QVPQ9FGEEF5E"},{"service":"media","sha":"cb17f297b00c25da3f774f68251437e3e5209417","short":"cb17f29","subject":"RTMP pull SSRF: POST /vods/:id/ingest/rtmp makes ffmpeg connect to the URL it is given, and any rtmp:// or rtmps:// URL was accepted, so an app key (or a leaked one) could point Media's ffmpeg at any host and port it can reach. The…","author":"OpenVibers","committed_at":"2026-09-24T01:30:26Z","deployed_at":"2026-09-24T04:51:53.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/cb17f297b00c25da3f774f68251437e3e5209417","post_id":"pst_01M39313D833G8QVPQ9FGEEF5E"},{"service":"media","sha":"e5e6f09cbe9296e31351e50ccbcb7bb71a2ff62a","short":"e5e6f09","subject":"object.hash job: sha256 for local copies in bounded batches, recorded on the object (content_hash, with metadata.hash_basis = the file and size it read) and on its local location (checksum, verified_at). Only 14 of 2,839 ready objects had…","author":"OpenVibers","committed_at":"2026-09-24T01:28:20Z","deployed_at":"2026-09-24T04:51:53.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/e5e6f09cbe9296e31351e50ccbcb7bb71a2ff62a","post_id":"pst_01M39313D833G8QVPQ9FGEEF5E"},{"service":"media","sha":"47b43491a31709bac66d6367b3aefa08d519bb28","short":"47b4349","subject":"trust proxy is loopback only (was true): req.ip is the X-Forwarded-For that the local nginx set when a request came through it, and the socket address for anyone else, so a caller reaching port 4100 directly (HOST defaults to 0.0.0.0) can…","author":"OpenVibers","committed_at":"2026-09-24T01:24:25Z","deployed_at":"2026-09-24T04:51:53.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/47b43491a31709bac66d6367b3aefa08d519bb28","post_id":"pst_01M39313D833G8QVPQ9FGEEF5E"},{"service":"media","sha":"20a602e124f84cffa955af34187b7993453e0c16","short":"20a602e","subject":"vod.duration.reconcile: stored VOD durations are compared with a measurement of the real file in bounded batches, offloaded VODs included, and clearly wrong values are repaired (the health scanner only repaired durations <= 0 and skipped…","author":"OpenVibers","committed_at":"2026-09-24T01:22:01Z","deployed_at":"2026-09-24T04:51:53.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/20a602e124f84cffa955af34187b7993453e0c16","post_id":"pst_01M39313D833G8QVPQ9FGEEF5E"},{"service":"media","sha":"24f1962d897c7395066fe0732a698d646eb1b07f","short":"24f1962","subject":"vod.finalize job: a recording whose finalize failed or never ran is retried on media_jobs with backoff, instead of a one-shot boot sweep whose failure was swallowed and a stat failure that only cleared is_recording. The orphan sweep (in…","author":"OpenVibers","committed_at":"2026-09-24T01:15:22Z","deployed_at":"2026-09-24T04:51:53.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/24f1962d897c7395066fe0732a698d646eb1b07f","post_id":"pst_01M39313D833G8QVPQ9FGEEF5E"},{"service":"media","sha":"cc84bf1a10952da5391b689371d19f995bda2b39","short":"cc84bf1","subject":"VOD durations are measured, never estimated: finalize stores what the file says and vods.duration_source says where it came from. probe = ffprobe's container duration of the finished file; remux = the last packet time of a stream-copy pass…","author":"OpenVibers","committed_at":"2026-09-24T01:11:27Z","deployed_at":"2026-09-24T04:51:53.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/cc84bf1a10952da5391b689371d19f995bda2b39","post_id":"pst_01M39313D833G8QVPQ9FGEEF5E"},{"service":"media","sha":"0724119709777b4126bb18540b4cfdcee92a139e","short":"0724119","subject":"objects-verify test: read the re-upload from the run that first checked the object, not from media_verifications, which keeps only the latest verdict; when batch rotation re-verified the object in a later run (same-second verified_at…","author":"OpenVibers","committed_at":"2026-09-23T23:54:06Z","deployed_at":"2026-09-23T23:54:06.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/0724119709777b4126bb18540b4cfdcee92a139e","post_id":null},{"service":"media","sha":"6c2d384b8af9a70ff3c928ee7ed8bc8131cb1bee","short":"6c2d384","subject":"Opening the database no longer fails a clip being cut: getDb() ran the restart recovery ('processing' clips → failed) every time any process opened media.db, so a backfill or operator script run on the host while the service cut a clip…","author":"OpenVibers","committed_at":"2026-09-23T23:51:36Z","deployed_at":"2026-09-23T23:51:36.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/6c2d384b8af9a70ff3c928ee7ed8bc8131cb1bee","post_id":null},{"service":"media","sha":"ce6a02ae0834b28eacb3af25fd49295b4a04965a","short":"ce6a02a","subject":"gitleaks: allow the owner-subject test's made-up INTERNAL_API_KEY, matched on path and value","author":"OpenVibers","committed_at":"2026-09-23T23:48:53Z","deployed_at":"2026-09-23T23:48:53.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/ce6a02ae0834b28eacb3af25fd49295b4a04965a","post_id":null},{"service":"media","sha":"31c28992cbc729b837c852e3543d5e865e7be35a","short":"31c2899","subject":"Owner subjects: every media object that names an app-local owner (owner_app + owner_user_id) gets the owner's canonical Network subject in owner_subject, so Live's lineage resolver and other consumers read owner.subject instead of…","author":"OpenVibers","committed_at":"2026-09-23T23:46:48Z","deployed_at":"2026-09-23T23:46:48.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/31c28992cbc729b837c852e3543d5e865e7be35a","post_id":null},{"service":"media","sha":"0c27f0b5bab056f61f461e4ef7d5a31c0c1314b1","short":"0c27f0b","subject":"openvibe-shared v1.5.1 (Track R release manifest), openvibe-contracts v0.33.0, openvibe-sdk v0.5.0","author":"OpenVibers","committed_at":"2026-09-23T23:16:09Z","deployed_at":"2026-09-23T23:16:09.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/0c27f0b5bab056f61f461e4ef7d5a31c0c1314b1","post_id":null},{"service":"media","sha":"6e74eb0fc24901e71fadbf96ce3082069e92f30d","short":"6e74eb0","subject":"Restore drills: MEDIA_DRILL=1 makes Media a read-only instance on a restored copy of media.db, so `ovhost drill media` can boot one next to production. It refuses to start unless DB_PATH is set and outside the checkout and…","author":"OpenVibers","committed_at":"2026-09-23T22:55:41Z","deployed_at":"2026-09-23T22:55:41.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/6e74eb0fc24901e71fadbf96ce3082069e92f30d","post_id":null},{"service":"media","sha":"ee39be1ce03a0dce52c3b00e3cac43b873fd0c8d","short":"ee39be1","subject":"Clips say who made them: POST /clips keeps auto_generated and the description when the app itself asks (an app-key call with no X-OV-User-Id), and never when the call acts for one of the app's users. Both fields were dropped, so every AI…","author":"OpenVibers","committed_at":"2026-09-23T21:23:49Z","deployed_at":"2026-09-23T21:23:49.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/ee39be1ce03a0dce52c3b00e3cac43b873fd0c8d","post_id":null},{"service":"media","sha":"ad2217be56627efca799fd3ce0987d91cb6f3e24","short":"ad2217b","subject":"Job events carry a projection, not the job: media.job.<transition> payloads are queue.jobEvent (id, app_id, object_id, type, status, attempts, max_attempts, error_code, cancel_requested, has_result, run_after, decided_at, created_at…","author":"OpenVibers","committed_at":"2026-09-23T21:23:36Z","deployed_at":"2026-09-23T21:23:36.000Z","major":false,"url":"https://github.com/OpenVibers/OpenVibe.Media/commit/ad2217be56627efca799fd3ce0987d91cb6f3e24","post_id":null}],"next":"MjAyNi0wOS0yM1QyMToyMzozNi4wMDBafDUzMA","latest_post":{"id":"pst_01M39313D833G8QVPQ9FGEEF5E","title":"Patch notes: 120 changes across 18 sites","url":"https://openvibe.blog/@openvibe/patch-notes-120-changes-across-18-sites","published_at":1790232792495,"entries":120},"posts":[{"id":"pst_01M39313D833G8QVPQ9FGEEF5E","title":"Patch notes: 120 changes across 18 sites","url":"https://openvibe.blog/@openvibe/patch-notes-120-changes-across-18-sites","published_at":1790232792495,"entries":120}]}