Skip to content
FrameworkStyle

twitch-video

Video component that plays Twitch videos and live channels through the Twitch embed player

The Twitch embed player handles both recorded videos and live channels. Its own chrome stays hidden by default, so it drops into a player skin like any other media component; set controls to use Twitch’s UI instead.

Import

pnpm add @videojs/html @videojs/twitch-video
import '@videojs/html/media/twitch-video';

Or load it from the CDN:

<script type="module" src="https://cdn.jsdelivr.net/npm/@videojs/cdn@10.0.0-beta.32/media/twitch-video.js"></script>

Load a source

src takes a video URL (twitch.tv/videos/<id>) or a channel URL (twitch.tv/<channel>), with or without the www. and go. hosts. A channel URL plays the channel’s live stream. Clips (clips.twitch.tv) are a different embed and aren’t supported.

<twitch-video src="https://www.twitch.tv/videos/106400740"></twitch-video>

Live channels

A channel embed behaves like a live media component:

  • duration reports Infinity while the stream is live.
  • Seeking is unavailable: the embed exposes no DVR window.
  • The stream going away and coming back dispatch offline and online events.
  • loop never repeats a channel; a live stream doesn’t end.

Parent hostnames

Twitch checks the embedding page’s ancestors against a parent allowlist and won’t play unless the current page is on it. The element always includes your page’s own hostname, so a plain embed needs no setup. When your player is itself framed by other hostnames, name each of them under engine.twitch.parent:

const video = document.querySelector('twitch-video');
video.source = {
  src: 'https://www.twitch.tv/videos/106400740',
  engine: { twitch: { parent: ['embed.example.com'] } },
};

Behavior

  • Volume and mute both work, like a native <video>.
  • playbackRate is reported but never applied: the embed has no rate command.
  • loop restarts a finished video from the top; the embed has no loop parameter.
  • controls is read when the embed is built; changing it later doesn’t take effect, since rebuilding the iframe would lose the playback session.
  • Fullscreen targets the iframe, so Twitch’s own chrome shows in fullscreen.

Examples

Basic Usage

<twitch-video class="twitch-video" src="https://www.twitch.tv/videos/106400740" controls></twitch-video>

API Reference

Attributes

These attributes configure the embedded media adapter:

AttributeTypeDefaultDetails
autoplaybooleanfalse
controlsbooleanfalse
loopbooleanfalse
mutedbooleanfalse
playsinlinebooleantrue
posterstring''
preloadMediaPreloadType'metadata'
srcstring''

Properties

PropertyTypeDefaultDetails
autoplaybooleanfalse
bufferedTimeRangeLike
controlsbooleanfalse
currentSrcstring
currentTimenumber
defaultMutedbooleanfalse
durationnumber
endedboolean
engineWindow | null
errorMediaError | null
isFullscreenboolean
loopbooleanfalse
mutedbooleanfalse
pausedboolean
playbackRatenumber
played{ length: number; start(index: number): number; end(index: number): number }
playsInlinebooleantrue
posterstring''
preloadMediaPreloadType'metadata'
readyStatenumber
seekableTimeRangeLike
seekingboolean
source{ src?: string; engine?: TwitchSourceEngineConfig } | nullnull
srcstring''
textTracksTextTrackListLike
volumenumber

Engine options

source.engine.twitch

Pass Twitch embed parameters under source.engine.twitch, spelled exactly as Twitch spells them, plus anything Twitch adds next. Media Sources covers how engine options fit into a structured source.

controls, autoplay, and muted come from the props of the same name, and the video or channel comes from src, so none of those have an engine.twitch spelling.

OptionTypeDetails
collectionstring | undefined
parentstring | readonly string[] | undefined
referrerPolicyReferrerPolicy | undefined
timestring | undefined

Methods

Supports these media methods: afterLoadbeginLoadcreatePlayerexitFullscreenisStaleloadonEmbedEventonLoadedonMessageonUpdateStatepauseplayrequestFullscreenresetStatesendCommandsnapshotProps

Events

Implements these standard media events through the embedded player: durationchangeemptiedendederrorloadedmetadataloadstartplayingprogressseekedseekingtimeupdatevolumechangewaiting

Also emits these Video.js-specific events:

EventDescription
loadcomplete
sourcechangeFired when `source` changes, either directly or by resolving a new `src`. Read `source` for the new value.