Renders an interactive player (MCP Apps UI component) so the user can watch
a transcoded result without leaving the conversation. When a job in this
conversation is already Done with a playable URL, call this in the same
reply as `list_jobs` — do not only paste the link. Pass a playback URL from
`list_jobs` / `get_job_status_detailed`: a progressive file (`.mp4` /
`.webm`) or an HLS/DASH manifest (`.m3u8` / `.mpd`). QuickTime / `.mov`
is rejected (Chromium `<video>` cannot decode that container).
A manifest MUST be a PUBLIC URL. A presigned one is rejected, because the
signature covers only the playlist while its segments are relative and
would 403 (the player would spin forever). A public Media Storage object
plays from `cdn_url` on `list_objects`. A private progressive file
(`.mp4` / `.webm`, no `cdn_url`) plays from `get_download_url` — pass that
URL here and do not append anything. A private HLS/DASH manifest cannot;
do not substitute a presign. Job temp-storage output URLs from `list_jobs`
stay valid for playback.
It resolves the per-user Qencode Player license key (a public client-side
site-key) via the portal bridge and hands it to the widget; the actual
playback happens client-side in a sandboxed iframe.
Args:
source_url: https:// URL to play — mp4, webm, or an HLS/DASH manifest.
A presigned manifest URL is rejected; pass a public one.
`.mov` / QuickTime is rejected — submit `output: "mp4"` instead.
poster_url: optional https:// image shown before playback starts.
source_type: optional MIME hint, e.g. "video/mp4", "video/webm",
"application/x-mpegURL" or "application/dash+xml". The player
infers a sensible default when omitted.
title: optional display title for the player.
Allowed playback origins depend on the client's sandbox CSP. Videos hosted
in Qencode storage (`*.qencode.com`, Qencode CDN / `*.cloudfront.net`) play
on every client; an external origin plays on some hosts and is blocked on
others. This tool knows which policy applies, so ALWAYS CALL IT for a
playback URL — including an external mp4/webm. Never refuse up front or
guess from the client name: on a permissive host that refusal would be
wrong.
If the tool DOES reject the URL, follow the error text — do not improvise:
- Presigned manifest: re-open the player on the public URL of the same
playlist (see above). Do not transcode to mp4 to dodge it.
- QuickTime / `.mov`: do NOT retry `open_player`. Tell the user in-chat
playback needs MP4, then submit `output: "mp4"` (not `repack` +
`container: "mov"`) and open the resulting `.mp4`.
- External origin on a strict client: do NOT silently transcode. Tell the
user only Qencode-storage videos can be viewed in this client, and OFFER
to create a Qencode Media Storage bucket and upload the video into it
(`create_bucket` then `download_url_to_bucket` — server-side ingest, no
re-encode); once they agree, open the player on the resulting Qencode URL.
When the result carries a non-null `client_note`, pass its point on to the
user in the same reply. It describes how THIS client presents the player —
e.g. hosts that put the widget in a collapsed tool-call block, where the
user sees no video until they expand it.
Note: only public / temporary-storage outputs are supported for now.
Signed-cookie / DRM playback does not work inside the chat sandbox yet.