Repository navigation
Sync upstream 2026-11-13 (508 commits) - #19
Merged
Merged
Conversation
…-sdr fix(media-server): convert HDR video to standard range before encoding
…r-page fix: make developer video shareUrl and embedUrl open a real player page
…eo-page # Conflicts: # apps/web/app/(infra)/dashboard/infra/[appId]/billing/top-up.tsx
…pi-contract # Conflicts: # apps/web/__tests__/unit/developer-video-api.test.ts # apps/web/__tests__/unit/infra-billing-gates.test.ts # apps/web/lib/developer-openapi.ts # apps/web/lib/infra-video-upload.ts
…per-api-contract fix: developer API errors, validation, idempotent delete and rate limit headers
Two transcripts that both needed a bigger hold each kept their first hold while waiting, so neither request could fit and both failed after the wait limit even when the balance covered one of them. A transcript that has to wait for a raise now releases its own hold, which lets one go first. No work runs while it waits, and it must hold again before any.
…e-video-page feat(web): watch, track and manage videos in the Cap Infra console
…ript-hold-first fix(web): hold a transcript's credit before its source is downloaded or converted
… to the API Adds a Play a Video section with a tested hls.js page, the Safari tag, URL lifetimes, the Content Security Policy hosts and what viewers get when playback stops. Brings errors, rate limits, pagination and the list, get, status and usage examples in line with what the API returns, documents the upload steps and their limits, and removes the SDK packages that are not published.
Replaces the old per-minute prices with the storage and transcription rates the code charges, and drops the webhook and SDK package claims.
A video counts in the lower of its maxResolutionTier and the tier of its source. Description text only.
…pt policy and a reload The page now checks that hlsUrl and mp4Url exist before choosing a branch, falls back to the MP4 when the browser's own HLS player fails, and keeps the hls.js instance in scope so the reload function can reach it. The Content Security Policy section says how to allow the page's inline script.
… check the cleanup deadline before each abort
A public key could create videos and run the whole upload, guarded only by the Origin header, which any client outside a browser can set. Anyone who copied a key from a page could spend that app's storage credit. POST /api/developer/v1/uploads (secret key) now creates the video and returns a signed upload token bound to that one video, with an expiry and an optional origin. The SDK upload routes accept only that token. Public keys are refused across the SDK API and the browser create route is gone.
The recorder took a public key and created the video itself. It now takes a createUpload function that asks the integrator's server for an upload, then uploads the recording with the returned token. The React hook keeps the current capture when createUpload is a new function and calls the newest one.
…ack-guide docs(web): add a playback guide and bring the developer API docs in line with the API
# Conflicts: # apps/web/content/docs/api/rest-api.mdx
…-cleanup-bounds fix(web): keep one open upload per Cap Infra video and bound the upload cleanup
With separate audio and video playlists the first buffered segment could be audio, so loading stopped before a frame was ready and the viewer waited after pressing play. Loading now stops once the first video segment and, when audio is separate, the first audio segment are buffered. The element's own preload is set to auto for streams, because the browser will not decode the first frame otherwise, and the stream engine's start-up seek no longer resumes loading.
…r-light-embed fix(infra): light embeds, embed parameters and a neutral failed state
# Conflicts: # apps/web/components/cap-player/CapPlayer.tsx # apps/web/components/cap-player/player.module.css # apps/web/components/cap-player/source.ts
…ss from stepping back
…surface fix: consistent Cap Infra agent API answers and a console agent prompt that uses the REST API
A pick made before play is remembered and applied when playback starts, so it downloads nothing while the player is idle and is not undone by the return to automatic loading. The quality button shows the picked rendition immediately instead of waiting for the switch.
…button without a control bar A time label that mounts while the video is paused now shows the current time instead of zero. With the control bar hidden, focusOnMount goes to the visible cover button rather than the hidden bar.
…controls feat(web): add quality, speed and volume controls to the video player
…ty-ein-no-call fix(web): save no EIN at checkout when there is nothing to change
…start docs(web): add a Get Started guide for the Developer API
Upstream rewrote the organization members card (its own settings tab with name and email search), which conflicted with feat/members-table-search. Take upstream's MembersCard and docs and drop our table helper and its tests; the patch ledger records the drop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Merges
main(CapSoftware/Cap@f0d45b0) intosmg.Conflict resolved in favor of upstream:
apps/web/app/(org)/dashboard/settings/organization/components/MembersCard.tsx. Upstream gave members their own settings tab and its own name and email search, which conflicts with ourfeat/members-table-searchpatch. This sync takes upstream's version and drops ours, along withlib/organization-members-table.ts, its tests and our lines incontent/docs/teams.mdx. The role and status filters and column sorting go away.SMG.mdrecords the drop, and CapSoftware/Cap#3919 gets closed.Migrations: both are additive and only touch the Cap Infra developer tables, which this instance doesn't use.
0054_developer_video_playbackadds columns and indexes todeveloper_videos, and indexes todeveloper_credit_accountsanddeveloper_credit_transactions.0055_developer_transcriptscreatesdeveloper_transcripts.A MySQL backup was taken before merging (
cap-mysql-pre-0055-20261113T0103Z.sql.gz, 54 tables).Media server: no route was added or removed in
apps/media-server. The web's only new media-server caller (/video/ladder, developer video encodes) already exists on the pinned image, so theCap Media Serverdigest stays as is.Still carried on top of upstream: preview OG fallback (CapSoftware#3963), Google account linking (CapSoftware#3964), share unfurl AI summary, and the
smg/ops files.apps/web/Dockerfileis unchanged, sosmg/web.Dockerfileneeds no regeneration.Upstream changes worth knowing after deploy: