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,134 @@
1
+ /**
2
+ * ts-video-player YouTube Provider
3
+ *
4
+ * YouTube embed provider using the iframe API.
5
+ *
6
+ * @module providers/youtube
7
+ */
8
+ import type { ProviderType, Src, PlayerOptions, VideoQuality } from '../types';
9
+ import { BaseProvider } from './base';
10
+ /**
11
+ * Extract YouTube video ID from URL
12
+ */
13
+ export declare function extractYouTubeId(url: string): string | null;
14
+ /**
15
+ * Check if source is a YouTube source
16
+ */
17
+ export declare function isYouTubeSource(src: Src): boolean;
18
+ interface YTPlayer {
19
+ playVideo(): void;
20
+ pauseVideo(): void;
21
+ stopVideo(): void;
22
+ seekTo(seconds: number, allowSeekAhead: boolean): void;
23
+ getCurrentTime(): number;
24
+ getDuration(): number;
25
+ setVolume(volume: number): void;
26
+ getVolume(): number;
27
+ mute(): void;
28
+ unMute(): void;
29
+ isMuted(): boolean;
30
+ setPlaybackRate(rate: number): void;
31
+ getPlaybackRate(): number;
32
+ getAvailablePlaybackRates(): number[];
33
+ setPlaybackQuality(quality: string): void;
34
+ getPlaybackQuality(): string;
35
+ getAvailableQualityLevels(): string[];
36
+ loadVideoById(options: {
37
+ videoId: string;
38
+ startSeconds?: number;
39
+ endSeconds?: number;
40
+ }): void;
41
+ cueVideoById(options: {
42
+ videoId: string;
43
+ startSeconds?: number;
44
+ endSeconds?: number;
45
+ }): void;
46
+ getIframe(): HTMLIFrameElement;
47
+ getPlayerState(): number;
48
+ destroy(): void;
49
+ }
50
+ interface YTPlayerEvent {
51
+ target: YTPlayer;
52
+ data: number;
53
+ }
54
+ declare global {
55
+ interface Window {
56
+ YT?: {
57
+ Player: new (elementId: string | HTMLElement, options: {
58
+ videoId?: string;
59
+ width?: number | string;
60
+ height?: number | string;
61
+ playerVars?: Record<string, string | number>;
62
+ events?: {
63
+ onReady?: (event: YTPlayerEvent) => void;
64
+ onStateChange?: (event: YTPlayerEvent) => void;
65
+ onError?: (event: YTPlayerEvent) => void;
66
+ onPlaybackQualityChange?: (event: YTPlayerEvent) => void;
67
+ onPlaybackRateChange?: (event: YTPlayerEvent) => void;
68
+ };
69
+ }) => YTPlayer;
70
+ PlayerState: {
71
+ UNSTARTED: -1;
72
+ ENDED: 0;
73
+ PLAYING: 1;
74
+ PAUSED: 2;
75
+ BUFFERING: 3;
76
+ CUED: 5;
77
+ };
78
+ };
79
+ onYouTubeIframeAPIReady?: () => void;
80
+ }
81
+ }
82
+ /**
83
+ * YouTube embed provider
84
+ */
85
+ export declare class YouTubeProvider extends BaseProvider {
86
+ readonly name = "youtube";
87
+ readonly type: ProviderType;
88
+ private player;
89
+ private iframe;
90
+ private pendingVideoId;
91
+ private startTime?;
92
+ private endTime?;
93
+ private timeUpdateInterval;
94
+ private lastState;
95
+ get mediaElement(): HTMLIFrameElement | null;
96
+ protected initialize(): Promise<void>;
97
+ private loadYouTubeAPI;
98
+ protected cleanup(): void;
99
+ private onReady;
100
+ private onStateChange;
101
+ private onError;
102
+ private onQualityChange;
103
+ private onRateChange;
104
+ canPlay(src: Src): boolean;
105
+ load(src: Src): Promise<void>;
106
+ private loadVideo;
107
+ play(): Promise<void>;
108
+ pause(): void;
109
+ stop(): void;
110
+ seekTo(time: number): void;
111
+ getCurrentTime(): number;
112
+ getDuration(): number;
113
+ setVolume(volume: number): void;
114
+ getVolume(): number;
115
+ setMuted(muted: boolean): void;
116
+ getMuted(): boolean;
117
+ setPlaybackRate(rate: number): void;
118
+ getPlaybackRate(): number;
119
+ getQualities(): VideoQuality[];
120
+ setQuality(quality: VideoQuality | 'auto'): void;
121
+ }
122
+ /**
123
+ * YouTube Provider Loader
124
+ */
125
+ export declare const youtubeLoader: {
126
+ name: string;
127
+ type: ProviderType;
128
+ canPlay(src: Src): boolean;
129
+ mediaType(): "video";
130
+ preconnect(): string[];
131
+ load(container: HTMLElement, options: PlayerOptions): Promise<YouTubeProvider>;
132
+ };
133
+ export {};
134
+ //# sourceMappingURL=youtube.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"youtube.d.ts","sourceRoot":"","sources":["../../src/providers/youtube.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * ts-video-player stx Integration
3
+ *
4
+ * Deep integration with the stx templating framework.
5
+ * Provides components, directives, and runtime for seamless video embedding.
6
+ *
7
+ * @module stx
8
+ */
9
+ import type { VideoComponentProps, VideoRenderResult } from '../types';
10
+ /**
11
+ * Render the <Video> component for stx
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const result = await renderVideoComponent({
16
+ * src: '/videos/intro.mp4',
17
+ * poster: '/images/poster.jpg',
18
+ * controls: true,
19
+ * lazy: true,
20
+ * })
21
+ * ```
22
+ */
23
+ export declare function renderVideoComponent(props: VideoComponentProps, _context?: {
24
+ isDev?: boolean;
25
+ }): Promise<VideoRenderResult>;
26
+ /**
27
+ * Parse <Video> component from template
28
+ */
29
+ export declare function parseVideoComponent(content: string): VideoComponentProps | null;
30
+ /**
31
+ * Create the @video directive for stx
32
+ *
33
+ * Usage:
34
+ * ```html
35
+ * @video('/videos/intro.mp4', { poster: '/poster.jpg', controls: true })
36
+ * @video(youtubeUrl, { lazy: true })
37
+ * ```
38
+ */
39
+ export declare function createVideoDirective(): {
40
+ name: string;
41
+ hasEndTag: boolean;
42
+ description: string;
43
+ transform: (content: string, params: Record<string, unknown>, context: Record<string, unknown>) => Promise<string>;
44
+ };
45
+ export declare const videoDirective: {
46
+ name: string;
47
+ hasEndTag: boolean;
48
+ description: string;
49
+ transform: (content: string, params: Record<string, unknown>, context: Record<string, unknown>) => Promise<string>;
50
+ };
51
+ /**
52
+ * Register ts-video-player directives with stx
53
+ */
54
+ export declare function registerVideoDirectives(stx: {
55
+ config: {
56
+ customDirectives?: any[];
57
+ };
58
+ }): void;
59
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stx/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EAGlB,MAAM,UAAU,CAAA;AAOjB;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,mBAAmB,EAC1B,QAAQ,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,iBAAiB,CAAC,CAsF5B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CA2B/E;AAMD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,CAgCpN;AAyYD,eAAO,MAAM,cAAc,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAA2B,CAAA;AAEnO;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE;IAAE,MAAM,EAAE;QAAE,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,CAAA;CAAE,GAAG,IAAI,CAK3F"}
@@ -0,0 +1,480 @@
1
+ // src/providers/youtube.ts
2
+ var YOUTUBE_PATTERNS = [
3
+ /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([a-zA-Z0-9_-]{11})/,
4
+ /youtube\.com\/v\/([a-zA-Z0-9_-]{11})/,
5
+ /youtube\.com\/shorts\/([a-zA-Z0-9_-]{11})/
6
+ ];
7
+ function extractYouTubeId(url) {
8
+ for (const pattern of YOUTUBE_PATTERNS) {
9
+ const match = url.match(pattern);
10
+ if (match)
11
+ return match[1];
12
+ }
13
+ return null;
14
+ }
15
+
16
+ // src/stx/index.ts
17
+ async function renderVideoComponent(props, _context = {}) {
18
+ const {
19
+ src,
20
+ poster,
21
+ title,
22
+ class: className,
23
+ style,
24
+ id = `ts-video-${randomId()}`,
25
+ width,
26
+ height,
27
+ options = {},
28
+ lazy = true,
29
+ autoplay = false,
30
+ loop = false,
31
+ muted = false,
32
+ controls = true,
33
+ playsinline = true,
34
+ preload = "metadata",
35
+ crossorigin,
36
+ controlsList,
37
+ disablePictureInPicture = false,
38
+ theme = "default"
39
+ } = props;
40
+ const providerType = detectProviderType(src);
41
+ const isEmbed = providerType === "youtube" || providerType === "vimeo";
42
+ const playerOptions = {
43
+ ...options,
44
+ autoplay,
45
+ loop,
46
+ muted,
47
+ playsinline,
48
+ preload,
49
+ poster,
50
+ title,
51
+ controls,
52
+ crossorigin,
53
+ controlsList,
54
+ disablePictureInPicture
55
+ };
56
+ const attrs = [
57
+ `id="${id}"`,
58
+ `class="ts-video-player ts-video-player--${theme}${className ? " " + escapeAttr(className) : ""}"`,
59
+ `data-ts-video-player`,
60
+ `data-provider="${providerType}"`
61
+ ];
62
+ if (style)
63
+ attrs.push(`style="${escapeAttr(style)}"`);
64
+ if (width)
65
+ attrs.push(`data-width="${width}"`);
66
+ if (height)
67
+ attrs.push(`data-height="${height}"`);
68
+ if (lazy)
69
+ attrs.push(`data-lazy`);
70
+ const config = {
71
+ src: normalizeSrc(src),
72
+ options: playerOptions
73
+ };
74
+ attrs.push(`data-config='${JSON.stringify(config)}'`);
75
+ let html = "";
76
+ if (isEmbed) {
77
+ html = buildEmbedPlaceholder(id, attrs, poster, title, providerType, src);
78
+ } else {
79
+ html = buildNativeVideoPlaceholder(id, attrs, poster, title, lazy, preload, src, {
80
+ crossorigin,
81
+ controlsList,
82
+ disablePictureInPicture
83
+ });
84
+ }
85
+ const script = generateInitScript(id, lazy);
86
+ const css = generatePlayerCSS(theme);
87
+ return { html, script, css };
88
+ }
89
+ function parseVideoComponent(content) {
90
+ const srcMatch = content.match(/src=["']([^"']+)["']/);
91
+ const posterMatch = content.match(/poster=["']([^"']+)["']/);
92
+ const titleMatch = content.match(/title=["']([^"']+)["']/);
93
+ const classMatch = content.match(/class=["']([^"']+)["']/);
94
+ const idMatch = content.match(/id=["']([^"']+)["']/);
95
+ const widthMatch = content.match(/width=["']?(\d+)["']?/);
96
+ const heightMatch = content.match(/height=["']?(\d+)["']?/);
97
+ if (!srcMatch)
98
+ return null;
99
+ return {
100
+ src: srcMatch[1],
101
+ poster: posterMatch?.[1],
102
+ title: titleMatch?.[1],
103
+ class: classMatch?.[1],
104
+ id: idMatch?.[1],
105
+ width: widthMatch ? parseInt(widthMatch[1], 10) : undefined,
106
+ height: heightMatch ? parseInt(heightMatch[1], 10) : undefined,
107
+ autoplay: content.includes("autoplay"),
108
+ loop: content.includes("loop"),
109
+ muted: content.includes("muted"),
110
+ controls: !content.includes('controls="false"') && !content.includes(':controls="false"'),
111
+ playsinline: !content.includes('playsinline="false"'),
112
+ lazy: !content.includes('lazy="false"') && !content.includes(':lazy="false"')
113
+ };
114
+ }
115
+ function createVideoDirective() {
116
+ return {
117
+ name: "video",
118
+ hasEndTag: false,
119
+ description: "Embed a video player with full playback controls",
120
+ transform: async (content, params, context) => {
121
+ const props = parseVideoDirectiveArgs(content, params, context);
122
+ if (!props.src) {
123
+ console.warn("@video directive: missing src argument");
124
+ return "<!-- @video: missing src -->";
125
+ }
126
+ const isDev = context.__isDev || false;
127
+ const result = await renderVideoComponent(props, { isDev });
128
+ let output = result.html;
129
+ if (result.css) {
130
+ output += `
131
+ <style>${result.css}</style>`;
132
+ }
133
+ if (result.script) {
134
+ output += `
135
+ <script>${result.script}</script>`;
136
+ }
137
+ return output;
138
+ }
139
+ };
140
+ }
141
+ function parseVideoDirectiveArgs(content, params, context) {
142
+ if (params.src) {
143
+ return {
144
+ src: String(params.src),
145
+ ...params.options || params
146
+ };
147
+ }
148
+ let args = content.trim();
149
+ if (args.startsWith("@video(") || args.startsWith("(")) {
150
+ args = args.replace(/^@video\(/, "").replace(/^\(/, "").replace(/\)$/, "");
151
+ }
152
+ const parts = splitArgs(args);
153
+ const src = resolveValue(parts[0], context) || "";
154
+ let options = {};
155
+ if (parts[1]) {
156
+ const resolved = resolveValue(parts[1], context);
157
+ if (typeof resolved === "object" && resolved !== null) {
158
+ options = resolved;
159
+ }
160
+ }
161
+ return { src, ...options };
162
+ }
163
+ function detectProviderType(src) {
164
+ const firstSrc = Array.isArray(src) ? src[0] : src;
165
+ const url = typeof firstSrc === "string" ? firstSrc : firstSrc.src || "";
166
+ if (extractYouTubeId(url))
167
+ return "youtube";
168
+ if (url.includes("vimeo.com"))
169
+ return "vimeo";
170
+ if (url.endsWith(".m3u8") || url.includes("application/x-mpegURL"))
171
+ return "hls";
172
+ if (url.endsWith(".mpd") || url.includes("application/dash+xml"))
173
+ return "dash";
174
+ return "html5";
175
+ }
176
+ function normalizeSrc(src) {
177
+ return src;
178
+ }
179
+ function buildEmbedPlaceholder(_id, attrs, poster, title, _provider, _src) {
180
+ const posterStyle = poster ? `background-image: url('${escapeAttr(poster)}');` : "";
181
+ return `
182
+ <div ${attrs.join(" ")}>
183
+ <div class="ts-video-player__container">
184
+ <div class="ts-video-player__placeholder" style="${posterStyle}" data-poster>
185
+ <button class="ts-video-player__play-button" aria-label="Play ${escapeAttr(title || "video")}">
186
+ <svg viewBox="0 0 24 24" fill="currentColor" width="64" height="64">
187
+ <path d="M8 5v14l11-7z"/>
188
+ </svg>
189
+ </button>
190
+ </div>
191
+ </div>
192
+ </div>
193
+ `.trim();
194
+ }
195
+ function buildNativeVideoPlaceholder(_id, attrs, poster, title, lazy, preload, src, options) {
196
+ const firstSrc = Array.isArray(src) ? src[0] : src;
197
+ const url = typeof firstSrc === "string" ? firstSrc : firstSrc.src || "";
198
+ const videoAttrs = [
199
+ `class="ts-video-player__media"`,
200
+ `playsinline`,
201
+ lazy ? 'preload="none"' : `preload="${preload}"`
202
+ ];
203
+ if (lazy) {
204
+ videoAttrs.push(`data-poster="${escapeAttr(poster || "")}"`);
205
+ videoAttrs.push(`data-src="${escapeAttr(url)}"`);
206
+ } else {
207
+ if (poster)
208
+ videoAttrs.push(`poster="${escapeAttr(poster)}"`);
209
+ videoAttrs.push(`src="${escapeAttr(url)}"`);
210
+ }
211
+ if (title)
212
+ videoAttrs.push(`title="${escapeAttr(title)}"`);
213
+ if (options.crossorigin !== undefined)
214
+ videoAttrs.push(`crossorigin="${escapeAttr(options.crossorigin)}"`);
215
+ if (options.controlsList?.length)
216
+ videoAttrs.push(`controlslist="${escapeAttr(options.controlsList.join(" "))}"`);
217
+ if (options.disablePictureInPicture)
218
+ videoAttrs.push("disablepictureinpicture");
219
+ return `
220
+ <div ${attrs.join(" ")}>
221
+ <div class="ts-video-player__container">
222
+ <video ${videoAttrs.join(" ")}>
223
+ ${!lazy ? buildSourceTags(src) : ""}
224
+ </video>
225
+ </div>
226
+ </div>
227
+ `.trim();
228
+ }
229
+ function buildSourceTags(src) {
230
+ const sources = Array.isArray(src) ? src : [src];
231
+ return sources.map((s) => {
232
+ if (typeof s === "string") {
233
+ return `<source src="${escapeAttr(s)}" type="${getMimeType(s)}" />`;
234
+ }
235
+ const mediaSource = s;
236
+ return `<source src="${escapeAttr(mediaSource.src)}" type="${mediaSource.type || getMimeType(mediaSource.src)}" />`;
237
+ }).join(`
238
+ `);
239
+ }
240
+ function getMimeType(src) {
241
+ const path = src.split(/[?#]/, 1)[0];
242
+ const ext = path.slice(path.lastIndexOf(".") + 1).toLowerCase();
243
+ const types = {
244
+ mp4: "video/mp4",
245
+ webm: "video/webm",
246
+ ogg: "video/ogg",
247
+ ogv: "video/ogg",
248
+ mov: "video/quicktime",
249
+ m3u8: "application/x-mpegURL",
250
+ mpd: "application/dash+xml",
251
+ mp3: "audio/mpeg",
252
+ wav: "audio/wav",
253
+ flac: "audio/flac",
254
+ m4a: "audio/mp4",
255
+ aac: "audio/aac",
256
+ oga: "audio/ogg",
257
+ opus: "audio/ogg; codecs=opus"
258
+ };
259
+ return types[ext || ""] || "video/mp4";
260
+ }
261
+ function generateInitScript(id, _lazy) {
262
+ return `
263
+ (function() {
264
+ const container = document.getElementById('${id}');
265
+ if (!container) return;
266
+
267
+ const config = JSON.parse(container.dataset.config || '{}');
268
+ const isLazy = container.hasAttribute('data-lazy');
269
+
270
+ function initPlayer() {
271
+ if (typeof VideoPlayer === 'undefined') {
272
+ // Load the player library
273
+ const script = document.createElement('script');
274
+ script.src = 'https://cdn.jsdelivr.net/npm/ts-video-player@latest/dist/index.min.js';
275
+ script.onload = function() { createPlayer(); };
276
+ document.head.appendChild(script);
277
+ } else {
278
+ createPlayer();
279
+ }
280
+ }
281
+
282
+ function createPlayer() {
283
+ const player = VideoPlayer.createPlayer(container, config.options || {});
284
+ if (config.src) {
285
+ player.setSrc(config.src);
286
+ }
287
+ container.__videoPlayer = player;
288
+ }
289
+
290
+ if (isLazy) {
291
+ // Use IntersectionObserver for lazy loading
292
+ const observer = new IntersectionObserver(function(entries) {
293
+ entries.forEach(function(entry) {
294
+ if (entry.isIntersecting) {
295
+ initPlayer();
296
+ observer.disconnect();
297
+ }
298
+ });
299
+ }, { rootMargin: '50px' });
300
+ observer.observe(container);
301
+ } else {
302
+ // Initialize immediately
303
+ if (document.readyState === 'loading') {
304
+ document.addEventListener('DOMContentLoaded', initPlayer);
305
+ } else {
306
+ initPlayer();
307
+ }
308
+ }
309
+
310
+ // Handle play button click (for embed placeholders)
311
+ const playButton = container.querySelector('.ts-video-player__play-button');
312
+ if (playButton) {
313
+ playButton.addEventListener('click', function() {
314
+ initPlayer();
315
+ // Wait for player to initialize then play
316
+ const checkPlayer = setInterval(function() {
317
+ if (container.__videoPlayer && container.__videoPlayer.ready) {
318
+ container.__videoPlayer.play();
319
+ clearInterval(checkPlayer);
320
+ }
321
+ }, 100);
322
+ });
323
+ }
324
+ })();
325
+ `.trim();
326
+ }
327
+ function generatePlayerCSS(_theme) {
328
+ return `
329
+ .ts-video-player {
330
+ position: relative;
331
+ width: 100%;
332
+ background: #000;
333
+ }
334
+
335
+ .ts-video-player__container {
336
+ position: relative;
337
+ width: 100%;
338
+ padding-bottom: 56.25%; /* 16:9 */
339
+ }
340
+
341
+ .ts-video-player__media,
342
+ .ts-video-player__placeholder {
343
+ position: absolute;
344
+ top: 0;
345
+ left: 0;
346
+ width: 100%;
347
+ height: 100%;
348
+ object-fit: contain;
349
+ }
350
+
351
+ .ts-video-player__placeholder {
352
+ display: flex;
353
+ align-items: center;
354
+ justify-content: center;
355
+ background-color: #1a1a1a;
356
+ background-size: cover;
357
+ background-position: center;
358
+ cursor: pointer;
359
+ }
360
+
361
+ .ts-video-player__play-button {
362
+ display: flex;
363
+ align-items: center;
364
+ justify-content: center;
365
+ width: 80px;
366
+ height: 80px;
367
+ background: rgba(0, 0, 0, 0.7);
368
+ border: none;
369
+ border-radius: 50%;
370
+ color: white;
371
+ cursor: pointer;
372
+ transition: transform 0.2s, background 0.2s;
373
+ }
374
+
375
+ .ts-video-player__play-button:hover {
376
+ transform: scale(1.1);
377
+ background: rgba(0, 0, 0, 0.9);
378
+ }
379
+
380
+ .ts-video-player__play-button svg {
381
+ margin-left: 4px;
382
+ }
383
+
384
+ /* Loading state */
385
+ .ts-video-player[data-loading="true"]::after {
386
+ content: '';
387
+ position: absolute;
388
+ top: 50%;
389
+ left: 50%;
390
+ width: 40px;
391
+ height: 40px;
392
+ margin: -20px 0 0 -20px;
393
+ border: 3px solid rgba(255, 255, 255, 0.3);
394
+ border-top-color: white;
395
+ border-radius: 50%;
396
+ animation: ts-video-spin 0.8s linear infinite;
397
+ }
398
+
399
+ @keyframes ts-video-spin {
400
+ to { transform: rotate(360deg); }
401
+ }
402
+
403
+ /* Controls hidden */
404
+ .ts-video-player[data-controls-visible="false"] .ts-video-player__controls {
405
+ opacity: 0;
406
+ pointer-events: none;
407
+ }
408
+ `.trim();
409
+ }
410
+ function escapeAttr(str) {
411
+ return str.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/'/g, "&#039;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
412
+ }
413
+ function randomId() {
414
+ return Math.random().toString(36).slice(2, 8);
415
+ }
416
+ function splitArgs(str) {
417
+ const args = [];
418
+ let current = "";
419
+ let depth = 0;
420
+ let inString = false;
421
+ let stringChar = "";
422
+ for (const char of str) {
423
+ if ((char === '"' || char === "'") && !inString) {
424
+ inString = true;
425
+ stringChar = char;
426
+ } else if (char === stringChar && inString) {
427
+ inString = false;
428
+ stringChar = "";
429
+ }
430
+ if (!inString) {
431
+ if (char === "{" || char === "[")
432
+ depth++;
433
+ if (char === "}" || char === "]")
434
+ depth--;
435
+ if (char === "," && depth === 0) {
436
+ args.push(current.trim());
437
+ current = "";
438
+ continue;
439
+ }
440
+ }
441
+ current += char;
442
+ }
443
+ if (current.trim()) {
444
+ args.push(current.trim());
445
+ }
446
+ return args;
447
+ }
448
+ function resolveValue(value, context) {
449
+ if (!value)
450
+ return;
451
+ const trimmed = value.trim();
452
+ if (trimmed.startsWith('"') && trimmed.endsWith('"') || trimmed.startsWith("'") && trimmed.endsWith("'")) {
453
+ return trimmed.slice(1, -1);
454
+ }
455
+ if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
456
+ try {
457
+ return JSON.parse(trimmed);
458
+ } catch {}
459
+ }
460
+ if (trimmed in context) {
461
+ return context[trimmed];
462
+ }
463
+ return trimmed;
464
+ }
465
+ var videoDirective = createVideoDirective();
466
+ function registerVideoDirectives(stx) {
467
+ if (!stx.config.customDirectives) {
468
+ stx.config.customDirectives = [];
469
+ }
470
+ stx.config.customDirectives.push(videoDirective);
471
+ }
472
+ export {
473
+ videoDirective,
474
+ renderVideoComponent,
475
+ registerVideoDirectives,
476
+ parseVideoComponent,
477
+ createVideoDirective
478
+ };
479
+
480
+ //# debugId=CC15566753F52D2564756E2164756E21