TV shows

Replace an episode

PUT/tv/episodes/{id}/

write Change: creates or edits. Scopes

Saves every field of an episode.

Path parameters

  • idstring (uuid)required

    The episode's id.

Body

  • seasonstring (uuid)required
  • numberintegerrequired
  • namestring

    Empty reads as "Episode N" wherever a title is shown.

  • plotstring
  • still_urlstring (uri)

    A frame from the episode, shown as its thumbnail. The series poster stands in when empty.

  • air_datestring (date)can be null
  • runtime_minutesintegercan be null
  • ratingstring (decimal)can be null

    Out of 10.

  • directorstring
  • writerstring
  • guest_starsstring
  • tmdb_idstring

    The episode's own TMDB record, filled by a sync.

  • is_activeboolean

    An inactive episode disappears from playlists and refuses playback, without being deleted.

Response

200 OK

  • idstring (uuid)requiredread-only
  • xtream_idintegerrequiredread-only

    The number players know it by, in player links and the player API. Given when it is created, never changed or reused, because players save favourites against it.

  • seasonstring (uuid)required
  • season_numberintegerrequiredread-only
  • series_idstring (uuid)requiredread-only
  • series_namestringrequiredread-only
  • numberintegerrequired
  • codestringrequiredread-only
  • namestring

    Empty reads as "Episode N" wherever a title is shown.

  • titlestringrequiredread-only
  • plotstring
  • still_urlstring (uri)

    A frame from the episode, shown as its thumbnail. The series poster stands in when empty.

  • air_datestring (date)can be null
  • runtime_minutesintegercan be null
  • ratingstring (decimal)can be null

    Out of 10.

  • directorstring
  • writerstring
  • guest_starsstring
  • tmdb_idstring

    The episode's own TMDB record, filled by a sync.

  • is_activeboolean

    An inactive episode disappears from playlists and refuses playback, without being deleted.

  • media_filestring (uuid)requiredread-onlycan be null

    The file behind this title. Null until a source is attached. One title, one file — selling the same title in two qualities means two entries, which is also how every player's VOD list expects to see it.

  • mediaobjectrequiredread-only
    • idstring (uuid)requiredread-only
    • statestringrequiredread-only

      Lifecycle 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 - Draft
      • ingesting - Ingesting
      • ready - Ready
      • failed - Failed
    • original_namestringrequiredread-only

      Filename as uploaded, downloaded, or found in the watch folder. Kept for operator recognition only.

    • containerstringrequiredread-only

      File 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-only

      Size of the finished file. Drives the per-node storage quota.

    • duration_secondsnumberrequiredread-onlycan be null

      Null until a node probes the file.

    • video_codecstringrequiredread-only

      e.g. H.264, HEVC. Decides whether the operator preview player can show it.

    • widthintegerrequiredread-onlycan be null
    • heightintegerrequiredread-onlycan be null
    • fpsnumberrequiredread-onlycan be null

      Null when the file declares a variable or unknown rate.

    • checksumstringrequiredread-only

      Of the finished file. Node-to-node replication verifies against this, so a truncated copy is caught before it is ever served.

    • is_readybooleanrequiredread-only

      Whether a streaming server can serve this file now.

    • assetsobject[]requiredread-only
      • idstring (uuid)requiredread-only
      • serverstring (uuid)requiredread-only
      • server_namestringrequiredread-only
      • server_instance_idstringrequiredread-only
      • statusstringrequiredread-only
      • progress_pctintegerrequiredread-only
      • bytes_doneintegerrequiredread-only
      • bytes_totalintegerrequiredread-only
      • errorstringrequiredread-only

        Why the last attempt failed. Cleared on a successful retry.

      • last_verified_atstring (date-time)requiredread-onlycan be null

        When the node last confirmed the file is present and the right size.

    • audio_tracksobject[]requiredread-only
      • idstring (uuid)requiredread-only
      • indexintegerrequiredread-only

        Position within the stored container, 0-based.

      • languagestringrequiredread-only

        ISO 639-2 code as tagged in the container (eng, fra, ara). Empty when the source carried no tag.

      • titlestringrequiredread-only
      • codecstringrequiredread-only
      • channelsintegerrequiredread-onlycan be null
      • is_defaultbooleanrequiredread-only
    • subtitle_tracksobject[]requiredread-only
      • idstring (uuid)requiredread-only
      • indexintegerrequiredread-only

        Position within the stored container, 0-based.

      • languagestring

        ISO 639-2 code (eng, fra, ara). Required for operator-supplied files — an untagged subtitle shows up as "Track 3" on every player.

      • titlestring
      • codecstringrequiredread-only

        subrip, ass, hdmv_pgs_subtitle, ...

      • is_defaultboolean
      • is_forcedboolean

        Shown automatically for foreign-language passages even when subtitles are off.

      • is_sdhboolean
      • source_urlstring (uri)

        Where an operator-supplied subtitle was fetched from. Empty for tracks that came out of the source media.

    • deliverystringrequiredread-only

      Who 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 node
      • proxy - Proxied through a node
      • redirect - Sent straight to the source
    • source_urlstring (uri)requiredread-only

      Upstream 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 null

      Set 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-only
    • source_keystringrequiredread-only
    • source_labelstringrequiredread-only
    • supports_rangesbooleanrequiredread-only

      Whether 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 null

      The 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-only
    • proxy_balancedbooleanrequiredread-only

      Proxied 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_server alone carries the title.

    • created_atstring (date-time)requiredread-only
    • updated_atstring (date-time)requiredread-only
  • is_playablebooleanrequiredread-only

    Whether a viewer asking for it now could be served.

  • ready_node_countintegerrequiredread-only
  • created_atstring (date-time)requiredread-only
  • updated_atstring (date-time)requiredread-only

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.

What each error means