ts-video-player 0.1.0

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 (251) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +438 -0
  3. package/dist/cdn.d.ts +10 -0
  4. package/dist/cdn.d.ts.map +1 -0
  5. package/dist/cdn.min.js +1046 -0
  6. package/dist/cdn.min.js.map +54 -0
  7. package/dist/cdn.test.d.ts +2 -0
  8. package/dist/cdn.test.d.ts.map +1 -0
  9. package/dist/chunk-36x4yhjn.js +765 -0
  10. package/dist/chunk-36x4yhjn.js.map +12 -0
  11. package/dist/chunk-eajts2jv.js +4243 -0
  12. package/dist/chunk-eajts2jv.js.map +42 -0
  13. package/dist/chunk-z1ehbz9f.js +380 -0
  14. package/dist/chunk-z1ehbz9f.js.map +19 -0
  15. package/dist/config.d.ts +9 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/core/audio-gain.d.ts +67 -0
  18. package/dist/core/audio-gain.d.ts.map +1 -0
  19. package/dist/core/caption-styles.d.ts +121 -0
  20. package/dist/core/caption-styles.d.ts.map +1 -0
  21. package/dist/core/chapters.d.ts +150 -0
  22. package/dist/core/chapters.d.ts.map +1 -0
  23. package/dist/core/error-overlay.d.ts +71 -0
  24. package/dist/core/error-overlay.d.ts.map +1 -0
  25. package/dist/core/events.d.ts +119 -0
  26. package/dist/core/events.d.ts.map +1 -0
  27. package/dist/core/features.d.ts +64 -0
  28. package/dist/core/features.d.ts.map +1 -0
  29. package/dist/core/i18n.d.ts +132 -0
  30. package/dist/core/i18n.d.ts.map +1 -0
  31. package/dist/core/index.d.ts +37 -0
  32. package/dist/core/index.d.ts.map +1 -0
  33. package/dist/core/live.d.ts +130 -0
  34. package/dist/core/live.d.ts.map +1 -0
  35. package/dist/core/media-session.d.ts +38 -0
  36. package/dist/core/media-session.d.ts.map +1 -0
  37. package/dist/core/orientation.d.ts +22 -0
  38. package/dist/core/orientation.d.ts.map +1 -0
  39. package/dist/core/popover.d.ts +42 -0
  40. package/dist/core/popover.d.ts.map +1 -0
  41. package/dist/core/remote-playback.d.ts +195 -0
  42. package/dist/core/remote-playback.d.ts.map +1 -0
  43. package/dist/core/settings-menu.d.ts +132 -0
  44. package/dist/core/settings-menu.d.ts.map +1 -0
  45. package/dist/core/spinner.d.ts +67 -0
  46. package/dist/core/spinner.d.ts.map +1 -0
  47. package/dist/core/state.d.ts +142 -0
  48. package/dist/core/state.d.ts.map +1 -0
  49. package/dist/core/text-tracks.d.ts +162 -0
  50. package/dist/core/text-tracks.d.ts.map +1 -0
  51. package/dist/core/themes.d.ts +213 -0
  52. package/dist/core/themes.d.ts.map +1 -0
  53. package/dist/core/thumbnails.d.ts +124 -0
  54. package/dist/core/thumbnails.d.ts.map +1 -0
  55. package/dist/core/tooltips.d.ts +100 -0
  56. package/dist/core/tooltips.d.ts.map +1 -0
  57. package/dist/elements/base.d.ts +3 -0
  58. package/dist/elements/base.d.ts.map +1 -0
  59. package/dist/elements/index.d.ts +33 -0
  60. package/dist/elements/index.d.ts.map +1 -0
  61. package/dist/elements/index.js +55 -0
  62. package/dist/elements/index.js.map +9 -0
  63. package/dist/elements/media-airplay-button.d.ts +13 -0
  64. package/dist/elements/media-airplay-button.d.ts.map +1 -0
  65. package/dist/elements/media-error-display.d.ts +13 -0
  66. package/dist/elements/media-error-display.d.ts.map +1 -0
  67. package/dist/elements/media-fullscreen-button.d.ts +13 -0
  68. package/dist/elements/media-fullscreen-button.d.ts.map +1 -0
  69. package/dist/elements/media-live-button.d.ts +13 -0
  70. package/dist/elements/media-live-button.d.ts.map +1 -0
  71. package/dist/elements/media-mute-button.d.ts +13 -0
  72. package/dist/elements/media-mute-button.d.ts.map +1 -0
  73. package/dist/elements/media-pip-button.d.ts +13 -0
  74. package/dist/elements/media-pip-button.d.ts.map +1 -0
  75. package/dist/elements/media-play-button.d.ts +14 -0
  76. package/dist/elements/media-play-button.d.ts.map +1 -0
  77. package/dist/elements/media-playback-rate-button.d.ts +10 -0
  78. package/dist/elements/media-playback-rate-button.d.ts.map +1 -0
  79. package/dist/elements/media-preview-time.d.ts +18 -0
  80. package/dist/elements/media-preview-time.d.ts.map +1 -0
  81. package/dist/elements/media-progress-bar.d.ts +16 -0
  82. package/dist/elements/media-progress-bar.d.ts.map +1 -0
  83. package/dist/elements/media-remote-playback-button.d.ts +16 -0
  84. package/dist/elements/media-remote-playback-button.d.ts.map +1 -0
  85. package/dist/elements/media-seek-button.d.ts +9 -0
  86. package/dist/elements/media-seek-button.d.ts.map +1 -0
  87. package/dist/elements/media-settings-menu.d.ts +32 -0
  88. package/dist/elements/media-settings-menu.d.ts.map +1 -0
  89. package/dist/elements/media-time-display.d.ts +21 -0
  90. package/dist/elements/media-time-display.d.ts.map +1 -0
  91. package/dist/elements/media-time-group.d.ts +22 -0
  92. package/dist/elements/media-time-group.d.ts.map +1 -0
  93. package/dist/elements/media-time-separator.d.ts +13 -0
  94. package/dist/elements/media-time-separator.d.ts.map +1 -0
  95. package/dist/elements/media-volume-slider.d.ts +16 -0
  96. package/dist/elements/media-volume-slider.d.ts.map +1 -0
  97. package/dist/elements/utils.d.ts +27 -0
  98. package/dist/elements/utils.d.ts.map +1 -0
  99. package/dist/elements/video-player.d.ts +23 -0
  100. package/dist/elements/video-player.d.ts.map +1 -0
  101. package/dist/elements/video-skin.d.ts +23 -0
  102. package/dist/elements/video-skin.d.ts.map +1 -0
  103. package/dist/features/captions.d.ts +8 -0
  104. package/dist/features/captions.d.ts.map +1 -0
  105. package/dist/features/create-player.d.ts +45 -0
  106. package/dist/features/create-player.d.ts.map +1 -0
  107. package/dist/features/fullscreen.d.ts +8 -0
  108. package/dist/features/fullscreen.d.ts.map +1 -0
  109. package/dist/features/gestures.d.ts +8 -0
  110. package/dist/features/gestures.d.ts.map +1 -0
  111. package/dist/features/index.d.ts +26 -0
  112. package/dist/features/index.d.ts.map +1 -0
  113. package/dist/features/index.js +31 -0
  114. package/dist/features/index.js.map +9 -0
  115. package/dist/features/keyboard.d.ts +8 -0
  116. package/dist/features/keyboard.d.ts.map +1 -0
  117. package/dist/features/pip.d.ts +8 -0
  118. package/dist/features/pip.d.ts.map +1 -0
  119. package/dist/features/playback.d.ts +8 -0
  120. package/dist/features/playback.d.ts.map +1 -0
  121. package/dist/features/quality.d.ts +8 -0
  122. package/dist/features/quality.d.ts.map +1 -0
  123. package/dist/features/types.d.ts +26 -0
  124. package/dist/features/types.d.ts.map +1 -0
  125. package/dist/features/volume.d.ts +8 -0
  126. package/dist/features/volume.d.ts.map +1 -0
  127. package/dist/index.d.ts +84 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +8149 -0
  130. package/dist/index.js.map +31 -0
  131. package/dist/layouts/index.d.ts +58 -0
  132. package/dist/layouts/index.d.ts.map +1 -0
  133. package/dist/player.d.ts +90 -0
  134. package/dist/player.d.ts.map +1 -0
  135. package/dist/plugins/ads.d.ts +311 -0
  136. package/dist/plugins/ads.d.ts.map +1 -0
  137. package/dist/plugins/analytics.d.ts +203 -0
  138. package/dist/plugins/analytics.d.ts.map +1 -0
  139. package/dist/plugins/end-screen.d.ts +184 -0
  140. package/dist/plugins/end-screen.d.ts.map +1 -0
  141. package/dist/plugins/index.d.ts +13 -0
  142. package/dist/plugins/index.d.ts.map +1 -0
  143. package/dist/plugins/index.js +20 -0
  144. package/dist/plugins/index.js.map +9 -0
  145. package/dist/plugins/skip-segments.d.ts +159 -0
  146. package/dist/plugins/skip-segments.d.ts.map +1 -0
  147. package/dist/plugins/watermark.d.ts +157 -0
  148. package/dist/plugins/watermark.d.ts.map +1 -0
  149. package/dist/providers/base.d.ts +56 -0
  150. package/dist/providers/base.d.ts.map +1 -0
  151. package/dist/providers/dash.d.ts +94 -0
  152. package/dist/providers/dash.d.ts.map +1 -0
  153. package/dist/providers/hls.d.ts +182 -0
  154. package/dist/providers/hls.d.ts.map +1 -0
  155. package/dist/providers/html5.d.ts +64 -0
  156. package/dist/providers/html5.d.ts.map +1 -0
  157. package/dist/providers/index.d.ts +41 -0
  158. package/dist/providers/index.d.ts.map +1 -0
  159. package/dist/providers/vimeo.d.ts +157 -0
  160. package/dist/providers/vimeo.d.ts.map +1 -0
  161. package/dist/providers/youtube.d.ts +134 -0
  162. package/dist/providers/youtube.d.ts.map +1 -0
  163. package/dist/stx/index.d.ts +59 -0
  164. package/dist/stx/index.d.ts.map +1 -0
  165. package/dist/stx/index.js +480 -0
  166. package/dist/stx/index.js.map +11 -0
  167. package/dist/types.d.ts +724 -0
  168. package/dist/types.d.ts.map +1 -0
  169. package/dist/ui/components.d.ts +121 -0
  170. package/dist/ui/components.d.ts.map +1 -0
  171. package/dist/ui/index.d.ts +9 -0
  172. package/dist/ui/index.d.ts.map +1 -0
  173. package/dist/ui/index.js +16 -0
  174. package/dist/ui/index.js.map +9 -0
  175. package/package.json +109 -0
  176. package/src/cdn.test.ts +10 -0
  177. package/src/cdn.ts +60 -0
  178. package/src/config.ts +25 -0
  179. package/src/core/audio-gain.ts +171 -0
  180. package/src/core/caption-styles.ts +568 -0
  181. package/src/core/chapters.ts +551 -0
  182. package/src/core/error-overlay.ts +354 -0
  183. package/src/core/events.ts +552 -0
  184. package/src/core/features.ts +287 -0
  185. package/src/core/i18n.ts +590 -0
  186. package/src/core/index.ts +249 -0
  187. package/src/core/live.ts +472 -0
  188. package/src/core/media-session.ts +137 -0
  189. package/src/core/orientation.ts +57 -0
  190. package/src/core/popover.ts +143 -0
  191. package/src/core/remote-playback.ts +661 -0
  192. package/src/core/settings-menu.ts +630 -0
  193. package/src/core/spinner.ts +310 -0
  194. package/src/core/state.ts +476 -0
  195. package/src/core/text-tracks.ts +599 -0
  196. package/src/core/themes.ts +607 -0
  197. package/src/core/thumbnails.ts +457 -0
  198. package/src/core/tooltips.ts +370 -0
  199. package/src/elements/base.ts +2 -0
  200. package/src/elements/index.ts +82 -0
  201. package/src/elements/media-airplay-button.ts +78 -0
  202. package/src/elements/media-error-display.ts +47 -0
  203. package/src/elements/media-fullscreen-button.ts +72 -0
  204. package/src/elements/media-live-button.ts +65 -0
  205. package/src/elements/media-mute-button.ts +69 -0
  206. package/src/elements/media-pip-button.ts +66 -0
  207. package/src/elements/media-play-button.ts +69 -0
  208. package/src/elements/media-playback-rate-button.ts +59 -0
  209. package/src/elements/media-preview-time.ts +75 -0
  210. package/src/elements/media-progress-bar.ts +200 -0
  211. package/src/elements/media-remote-playback-button.ts +108 -0
  212. package/src/elements/media-seek-button.ts +50 -0
  213. package/src/elements/media-settings-menu.ts +302 -0
  214. package/src/elements/media-time-display.ts +99 -0
  215. package/src/elements/media-time-group.ts +41 -0
  216. package/src/elements/media-time-separator.ts +35 -0
  217. package/src/elements/media-volume-slider.ts +140 -0
  218. package/src/elements/utils.ts +82 -0
  219. package/src/elements/video-player.ts +175 -0
  220. package/src/elements/video-skin.ts +127 -0
  221. package/src/features/captions.ts +56 -0
  222. package/src/features/create-player.ts +91 -0
  223. package/src/features/fullscreen.ts +44 -0
  224. package/src/features/gestures.ts +44 -0
  225. package/src/features/index.ts +44 -0
  226. package/src/features/keyboard.ts +89 -0
  227. package/src/features/pip.ts +47 -0
  228. package/src/features/playback.ts +68 -0
  229. package/src/features/quality.ts +19 -0
  230. package/src/features/types.ts +28 -0
  231. package/src/features/volume.ts +46 -0
  232. package/src/index.ts +635 -0
  233. package/src/layouts/index.ts +672 -0
  234. package/src/player.ts +821 -0
  235. package/src/plugins/ads.ts +1045 -0
  236. package/src/plugins/analytics.ts +673 -0
  237. package/src/plugins/end-screen.ts +793 -0
  238. package/src/plugins/index.ts +61 -0
  239. package/src/plugins/skip-segments.ts +537 -0
  240. package/src/plugins/watermark.ts +537 -0
  241. package/src/providers/base.ts +197 -0
  242. package/src/providers/dash.ts +588 -0
  243. package/src/providers/hls.ts +624 -0
  244. package/src/providers/html5.ts +473 -0
  245. package/src/providers/index.ts +97 -0
  246. package/src/providers/vimeo.ts +533 -0
  247. package/src/providers/youtube.ts +542 -0
  248. package/src/stx/index.ts +606 -0
  249. package/src/types.ts +874 -0
  250. package/src/ui/components.ts +910 -0
  251. package/src/ui/index.ts +29 -0
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Player Layouts
3
+ *
4
+ * Pre-built player layouts for quick setup.
5
+ *
6
+ * @module layouts
7
+ */
8
+ import type { PlayerOptions } from '../types';
9
+ export interface LayoutConfig {
10
+ /** Layout name */
11
+ name: string;
12
+ /** Layout description */
13
+ description: string;
14
+ /** CSS styles to inject */
15
+ styles: string;
16
+ /** HTML structure template */
17
+ template: string;
18
+ /** Default player options for this layout */
19
+ defaultOptions?: Partial<PlayerOptions>;
20
+ /** Initialize layout-specific behavior */
21
+ init?: (container: HTMLElement) => void;
22
+ /** Cleanup layout */
23
+ destroy?: (container: HTMLElement) => void;
24
+ }
25
+ export type LayoutName = 'default' | 'minimal' | 'cinema' | 'youtube' | 'vimeo' | 'audio';
26
+ export declare const defaultLayout: LayoutConfig;
27
+ export declare const minimalLayout: LayoutConfig;
28
+ export declare const cinemaLayout: LayoutConfig;
29
+ export declare const youtubeLayout: LayoutConfig;
30
+ export declare const vimeoLayout: LayoutConfig;
31
+ export declare const audioLayout: LayoutConfig;
32
+ export declare const layouts: Record<LayoutName, LayoutConfig>;
33
+ export declare class LayoutManager {
34
+ private container;
35
+ private currentLayout;
36
+ private styleElement;
37
+ constructor(container: HTMLElement);
38
+ /**
39
+ * Apply a layout to the container
40
+ */
41
+ apply(layout: LayoutName | LayoutConfig): void;
42
+ /**
43
+ * Get current layout
44
+ */
45
+ getLayout(): LayoutConfig | null;
46
+ /**
47
+ * Cleanup current layout
48
+ */
49
+ cleanup(): void;
50
+ /**
51
+ * Destroy layout manager
52
+ */
53
+ destroy(): void;
54
+ }
55
+ export declare function createLayoutManager(container: HTMLElement): LayoutManager;
56
+ export declare function getLayout(name: LayoutName): LayoutConfig;
57
+ export declare function registerLayout(config: LayoutConfig): void;
58
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/layouts/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAM7C,MAAM,WAAW,YAAY;IAC3B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IACvC,0CAA0C;IAC1C,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,KAAK,IAAI,CAAA;IACvC,qBAAqB;IACrB,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,KAAK,IAAI,CAAA;CAC3C;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAA;AAMzF,eAAO,MAAM,aAAa,EAAE,YAyF3B,CAAA;AAMD,eAAO,MAAM,aAAa,EAAE,YA4C3B,CAAA;AAMD,eAAO,MAAM,YAAY,EAAE,YAkG1B,CAAA;AAMD,eAAO,MAAM,aAAa,EAAE,YA2F3B,CAAA;AAMD,eAAO,MAAM,WAAW,EAAE,YAsFzB,CAAA;AAMD,eAAO,MAAM,WAAW,EAAE,YAuFzB,CAAA;AAMD,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,YAAY,CAOpD,CAAA;AAMD,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,YAAY,CAAgC;gBAExC,SAAS,EAAE,WAAW;IAIlC;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI;IA0B9C;;OAEG;IACH,SAAS,IAAI,YAAY,GAAG,IAAI;IAIhC;;OAEG;IACH,OAAO,IAAI,IAAI;IAoBf;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB;AAMD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,WAAW,GAAG,aAAa,CAEzE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,CAExD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAEzD"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * ts-video-player Player
3
+ *
4
+ * Main player class that orchestrates providers, state, and UI.
5
+ *
6
+ * @module player
7
+ */
8
+ import type { Player as IPlayer, PlayerOptions, PlayerState, PlayerEventMap, Provider, Src, VideoQuality } from './types';
9
+ /**
10
+ * ts-video-player main class
11
+ */
12
+ export declare class Player implements IPlayer {
13
+ private _el;
14
+ private _options;
15
+ private _store;
16
+ private _events;
17
+ private _provider;
18
+ private _loaders;
19
+ private _cleanupFns;
20
+ private _destroyed;
21
+ private _sourceLoadId;
22
+ private _announcer;
23
+ /**
24
+ * Create a new player instance
25
+ */
26
+ constructor(container: HTMLElement | string, options?: PlayerOptions);
27
+ get el(): HTMLElement;
28
+ get state(): PlayerState;
29
+ get provider(): Provider | null;
30
+ get ready(): boolean;
31
+ private setupElement;
32
+ private setupState;
33
+ private setupKeyboard;
34
+ private setupActivity;
35
+ private setupStorage;
36
+ private setupMediaSession;
37
+ private setupEvents;
38
+ private updateAttributes;
39
+ /**
40
+ * Announce a message to screen readers via the ARIA live region
41
+ */
42
+ private announce;
43
+ destroy(): void;
44
+ setSrc(src: Src | Src[]): Promise<void>;
45
+ getSrc(): Src | null;
46
+ private attachProviderEvents;
47
+ play(): Promise<void>;
48
+ pause(): void;
49
+ togglePlay(): void;
50
+ stop(): void;
51
+ seekTo(time: number): void;
52
+ seekBy(offset: number): void;
53
+ setVolume(volume: number): void;
54
+ setMuted(muted: boolean): void;
55
+ toggleMute(): void;
56
+ setPlaybackRate(rate: number): void;
57
+ enterFullscreen(): Promise<void>;
58
+ exitFullscreen(): Promise<void>;
59
+ toggleFullscreen(): Promise<void>;
60
+ enterPiP(): Promise<void>;
61
+ exitPiP(): Promise<void>;
62
+ togglePiP(): Promise<void>;
63
+ setQuality(quality: VideoQuality | 'auto'): void;
64
+ setTextTrack(trackId: string, mode: 'disabled' | 'hidden' | 'showing'): void;
65
+ setAudioTrack(trackId: string): void;
66
+ private toggleCaptions;
67
+ on<K extends keyof PlayerEventMap>(event: K, handler: PlayerEventMap[K]): void;
68
+ off<K extends keyof PlayerEventMap>(event: K, handler: PlayerEventMap[K]): void;
69
+ once<K extends keyof PlayerEventMap>(event: K, handler: PlayerEventMap[K]): void;
70
+ subscribe(keyOrListener: keyof PlayerState | '*' | ((state: PlayerState, key?: keyof PlayerState) => void), listener?: (state: PlayerState, key?: keyof PlayerState) => void): () => void;
71
+ }
72
+ /**
73
+ * Create a new player instance
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * const player = createPlayer('#video-container', {
78
+ * src: 'https://example.com/video.mp4',
79
+ * autoplay: true,
80
+ * })
81
+ *
82
+ * player.on('playing', () => console.log('Video is playing!'))
83
+ * ```
84
+ */
85
+ export declare function createPlayer(container: HTMLElement | string, options?: PlayerOptions): Player;
86
+ /**
87
+ * Get player instance from element
88
+ */
89
+ export declare function getPlayer(element: HTMLElement): Player | null;
90
+ //# sourceMappingURL=player.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player.d.ts","sourceRoot":"","sources":["../src/player.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Video Ads Plugin
3
+ *
4
+ * VAST/VPAID ad support for video playback.
5
+ *
6
+ * @module plugins/ads
7
+ */
8
+ import type { Player } from '../player';
9
+ export type AdType = 'linear' | 'nonlinear' | 'companion';
10
+ export type AdBreakType = 'preroll' | 'midroll' | 'postroll';
11
+ export interface AdConfig {
12
+ /** VAST tag URL or inline VAST XML */
13
+ vastUrl?: string;
14
+ /** VAST XML content */
15
+ vastXml?: string;
16
+ /** VMAP URL for ad schedule */
17
+ vmapUrl?: string;
18
+ /** Ad schedule */
19
+ schedule?: AdBreak[];
20
+ /** Skip delay in seconds (0 = no skip, -1 = use VAST value) */
21
+ skipDelay?: number;
22
+ /** Maximum number of redirects to follow */
23
+ maxRedirects?: number;
24
+ /** Timeout for ad requests in ms */
25
+ timeout?: number;
26
+ /** Enable VPAID */
27
+ vpaidEnabled?: boolean;
28
+ /** Companion ad container selectors */
29
+ companionContainers?: Record<string, string>;
30
+ /** Preload ads */
31
+ preloadAds?: boolean;
32
+ /** Debug mode */
33
+ debug?: boolean;
34
+ }
35
+ export interface AdBreak {
36
+ /** Break type */
37
+ type: AdBreakType;
38
+ /** Time offset in seconds (for midrolls) */
39
+ timeOffset?: number;
40
+ /** VAST URL */
41
+ vastUrl?: string;
42
+ /** VAST XML */
43
+ vastXml?: string;
44
+ /** Has played */
45
+ played?: boolean;
46
+ }
47
+ export interface Ad {
48
+ /** Ad ID */
49
+ id: string;
50
+ /** Ad type */
51
+ type: AdType;
52
+ /** Ad system */
53
+ adSystem?: string;
54
+ /** Ad title */
55
+ title?: string;
56
+ /** Ad description */
57
+ description?: string;
58
+ /** Ad duration in seconds */
59
+ duration: number;
60
+ /** Skip offset in seconds */
61
+ skipOffset?: number;
62
+ /** Click through URL */
63
+ clickThroughUrl?: string;
64
+ /** Media files */
65
+ mediaFiles: AdMediaFile[];
66
+ /** Companion ads */
67
+ companions?: CompanionAd[];
68
+ /** Tracking events */
69
+ trackingEvents: AdTrackingEvent[];
70
+ /** VPAID script */
71
+ vpaidScript?: string;
72
+ /** Icons */
73
+ icons?: AdIcon[];
74
+ }
75
+ export interface AdMediaFile {
76
+ /** Media URL */
77
+ url: string;
78
+ /** MIME type */
79
+ type: string;
80
+ /** Width */
81
+ width: number;
82
+ /** Height */
83
+ height: number;
84
+ /** Bitrate */
85
+ bitrate?: number;
86
+ /** Codec */
87
+ codec?: string;
88
+ /** Delivery type */
89
+ delivery: 'progressive' | 'streaming';
90
+ }
91
+ export interface CompanionAd {
92
+ /** Width */
93
+ width: number;
94
+ /** Height */
95
+ height: number;
96
+ /** Resource URL (image, iframe, HTML) */
97
+ resourceUrl: string;
98
+ /** Resource type */
99
+ resourceType: 'static' | 'iframe' | 'html';
100
+ /** Click through URL */
101
+ clickThroughUrl?: string;
102
+ /** Alt text */
103
+ altText?: string;
104
+ /** Tracking pixel */
105
+ trackingUrl?: string;
106
+ }
107
+ export interface AdTrackingEvent {
108
+ /** Event name */
109
+ event: string;
110
+ /** Tracking URL */
111
+ url: string;
112
+ /** Offset (for progress events) */
113
+ offset?: number;
114
+ }
115
+ export interface AdIcon {
116
+ /** Icon URL */
117
+ url: string;
118
+ /** Width */
119
+ width: number;
120
+ /** Height */
121
+ height: number;
122
+ /** Position */
123
+ xPosition: string;
124
+ /** Position */
125
+ yPosition: string;
126
+ /** Click URL */
127
+ clickUrl?: string;
128
+ }
129
+ export interface AdState {
130
+ /** Is ad playing */
131
+ isPlaying: boolean;
132
+ /** Current ad */
133
+ currentAd: Ad | null;
134
+ /** Current ad break */
135
+ currentBreak: AdBreak | null;
136
+ /** Time remaining */
137
+ timeRemaining: number;
138
+ /** Can skip */
139
+ canSkip: boolean;
140
+ /** Skip countdown */
141
+ skipCountdown: number;
142
+ /** Is loading */
143
+ isLoading: boolean;
144
+ /** Error */
145
+ error: string | null;
146
+ }
147
+ export declare class VASTParser {
148
+ private maxRedirects;
149
+ private timeout;
150
+ private redirectCount;
151
+ constructor(options?: {
152
+ maxRedirects?: number;
153
+ timeout?: number;
154
+ });
155
+ /**
156
+ * Parse VAST from URL
157
+ */
158
+ parseFromUrl(url: string): Promise<Ad[]>;
159
+ /**
160
+ * Parse VAST from XML string
161
+ */
162
+ parseFromXml(xml: string): Ad[];
163
+ /**
164
+ * Fetch and parse VAST
165
+ */
166
+ private fetchAndParse;
167
+ /**
168
+ * Parse VAST document
169
+ */
170
+ private parseDocument;
171
+ /**
172
+ * Parse duration string (HH:MM:SS.mmm)
173
+ */
174
+ private parseDuration;
175
+ /**
176
+ * Parse offset (time or percentage)
177
+ */
178
+ private parseOffset;
179
+ /**
180
+ * Generate unique ID
181
+ */
182
+ private generateId;
183
+ }
184
+ export declare class AdsManager {
185
+ private player;
186
+ private config;
187
+ private parser;
188
+ private state;
189
+ private container;
190
+ private adVideo;
191
+ private adContainer;
192
+ private skipButton;
193
+ private adBreaks;
194
+ private currentAds;
195
+ private currentAdIndex;
196
+ private skipTimer;
197
+ private contentPaused;
198
+ private onAdStart;
199
+ private onAdComplete;
200
+ private onAdSkip;
201
+ private onAdClick;
202
+ private onAdErrorCallback;
203
+ private onAllAdsComplete;
204
+ constructor(config?: AdConfig);
205
+ /**
206
+ * Attach to player
207
+ */
208
+ attach(player: Player, container: HTMLElement): void;
209
+ /**
210
+ * Create ad container
211
+ */
212
+ private createAdContainer;
213
+ /**
214
+ * Attach player events
215
+ */
216
+ private attachPlayerEvents;
217
+ /**
218
+ * Preload ads
219
+ */
220
+ private preloadAds;
221
+ /**
222
+ * Play ad break
223
+ */
224
+ playAdBreak(adBreak: AdBreak): Promise<void>;
225
+ /**
226
+ * Play single ad
227
+ */
228
+ private playAd;
229
+ /**
230
+ * Select best media file
231
+ */
232
+ private selectMediaFile;
233
+ /**
234
+ * Start skip timer
235
+ */
236
+ private startSkipTimer;
237
+ /**
238
+ * Update skip button
239
+ */
240
+ private updateSkipButton;
241
+ /**
242
+ * Skip current ad
243
+ */
244
+ skipAd(): void;
245
+ /**
246
+ * Handle ad click
247
+ */
248
+ private handleAdClick;
249
+ /**
250
+ * Handle ad time update
251
+ */
252
+ private onAdTimeUpdate;
253
+ /**
254
+ * Handle ad ended
255
+ */
256
+ private onAdEnded;
257
+ /**
258
+ * Handle ad error
259
+ */
260
+ private handleAdError;
261
+ /**
262
+ * Finish ad break
263
+ */
264
+ private finishAdBreak;
265
+ /**
266
+ * Pause content
267
+ */
268
+ private pauseContent;
269
+ /**
270
+ * Resume content
271
+ */
272
+ private resumeContent;
273
+ /**
274
+ * Track ad event
275
+ */
276
+ private trackEvent;
277
+ /**
278
+ * Track URL (fire pixel)
279
+ */
280
+ private trackUrl;
281
+ /**
282
+ * Log debug message
283
+ */
284
+ private log;
285
+ /**
286
+ * Get current state
287
+ */
288
+ getState(): AdState;
289
+ /**
290
+ * Set event handlers
291
+ */
292
+ on(event: 'adStart', handler: (ad: Ad) => void): void;
293
+ on(event: 'adComplete', handler: (ad: Ad) => void): void;
294
+ on(event: 'adSkip', handler: (ad: Ad) => void): void;
295
+ on(event: 'adClick', handler: (ad: Ad) => void): void;
296
+ on(event: 'adError', handler: (error: string) => void): void;
297
+ on(event: 'allAdsComplete', handler: () => void): void;
298
+ /**
299
+ * Destroy ads manager
300
+ */
301
+ destroy(): void;
302
+ }
303
+ export declare function createAdsManager(config?: AdConfig): AdsManager;
304
+ /**
305
+ * Ads plugin for Player
306
+ */
307
+ export declare function adsPlugin(config: AdConfig): {
308
+ name: string;
309
+ install: (player: Player, container: HTMLElement) => () => void;
310
+ };
311
+ //# sourceMappingURL=ads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ads.d.ts","sourceRoot":"","sources":["../../src/plugins/ads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Video Analytics Plugin
3
+ *
4
+ * Deep integration with ts-analytics for comprehensive video tracking.
5
+ *
6
+ * @module plugins/analytics
7
+ */
8
+ import type { Player } from '../player';
9
+ export interface VideoAnalyticsConfig {
10
+ /** Site ID for analytics */
11
+ siteId: string;
12
+ /** Analytics API endpoint */
13
+ apiEndpoint: string;
14
+ /** Video ID (unique identifier) */
15
+ videoId: string;
16
+ /** Video title */
17
+ videoTitle?: string;
18
+ /** Video duration (auto-detected if not provided) */
19
+ duration?: number;
20
+ /** Content type (vod, live, etc.) */
21
+ contentType?: 'vod' | 'live' | 'dvr';
22
+ /** Content category */
23
+ category?: string;
24
+ /** Content tags */
25
+ tags?: string[];
26
+ /** Creator/channel ID */
27
+ creatorId?: string;
28
+ /** Series/playlist ID */
29
+ seriesId?: string;
30
+ /** Episode number */
31
+ episode?: number;
32
+ /** Season number */
33
+ season?: number;
34
+ /** Track playback milestones (percentages) */
35
+ milestones?: number[];
36
+ /** Track heartbeat interval (seconds) */
37
+ heartbeatInterval?: number;
38
+ /** Track quality changes */
39
+ trackQualityChanges?: boolean;
40
+ /** Track seeking behavior */
41
+ trackSeeking?: boolean;
42
+ /** Track buffering */
43
+ trackBuffering?: boolean;
44
+ /** Track errors */
45
+ trackErrors?: boolean;
46
+ /** Track engagement (pauses, replays) */
47
+ trackEngagement?: boolean;
48
+ /** Custom properties to include */
49
+ customProperties?: Record<string, string | number | boolean>;
50
+ /** Session ID (auto-generated if not provided) */
51
+ sessionId?: string;
52
+ /** Visitor ID (auto-generated if not provided) */
53
+ visitorId?: string;
54
+ /** Disable analytics */
55
+ disabled?: boolean;
56
+ }
57
+ export interface VideoEvent {
58
+ /** Event name */
59
+ name: VideoEventName;
60
+ /** Timestamp */
61
+ timestamp: Date;
62
+ /** Current playback time */
63
+ currentTime: number;
64
+ /** Video duration */
65
+ duration: number;
66
+ /** Additional properties */
67
+ properties?: Record<string, unknown>;
68
+ }
69
+ export type VideoEventName = 'video_start' | 'video_play' | 'video_pause' | 'video_resume' | 'video_seek' | 'video_buffer_start' | 'video_buffer_end' | 'video_quality_change' | 'video_volume_change' | 'video_mute' | 'video_unmute' | 'video_fullscreen_enter' | 'video_fullscreen_exit' | 'video_pip_enter' | 'video_pip_exit' | 'video_caption_enable' | 'video_caption_disable' | 'video_caption_change' | 'video_audio_track_change' | 'video_speed_change' | 'video_error' | 'video_milestone' | 'video_quartile' | 'video_complete' | 'video_heartbeat' | 'video_engagement' | 'video_ad_start' | 'video_ad_complete' | 'video_ad_skip' | 'video_ad_click';
70
+ export interface VideoAnalyticsState {
71
+ /** Has video started playing */
72
+ hasStarted: boolean;
73
+ /** Has video completed */
74
+ hasCompleted: boolean;
75
+ /** Total watch time in seconds */
76
+ watchTime: number;
77
+ /** Number of pauses */
78
+ pauseCount: number;
79
+ /** Number of seeks */
80
+ seekCount: number;
81
+ /** Number of buffer events */
82
+ bufferCount: number;
83
+ /** Total buffer time in seconds */
84
+ bufferTime: number;
85
+ /** Number of quality changes */
86
+ qualityChangeCount: number;
87
+ /** Reached milestones */
88
+ reachedMilestones: number[];
89
+ /** Reached quartiles */
90
+ reachedQuartiles: number[];
91
+ /** Playback start time */
92
+ playbackStartTime: number | null;
93
+ /** Last heartbeat time */
94
+ lastHeartbeat: number;
95
+ /** Is currently buffering */
96
+ isBuffering: boolean;
97
+ /** Buffer start time */
98
+ bufferStartTime: number | null;
99
+ }
100
+ export declare class VideoAnalytics {
101
+ private player;
102
+ private config;
103
+ private state;
104
+ private heartbeatTimer;
105
+ private eventQueue;
106
+ private flushTimer;
107
+ private sessionId;
108
+ private visitorId;
109
+ private unsubscribers;
110
+ constructor(config: VideoAnalyticsConfig);
111
+ /**
112
+ * Create initial analytics state
113
+ */
114
+ private createInitialState;
115
+ /**
116
+ * Attach to a player instance
117
+ */
118
+ attach(player: Player): void;
119
+ /**
120
+ * Detach from player
121
+ */
122
+ detach(): void;
123
+ /**
124
+ * Attach event listeners to player
125
+ */
126
+ private attachEventListeners;
127
+ /**
128
+ * Helper to subscribe to player events
129
+ */
130
+ private on;
131
+ /**
132
+ * Check and track milestones
133
+ */
134
+ private checkMilestones;
135
+ /**
136
+ * Update watch time
137
+ */
138
+ private updateWatchTime;
139
+ /**
140
+ * Start heartbeat tracking
141
+ */
142
+ private startHeartbeat;
143
+ /**
144
+ * Stop heartbeat tracking
145
+ */
146
+ private stopHeartbeat;
147
+ /**
148
+ * Track an event
149
+ */
150
+ trackEvent(name: VideoEventName, properties?: Record<string, unknown>): void;
151
+ /**
152
+ * Schedule event flush
153
+ */
154
+ private scheduleFlush;
155
+ /**
156
+ * Flush events to analytics endpoint
157
+ */
158
+ flush(): Promise<void>;
159
+ /**
160
+ * Send events to analytics endpoint
161
+ */
162
+ private sendEvents;
163
+ /**
164
+ * Build event payload for ts-analytics
165
+ */
166
+ private buildEventPayload;
167
+ /**
168
+ * Generate unique ID
169
+ */
170
+ private generateId;
171
+ /**
172
+ * Get or create visitor ID
173
+ */
174
+ private getOrCreateVisitorId;
175
+ /**
176
+ * Get current analytics state
177
+ */
178
+ getState(): VideoAnalyticsState;
179
+ /**
180
+ * Get session summary
181
+ */
182
+ getSummary(): Record<string, unknown>;
183
+ /**
184
+ * Reset analytics state
185
+ */
186
+ reset(): void;
187
+ /**
188
+ * Destroy analytics instance
189
+ */
190
+ destroy(): void;
191
+ }
192
+ export declare function createVideoAnalytics(config: VideoAnalyticsConfig): VideoAnalytics;
193
+ /**
194
+ * Analytics plugin for Player
195
+ */
196
+ export declare function analyticsPlugin(config: Omit<VideoAnalyticsConfig, 'videoId'>): {
197
+ name: string;
198
+ install: (player: Player, videoConfig: {
199
+ videoId: string;
200
+ videoTitle?: string;
201
+ }) => () => void;
202
+ };
203
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/plugins/analytics.ts"],"names":[],"mappings":"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"}