@livepeer-frameworks/player-svelte 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DevModePanel.svelte +650 -0
- package/dist/DevModePanel.svelte.d.ts +31 -0
- package/dist/DvdLogo.svelte +213 -0
- package/dist/DvdLogo.svelte.d.ts +7 -0
- package/dist/Icons.svelte +27 -0
- package/dist/Icons.svelte.d.ts +25 -0
- package/dist/IdleScreen.svelte +752 -0
- package/dist/IdleScreen.svelte.d.ts +11 -0
- package/dist/LoadingScreen.svelte +689 -0
- package/dist/LoadingScreen.svelte.d.ts +7 -0
- package/dist/Player.svelte +482 -0
- package/dist/Player.svelte.d.ts +26 -0
- package/dist/PlayerControls.svelte +739 -0
- package/dist/PlayerControls.svelte.d.ts +20 -0
- package/dist/SeekBar.svelte +274 -0
- package/dist/SeekBar.svelte.d.ts +25 -0
- package/dist/SkipIndicator.svelte +95 -0
- package/dist/SkipIndicator.svelte.d.ts +14 -0
- package/dist/SpeedIndicator.svelte +38 -0
- package/dist/SpeedIndicator.svelte.d.ts +8 -0
- package/dist/StatsPanel.svelte +155 -0
- package/dist/StatsPanel.svelte.d.ts +27 -0
- package/dist/StreamStateOverlay.svelte +266 -0
- package/dist/StreamStateOverlay.svelte.d.ts +18 -0
- package/dist/SubtitleRenderer.svelte +234 -0
- package/dist/SubtitleRenderer.svelte.d.ts +41 -0
- package/dist/ThumbnailOverlay.svelte +96 -0
- package/dist/ThumbnailOverlay.svelte.d.ts +11 -0
- package/dist/TitleOverlay.svelte +47 -0
- package/dist/TitleOverlay.svelte.d.ts +9 -0
- package/dist/assets/logomark.svg +56 -0
- package/dist/components/VolumeIcons.svelte +53 -0
- package/dist/components/VolumeIcons.svelte.d.ts +10 -0
- package/dist/global.d.ts +15 -0
- package/dist/icons/FullscreenExitIcon.svelte +33 -0
- package/dist/icons/FullscreenExitIcon.svelte.d.ts +8 -0
- package/dist/icons/FullscreenIcon.svelte +33 -0
- package/dist/icons/FullscreenIcon.svelte.d.ts +8 -0
- package/dist/icons/PauseIcon.svelte +28 -0
- package/dist/icons/PauseIcon.svelte.d.ts +8 -0
- package/dist/icons/PictureInPictureIcon.svelte +28 -0
- package/dist/icons/PictureInPictureIcon.svelte.d.ts +8 -0
- package/dist/icons/PlayIcon.svelte +27 -0
- package/dist/icons/PlayIcon.svelte.d.ts +8 -0
- package/dist/icons/SeekToLiveIcon.svelte +30 -0
- package/dist/icons/SeekToLiveIcon.svelte.d.ts +8 -0
- package/dist/icons/SettingsIcon.svelte +40 -0
- package/dist/icons/SettingsIcon.svelte.d.ts +8 -0
- package/dist/icons/SkipBackIcon.svelte +32 -0
- package/dist/icons/SkipBackIcon.svelte.d.ts +8 -0
- package/dist/icons/SkipForwardIcon.svelte +32 -0
- package/dist/icons/SkipForwardIcon.svelte.d.ts +8 -0
- package/dist/icons/StatsIcon.svelte +29 -0
- package/dist/icons/StatsIcon.svelte.d.ts +8 -0
- package/dist/icons/VolumeOffIcon.svelte +29 -0
- package/dist/icons/VolumeOffIcon.svelte.d.ts +8 -0
- package/dist/icons/VolumeUpIcon.svelte +34 -0
- package/dist/icons/VolumeUpIcon.svelte.d.ts +8 -0
- package/dist/icons/index.d.ts +17 -0
- package/dist/icons/index.js +17 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.js +54 -0
- package/dist/player.css +2 -0
- package/dist/stores/index.d.ts +15 -0
- package/dist/stores/index.js +21 -0
- package/dist/stores/playbackQuality.d.ts +43 -0
- package/dist/stores/playbackQuality.js +107 -0
- package/dist/stores/playerContext.d.ts +73 -0
- package/dist/stores/playerContext.js +166 -0
- package/dist/stores/playerController.d.ts +178 -0
- package/dist/stores/playerController.js +358 -0
- package/dist/stores/playerSelection.d.ts +84 -0
- package/dist/stores/playerSelection.js +159 -0
- package/dist/stores/streamState.d.ts +44 -0
- package/dist/stores/streamState.js +314 -0
- package/dist/stores/viewerEndpoints.d.ts +48 -0
- package/dist/stores/viewerEndpoints.js +178 -0
- package/dist/types.d.ts +4 -0
- package/dist/types.js +4 -0
- package/dist/ui/Badge.svelte +21 -0
- package/dist/ui/Badge.svelte.d.ts +32 -0
- package/dist/ui/Button.svelte +42 -0
- package/dist/ui/Button.svelte.d.ts +35 -0
- package/dist/ui/Slider.svelte +100 -0
- package/dist/ui/Slider.svelte.d.ts +17 -0
- package/dist/ui/badge.d.ts +6 -0
- package/dist/ui/badge.js +10 -0
- package/dist/ui/button.d.ts +8 -0
- package/dist/ui/button.js +21 -0
- package/dist/ui/context-menu/ContextMenuCheckboxItem.svelte +34 -0
- package/dist/ui/context-menu/ContextMenuCheckboxItem.svelte.d.ts +31 -0
- package/dist/ui/context-menu/ContextMenuContent.svelte +17 -0
- package/dist/ui/context-menu/ContextMenuContent.svelte.d.ts +7 -0
- package/dist/ui/context-menu/ContextMenuItem.svelte +22 -0
- package/dist/ui/context-menu/ContextMenuItem.svelte.d.ts +8 -0
- package/dist/ui/context-menu/ContextMenuLabel.svelte +22 -0
- package/dist/ui/context-menu/ContextMenuLabel.svelte.d.ts +8 -0
- package/dist/ui/context-menu/ContextMenuPortal.svelte +11 -0
- package/dist/ui/context-menu/ContextMenuPortal.svelte.d.ts +6 -0
- package/dist/ui/context-menu/ContextMenuRadioItem.svelte +21 -0
- package/dist/ui/context-menu/ContextMenuRadioItem.svelte.d.ts +31 -0
- package/dist/ui/context-menu/ContextMenuSeparator.svelte +14 -0
- package/dist/ui/context-menu/ContextMenuSeparator.svelte.d.ts +6 -0
- package/dist/ui/context-menu/ContextMenuShortcut.svelte +19 -0
- package/dist/ui/context-menu/ContextMenuShortcut.svelte.d.ts +7 -0
- package/dist/ui/context-menu/ContextMenuSubContent.svelte +20 -0
- package/dist/ui/context-menu/ContextMenuSubContent.svelte.d.ts +7 -0
- package/dist/ui/context-menu/ContextMenuSubTrigger.svelte +34 -0
- package/dist/ui/context-menu/ContextMenuSubTrigger.svelte.d.ts +8 -0
- package/dist/ui/context-menu/index.d.ts +17 -0
- package/dist/ui/context-menu/index.js +17 -0
- package/package.json +51 -0
- package/src/DevModePanel.svelte +650 -0
- package/src/DvdLogo.svelte +213 -0
- package/src/Icons.svelte +27 -0
- package/src/IdleScreen.svelte +739 -0
- package/src/LoadingScreen.svelte +674 -0
- package/src/Player.svelte +483 -0
- package/src/PlayerControls.svelte +752 -0
- package/src/SeekBar.svelte +274 -0
- package/src/SkipIndicator.svelte +95 -0
- package/src/SpeedIndicator.svelte +37 -0
- package/src/StatsPanel.svelte +155 -0
- package/src/StreamStateOverlay.svelte +266 -0
- package/src/SubtitleRenderer.svelte +234 -0
- package/src/ThumbnailOverlay.svelte +96 -0
- package/src/TitleOverlay.svelte +47 -0
- package/src/assets/logomark.svg +56 -0
- package/src/components/VolumeIcons.svelte +53 -0
- package/src/global.d.ts +15 -0
- package/src/icons/FullscreenExitIcon.svelte +33 -0
- package/src/icons/FullscreenIcon.svelte +33 -0
- package/src/icons/PauseIcon.svelte +28 -0
- package/src/icons/PictureInPictureIcon.svelte +28 -0
- package/src/icons/PlayIcon.svelte +27 -0
- package/src/icons/SeekToLiveIcon.svelte +30 -0
- package/src/icons/SettingsIcon.svelte +40 -0
- package/src/icons/SkipBackIcon.svelte +32 -0
- package/src/icons/SkipForwardIcon.svelte +32 -0
- package/src/icons/StatsIcon.svelte +29 -0
- package/src/icons/VolumeOffIcon.svelte +29 -0
- package/src/icons/VolumeUpIcon.svelte +34 -0
- package/src/icons/index.ts +18 -0
- package/src/index.ts +84 -0
- package/src/player.css +2 -0
- package/src/stores/index.ts +88 -0
- package/src/stores/playbackQuality.ts +137 -0
- package/src/stores/playerContext.ts +221 -0
- package/src/stores/playerController.ts +568 -0
- package/src/stores/playerSelection.ts +216 -0
- package/src/stores/streamState.ts +367 -0
- package/src/stores/viewerEndpoints.ts +224 -0
- package/src/types.ts +6 -0
- package/src/ui/Badge.svelte +21 -0
- package/src/ui/Button.svelte +42 -0
- package/src/ui/Slider.svelte +100 -0
- package/src/ui/badge.ts +20 -0
- package/src/ui/button.ts +35 -0
- package/src/ui/context-menu/ContextMenuCheckboxItem.svelte +34 -0
- package/src/ui/context-menu/ContextMenuContent.svelte +17 -0
- package/src/ui/context-menu/ContextMenuItem.svelte +22 -0
- package/src/ui/context-menu/ContextMenuLabel.svelte +22 -0
- package/src/ui/context-menu/ContextMenuPortal.svelte +11 -0
- package/src/ui/context-menu/ContextMenuRadioItem.svelte +21 -0
- package/src/ui/context-menu/ContextMenuSeparator.svelte +14 -0
- package/src/ui/context-menu/ContextMenuShortcut.svelte +19 -0
- package/src/ui/context-menu/ContextMenuSubContent.svelte +20 -0
- package/src/ui/context-menu/ContextMenuSubTrigger.svelte +34 -0
- package/src/ui/context-menu/index.ts +36 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
VolumeUpIcon.svelte
|
|
3
|
+
-->
|
|
4
|
+
<script lang="ts">
|
|
5
|
+
interface Props {
|
|
6
|
+
size?: number;
|
|
7
|
+
color?: string;
|
|
8
|
+
class?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let {
|
|
12
|
+
size = 16,
|
|
13
|
+
color = 'currentColor',
|
|
14
|
+
class: className = '',
|
|
15
|
+
}: Props = $props();
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<svg
|
|
19
|
+
width={size}
|
|
20
|
+
height={size}
|
|
21
|
+
viewBox="0 0 24 24"
|
|
22
|
+
fill="none"
|
|
23
|
+
class={className}
|
|
24
|
+
aria-hidden="true"
|
|
25
|
+
>
|
|
26
|
+
<polygon points="11,5 6,9 2,9 2,15 6,15 11,19" fill={color} />
|
|
27
|
+
<path
|
|
28
|
+
d="M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07"
|
|
29
|
+
stroke={color}
|
|
30
|
+
stroke-width="2"
|
|
31
|
+
stroke-linecap="round"
|
|
32
|
+
stroke-linejoin="round"
|
|
33
|
+
/>
|
|
34
|
+
</svg>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte icon components
|
|
3
|
+
*
|
|
4
|
+
* Port of src/components/Icons.tsx
|
|
5
|
+
*/
|
|
6
|
+
export { default as PlayIcon } from './PlayIcon.svelte';
|
|
7
|
+
export { default as PauseIcon } from './PauseIcon.svelte';
|
|
8
|
+
export { default as SkipBackIcon } from './SkipBackIcon.svelte';
|
|
9
|
+
export { default as SkipForwardIcon } from './SkipForwardIcon.svelte';
|
|
10
|
+
export { default as VolumeUpIcon } from './VolumeUpIcon.svelte';
|
|
11
|
+
export { default as VolumeOffIcon } from './VolumeOffIcon.svelte';
|
|
12
|
+
export { default as FullscreenIcon } from './FullscreenIcon.svelte';
|
|
13
|
+
export { default as FullscreenExitIcon } from './FullscreenExitIcon.svelte';
|
|
14
|
+
export { default as SettingsIcon } from './SettingsIcon.svelte';
|
|
15
|
+
export { default as StatsIcon } from './StatsIcon.svelte';
|
|
16
|
+
export { default as PictureInPictureIcon } from './PictureInPictureIcon.svelte';
|
|
17
|
+
export { default as SeekToLiveIcon } from './SeekToLiveIcon.svelte';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte icon components
|
|
3
|
+
*
|
|
4
|
+
* Port of src/components/Icons.tsx
|
|
5
|
+
*/
|
|
6
|
+
export { default as PlayIcon } from './PlayIcon.svelte';
|
|
7
|
+
export { default as PauseIcon } from './PauseIcon.svelte';
|
|
8
|
+
export { default as SkipBackIcon } from './SkipBackIcon.svelte';
|
|
9
|
+
export { default as SkipForwardIcon } from './SkipForwardIcon.svelte';
|
|
10
|
+
export { default as VolumeUpIcon } from './VolumeUpIcon.svelte';
|
|
11
|
+
export { default as VolumeOffIcon } from './VolumeOffIcon.svelte';
|
|
12
|
+
export { default as FullscreenIcon } from './FullscreenIcon.svelte';
|
|
13
|
+
export { default as FullscreenExitIcon } from './FullscreenExitIcon.svelte';
|
|
14
|
+
export { default as SettingsIcon } from './SettingsIcon.svelte';
|
|
15
|
+
export { default as StatsIcon } from './StatsIcon.svelte';
|
|
16
|
+
export { default as PictureInPictureIcon } from './PictureInPictureIcon.svelte';
|
|
17
|
+
export { default as SeekToLiveIcon } from './SeekToLiveIcon.svelte';
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte exports for SvelteKit/Svelte 5 environments.
|
|
3
|
+
*
|
|
4
|
+
* Full-featured player with React parity including:
|
|
5
|
+
* - Gateway URL integration with GraphQL endpoint resolution
|
|
6
|
+
* - MistServer WebSocket/HTTP stream state polling
|
|
7
|
+
* - Quality monitoring and stats panel
|
|
8
|
+
* - DevMode panel for player/source testing
|
|
9
|
+
* - InteractionController for modern gestures
|
|
10
|
+
* - MistReporter for stats reporting
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```svelte
|
|
14
|
+
* <script>
|
|
15
|
+
* import { Player } from '@livepeer-frameworks/player/svelte';
|
|
16
|
+
* </script>
|
|
17
|
+
*
|
|
18
|
+
* <Player
|
|
19
|
+
* contentId="my-stream"
|
|
20
|
+
* contentType="live"
|
|
21
|
+
* options={{ gatewayUrl: "https://gateway.example.com/graphql", devMode: true }}
|
|
22
|
+
* autoplay
|
|
23
|
+
* muted
|
|
24
|
+
* />
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export { default as Button } from './ui/Button.svelte';
|
|
28
|
+
export { default as Badge } from './ui/Badge.svelte';
|
|
29
|
+
export { default as Slider } from './ui/Slider.svelte';
|
|
30
|
+
export { default as Player } from './Player.svelte';
|
|
31
|
+
export { default as PlayerControls } from './PlayerControls.svelte';
|
|
32
|
+
export { default as SeekBar } from './SeekBar.svelte';
|
|
33
|
+
export { default as SpeedIndicator } from './SpeedIndicator.svelte';
|
|
34
|
+
export { default as SkipIndicator } from './SkipIndicator.svelte';
|
|
35
|
+
export { default as IdleScreen } from './IdleScreen.svelte';
|
|
36
|
+
export { default as LoadingScreen } from './LoadingScreen.svelte';
|
|
37
|
+
export { default as StreamStateOverlay } from './StreamStateOverlay.svelte';
|
|
38
|
+
export { default as SubtitleRenderer } from './SubtitleRenderer.svelte';
|
|
39
|
+
export { default as DvdLogo } from './DvdLogo.svelte';
|
|
40
|
+
export { default as TitleOverlay } from './TitleOverlay.svelte';
|
|
41
|
+
export { default as ThumbnailOverlay } from './ThumbnailOverlay.svelte';
|
|
42
|
+
export { default as StatsPanel } from './StatsPanel.svelte';
|
|
43
|
+
export { default as DevModePanel } from './DevModePanel.svelte';
|
|
44
|
+
export * from './icons';
|
|
45
|
+
export * from './stores';
|
|
46
|
+
export * from './ui/context-menu';
|
|
47
|
+
export type { SkipDirection } from './types';
|
|
48
|
+
export { PlayerController, PlayerManager, globalPlayerManager } from '@livepeer-frameworks/player-core';
|
|
49
|
+
export type { PlayerControllerConfig, PlayerControllerEvents } from '@livepeer-frameworks/player-core';
|
|
50
|
+
export type { PlayerState, PlayerStateContext, StreamState, StreamStatus, ContentMetadata, ContentEndpoints, EndpointInfo, PlaybackMode, PlaybackQuality, MistStreamInfo, PlayerOptions, PlayerMetadata, PlayerSelection, PlayerCombination, PlayerManagerOptions, PlayerManagerEvents, } from '@livepeer-frameworks/player-core';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte exports for SvelteKit/Svelte 5 environments.
|
|
3
|
+
*
|
|
4
|
+
* Full-featured player with React parity including:
|
|
5
|
+
* - Gateway URL integration with GraphQL endpoint resolution
|
|
6
|
+
* - MistServer WebSocket/HTTP stream state polling
|
|
7
|
+
* - Quality monitoring and stats panel
|
|
8
|
+
* - DevMode panel for player/source testing
|
|
9
|
+
* - InteractionController for modern gestures
|
|
10
|
+
* - MistReporter for stats reporting
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```svelte
|
|
14
|
+
* <script>
|
|
15
|
+
* import { Player } from '@livepeer-frameworks/player/svelte';
|
|
16
|
+
* </script>
|
|
17
|
+
*
|
|
18
|
+
* <Player
|
|
19
|
+
* contentId="my-stream"
|
|
20
|
+
* contentType="live"
|
|
21
|
+
* options={{ gatewayUrl: "https://gateway.example.com/graphql", devMode: true }}
|
|
22
|
+
* autoplay
|
|
23
|
+
* muted
|
|
24
|
+
* />
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
// UI primitives
|
|
28
|
+
export { default as Button } from './ui/Button.svelte';
|
|
29
|
+
export { default as Badge } from './ui/Badge.svelte';
|
|
30
|
+
export { default as Slider } from './ui/Slider.svelte';
|
|
31
|
+
// Main components
|
|
32
|
+
export { default as Player } from './Player.svelte';
|
|
33
|
+
export { default as PlayerControls } from './PlayerControls.svelte';
|
|
34
|
+
export { default as SeekBar } from './SeekBar.svelte';
|
|
35
|
+
// Overlay components
|
|
36
|
+
export { default as SpeedIndicator } from './SpeedIndicator.svelte';
|
|
37
|
+
export { default as SkipIndicator } from './SkipIndicator.svelte';
|
|
38
|
+
export { default as IdleScreen } from './IdleScreen.svelte';
|
|
39
|
+
export { default as LoadingScreen } from './LoadingScreen.svelte';
|
|
40
|
+
export { default as StreamStateOverlay } from './StreamStateOverlay.svelte';
|
|
41
|
+
export { default as SubtitleRenderer } from './SubtitleRenderer.svelte';
|
|
42
|
+
export { default as DvdLogo } from './DvdLogo.svelte';
|
|
43
|
+
export { default as TitleOverlay } from './TitleOverlay.svelte';
|
|
44
|
+
export { default as ThumbnailOverlay } from './ThumbnailOverlay.svelte';
|
|
45
|
+
export { default as StatsPanel } from './StatsPanel.svelte';
|
|
46
|
+
export { default as DevModePanel } from './DevModePanel.svelte';
|
|
47
|
+
// Icon components
|
|
48
|
+
export * from './icons';
|
|
49
|
+
// Stores
|
|
50
|
+
export * from './stores';
|
|
51
|
+
// Context menu components
|
|
52
|
+
export * from './ui/context-menu';
|
|
53
|
+
// Re-export core types and classes for Svelte users
|
|
54
|
+
export { PlayerController, PlayerManager, globalPlayerManager } from '@livepeer-frameworks/player-core';
|
package/dist/player.css
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte stores for player state management.
|
|
3
|
+
*
|
|
4
|
+
* These stores provide reactive state management for:
|
|
5
|
+
* - MistServer stream state polling (WebSocket/HTTP)
|
|
6
|
+
* - Gateway endpoint resolution (GraphQL)
|
|
7
|
+
* - Player instance context sharing
|
|
8
|
+
* - Playback quality monitoring
|
|
9
|
+
*/
|
|
10
|
+
export { createStreamStateManager, createDerivedStreamStatus, createDerivedIsOnline, createDerivedStreamInfo, type StreamStateOptions, type StreamStateStore, } from './streamState';
|
|
11
|
+
export { createEndpointResolver, createDerivedEndpoints, createDerivedPrimaryEndpoint, createDerivedMetadata, createDerivedStatus, type ViewerEndpointsOptions, type ViewerEndpointsStore, type ViewerEndpointsState, type EndpointStatus, } from './viewerEndpoints';
|
|
12
|
+
export { createPlayerContext, setPlayerContextInComponent, getPlayerContextFromComponent, getPlayerContextOrFallback, createDerivedVideoElement, createDerivedIsReady, createDerivedPlayerInfo, type PlayerContextState, type PlayerContextStore, } from './playerContext';
|
|
13
|
+
export { createPlaybackQualityMonitor, createDerivedQualityScore, createDerivedStallCount, createDerivedFrameDropRate, createDerivedBitrate, createDerivedLatency, type PlaybackQualityOptions, type PlaybackQualityStore, } from './playbackQuality';
|
|
14
|
+
export { createPlayerSelectionStore, createDerivedSelection, createDerivedCombinations, createDerivedReady, createDerivedSelectedPlayer, createDerivedSelectedSourceType, createDerivedCompatibleCombinations, createDerivedIncompatibleCombinations, type PlayerSelectionOptions, type PlayerSelectionState, type PlayerSelectionStore, } from './playerSelection';
|
|
15
|
+
export { createPlayerControllerStore, createDerivedState, createDerivedIsPlaying, createDerivedCurrentTime, createDerivedDuration, createDerivedError, createDerivedVideoElement as createDerivedControllerVideoElement, createDerivedShouldShowControls, createDerivedShouldShowIdleScreen, type PlayerControllerStoreConfig, type PlayerControllerState, type PlayerControllerStore, } from './playerController';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte stores for player state management.
|
|
3
|
+
*
|
|
4
|
+
* These stores provide reactive state management for:
|
|
5
|
+
* - MistServer stream state polling (WebSocket/HTTP)
|
|
6
|
+
* - Gateway endpoint resolution (GraphQL)
|
|
7
|
+
* - Player instance context sharing
|
|
8
|
+
* - Playback quality monitoring
|
|
9
|
+
*/
|
|
10
|
+
// Stream state (MistServer polling)
|
|
11
|
+
export { createStreamStateManager, createDerivedStreamStatus, createDerivedIsOnline, createDerivedStreamInfo, } from './streamState';
|
|
12
|
+
// Viewer endpoints (Gateway resolution)
|
|
13
|
+
export { createEndpointResolver, createDerivedEndpoints, createDerivedPrimaryEndpoint, createDerivedMetadata, createDerivedStatus, } from './viewerEndpoints';
|
|
14
|
+
// Player context (instance sharing)
|
|
15
|
+
export { createPlayerContext, setPlayerContextInComponent, getPlayerContextFromComponent, getPlayerContextOrFallback, createDerivedVideoElement, createDerivedIsReady, createDerivedPlayerInfo, } from './playerContext';
|
|
16
|
+
// Playback quality monitoring
|
|
17
|
+
export { createPlaybackQualityMonitor, createDerivedQualityScore, createDerivedStallCount, createDerivedFrameDropRate, createDerivedBitrate, createDerivedLatency, } from './playbackQuality';
|
|
18
|
+
// Player selection (event-driven, cached)
|
|
19
|
+
export { createPlayerSelectionStore, createDerivedSelection, createDerivedCombinations, createDerivedReady, createDerivedSelectedPlayer, createDerivedSelectedSourceType, createDerivedCompatibleCombinations, createDerivedIncompatibleCombinations, } from './playerSelection';
|
|
20
|
+
// PlayerController store (central orchestrator)
|
|
21
|
+
export { createPlayerControllerStore, createDerivedState, createDerivedIsPlaying, createDerivedCurrentTime, createDerivedDuration, createDerivedError, createDerivedVideoElement as createDerivedControllerVideoElement, createDerivedShouldShowControls, createDerivedShouldShowIdleScreen, } from './playerController';
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte store for playback quality monitoring.
|
|
3
|
+
*
|
|
4
|
+
* Wraps QualityMonitor for reactive quality metrics.
|
|
5
|
+
*/
|
|
6
|
+
import { type Readable } from 'svelte/store';
|
|
7
|
+
import { type PlaybackQuality } from '@livepeer-frameworks/player-core';
|
|
8
|
+
export interface PlaybackQualityOptions {
|
|
9
|
+
sampleInterval?: number;
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface PlaybackQualityStore extends Readable<PlaybackQuality | null> {
|
|
13
|
+
start: (videoElement: HTMLVideoElement) => void;
|
|
14
|
+
stop: () => void;
|
|
15
|
+
getPlaybackScore: () => number;
|
|
16
|
+
destroy: () => void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create a playback quality monitoring store.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```svelte
|
|
23
|
+
* <script>
|
|
24
|
+
* import { createPlaybackQualityMonitor } from './stores/playbackQuality';
|
|
25
|
+
*
|
|
26
|
+
* const quality = createPlaybackQualityMonitor();
|
|
27
|
+
*
|
|
28
|
+
* // Start monitoring when video element is available
|
|
29
|
+
* $: if (videoElement) quality.start(videoElement);
|
|
30
|
+
*
|
|
31
|
+
* // Access quality metrics
|
|
32
|
+
* $: score = $quality?.score ?? 100;
|
|
33
|
+
* $: stallCount = $quality?.stallCount ?? 0;
|
|
34
|
+
* </script>
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function createPlaybackQualityMonitor(options?: PlaybackQualityOptions): PlaybackQualityStore;
|
|
38
|
+
export declare function createDerivedQualityScore(store: PlaybackQualityStore): Readable<number>;
|
|
39
|
+
export declare function createDerivedStallCount(store: PlaybackQualityStore): Readable<number>;
|
|
40
|
+
export declare function createDerivedFrameDropRate(store: PlaybackQualityStore): Readable<number>;
|
|
41
|
+
export declare function createDerivedBitrate(store: PlaybackQualityStore): Readable<number>;
|
|
42
|
+
export declare function createDerivedLatency(store: PlaybackQualityStore): Readable<number | undefined>;
|
|
43
|
+
export default createPlaybackQualityMonitor;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte store for playback quality monitoring.
|
|
3
|
+
*
|
|
4
|
+
* Wraps QualityMonitor for reactive quality metrics.
|
|
5
|
+
*/
|
|
6
|
+
import { writable, derived } from 'svelte/store';
|
|
7
|
+
import { QualityMonitor } from '@livepeer-frameworks/player-core';
|
|
8
|
+
const initialQuality = {
|
|
9
|
+
score: 100,
|
|
10
|
+
bitrate: 0,
|
|
11
|
+
bufferedAhead: 0,
|
|
12
|
+
frameDropRate: 0,
|
|
13
|
+
stallCount: 0,
|
|
14
|
+
latency: 0,
|
|
15
|
+
timestamp: Date.now(),
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Create a playback quality monitoring store.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```svelte
|
|
22
|
+
* <script>
|
|
23
|
+
* import { createPlaybackQualityMonitor } from './stores/playbackQuality';
|
|
24
|
+
*
|
|
25
|
+
* const quality = createPlaybackQualityMonitor();
|
|
26
|
+
*
|
|
27
|
+
* // Start monitoring when video element is available
|
|
28
|
+
* $: if (videoElement) quality.start(videoElement);
|
|
29
|
+
*
|
|
30
|
+
* // Access quality metrics
|
|
31
|
+
* $: score = $quality?.score ?? 100;
|
|
32
|
+
* $: stallCount = $quality?.stallCount ?? 0;
|
|
33
|
+
* </script>
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function createPlaybackQualityMonitor(options = {}) {
|
|
37
|
+
const { sampleInterval = 500, enabled = true } = options;
|
|
38
|
+
const store = writable(null);
|
|
39
|
+
let monitor = null;
|
|
40
|
+
let currentVideoElement = null;
|
|
41
|
+
/**
|
|
42
|
+
* Start monitoring a video element
|
|
43
|
+
*/
|
|
44
|
+
function start(videoElement) {
|
|
45
|
+
if (!enabled)
|
|
46
|
+
return;
|
|
47
|
+
// Stop existing monitor if different element
|
|
48
|
+
if (currentVideoElement && currentVideoElement !== videoElement) {
|
|
49
|
+
stop();
|
|
50
|
+
}
|
|
51
|
+
currentVideoElement = videoElement;
|
|
52
|
+
if (!monitor) {
|
|
53
|
+
monitor = new QualityMonitor({
|
|
54
|
+
sampleInterval,
|
|
55
|
+
onSample: (quality) => {
|
|
56
|
+
store.set(quality);
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
monitor.start(videoElement);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Stop monitoring
|
|
64
|
+
*/
|
|
65
|
+
function stop() {
|
|
66
|
+
monitor?.stop();
|
|
67
|
+
currentVideoElement = null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get current playback score
|
|
71
|
+
*/
|
|
72
|
+
function getPlaybackScore() {
|
|
73
|
+
return monitor?.getPlaybackScore() ?? 1.0;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Cleanup
|
|
77
|
+
*/
|
|
78
|
+
function destroy() {
|
|
79
|
+
stop();
|
|
80
|
+
monitor = null;
|
|
81
|
+
store.set(null);
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
subscribe: store.subscribe,
|
|
85
|
+
start,
|
|
86
|
+
stop,
|
|
87
|
+
getPlaybackScore,
|
|
88
|
+
destroy,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// Convenience derived stores
|
|
92
|
+
export function createDerivedQualityScore(store) {
|
|
93
|
+
return derived(store, $quality => $quality?.score ?? 100);
|
|
94
|
+
}
|
|
95
|
+
export function createDerivedStallCount(store) {
|
|
96
|
+
return derived(store, $quality => $quality?.stallCount ?? 0);
|
|
97
|
+
}
|
|
98
|
+
export function createDerivedFrameDropRate(store) {
|
|
99
|
+
return derived(store, $quality => $quality?.frameDropRate ?? 0);
|
|
100
|
+
}
|
|
101
|
+
export function createDerivedBitrate(store) {
|
|
102
|
+
return derived(store, $quality => $quality?.bitrate ?? 0);
|
|
103
|
+
}
|
|
104
|
+
export function createDerivedLatency(store) {
|
|
105
|
+
return derived(store, $quality => $quality?.latency);
|
|
106
|
+
}
|
|
107
|
+
export default createPlaybackQualityMonitor;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte store for player instance context sharing.
|
|
3
|
+
*
|
|
4
|
+
* Port of PlayerContext.tsx React context to Svelte 5 stores.
|
|
5
|
+
*/
|
|
6
|
+
import { type Readable } from 'svelte/store';
|
|
7
|
+
import { type StreamInfo, type IPlayer } from '@livepeer-frameworks/player-core';
|
|
8
|
+
export interface PlayerContextState {
|
|
9
|
+
/** Current video element (if available) */
|
|
10
|
+
videoElement: HTMLVideoElement | null;
|
|
11
|
+
/** Current player instance */
|
|
12
|
+
player: IPlayer | null;
|
|
13
|
+
/** Player name */
|
|
14
|
+
playerName: string | null;
|
|
15
|
+
/** Player shortname */
|
|
16
|
+
playerShortname: string | null;
|
|
17
|
+
/** Current source type */
|
|
18
|
+
sourceType: string | null;
|
|
19
|
+
/** Current source URL */
|
|
20
|
+
sourceUrl: string | null;
|
|
21
|
+
/** Whether player is ready */
|
|
22
|
+
isReady: boolean;
|
|
23
|
+
/** Current stream info */
|
|
24
|
+
streamInfo: StreamInfo | null;
|
|
25
|
+
}
|
|
26
|
+
export interface PlayerContextStore extends Readable<PlayerContextState> {
|
|
27
|
+
setVideoElement: (el: HTMLVideoElement | null) => void;
|
|
28
|
+
setPlayer: (player: IPlayer | null) => void;
|
|
29
|
+
setSource: (type: string | null, url: string | null) => void;
|
|
30
|
+
setStreamInfo: (info: StreamInfo | null) => void;
|
|
31
|
+
setReady: (ready: boolean) => void;
|
|
32
|
+
reset: () => void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a player context store for sharing player state across components.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```svelte
|
|
39
|
+
* <!-- Parent component -->
|
|
40
|
+
* <script>
|
|
41
|
+
* import { createPlayerContext, setPlayerContext } from './stores/playerContext';
|
|
42
|
+
* const playerContext = createPlayerContext();
|
|
43
|
+
* setPlayerContext(playerContext);
|
|
44
|
+
* </script>
|
|
45
|
+
*
|
|
46
|
+
* <!-- Child component -->
|
|
47
|
+
* <script>
|
|
48
|
+
* import { getPlayerContext } from './stores/playerContext';
|
|
49
|
+
* const playerContext = getPlayerContext();
|
|
50
|
+
* $: videoEl = $playerContext.videoElement;
|
|
51
|
+
* </script>
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare function createPlayerContext(): PlayerContextStore;
|
|
55
|
+
/**
|
|
56
|
+
* Set player context in Svelte context (call in parent component)
|
|
57
|
+
*/
|
|
58
|
+
export declare function setPlayerContextInComponent(context: PlayerContextStore): void;
|
|
59
|
+
/**
|
|
60
|
+
* Get player context from Svelte context (call in child components)
|
|
61
|
+
*/
|
|
62
|
+
export declare function getPlayerContextFromComponent(): PlayerContextStore | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Get player context or create a fallback that uses globalPlayerManager
|
|
65
|
+
*/
|
|
66
|
+
export declare function getPlayerContextOrFallback(): PlayerContextStore;
|
|
67
|
+
export declare function createDerivedVideoElement(store: PlayerContextStore): Readable<HTMLVideoElement | null>;
|
|
68
|
+
export declare function createDerivedIsReady(store: PlayerContextStore): Readable<boolean>;
|
|
69
|
+
export declare function createDerivedPlayerInfo(store: PlayerContextStore): Readable<{
|
|
70
|
+
name: string | null;
|
|
71
|
+
shortname: string | null;
|
|
72
|
+
}>;
|
|
73
|
+
export default createPlayerContext;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte store for player instance context sharing.
|
|
3
|
+
*
|
|
4
|
+
* Port of PlayerContext.tsx React context to Svelte 5 stores.
|
|
5
|
+
*/
|
|
6
|
+
import { writable, derived } from 'svelte/store';
|
|
7
|
+
import { getContext, setContext } from 'svelte';
|
|
8
|
+
import { globalPlayerManager } from '@livepeer-frameworks/player-core';
|
|
9
|
+
// Context key
|
|
10
|
+
const PLAYER_CONTEXT_KEY = Symbol('player-context');
|
|
11
|
+
const initialState = {
|
|
12
|
+
videoElement: null,
|
|
13
|
+
player: null,
|
|
14
|
+
playerName: null,
|
|
15
|
+
playerShortname: null,
|
|
16
|
+
sourceType: null,
|
|
17
|
+
sourceUrl: null,
|
|
18
|
+
isReady: false,
|
|
19
|
+
streamInfo: null,
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Create a player context store for sharing player state across components.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```svelte
|
|
26
|
+
* <!-- Parent component -->
|
|
27
|
+
* <script>
|
|
28
|
+
* import { createPlayerContext, setPlayerContext } from './stores/playerContext';
|
|
29
|
+
* const playerContext = createPlayerContext();
|
|
30
|
+
* setPlayerContext(playerContext);
|
|
31
|
+
* </script>
|
|
32
|
+
*
|
|
33
|
+
* <!-- Child component -->
|
|
34
|
+
* <script>
|
|
35
|
+
* import { getPlayerContext } from './stores/playerContext';
|
|
36
|
+
* const playerContext = getPlayerContext();
|
|
37
|
+
* $: videoEl = $playerContext.videoElement;
|
|
38
|
+
* </script>
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function createPlayerContext() {
|
|
42
|
+
const store = writable(initialState);
|
|
43
|
+
function setVideoElement(el) {
|
|
44
|
+
store.update(s => ({ ...s, videoElement: el }));
|
|
45
|
+
}
|
|
46
|
+
function setPlayer(player) {
|
|
47
|
+
store.update(s => ({
|
|
48
|
+
...s,
|
|
49
|
+
player,
|
|
50
|
+
playerName: player?.capability.name ?? null,
|
|
51
|
+
playerShortname: player?.capability.shortname ?? null,
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
function setSource(type, url) {
|
|
55
|
+
store.update(s => ({ ...s, sourceType: type, sourceUrl: url }));
|
|
56
|
+
}
|
|
57
|
+
function setStreamInfo(info) {
|
|
58
|
+
store.update(s => ({ ...s, streamInfo: info }));
|
|
59
|
+
}
|
|
60
|
+
function setReady(ready) {
|
|
61
|
+
store.update(s => ({ ...s, isReady: ready }));
|
|
62
|
+
}
|
|
63
|
+
function reset() {
|
|
64
|
+
store.set(initialState);
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
subscribe: store.subscribe,
|
|
68
|
+
setVideoElement,
|
|
69
|
+
setPlayer,
|
|
70
|
+
setSource,
|
|
71
|
+
setStreamInfo,
|
|
72
|
+
setReady,
|
|
73
|
+
reset,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Set player context in Svelte context (call in parent component)
|
|
78
|
+
*/
|
|
79
|
+
export function setPlayerContextInComponent(context) {
|
|
80
|
+
setContext(PLAYER_CONTEXT_KEY, context);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get player context from Svelte context (call in child components)
|
|
84
|
+
*/
|
|
85
|
+
export function getPlayerContextFromComponent() {
|
|
86
|
+
return getContext(PLAYER_CONTEXT_KEY);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get player context or create a fallback that uses globalPlayerManager
|
|
90
|
+
*/
|
|
91
|
+
export function getPlayerContextOrFallback() {
|
|
92
|
+
const context = getContext(PLAYER_CONTEXT_KEY);
|
|
93
|
+
if (context)
|
|
94
|
+
return context;
|
|
95
|
+
// Fallback: create a derived context from globalPlayerManager
|
|
96
|
+
return createFallbackContext();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create a fallback context that reads from globalPlayerManager
|
|
100
|
+
* Uses event-driven updates instead of polling
|
|
101
|
+
*/
|
|
102
|
+
function createFallbackContext() {
|
|
103
|
+
const store = writable(initialState);
|
|
104
|
+
// Sync state from globalPlayerManager
|
|
105
|
+
function syncState() {
|
|
106
|
+
const player = globalPlayerManager.getCurrentPlayer();
|
|
107
|
+
const videoEl = player?.getVideoElement() ?? null;
|
|
108
|
+
store.update(s => ({
|
|
109
|
+
...s,
|
|
110
|
+
videoElement: videoEl,
|
|
111
|
+
player: player ?? null,
|
|
112
|
+
playerName: player?.capability.name ?? null,
|
|
113
|
+
playerShortname: player?.capability.shortname ?? null,
|
|
114
|
+
isReady: !!videoEl,
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
// Event handlers
|
|
118
|
+
const handleInitialized = () => syncState();
|
|
119
|
+
const handleSelectionChanged = () => syncState();
|
|
120
|
+
// Start/stop event listeners based on subscriber count
|
|
121
|
+
const originalSubscribe = store.subscribe;
|
|
122
|
+
let subscribers = 0;
|
|
123
|
+
const subscribe = (run, invalidate) => {
|
|
124
|
+
subscribers++;
|
|
125
|
+
if (subscribers === 1) {
|
|
126
|
+
// Initial sync
|
|
127
|
+
syncState();
|
|
128
|
+
// Subscribe to events
|
|
129
|
+
globalPlayerManager.on('playerInitialized', handleInitialized);
|
|
130
|
+
globalPlayerManager.on('selection-changed', handleSelectionChanged);
|
|
131
|
+
}
|
|
132
|
+
const unsubscribe = originalSubscribe(run, invalidate);
|
|
133
|
+
return () => {
|
|
134
|
+
unsubscribe();
|
|
135
|
+
subscribers--;
|
|
136
|
+
if (subscribers === 0) {
|
|
137
|
+
// Unsubscribe from events
|
|
138
|
+
globalPlayerManager.off('playerInitialized', handleInitialized);
|
|
139
|
+
globalPlayerManager.off('selection-changed', handleSelectionChanged);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
return {
|
|
144
|
+
subscribe,
|
|
145
|
+
setVideoElement: () => { },
|
|
146
|
+
setPlayer: () => { },
|
|
147
|
+
setSource: () => { },
|
|
148
|
+
setStreamInfo: () => { },
|
|
149
|
+
setReady: () => { },
|
|
150
|
+
reset: () => { },
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
// Convenience derived stores
|
|
154
|
+
export function createDerivedVideoElement(store) {
|
|
155
|
+
return derived(store, $state => $state.videoElement);
|
|
156
|
+
}
|
|
157
|
+
export function createDerivedIsReady(store) {
|
|
158
|
+
return derived(store, $state => $state.isReady);
|
|
159
|
+
}
|
|
160
|
+
export function createDerivedPlayerInfo(store) {
|
|
161
|
+
return derived(store, $state => ({
|
|
162
|
+
name: $state.playerName,
|
|
163
|
+
shortname: $state.playerShortname,
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
export default createPlayerContext;
|