stormcloud-video-player 0.2.12 → 0.2.14

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.
Files changed (38) hide show
  1. package/README.md +100 -1
  2. package/dist/stormcloud-vp.min.js +2 -2
  3. package/lib/index.cjs +1206 -151
  4. package/lib/index.cjs.map +1 -1
  5. package/lib/index.d.cts +77 -2
  6. package/lib/index.d.ts +77 -2
  7. package/lib/index.js +1196 -151
  8. package/lib/index.js.map +1 -1
  9. package/lib/player/StormcloudVideoPlayer.cjs +1100 -114
  10. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  11. package/lib/player/StormcloudVideoPlayer.d.cts +2 -2
  12. package/lib/players/FilePlayer.cjs +14 -7
  13. package/lib/players/FilePlayer.cjs.map +1 -1
  14. package/lib/players/HlsPlayer.cjs +1108 -119
  15. package/lib/players/HlsPlayer.cjs.map +1 -1
  16. package/lib/players/HlsPlayer.d.cts +1 -1
  17. package/lib/players/index.cjs +1122 -126
  18. package/lib/players/index.cjs.map +1 -1
  19. package/lib/sdk/hlsAdPlayer.cjs +561 -0
  20. package/lib/sdk/hlsAdPlayer.cjs.map +1 -0
  21. package/lib/sdk/hlsAdPlayer.d.cts +10 -0
  22. package/lib/sdk/ima.cjs +176 -23
  23. package/lib/sdk/ima.cjs.map +1 -1
  24. package/lib/sdk/ima.d.cts +1 -1
  25. package/lib/{types-GpA_hKek.d.cts → types-mVgmKmzM.d.cts} +3 -0
  26. package/lib/ui/StormcloudVideoPlayer.cjs +1107 -119
  27. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  28. package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
  29. package/lib/utils/browserCompat.cjs +229 -0
  30. package/lib/utils/browserCompat.cjs.map +1 -0
  31. package/lib/utils/browserCompat.d.cts +36 -0
  32. package/lib/utils/polyfills.cjs +253 -0
  33. package/lib/utils/polyfills.cjs.map +1 -0
  34. package/lib/utils/polyfills.d.cts +11 -0
  35. package/lib/utils/tracking.cjs +10 -9
  36. package/lib/utils/tracking.cjs.map +1 -1
  37. package/lib/utils/tracking.d.cts +1 -1
  38. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { S as StormcloudVideoPlayerConfig } from '../types-GpA_hKek.cjs';
1
+ import { S as StormcloudVideoPlayerConfig } from '../types-mVgmKmzM.cjs';
2
2
 
3
3
  declare class StormcloudVideoPlayer {
4
4
  private readonly video;
@@ -15,7 +15,6 @@ declare class StormcloudVideoPlayer {
15
15
  private ptsDriftEmaMs;
16
16
  private adPodQueue;
17
17
  private apiVastTagUrl;
18
- private vastConfig;
19
18
  private lastHeartbeatTime;
20
19
  private heartbeatInterval;
21
20
  private currentAdIndex;
@@ -23,6 +22,7 @@ declare class StormcloudVideoPlayer {
23
22
  private showAds;
24
23
  private isLiveStream;
25
24
  constructor(config: StormcloudVideoPlayerConfig);
25
+ private createAdPlayer;
26
26
  load(): Promise<void>;
27
27
  private attach;
28
28
  private shouldUseNativeHls;
@@ -61,37 +61,44 @@ var FilePlayer = class extends import_react.Component {
61
61
  this.mounted = false;
62
62
  this.ready = false;
63
63
  this.load = () => {
64
+ var _a, _b;
64
65
  if (!this.props.videoElement || !this.props.src) return;
65
66
  const video = this.props.videoElement;
66
67
  const handleLoadedMetadata = () => {
68
+ var _a2, _b2;
67
69
  if (this.mounted && !this.ready) {
68
70
  this.ready = true;
69
- this.props.onReady?.();
71
+ (_b2 = (_a2 = this.props).onReady) == null ? void 0 : _b2.call(_a2);
70
72
  }
71
73
  };
72
74
  const handlePlay = () => {
75
+ var _a2, _b2;
73
76
  if (this.mounted) {
74
- this.props.onPlay?.();
77
+ (_b2 = (_a2 = this.props).onPlay) == null ? void 0 : _b2.call(_a2);
75
78
  }
76
79
  };
77
80
  const handlePause = () => {
81
+ var _a2, _b2;
78
82
  if (this.mounted) {
79
- this.props.onPause?.();
83
+ (_b2 = (_a2 = this.props).onPause) == null ? void 0 : _b2.call(_a2);
80
84
  }
81
85
  };
82
86
  const handleEnded = () => {
87
+ var _a2, _b2;
83
88
  if (this.mounted) {
84
- this.props.onEnded?.();
89
+ (_b2 = (_a2 = this.props).onEnded) == null ? void 0 : _b2.call(_a2);
85
90
  }
86
91
  };
87
92
  const handleError = (error) => {
93
+ var _a2, _b2;
88
94
  if (this.mounted) {
89
- this.props.onError?.(error);
95
+ (_b2 = (_a2 = this.props).onError) == null ? void 0 : _b2.call(_a2, error);
90
96
  }
91
97
  };
92
98
  const handleLoadedData = () => {
99
+ var _a2, _b2;
93
100
  if (this.mounted) {
94
- this.props.onLoaded?.();
101
+ (_b2 = (_a2 = this.props).onLoaded) == null ? void 0 : _b2.call(_a2);
95
102
  }
96
103
  };
97
104
  video.addEventListener("loadedmetadata", handleLoadedMetadata);
@@ -110,7 +117,7 @@ var FilePlayer = class extends import_react.Component {
110
117
  if (this.props.preload !== void 0)
111
118
  video.preload = this.props.preload;
112
119
  if (this.props.poster !== void 0) video.poster = this.props.poster;
113
- this.props.onMount?.(this);
120
+ (_b = (_a = this.props).onMount) == null ? void 0 : _b.call(_a, this);
114
121
  return () => {
115
122
  video.removeEventListener("loadedmetadata", handleLoadedMetadata);
116
123
  video.removeEventListener("play", handlePlay);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/players/FilePlayer.tsx","../../src/patterns.ts"],"sourcesContent":["import { Component } from \"react\";\nimport { canPlay } from \"../patterns\";\n\nexport interface FilePlayerProps {\n src: string;\n videoElement?: HTMLVideoElement;\n onMount?: (player: any) => void;\n onReady?: () => void;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onLoaded?: () => void;\n onError?: (error: any) => void;\n autoplay?: boolean;\n muted?: boolean;\n loop?: boolean;\n controls?: boolean;\n playsInline?: boolean;\n preload?: string;\n poster?: string;\n}\n\nexport default class FilePlayer extends Component<FilePlayerProps> {\n static displayName = \"FilePlayer\";\n\n static canPlay = canPlay.file;\n\n private mounted = false;\n private ready = false;\n\n componentDidMount() {\n this.mounted = true;\n this.load();\n }\n\n componentWillUnmount() {\n this.mounted = false;\n }\n\n componentDidUpdate(prevProps: FilePlayerProps) {\n if (prevProps.src !== this.props.src) {\n this.load();\n }\n }\n\n load = () => {\n if (!this.props.videoElement || !this.props.src) return;\n\n const video = this.props.videoElement;\n\n const handleLoadedMetadata = () => {\n if (this.mounted && !this.ready) {\n this.ready = true;\n this.props.onReady?.();\n }\n };\n\n const handlePlay = () => {\n if (this.mounted) {\n this.props.onPlay?.();\n }\n };\n\n const handlePause = () => {\n if (this.mounted) {\n this.props.onPause?.();\n }\n };\n\n const handleEnded = () => {\n if (this.mounted) {\n this.props.onEnded?.();\n }\n };\n\n const handleError = (error: any) => {\n if (this.mounted) {\n this.props.onError?.(error);\n }\n };\n\n const handleLoadedData = () => {\n if (this.mounted) {\n this.props.onLoaded?.();\n }\n };\n\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"play\", handlePlay);\n video.addEventListener(\"pause\", handlePause);\n video.addEventListener(\"ended\", handleEnded);\n video.addEventListener(\"error\", handleError);\n video.addEventListener(\"loadeddata\", handleLoadedData);\n\n video.src = this.props.src;\n if (this.props.autoplay !== undefined) video.autoplay = this.props.autoplay;\n if (this.props.muted !== undefined) video.muted = this.props.muted;\n if (this.props.loop !== undefined) video.loop = this.props.loop;\n if (this.props.controls !== undefined) video.controls = this.props.controls;\n if (this.props.playsInline !== undefined)\n video.playsInline = this.props.playsInline;\n if (this.props.preload !== undefined)\n video.preload = this.props.preload as \"\" | \"metadata\" | \"none\" | \"auto\";\n if (this.props.poster !== undefined) video.poster = this.props.poster;\n\n this.props.onMount?.(this);\n\n return () => {\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"play\", handlePlay);\n video.removeEventListener(\"pause\", handlePause);\n video.removeEventListener(\"ended\", handleEnded);\n video.removeEventListener(\"error\", handleError);\n video.removeEventListener(\"loadeddata\", handleLoadedData);\n };\n };\n\n play = () => {\n if (this.props.videoElement) {\n this.props.videoElement.play();\n }\n };\n\n pause = () => {\n if (this.props.videoElement) {\n this.props.videoElement.pause();\n }\n };\n\n stop = () => {\n this.pause();\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = 0;\n }\n };\n\n seekTo = (seconds: number, keepPlaying?: boolean) => {\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = seconds;\n if (!keepPlaying) {\n this.pause();\n }\n }\n };\n\n setVolume = (volume: number) => {\n if (this.props.videoElement) {\n this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n }\n };\n\n mute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = true;\n }\n };\n\n unmute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = false;\n }\n };\n\n setPlaybackRate = (rate: number) => {\n if (this.props.videoElement && rate > 0) {\n this.props.videoElement.playbackRate = rate;\n }\n };\n\n setLoop = (loop: boolean) => {\n if (this.props.videoElement) {\n this.props.videoElement.loop = loop;\n }\n };\n\n getDuration = (): number | null => {\n if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n return this.props.videoElement.duration;\n }\n return null;\n };\n\n getCurrentTime = (): number | null => {\n if (\n this.props.videoElement &&\n isFinite(this.props.videoElement.currentTime)\n ) {\n return this.props.videoElement.currentTime;\n }\n return null;\n };\n\n getSecondsLoaded = (): number | null => {\n if (\n this.props.videoElement &&\n this.props.videoElement.buffered.length > 0\n ) {\n return this.props.videoElement.buffered.end(\n this.props.videoElement.buffered.length - 1\n );\n }\n return null;\n };\n\n getInternalPlayer = (key = \"player\") => {\n if (key === \"video\") return this.props.videoElement;\n return null;\n };\n\n enablePIP = async () => {\n if (\n this.props.videoElement &&\n \"requestPictureInPicture\" in this.props.videoElement\n ) {\n try {\n await (this.props.videoElement as any).requestPictureInPicture();\n } catch (error) {\n console.warn(\"Picture-in-Picture failed:\", error);\n }\n }\n };\n\n disablePIP = async () => {\n if (document.pictureInPictureElement) {\n try {\n await document.exitPictureInPicture();\n } catch (error) {\n console.warn(\"Exit Picture-in-Picture failed:\", error);\n }\n }\n };\n\n render() {\n return null;\n }\n}\n","export const HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i;\nexport const HLS_PATHS = /\\/hls\\//i;\nexport const DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i;\nexport const VIDEO_EXTENSIONS = /\\.(mp4|webm|ogg|avi|mov|wmv|flv|mkv)($|\\?)/i;\nexport const AUDIO_EXTENSIONS = /\\.(mp3|wav|ogg|aac|wma|flac|m4a)($|\\?)/i;\n\nexport const canPlay = {\n hls: (url: string): boolean => {\n if (!url || typeof url !== \"string\") return false;\n return HLS_EXTENSIONS.test(url) || HLS_PATHS.test(url);\n },\n\n dash: (url: string): boolean => {\n if (!url || typeof url !== \"string\") return false;\n return DASH_EXTENSIONS.test(url);\n },\n\n video: (url: string): boolean => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url);\n },\n\n audio: (url: string): boolean => {\n if (!url || typeof url !== \"string\") return false;\n return AUDIO_EXTENSIONS.test(url);\n },\n\n file: (url: string): boolean => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url) || AUDIO_EXTENSIONS.test(url);\n },\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/players/FilePlayer.tsx","../../src/patterns.ts"],"sourcesContent":["import { Component } from \"react\";\nimport { canPlay } from \"../patterns\";\n\nexport interface FilePlayerProps {\n src: string;\n videoElement?: HTMLVideoElement;\n onMount?: (player: any) => void;\n onReady?: () => void;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onLoaded?: () => void;\n onError?: (error: any) => void;\n autoplay?: boolean;\n muted?: boolean;\n loop?: boolean;\n controls?: boolean;\n playsInline?: boolean;\n preload?: string;\n poster?: string;\n}\n\nexport default class FilePlayer extends Component<FilePlayerProps> {\n static displayName = \"FilePlayer\";\n\n static canPlay = canPlay.file;\n\n private mounted = false;\n private ready = false;\n\n componentDidMount() {\n this.mounted = true;\n this.load();\n }\n\n componentWillUnmount() {\n this.mounted = false;\n }\n\n componentDidUpdate(prevProps: FilePlayerProps) {\n if (prevProps.src !== this.props.src) {\n this.load();\n }\n }\n\n load = () => {\n if (!this.props.videoElement || !this.props.src) return;\n\n const video = this.props.videoElement;\n\n const handleLoadedMetadata = () => {\n if (this.mounted && !this.ready) {\n this.ready = true;\n this.props.onReady?.();\n }\n };\n\n const handlePlay = () => {\n if (this.mounted) {\n this.props.onPlay?.();\n }\n };\n\n const handlePause = () => {\n if (this.mounted) {\n this.props.onPause?.();\n }\n };\n\n const handleEnded = () => {\n if (this.mounted) {\n this.props.onEnded?.();\n }\n };\n\n const handleError = (error: any) => {\n if (this.mounted) {\n this.props.onError?.(error);\n }\n };\n\n const handleLoadedData = () => {\n if (this.mounted) {\n this.props.onLoaded?.();\n }\n };\n\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"play\", handlePlay);\n video.addEventListener(\"pause\", handlePause);\n video.addEventListener(\"ended\", handleEnded);\n video.addEventListener(\"error\", handleError);\n video.addEventListener(\"loadeddata\", handleLoadedData);\n\n video.src = this.props.src;\n if (this.props.autoplay !== undefined) video.autoplay = this.props.autoplay;\n if (this.props.muted !== undefined) video.muted = this.props.muted;\n if (this.props.loop !== undefined) video.loop = this.props.loop;\n if (this.props.controls !== undefined) video.controls = this.props.controls;\n if (this.props.playsInline !== undefined)\n video.playsInline = this.props.playsInline;\n if (this.props.preload !== undefined)\n video.preload = this.props.preload as \"\" | \"metadata\" | \"none\" | \"auto\";\n if (this.props.poster !== undefined) video.poster = this.props.poster;\n\n this.props.onMount?.(this);\n\n return () => {\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"play\", handlePlay);\n video.removeEventListener(\"pause\", handlePause);\n video.removeEventListener(\"ended\", handleEnded);\n video.removeEventListener(\"error\", handleError);\n video.removeEventListener(\"loadeddata\", handleLoadedData);\n };\n };\n\n play = () => {\n if (this.props.videoElement) {\n this.props.videoElement.play();\n }\n };\n\n pause = () => {\n if (this.props.videoElement) {\n this.props.videoElement.pause();\n }\n };\n\n stop = () => {\n this.pause();\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = 0;\n }\n };\n\n seekTo = (seconds: number, keepPlaying?: boolean) => {\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = seconds;\n if (!keepPlaying) {\n this.pause();\n }\n }\n };\n\n setVolume = (volume: number) => {\n if (this.props.videoElement) {\n this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n }\n };\n\n mute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = true;\n }\n };\n\n unmute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = false;\n }\n };\n\n setPlaybackRate = (rate: number) => {\n if (this.props.videoElement && rate > 0) {\n this.props.videoElement.playbackRate = rate;\n }\n };\n\n setLoop = (loop: boolean) => {\n if (this.props.videoElement) {\n this.props.videoElement.loop = loop;\n }\n };\n\n getDuration = (): number | null => {\n if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n return this.props.videoElement.duration;\n }\n return null;\n };\n\n getCurrentTime = (): number | null => {\n if (\n this.props.videoElement &&\n isFinite(this.props.videoElement.currentTime)\n ) {\n return this.props.videoElement.currentTime;\n }\n return null;\n };\n\n getSecondsLoaded = (): number | null => {\n if (\n this.props.videoElement &&\n this.props.videoElement.buffered.length > 0\n ) {\n return this.props.videoElement.buffered.end(\n this.props.videoElement.buffered.length - 1\n );\n }\n return null;\n };\n\n getInternalPlayer = (key = \"player\") => {\n if (key === \"video\") return this.props.videoElement;\n return null;\n };\n\n enablePIP = async () => {\n if (\n this.props.videoElement &&\n \"requestPictureInPicture\" in this.props.videoElement\n ) {\n try {\n await (this.props.videoElement as any).requestPictureInPicture();\n } catch (error) {\n console.warn(\"Picture-in-Picture failed:\", error);\n }\n }\n };\n\n disablePIP = async () => {\n if (document.pictureInPictureElement) {\n try {\n await document.exitPictureInPicture();\n } catch (error) {\n console.warn(\"Exit Picture-in-Picture failed:\", error);\n }\n }\n };\n\n render() {\n return null;\n }\n}\n","export const HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i;\nexport const HLS_PATHS = /\\/hls\\//i;\nexport const DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i;\nexport const VIDEO_EXTENSIONS = /\\.(mp4|webm|ogg|avi|mov|wmv|flv|mkv)($|\\?)/i;\nexport const AUDIO_EXTENSIONS = /\\.(mp3|wav|ogg|aac|wma|flac|m4a)($|\\?)/i;\n\nexport const canPlay = {\n hls: (url: string): boolean => {\n if (!url || typeof url !== \"string\") return false;\n return HLS_EXTENSIONS.test(url) || HLS_PATHS.test(url);\n },\n\n dash: (url: string): boolean => {\n if (!url || typeof url !== \"string\") return false;\n return DASH_EXTENSIONS.test(url);\n },\n\n video: (url: string): boolean => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url);\n },\n\n audio: (url: string): boolean => {\n if (!url || typeof url !== \"string\") return false;\n return AUDIO_EXTENSIONS.test(url);\n },\n\n file: (url: string): boolean => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url) || AUDIO_EXTENSIONS.test(url);\n },\n};\n"],"mappings":"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","names":["_a","_b"]}