Skip to content

Player — Svelte

Terminal window
npm install @livepeer-frameworks/player-svelte
<script>
import "@livepeer-frameworks/player-svelte/player.css";
</script>
<script lang="ts">
import { Player } from "@livepeer-frameworks/player-svelte";
import "@livepeer-frameworks/player-svelte/player.css";
</script>
<Player
contentType="live"
contentId="<YOUR_PLAYBACK_ID>"
options={{
autoplay: true,
muted: true,
}}
/>

The player resolves through the official FrameWorks Gateway from the viewer’s browser, so Foghorn routes from that viewer’s IP. Set gatewayUrl only for a fully self-hosted control plane or local Gateway preview. For backend-generated playback URLs or custom players that do not use this component, use the dashboard playback DNS URL directly.

<Player
contentType="live"
contentId="<YOUR_PLAYBACK_ID>"
options={{ mistUrl: "https://edge-egress.eu.example.com" }}
/>
<Player contentType="dvr" contentId="pk_..." />
<Player contentType="clip" contentId="pk_..." />

Pass a children snippet to replace the default controls:

<script lang="ts">
import {
Player,
PlayButton,
SkipButton,
VolumeControl,
TimeDisplay,
LiveBadge,
FullscreenButton,
SettingsMenu,
} from "@livepeer-frameworks/player-svelte";
import "@livepeer-frameworks/player-svelte/player.css";
</script>
<Player contentId="pk_..." contentType="live">
{#snippet children()}
<div class="my-controls">
<PlayButton />
<SkipButton direction="back" />
<SkipButton direction="forward" />
<TimeDisplay />
<LiveBadge />
<VolumeControl />
<SettingsMenu />
<FullscreenButton />
</div>
{/snippet}
</Player>

Sub-components auto-connect to the parent <Player> via Svelte 5 context (getContext("fw-player-controller")).

ComponentPurpose
PlayButtonPlay/pause toggle
SkipButtonSkip forward/back (pass direction="back" or "forward")
VolumeControlVolume slider with mute toggle
TimeDisplayCurrent time / duration display
LiveBadgeLive indicator with jump-to-live
FullscreenButtonFullscreen toggle
SettingsMenuQuality, speed, and track selection

For fully custom controls inside a <Player>, use Svelte 5 context. The <Player> sets context with reactive getters — Svelte 5’s fine-grained reactivity tracks access automatically.

CustomControls.svelte
<script lang="ts">
import { getContext } from "svelte";
const pc: any = getContext("fw-player-controller");
</script>
<div class="my-custom-controls">
<p>State: {pc?.isPlaying ? "Playing" : "Paused"}</p>
<p>
Time: {((pc?.currentTime ?? 0) / 1000).toFixed(1)}s /
{((pc?.duration ?? 0) / 1000).toFixed(1)}s
</p>
<button onclick={() => pc?.togglePlay()}>
{pc?.isPlaying ? "Pause" : "Play"}
</button>
<button onclick={() => pc?.toggleMute()}>
{pc?.isMuted ? "Unmute" : "Mute"}
</button>
<input
type="range"
min={0}
max={1}
step={0.01}
value={pc?.volume ?? 1}
oninput={(e) => pc?.setVolume(e.currentTarget.valueAsNumber)}
/>
</div>

Then use it as children:

<script lang="ts">
import { Player } from "@livepeer-frameworks/player-svelte";
import CustomControls from "./CustomControls.svelte";
</script>
<Player contentId="pk_..." contentType="live">
{#snippet children()}
<CustomControls />
{/snippet}
</Player>

The context object from getContext("fw-player-controller") provides:

PropertyTypeDescription
isPlayingbooleanWhether actively playing
isPausedbooleanWhether paused
isMutedbooleanWhether muted
volumenumberVolume (0-1)
currentTimenumberCurrent playback position in milliseconds
durationnumberTotal duration in milliseconds (Infinity for live)
isFullscreenbooleanWhether in fullscreen
isEffectivelyLivebooleanWhether live content
isBufferingbooleanWhether buffering
isLoopEnabledbooleanWhether loop is on
errorstring | nullCurrent error
qualitiesQuality[]Available quality levels
MethodDescription
togglePlay()Toggle play/pause
toggleMute()Toggle mute
toggleFullscreen()Toggle fullscreen
toggleLoop()Toggle loop
setVolume(n)Set volume (0-1)
jumpToLive()Jump to live edge
seek(t)Seek to time in milliseconds
selectQuality(id)Select a quality level
getQualities()Get available quality levels
PropTypeDescription
contentIdstringPlayback ID
contentType'live' | 'dvr' | 'clip' | 'vod'Content type
endpointsContentEndpointsPre-resolved endpoints
thumbnailUrlstringPoster image (pre-playback overlay). Seek-bar sprites are auto-detected.
optionsPlayerOptionsConfiguration options
options.gatewayUrlstringGateway GraphQL endpoint override
options.mistUrlstringDirect MistServer base URL
options.authTokenstringBearer token for Gateway GraphQL resolution
options.playbackAuth{ token: string; transport?: "query" | "header" }Viewer JWT sent as ?jwt= by default, or Authorization: Bearer on player-controlled transports
options.stockControlsbooleanUse browser-native video controls
options.animatePrerollbooleanCycle thumbnail sprite tiles as a preroll animation before playback. Default false (static poster)
options.themestringTheme preset
options.themeOverridesobjectPer-token theme overrides
options.localestringBuilt-in UI locale
options.playbackModestringInitial controls/dev-panel mode label; use the store dev-mode helper for runtime protocol preference
onStateChangefunctionState transition callback