Play an episode from a link without storing it
/tv/episodes/{id}/proxy-source/write Change: creates or edits. Scopes
The episode plays from a link (url) or a bucket object (s3_key) and nothing is stored. delivery: proxy: server relays it and viewers never see the source. delivery: redirect: viewers are sent to the source itself; server only checks it first. Answers 201 with the new file.
Path parameters
idstring (uuid)requiredThe episode's id.
Body
deliverystring"proxy": a node of yours fetches the source and passes it through, hiding the origin and paying the bandwidth. "redirect": the viewer is sent to the source and fetches it themselves — no bandwidth cost, but the URL is visible to them and playback is beyond your reach.
proxy- proxyredirect- redirect
Default:
"proxy"serverstring (uuid)requiredNode that will carry a proxied title, and probe the source for either.
urlstringDirect HTTP(S) source. Never sent to a proxied viewer.
s3_keystringstoragestring (uuid)can be nullBucket for
s3_key; the VOD bucket when absent.
Response
201 OK
mediaobjectrequiredidstring (uuid)requiredread-onlystatestringrequiredread-onlyLifecycle of the file itself, not of any one node's copy. "ready" means at least one node finished ingest and can serve it; per-node progress lives on MediaAsset.
draft- Draftingesting- Ingestingready- Readyfailed- Failed
original_namestringrequiredread-onlyFilename as uploaded, downloaded, or found in the watch folder. Kept for operator recognition only.
containerstringrequiredread-onlyFile extension of what is actually served (mkv, mp4, ts, …). Ingest keeps the source's own container byte for byte, so this is whatever the file arrived as; the play URL carries it because players pick a demuxer from the extension.
size_bytesintegerrequiredread-onlySize of the finished file. Drives the per-node storage quota.
duration_secondsnumberrequiredread-onlycan be nullNull until a node probes the file.
video_codecstringrequiredread-onlye.g. H.264, HEVC. Decides whether the operator preview player can show it.
widthintegerrequiredread-onlycan be nullheightintegerrequiredread-onlycan be nullfpsnumberrequiredread-onlycan be nullNull when the file declares a variable or unknown rate.
checksumstringrequiredread-onlyOf the finished file. Node-to-node replication verifies against this, so a truncated copy is caught before it is ever served.
is_readybooleanrequiredread-onlyWhether a streaming server can serve this file now.
assetsobject[]requiredread-onlyidstring (uuid)requiredread-onlyserverstring (uuid)requiredread-onlyserver_namestringrequiredread-onlyserver_instance_idstringrequiredread-onlystatusstringrequiredread-onlyprogress_pctintegerrequiredread-onlybytes_doneintegerrequiredread-onlybytes_totalintegerrequiredread-onlyerrorstringrequiredread-onlyWhy the last attempt failed. Cleared on a successful retry.
last_verified_atstring (date-time)requiredread-onlycan be nullWhen the node last confirmed the file is present and the right size.
audio_tracksobject[]requiredread-onlyidstring (uuid)requiredread-onlyindexintegerrequiredread-onlyPosition within the stored container, 0-based.
languagestringrequiredread-onlyISO 639-2 code as tagged in the container (eng, fra, ara). Empty when the source carried no tag.
titlestringrequiredread-onlycodecstringrequiredread-onlychannelsintegerrequiredread-onlycan be nullis_defaultbooleanrequiredread-only
subtitle_tracksobject[]requiredread-onlyidstring (uuid)requiredread-onlyindexintegerrequiredread-onlyPosition within the stored container, 0-based.
languagestringISO 639-2 code (eng, fra, ara). Required for operator-supplied files — an untagged subtitle shows up as "Track 3" on every player.
titlestringcodecstringrequiredread-onlysubrip, ass, hdmv_pgs_subtitle, ...
is_defaultbooleanis_forcedbooleanShown automatically for foreign-language passages even when subtitles are off.
is_sdhbooleansource_urlstring (uri)Where an operator-supplied subtitle was fetched from. Empty for tracks that came out of the source media.
deliverystringrequiredread-onlyWho carries the bytes. "stored" is the normal path: a node holds a copy and serves it off local disk. "proxy" keeps nothing — a node opens the source per viewer and passes the bytes through, so the title costs no storage and the viewer never learns the origin, but every byte crosses your bandwidth. "redirect" costs you neither: the viewer is sent to the source and fetches it themselves — which necessarily shows them the URL, and puts playback beyond anything you can observe or cut off. All three inherit the source's reliability: if it goes away, so does the film.
stored- Stored on a nodeproxy- Proxied through a noderedirect- Sent straight to the source
source_urlstring (uri)requiredread-onlyUpstream this file is proxied from. Empty for stored files. Operator-visible only: it is handed to a node over the authenticated server-to-server channel and never reaches a viewer, which is the point of proxying.
source_storagestring (uuid)requiredread-onlycan be nullSet when the source is an object in one of the panel's buckets (Settings → Storage). The file is then addressed by its key and a signed URL is made each time it is needed, because a signed URL expires and a stored one would stop the film after a few hours.
source_storage_namestringrequiredread-onlysource_keystringrequiredread-onlysource_labelstringrequiredread-onlysupports_rangesbooleanrequiredread-onlyWhether the proxied source answered a range request when it was probed. False means the film plays from the start but cannot be scrubbed — accepted rather than refused, because a source that plays is worth more than one that is rejected for a feature the viewer may not use.
proxy_serverstring (uuid)requiredread-onlycan be nullThe node that carries a proxied title's traffic. Chosen by the operator rather than routed, because this is a bandwidth bill and picking which machine pays it is their decision, not a load-balancing one. Required for "proxy"; meaningless for the other two, since one serves from disk and the other never touches us.
proxy_server_namestringrequiredread-onlyproxy_balancedbooleanrequiredread-onlyProxied through whichever streaming node the panel picks at each play (load balanced: a viewer stays on one node, different viewers spread over all of them) instead of one chosen node. The operator opts into spreading the bandwidth bill; with it off,
proxy_serveralone carries the title.created_atstring (date-time)requiredread-onlyupdated_atstring (date-time)requiredread-only
replacedstring (uuid)requiredcan be nullThe file it replaced, if any.
warningstringrequiredcan be nullSaid when the source cannot be seeked: most players will not open it by redirect.
Errors
- 400 Something sent is not valid. Each field that is wrong is named with what is wrong.
- 401 No credential, or one that is wrong, expired or revoked.
- 403 The account, or the key's or app's scopes, may not do this.
- 404 Nothing with this id, or nothing the account can see.
- 429 Slow down: wait the seconds in the Retry-After header, then try again.
- 502 The server could not read the source.