@munsonlabs/video-player 0.2.3 → 0.2.5

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 (42) hide show
  1. package/README.md +49 -33
  2. package/dist/chunks/{ads-BV769SMr.mjs → ads-Dph3guS9.mjs} +1 -1
  3. package/dist/{elements/chunks/brightcove-rNI-XRxB.mjs → chunks/brightcove-DiJF_74z.mjs} +1 -1
  4. package/dist/chunks/constants-35ZnLsDv.mjs +1 -0
  5. package/dist/chunks/dailymotion-DTooszoV.mjs +1 -0
  6. package/dist/chunks/embedShared-CbArTtuR.mjs +1 -0
  7. package/dist/chunks/{jwplayer-WIkwoJTA.mjs → jwplayer-Dhq65VxK.mjs} +1 -1
  8. package/dist/chunks/loadScript-CxzeXqTe.mjs +1 -0
  9. package/dist/chunks/{sourceHelpers-rbs6D6ZG.mjs → sourceHelpers-B0tH-grj.mjs} +1 -1
  10. package/dist/chunks/vimeo-D0GAjId0.mjs +1 -0
  11. package/dist/chunks/youtube-B8AT2F-4.mjs +1 -0
  12. package/dist/elements/chunks/{ads-BV769SMr.mjs → ads-Dph3guS9.mjs} +1 -1
  13. package/dist/{chunks/brightcove-rNI-XRxB.mjs → elements/chunks/brightcove-DiJF_74z.mjs} +1 -1
  14. package/dist/elements/chunks/constants-35ZnLsDv.mjs +1 -0
  15. package/dist/elements/chunks/dailymotion-DTooszoV.mjs +1 -0
  16. package/dist/elements/chunks/embedShared-CbArTtuR.mjs +1 -0
  17. package/dist/elements/chunks/{jwplayer-WIkwoJTA.mjs → jwplayer-Dhq65VxK.mjs} +1 -1
  18. package/dist/elements/chunks/loadScript-CxzeXqTe.mjs +1 -0
  19. package/dist/elements/chunks/{sourceHelpers-rbs6D6ZG.mjs → sourceHelpers-B0tH-grj.mjs} +1 -1
  20. package/dist/elements/chunks/vimeo-D0GAjId0.mjs +1 -0
  21. package/dist/elements/chunks/youtube-B8AT2F-4.mjs +1 -0
  22. package/dist/elements/controls.d.mts +166 -38
  23. package/dist/elements/controls.mjs +1 -1
  24. package/dist/elements/core.d.mts +26 -31
  25. package/dist/elements/core.mjs +1 -1
  26. package/dist/elements/index.d.mts +136 -69
  27. package/dist/elements/index.mjs +1 -1
  28. package/dist/index.d.mts +208 -209
  29. package/dist/index.mjs +1 -1
  30. package/package.json +5 -3
  31. package/dist/chunks/constants-zR-UwEWY.mjs +0 -1
  32. package/dist/chunks/dailymotion-gEquA4h5.mjs +0 -1
  33. package/dist/chunks/embedShared-duyOYFQN.mjs +0 -1
  34. package/dist/chunks/loadScript-Du6JsTc2.mjs +0 -1
  35. package/dist/chunks/vimeo-WJYDJPA3.mjs +0 -1
  36. package/dist/chunks/youtube-DbJ-IrvP.mjs +0 -1
  37. package/dist/elements/chunks/constants-zR-UwEWY.mjs +0 -1
  38. package/dist/elements/chunks/dailymotion-gEquA4h5.mjs +0 -1
  39. package/dist/elements/chunks/embedShared-duyOYFQN.mjs +0 -1
  40. package/dist/elements/chunks/loadScript-Du6JsTc2.mjs +0 -1
  41. package/dist/elements/chunks/vimeo-WJYDJPA3.mjs +0 -1
  42. package/dist/elements/chunks/youtube-DbJ-IrvP.mjs +0 -1
package/README.md CHANGED
@@ -20,9 +20,9 @@ import '@munsonlabs/video-player/style'
20
20
 
21
21
  <template>
22
22
  <VideoCard
23
- title="Big Buck Bunny"
23
+ label="Big Buck Bunny"
24
24
  src="https://cdn.jwplayer.com/videos/O5chtspP-4VHSaSK0.mp4"
25
- poster="https://storage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg"
25
+ poster="https://m.media-amazon.com/images/S/pv-target-images/fb7afef01282cdc2d846b2343f9f3d7a785b7133729776f1aa0da6501a2e1f7b.jpg"
26
26
  />
27
27
  </template>
28
28
  ```
@@ -100,31 +100,31 @@ import { VideoStage, HideMarker } from '@munsonlabs/video-player'
100
100
 
101
101
  ## VideoCard / VideoPlayer Props
102
102
 
103
- | Prop | Type | Default | Description |
104
- | ------------------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
105
- | `src` | `string` | - | **Required.** The video URL or platform-specific URI (the platform is auto-detected from its shape, see [Platform URLs](#platform-urls)) |
106
- | `title` | `string` | `''` | Video title |
107
- | `poster` | `string` | `''` | Poster image URL |
108
- | `aspectRatio` | `string` | `'16:9'` | e.g. `'16:9'`, `'9:16'`, `'4:3'` |
109
- | `autoplay` | `boolean` | `false` | Autoplay on mount, see [Autoplay, mute & volume](#autoplay-mute--volume) |
110
- | `muted` | `boolean` | - | Force a starting mute state - if unset, follows the shared audio preference, see [Autoplay, mute & volume](#autoplay-mute--volume) |
111
- | `volume` | `number` | - | Force a starting volume (0-1) - if unset, follows the shared audio preference, see [Autoplay, mute & volume](#autoplay-mute--volume) |
112
- | `lazy` | `boolean` | `true`\* | Show placeholder until clicked |
113
- | `nativeUi` | `boolean` | `false` | Use the platform's native controls (YouTube, Vimeo, Dailymotion only) |
114
- | `autoStage` | `boolean` | `false` | Immediately send this video to the stage on mount |
115
- | `playbackRate` | `number` | `1` | Initial playback rate |
116
- | `adTagUrl` | `string` | `''` | VAST or VMAP ad tag URL |
117
- | `adMacroParams` | `object` | - | Fills `{macro}` tokens on whichever ad tag URL ends up in use, see [Ads](#ads-ima--vast--vmap) |
118
- | `headerBidding` | `object` | - | Runs a Prebid.js auction before the ad plays, see [Header bidding](#header-bidding-prebidjs) |
119
- | `tracks` | `array` | - | WebVTT caption/subtitle tracks, see [Captions](#captions-webvtt) |
120
- | `payload` | `object` | `{}` | Arbitrary data attached to every `state-change` event |
121
- | `action` | `PlayerAction` | `null` | Button shown in the player HUD, see [Actions](#actions) |
122
- | `disableTapCapture` | `boolean` | `false` | Disables the full-video tap-to-reveal-controls overlay (tap/click still reaches embed platform UI underneath, e.g. YouTube's own) |
123
- | `controls` | `boolean` | `true` | Set `false` to render a bare `<video>` with no built-in HUD - drive playback with your own UI instead, see [Headless Controls](#headless-controls) |
124
- | `playInView` | `boolean` | `false` | Auto-play once at least half the player is visible, auto-pause once it isn't - e.g. for a scroll-snap feed, see [Autoplay, mute & volume](#autoplay-mute--volume) |
125
- | `pin` | `PinCorner` | - | Pins the player to this screen corner once it scrolls out of view while playing, instead of auto-pausing - see [Pinning a single player](#pinning-a-single-player) |
126
-
127
- \* `lazy` only has an effect on `VideoCard` (default `true`), which is what actually implements the placeholder-until-clicked behaviour. `VideoPlayer` accepts the prop for type compatibility but defaults to `false` and never reads it: using `<VideoPlayer>` directly always mounts the real player immediately, regardless of `lazy`.
103
+ | Prop | Type | Default | Description |
104
+ | ------------------- | -------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
105
+ | `src` | `string` | - | **Required.** The video URL or platform-specific URI (the platform is auto-detected from its shape, see [Platform URLs](#platform-urls)) |
106
+ | `label` | `string` | `''` | Video label, shown on the placeholder and used as the player's accessible name |
107
+ | `poster` | `string` | `''` | Poster image URL |
108
+ | `aspectRatio` | `string` | `'16:9'` | e.g. `'16:9'`, `'9:16'`, `'4:3'` |
109
+ | `autoplay` | `boolean` | `false` | Autoplay on mount, see [Autoplay, mute & volume](#autoplay-mute--volume) |
110
+ | `muted` | `boolean` | - | Force a starting mute state - if unset, follows the shared audio preference, see [Autoplay, mute & volume](#autoplay-mute--volume) |
111
+ | `volume` | `number` | - | Force a starting volume (0-1) - if unset, follows the shared audio preference, see [Autoplay, mute & volume](#autoplay-mute--volume) |
112
+ | `lazy` | `boolean` | `true` | `VideoCard` only: show the placeholder until clicked |
113
+ | `nativeUi` | `boolean` | `false` | Use the platform's native controls (YouTube, Vimeo, Dailymotion only) |
114
+ | `autoStage` | `boolean` | `false` | `VideoCard` only: send this video to the stage on mount |
115
+ | `playbackRate` | `number` | `1` | Initial playback rate |
116
+ | `loop` | `boolean` | `false` | Start with looping on - reactive, so flipping it later is the same as calling `toggleLoop()` |
117
+ | `preload` | `PreloadMode` | - | `'none' \| 'metadata' \| 'auto'` - the native `<video preload>` attribute. `'none'` defers loading for MP4 and HLS alike (hls.js is held back until the first play), not DASH; other values leave HLS as normal |
118
+ | `adTagUrl` | `string` | `''` | VAST or VMAP ad tag URL |
119
+ | `adMacroParams` | `object` | - | Fills `{macro}` tokens on whichever ad tag URL ends up in use, see [Ads](#ads-ima--vast--vmap) |
120
+ | `headerBidding` | `object` | - | Runs a Prebid.js auction before the ad plays, see [Header bidding](#header-bidding-prebidjs) |
121
+ | `tracks` | `array` | - | WebVTT caption/subtitle tracks, see [Captions](#captions-webvtt) |
122
+ | `payload` | `object` | `{}` | Arbitrary data attached to every `state-change` event |
123
+ | `action` | `PlayerAction` | `null` | Button shown in the player HUD, see [Actions](#actions) |
124
+ | `disableTapCapture` | `boolean` | `false` | Disables the full-video tap-to-reveal-controls overlay (tap/click still reaches embed platform UI underneath, e.g. YouTube's own) |
125
+ | `controls` | `boolean` | `true` | Set `false` to render a bare `<video>` with no built-in HUD - drive playback with your own UI instead, see [Headless Controls](#headless-controls) |
126
+ | `playInView` | `boolean` | `false` | Auto-play once at least half the player is visible, auto-pause once it isn't - e.g. for a scroll-snap feed, see [Autoplay, mute & volume](#autoplay-mute--volume) |
127
+ | `pin` | `PinCorner` | - | Pins the player to this screen corner once it scrolls out of view while playing, instead of auto-pausing - see [Pinning a single player](#pinning-a-single-player) |
128
128
 
129
129
  ### Autoplay, mute & volume
130
130
 
@@ -162,7 +162,7 @@ registerPlatform({
162
162
 
163
163
  Call it once, before mounting any player that might see the new URL - resolution reads the registry fresh every time, so ordering (not caching) is the only thing that matters.
164
164
 
165
- - **`embed: true`** - the platform owns its own player (YouTube, Twitch, Vimeo). `createAdapter` returns a full `PlaybackAdapter`: `play`/`pause`/`currentTime`/captions/quality/PiP/fullscreen/`on`/`off`/`dispose`, translating SDK events into the common set.
165
+ - **`embed: true`** - the platform owns its own player (YouTube, Twitch, Vimeo). `createAdapter` returns a full `PlaybackAdapter`: `play` (returns a promise, resolved once the request is issued)/`pause`/`currentTime`/captions/quality/PiP/fullscreen/`on`/`off`/`dispose`, translating SDK events into the common set.
166
166
  - **`embed: false`** - the platform hosts a file/manifest behind an opaque URL. `resolveSource` (optional) returns `{ src, type?, poster?, adTagUrl? }`; the native path handles playback.
167
167
 
168
168
  This works identically from the [web component bundles](#web-component-usage) - see [Registering a platform from a web component](#registering-a-platform-from-a-web-component) for the `?defer` import mode that sidesteps a timing subtlety with statically-declared tags.
@@ -219,6 +219,20 @@ Or, `<label for>`-style, skip the ref and point at an element id instead:
219
219
 
220
220
  `player` and `for` are both optional - if both are given, `player` wins. Each button's own CSS uses `:where()` (zero specificity), so a single class you add always wins, and most expose their state via a scoped slot for full custom markup (e.g. `PlayButton`'s `#default="{ isPlaying }"`). See [Web Component Usage](#web-component-usage) for using these as raw custom elements (`<ml-controls-play-button>` etc.) outside Vue.
221
221
 
222
+ ### The player handle
223
+
224
+ A template ref on `VideoPlayer`/`VideoCard`/`VideoStage` (or the `player` injected into a headless control) exposes the `PlayerHandle` type. The commonly used part:
225
+
226
+ | Member | Notes |
227
+ | -------------------------------------------------- | -------------------------------------------------------------------------------------------- |
228
+ | `play()` / `pause()` / `togglePlay()` | `play()` returns a promise that resolves once playing and rejects on an autoplay block/error |
229
+ | `replay()` | Seeks to 0 and plays; what the HUD button does after `ended` |
230
+ | `seekTo(seconds)` / `seek(percent)` | Seconds for transcripts, chapters, deep links; percent for scrubbers |
231
+ | `isLoaded` / `isReady` / `isPlaying` | `isLoaded` means the duration is known; `isReady` only means the adapter is attached |
232
+ | `hasEnded` / `isError` / `retry()` | `retry()` reloads the current source after an error |
233
+ | `current` / `total` / `isLive` | Seconds |
234
+ | `isMuted` / `vol` / `toggleMute()` / `setVolume()` | Volume is 0-1 |
235
+
222
236
  ### Transcript
223
237
 
224
238
  `Transcript` renders a clickable transcript for the linked player: pass `cues` as `{ time, end?, text }[]` (times in seconds), clicking a cue seeks to its timestamp (starting playback first if paused), and the cue at the playhead is highlighted and kept scrolled into view:
@@ -257,7 +271,7 @@ defineExpose(forwarded)
257
271
  </template>
258
272
  ```
259
273
 
260
- `useForwardedPlayer` owns the ref itself - bind `playerRef` on the wrapped `VideoPlayer`, and spread (or pass) `forwarded` into your own `defineExpose`, so callers holding a ref to your wrapper get the same imperative API `VideoPlayer` exposes. Pass a `guard` callback to intercept method calls before they reach the underlying player.
274
+ `useForwardedPlayer` owns the ref itself - bind `playerRef` on the wrapped `VideoPlayer`, and spread (or pass) `forwarded` into your own `defineExpose`, so callers holding a ref to your wrapper get the same `PlayerHandle` API `VideoPlayer` exposes (methods return promises there, since the optional `guard` callback that runs before each call may be async).
261
275
 
262
276
  Because it's wired up via `defineExpose`, this works the same way whether your wrapper is used as a Vue component (a template ref) or as a custom element ([Web Component Usage](#web-component-usage)) - Vue copies `defineExpose`d properties onto the element itself.
263
277
 
@@ -302,6 +316,7 @@ Emitted by `VideoCard`, `VideoPlayer`, and `VideoStage`. Every event includes `c
302
316
 
303
317
  | Event | When it fires | Extra fields |
304
318
  | -------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- |
319
+ | `loaded` | Duration is known (or the stream is detected as live); `isLoaded` flips true | — |
305
320
  | `play` | Playback starts or resumes | — |
306
321
  | `pause` | Playback pauses | — |
307
322
  | `ended` | Playback reaches the end | — |
@@ -535,8 +550,8 @@ Three bundles are available: pick exactly one, since importing more than one dou
535
550
 
536
551
  <ml-video-card
537
552
  src="https://cdn.jwplayer.com/videos/O5chtspP-4VHSaSK0.mp4"
538
- title="Big Buck Bunny"
539
- poster="https://storage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg"
553
+ label="Big Buck Bunny"
554
+ poster="https://m.media-amazon.com/images/S/pv-target-images/fb7afef01282cdc2d846b2343f9f3d7a785b7133729776f1aa0da6501a2e1f7b.jpg"
540
555
  ></ml-video-card>
541
556
  ```
542
557
 
@@ -658,8 +673,9 @@ player.addEventListener('state-change', (e) => {
658
673
 
659
674
  ```js
660
675
  const player = document.querySelector('ml-video-card')
661
- player.togglePlay()
662
- console.log(player.isPlaying)
676
+ await player.play() // resolves once playing, rejects on an autoplay block or media error
677
+ player.seekTo(30)
678
+ console.log(player.isPlaying, player.isLoaded)
663
679
  ```
664
680
 
665
681
  ### Registering a platform from a web component
@@ -1 +1 @@
1
- import{c as e,f as t,p as n}from"./constants-zR-UwEWY.mjs";import{n as r}from"./platform-Dg9JBh8M.mjs";import{t as i}from"./loadScript-Du6JsTc2.mjs";function a(){return window.google?.ima?Promise.resolve():i(e,`ima`)}function o(e,i,o,s){let c=document.createElement(`div`);c.className=`ima-ad-container`,e.appendChild(c);let l=o,u=null,d=null,f=null,p=!1,m=!1,h=!1,g=!1,_=!1,v=!1,y=1,b=!1,x=``,S=new ResizeObserver(([e])=>{let t=window.google?.ima;if(!f||!t)return;let{width:n,height:r}=e.contentRect;f.resize(n,r,t.ViewMode.NORMAL)});S.observe(i);function C(){d?.contentComplete()}function w(r){g=r,e.classList.toggle(n,r),r||(_=!1,e.classList.remove(t))}function T(){if(p||!m||!h||!u||!d||!l)return;p=!0;let e=window.google?.ima;if(!e)return;u.initialize();let t=new e.AdsRequest;t.adTagUrl=l,d.requestAds(t)}function E(e){l=e,T()}a().then(()=>{if(v)return;let n=window.google?.ima;n&&(u=new n.AdDisplayContainer(c,i),d=new n.AdsLoader(u),m=!0,d.addEventListener(n.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,a=>{if(v)return;let o=new n.AdsRenderingSettings;o.restoreCustomPlaybackStateOnAdBreakComplete=!0,f=a.getAdsManager(i,o),i.addEventListener(`ended`,C),x=i.currentSrc,f.addEventListener(n.AdEvent.Type.CONTENT_PAUSE_REQUESTED,()=>{i.removeEventListener(`ended`,C),i.ended&&r()&&(b=!0),i.pause(),w(!0),s.onAdStart();let e=f?.getVolume()??1;e>0&&(y=e),s.onAdMuteChange(e===0)}),f.addEventListener(n.AdEvent.Type.CONTENT_RESUME_REQUESTED,()=>{if(i.addEventListener(`ended`,C),w(!1),s.onAdEnd(),b){b=!1,x&&i.currentSrc!==x&&(i.src=x);let e=i.duration;e&&isFinite(e)&&(i.currentTime=e-.5);return}i.ended||i.play()}),f.addEventListener(n.AdEvent.Type.PAUSED,()=>{_=!0,e.classList.add(t),s.onAdPauseChange(!0)}),f.addEventListener(n.AdEvent.Type.RESUMED,()=>{_=!1,e.classList.remove(t),s.onAdPauseChange(!1)}),f.addEventListener(n.AdEvent.Type.AD_PROGRESS,()=>{s.onAdProgress(f?.getRemainingTime()??0)}),f.addEventListener(n.AdErrorEvent.Type.AD_ERROR,e=>{w(!1),s.onError(e.getError().getMessage()),i.play()});try{f.init(i.clientWidth,i.clientHeight,n.ViewMode.NORMAL),f.start()}catch(e){s.onError(e instanceof Error?e.message:`Ad playback failed to start.`)}}),d.addEventListener(n.AdErrorEvent.Type.AD_ERROR,e=>{s.onError(e.getError().getMessage())}),T())}).catch(e=>s.onError(e.message));function D(){h=!0,T()}function O(){if(!f)return;let e=f.getVolume();e>0?(y=e,f.setVolume(0)):f.setVolume(y||1),s.onAdMuteChange(f.getVolume()===0)}return{isAdPlaying:()=>g,isAdPaused:()=>_,requestAdsOnFirstPlay:D,setAdTagUrl:E,pauseAd:()=>f?.pause(),resumeAd:()=>f?.resume(),toggleAdMute:O,dispose:()=>{v=!0,b=!1,x=``,S.disconnect(),i.removeEventListener(`ended`,C),f?.destroy(),d?.destroy(),c.remove(),e.classList.remove(n,t)}}}export{o as attachAds};
1
+ import{c as e,f as t,p as n}from"./constants-35ZnLsDv.mjs";import{n as r}from"./platform-Dg9JBh8M.mjs";import{t as i}from"./loadScript-CxzeXqTe.mjs";function a(){return window.google?.ima?Promise.resolve():i(e,`ima`)}function o(e,i,o,s){let c=document.createElement(`div`);c.className=`ima-ad-container`,e.appendChild(c);let l=o,u=null,d=null,f=null,p=!1,m=!1,h=!1,g=!1,_=!1,v=!1,y=1,b=!1,x=``,S=new ResizeObserver(([e])=>{let t=window.google?.ima;if(!f||!t)return;let{width:n,height:r}=e.contentRect;f.resize(n,r,t.ViewMode.NORMAL)});S.observe(i);function C(){d?.contentComplete()}function w(r){g=r,e.classList.toggle(n,r),r||(_=!1,e.classList.remove(t))}function T(){if(p||!m||!h||!u||!d||!l)return;p=!0;let e=window.google?.ima;if(!e)return;u.initialize();let t=new e.AdsRequest;t.adTagUrl=l,d.requestAds(t)}function E(e){l=e,T()}a().then(()=>{if(v)return;let n=window.google?.ima;n&&(u=new n.AdDisplayContainer(c,i),d=new n.AdsLoader(u),m=!0,d.addEventListener(n.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,a=>{if(v)return;let o=new n.AdsRenderingSettings;o.restoreCustomPlaybackStateOnAdBreakComplete=!0,f=a.getAdsManager(i,o),i.addEventListener(`ended`,C),x=i.currentSrc,f.addEventListener(n.AdEvent.Type.CONTENT_PAUSE_REQUESTED,()=>{i.removeEventListener(`ended`,C),i.ended&&r()&&(b=!0),i.pause(),w(!0),s.onAdStart();let e=f?.getVolume()??1;e>0&&(y=e),s.onAdMuteChange(e===0)}),f.addEventListener(n.AdEvent.Type.CONTENT_RESUME_REQUESTED,()=>{if(i.addEventListener(`ended`,C),w(!1),s.onAdEnd(),b){b=!1,x&&i.currentSrc!==x&&(i.src=x);let e=i.duration;e&&isFinite(e)&&(i.currentTime=e-.5);return}i.ended||i.play().catch(()=>{})}),f.addEventListener(n.AdEvent.Type.PAUSED,()=>{_=!0,e.classList.add(t),s.onAdPauseChange(!0)}),f.addEventListener(n.AdEvent.Type.RESUMED,()=>{_=!1,e.classList.remove(t),s.onAdPauseChange(!1)}),f.addEventListener(n.AdEvent.Type.AD_PROGRESS,()=>{s.onAdProgress(f?.getRemainingTime()??0)}),f.addEventListener(n.AdErrorEvent.Type.AD_ERROR,e=>{w(!1),s.onError(e.getError().getMessage()),i.play().catch(()=>{})});try{f.init(i.clientWidth,i.clientHeight,n.ViewMode.NORMAL),f.start()}catch(e){s.onError(e instanceof Error?e.message:`Ad playback failed to start.`)}}),d.addEventListener(n.AdErrorEvent.Type.AD_ERROR,e=>{s.onError(e.getError().getMessage())}),T())}).catch(e=>s.onError(e.message));function D(){h=!0,T()}function O(){if(!f)return;let e=f.getVolume();e>0?(y=e,f.setVolume(0)):f.setVolume(y||1),s.onAdMuteChange(f.getVolume()===0)}return{isAdPlaying:()=>g,isAdPaused:()=>_,requestAdsOnFirstPlay:D,setAdTagUrl:E,pauseAd:()=>f?.pause(),resumeAd:()=>f?.resume(),toggleAdMute:O,dispose:()=>{v=!0,b=!1,x=``,S.disconnect(),i.removeEventListener(`ended`,C),f?.destroy(),d?.destroy(),c.remove(),e.classList.remove(n,t)}}}export{o as attachAds};
@@ -1 +1 @@
1
- import{n as e,t}from"./constants-zR-UwEWY.mjs";import{n,t as r}from"./sourceHelpers-rbs6D6ZG.mjs";function i(e){let t;try{t=new URL(e)}catch{return null}if(t.hostname!==`players.brightcove.net`)return null;let[,n,r]=t.pathname.split(`/`),i=t.searchParams.get(`videoId`),a=r?.indexOf(`_`)??-1;return!n||a===-1||!i?null:{accountId:n,playerId:r.slice(0,a),embed:r.slice(a+1),videoId:i}}function a(e){for(let t of e?.plugins??[]){let e=t.options?.serverUrl??t.options?.imaOptions?.serverUrl;if(e)return e}return null}const o=r(async(t,n,r,i)=>{let o=await fetch(`${e}/${t}/${n}_${r}/config.json`);if(!o.ok)throw Error(`Brightcove: could not load player config (${o.status})`);let s=await o.json(),c=i??s?.video_cloud?.policy_key;if(!c)throw Error(`Brightcove: policy_key not found in player config`);return{policyKey:c,adTagUrl:a(s)}},(e,t,n)=>`${e}/${t}_${n}`);async function s(e,r,i){let a=await fetch(`${t}/${e}/videos/${r}`,{headers:{Accept:`application/json;pk=${i}`}});if(!a.ok)throw Error(`Brightcove Playback API error: ${a.status}`);let o=await a.json(),s=n(o.sources||[]);if(!s.length)throw Error(`Brightcove: no playable sources found`);return{sources:s.map(e=>({src:e.src,type:e.type})),poster:o.poster??o.thumbnail??null}}async function c(e,t){let n=i(e);if(!n)throw Error(`Brightcove: invalid src — expected a Brightcove embed URL, e.g. "https://players.brightcove.net/{accountId}/{playerId}_{embed}/index.html?videoId={videoId}"`);let{accountId:r,playerId:a,embed:c,videoId:l}=n,{policyKey:u,adTagUrl:d}=await o(r,a,c,t),{sources:f,poster:p}=await s(r,l,u);return{...f[0],poster:p,adTagUrl:d}}export{c as resolveSource};
1
+ import{n as e,t}from"./constants-35ZnLsDv.mjs";import{n,t as r}from"./sourceHelpers-B0tH-grj.mjs";function i(e){let t;try{t=new URL(e)}catch{return null}if(t.hostname!==`players.brightcove.net`)return null;let[,n,r]=t.pathname.split(`/`),i=t.searchParams.get(`videoId`),a=r?.indexOf(`_`)??-1;return!n||a===-1||!i?null:{accountId:n,playerId:r.slice(0,a),embed:r.slice(a+1),videoId:i}}function a(e){for(let t of e?.plugins??[]){let e=t.options?.serverUrl??t.options?.imaOptions?.serverUrl;if(e)return e}return null}const o=r(async(t,n,r,i)=>{let o=await fetch(`${e}/${t}/${n}_${r}/config.json`);if(!o.ok)throw Error(`Brightcove: could not load player config (${o.status})`);let s=await o.json(),c=i??s?.video_cloud?.policy_key;if(!c)throw Error(`Brightcove: policy_key not found in player config`);return{policyKey:c,adTagUrl:a(s)}},(e,t,n)=>`${e}/${t}_${n}`);async function s(e,r,i){let a=await fetch(`${t}/${e}/videos/${r}`,{headers:{Accept:`application/json;pk=${i}`}});if(!a.ok)throw Error(`Brightcove Playback API error: ${a.status}`);let o=await a.json(),s=n(o.sources||[]);if(!s.length)throw Error(`Brightcove: no playable sources found`);return{sources:s.map(e=>({src:e.src,type:e.type})),poster:o.poster??o.thumbnail??null}}async function c(e,t){let n=i(e);if(!n)throw Error(`Brightcove: invalid src — expected a Brightcove embed URL, e.g. "https://players.brightcove.net/{accountId}/{playerId}_{embed}/index.html?videoId={videoId}"`);let{accountId:r,playerId:a,embed:c,videoId:l}=n,{policyKey:u,adTagUrl:d}=await o(r,a,c,t),{sources:f,poster:p}=await s(r,l,u);return{...f[0],poster:p,adTagUrl:d}}export{c as resolveSource};
@@ -0,0 +1 @@
1
+ const e=`video-select`,t=`video-toggle`,n=`fullscreen-pending`,r=`fullscreen-pending-done`,i=`player:positions`,a=`player:autoAdvance`,o=`player:audio`,s={muted:!1,volume:1},c=`mlv-tech`,l=`mlv-youtube`,u=`mlv-vimeo`,d=`mlv-dailymotion`,f=`mlv-ad-playing`,p=`mlv-ad-paused`,m=`16:9`,h=`application/x-mpegURL`,g=`application/dash+xml`,_=`video/mp4`,v=[h,_],y=[.5,.75,1,1.25,1.5,2],b=3500,x=.1,S=3e3,C=[[.25,`firstQuartile`],[.5,`midpoint`],[.75,`thirdQuartile`]],w=.1,T=`https://imasdk.googleapis.com/js/sdkloader/ima3.js`,E=`https://player.vimeo.com/api/player.js`,D=`https://cdn.jwplayer.com/v2/media`,O=`https://edge.api.brightcove.com/playback/v1/accounts`,k=`https://players.brightcove.net`;export{t as A,S as C,i as D,a as E,E as O,C as S,o as T,c as _,s as a,x as b,T as c,_ as d,p as f,r as g,n as h,m as i,e as k,D as l,d as m,k as n,h as o,f as p,g as r,b as s,O as t,w as u,u as v,v as w,y as x,l as y};
@@ -0,0 +1 @@
1
+ import{m as e}from"./constants-35ZnLsDv.mjs";import{r as t}from"./embedShared-CbArTtuR.mjs";import{t as n}from"./loadScript-CxzeXqTe.mjs";function r(e){let t=e.match(/[?&]video=([a-zA-Z0-9]+)/);return t?t[1]:e.match(/(?:dailymotion\.com\/(?:embed\/)?video\/|dai\.ly\/)([a-zA-Z0-9]+)/)?.[1]??null}function i(i,a){let o=null;return t(i,a,{cssClass:e,connect:async({techId:e,emitter:t,state:i,isDisposed:s,consumeQueuedPlay:c})=>{let l=r(a.src);if(!l){i.errorState={code:4,message:`Could not parse video ID from source URL`},t.trigger(`error`);return}let u=!1;try{let r=await n(`https://geo.dailymotion.com/libs/player.js`,`dailymotion-sdk`).then(()=>window.dailymotion);if(!r||s())return;let d=await r.createPlayer(e,{video:l,params:{autoplay:!!a.autoplay,mute:!!a.muted}});o=d,a.volume!==void 0&&d.setVolume(a.volume);let f=r.events;c(()=>o?.play()),d.on(f.VIDEO_PLAY,()=>{i.paused=!1,t.trigger(`play`),t.trigger(`playing`),!a.autoplay&&!u&&(u=!0,d.pause())}),d.on(f.VIDEO_PLAYING,()=>{i.paused=!1,t.trigger(`play`),t.trigger(`playing`)}),d.on(f.VIDEO_PAUSE,()=>{i.paused=!0,t.trigger(`pause`)}),f.VIDEO_BUFFERING&&d.on(f.VIDEO_BUFFERING,()=>t.trigger(`waiting`)),d.on(f.VIDEO_END,()=>{i.paused=!0,t.trigger(`ended`)}),d.on(f.VIDEO_TIMECHANGE,e=>{i.currentTime=e.videoTime??i.currentTime,i.duration=e.videoDuration??i.duration,t.trigger(`timeupdate`)}),d.on(f.VIDEO_DURATIONCHANGE,e=>{i.duration=e.videoDuration??i.duration,t.trigger(`durationchange`)}),d.on(f.VIDEO_SEEKEND,e=>{i.currentTime=e.videoTime??i.currentTime,t.trigger(`seeked`)}),d.on(f.PLAYER_VOLUMECHANGE,e=>{i.volume=e.playerVolume??i.volume,i.muted=e.playerIsMuted??i.muted,t.trigger(`volumechange`)}),d.on(f.PLAYER_ERROR,()=>t.trigger(`error`)),f.AD_START&&d.on(f.AD_START,()=>{i.paused=!1,t.trigger(`play`),t.trigger(`adstart`)}),f.AD_END&&d.on(f.AD_END,()=>t.trigger(`adend`))}catch(e){i.errorState={code:4,message:e instanceof Error?e.message:`This video could not be played.`},t.trigger(`error`)}},hasPlayer:()=>!!o,play:()=>o?.play(),pause:()=>o?.pause(),seekToSdk:e=>o?.seek(e),volumeToSdk:e=>o?.setVolume(e),muteToSdk:(e,t)=>o?.setMute(t),sdkFullscreenEnter:()=>o?.setFullscreen(!0),sdkFullscreenExit:()=>o?.setFullscreen(!1),destroyPlayer:()=>{let e=o;o=null,e?.destroy?.()}})}export{i as createDailymotionAdapter};
@@ -0,0 +1 @@
1
+ import{_ as e,g as t,h as n}from"./constants-35ZnLsDv.mjs";import{n as r,r as i,t as a}from"./platform-Dg9JBh8M.mjs";function o(){let e=new Map;function t(t,n){e.has(t)||e.set(t,new Set),e.get(t)?.add(n)}function n(t,n){e.get(t)?.delete(n)}function r(t,...n){e.get(t)?.forEach(e=>e(...n))}function i(){e.clear()}return{on:t,off:n,trigger:r,dispose:i}}const s={supportsCaptions:()=>!1,getCaptionTracks:()=>[],setCaptionTrack:()=>{},getActiveCaptionTrack:()=>null,supportsQuality:()=>!1,getQualityLevels:()=>[],getCurrentQuality:()=>null,isAutoQuality:()=>!0,setQuality:()=>{},supportsPip:()=>!1,isPipActive:()=>!1,togglePip:()=>{}};let c=0;function l(e){let t=e.querySelector(`iframe`);if(t){t.tabIndex=-1;return}let n=new MutationObserver(()=>{let t=e.querySelector(`iframe`);t&&(t.tabIndex=-1,n.disconnect())});n.observe(e,{childList:!0,subtree:!0})}function u(t,n,r){t.parentElement?.classList.add(n);let i=`${n}-${++c}`,a=document.createElement(`div`);a.id=i,a.className=e,a.style.cssText=`width:100%;height:100%;top:0;left:0;position:absolute`;let o=document.createElement(`div`);return o.style.cssText=`width:100%;height:100%;position:absolute;inset:0;opacity:0;pointer-events:none;transition:opacity 0.2s`,o.appendChild(a),t.parentElement?.insertBefore(o,t),r||l(o),{techId:i,wrapper:o}}function d(e,t){e.style.display=`none`,t.style.opacity=`1`,t.style.pointerEvents=``}function f(e,t,n){t.remove(),e.parentElement?.classList.remove(n),e.style.display=``}function p(e){return e.closest(`.player__shell`)}function m(e,t){if(r()&&t()!==!1)return;let n=p(e);n&&i(n)}function h(){let e=new Set;return{schedule(t,n=0){let r=setTimeout(()=>{e.delete(r),t()},n);e.add(r)},clearAll(){e.forEach(clearTimeout),e.clear()}}}function g(e){e.trigger(n);let r=document.createElement(`div`);r.style.cssText=`position:fixed;inset:0;z-index:99999;opacity:0;pointer-events:none`,document.body.appendChild(r);let i=!1;function a(){i||e.trigger(t)}function o(n){i||(i=!0,e.trigger(t),r.remove(),n?.())}return{overlay:r,reveal:a,finish:o}}function _(e,t,n){let i=o(),{techId:c,wrapper:l}=u(e,n.cssClass,t.nativeUi),{schedule:d,clearAll:p}=h(),g={currentTime:0,duration:0,volume:t.volume??1,muted:!1,paused:!0,playQueued:!1,errorState:null},_=!1,v={techId:c,wrapper:l,emitter:i,state:g,schedule:d,isDisposed:()=>_,consumeQueuedPlay(e){g.playQueued&&(g.playQueued=!1,e())}};n.connect(v);function y(){m(e,()=>{if(!n.sdkFullscreenEnter)return!1;n.sdkFullscreenEnter()})}function b(){if(r()&&n.sdkFullscreenExit){n.sdkFullscreenExit();return}a()}return{el:l,play:()=>n.hasPlayer()?Promise.resolve(n.play()):(g.playQueued=!0,Promise.resolve()),pause:()=>n.pause(),paused:()=>g.paused,currentTime:()=>g.currentTime,setCurrentTime:e=>{g.currentTime=e,n.seekToSdk?.(e)},duration:()=>g.duration,volume:()=>g.volume,setVolume:e=>{g.volume=e,n.volumeToSdk(e)},muted:()=>g.muted,setMuted:e=>{g.muted=e,n.muteToSdk(v,e)},playbackRate:()=>1,setPlaybackRate:()=>{},bufferedEnd:()=>g.currentTime,error:()=>g.errorState,setSrc:e=>{(!n.hasPlayer()||g.errorState)&&(t.src=e,g.errorState=null,n.destroyPlayer(),n.connect(v))},supportsPlaybackRate:()=>!1,...s,enterFullscreen:y,exitFullscreen:b,on:i.on,off:i.off,dispose:()=>{_=!0,p(),n.destroyPlayer(),f(e,l,n.cssClass),i.dispose()}}}export{m as a,g as c,h as i,f as l,u as n,p as o,_ as r,d as s,s as t,o as u};
@@ -1 +1 @@
1
- import{d as e,l as t,o as n}from"./constants-zR-UwEWY.mjs";import{n as r,t as i}from"./sourceHelpers-rbs6D6ZG.mjs";function a(e){return e.match(/cdn\.jwplayer\.com\/videos\/([^-]+)/)?.[1]??e.match(/cdn\.jwplayer\.com\/manifests\/([^.]+)/)?.[1]??e.match(/^jwplayer:\/\/([^/]+)$/)?.[1]??null}function o(e){let t=e?.advertising?.schedule;return Array.isArray(t)&&t.length?t[0].tag??null:e?.advertising?.tag??null}const s=i(async e=>{let n=await fetch(`${t}/${e}`);if(!n.ok)throw Error(`JW Platform API error: ${n.status}`);let i=(await n.json()).playlist?.[0];if(!i)throw Error(`JW Platform: empty playlist`);let a=r((i.sources??[]).map(e=>({src:e.file,type:e.type})));if(!a.length)throw Error(`JW Platform: no playable sources found`);return{src:a[0].src,type:a[0].type,poster:i.image??null,adTagUrl:o(i)}});async function c(t){let r=a(t);if(!r)throw Error(`JW Platform: unrecognised source URL: ${t}`);let i=await s(r);if(t.startsWith(`jwplayer://`))return i;let o=/\.mp4(\?|#|$)/.test(t)?e:n;return{...i,src:t,type:o}}export{c as resolveSource};
1
+ import{d as e,l as t,o as n}from"./constants-35ZnLsDv.mjs";import{n as r,t as i}from"./sourceHelpers-B0tH-grj.mjs";function a(e){return e.match(/cdn\.jwplayer\.com\/videos\/([^-]+)/)?.[1]??e.match(/cdn\.jwplayer\.com\/manifests\/([^.]+)/)?.[1]??e.match(/^jwplayer:\/\/([^/]+)$/)?.[1]??null}function o(e){let t=e?.advertising?.schedule;return Array.isArray(t)&&t.length?t[0].tag??null:e?.advertising?.tag??null}const s=i(async e=>{let n=await fetch(`${t}/${e}`);if(!n.ok)throw Error(`JW Platform API error: ${n.status}`);let i=(await n.json()).playlist?.[0];if(!i)throw Error(`JW Platform: empty playlist`);let a=r((i.sources??[]).map(e=>({src:e.file,type:e.type})));if(!a.length)throw Error(`JW Platform: no playable sources found`);return{src:a[0].src,type:a[0].type,poster:i.image??null,adTagUrl:o(i)}});async function c(t){let r=a(t);if(!r)throw Error(`JW Platform: unrecognised source URL: ${t}`);let i=await s(r);if(t.startsWith(`jwplayer://`))return i;let o=/\.mp4(\?|#|$)/.test(t)?e:n;return{...i,src:t,type:o}}export{c as resolveSource};
@@ -0,0 +1 @@
1
+ const e={};function t(t,n=t){if(!e[n]){let r=new Promise((e,n)=>{let r=document.createElement(`script`);r.src=t,r.onload=()=>e(),r.onerror=()=>{r.remove(),n(Error(`Failed to load script: ${t}`))},document.head.appendChild(r)});r.catch(()=>{e[n]===r&&delete e[n]}),e[n]=r}return e[n]}export{t};
@@ -1 +1 @@
1
- import{w as e}from"./constants-zR-UwEWY.mjs";function t(e,t=(...e)=>String(e[0])){let n={};return async(...r)=>{let i=t(...r);if(n[i])return n[i];let a=await e(...r);return n[i]=a,a}}function n(t){return t.filter(t=>t.src&&e.includes(t.type)).sort((t,n)=>e.indexOf(t.type)-e.indexOf(n.type))}export{n,t};
1
+ import{w as e}from"./constants-35ZnLsDv.mjs";function t(e,t=(...e)=>String(e[0])){let n={};return async(...r)=>{let i=t(...r);if(n[i])return n[i];let a=await e(...r);return n[i]=a,a}}function n(t){return t.filter(t=>t.src&&e.includes(t.type)).sort((t,n)=>e.indexOf(t.type)-e.indexOf(n.type))}export{n,t};
@@ -0,0 +1 @@
1
+ import{O as e,v as t}from"./constants-35ZnLsDv.mjs";import{r as n}from"./embedShared-CbArTtuR.mjs";import{t as r}from"./loadScript-CxzeXqTe.mjs";function i(e){return e.match(/(?:vimeo\.com\/(?:video\/|channels\/[^/]+\/|groups\/[^/]+\/videos\/)?|player\.vimeo\.com\/video\/)(\d+)/)?.[1]??null}function a(a,o){let s=null;return n(a,o,{cssClass:t,connect:async({techId:t,emitter:n,state:a,isDisposed:c,consumeQueuedPlay:l})=>{let u=i(o.src);if(!u)return;try{await r(e,`vimeo`)}catch(e){if(c())return;a.errorState={code:4,message:e instanceof Error?e.message:`The Vimeo player failed to load.`},n.trigger(`error`);return}if(c())return;if(!window.Vimeo){a.errorState={code:4,message:`The Vimeo player failed to load.`},n.trigger(`error`);return}let d={id:Number(u),byline:!1,portrait:!1,title:!1,transparent:!0,controls:!!o.nativeUi,autopause:!1,...o.autoplay!==void 0&&{autoplay:o.autoplay},...o.muted!==void 0&&{muted:o.muted}};s=new window.Vimeo.Player(t,d),o.autoplay&&(a.playQueued=!0),s.ready().then(()=>{o.muted&&s?.setMuted(!0).catch(()=>{}),o.volume!==void 0&&s?.setVolume(o.volume).catch(()=>{}),l(()=>void s?.play().catch(()=>{}))}).catch(e=>{a.errorState={code:4,message:e?.message||`This video is unavailable or cannot be embedded here.`},n.trigger(`error`)}),s.on(`play`,()=>{a.paused=!1,n.trigger(`play`),n.trigger(`playing`)}),s.on(`pause`,()=>{a.paused=!0,n.trigger(`pause`)}),s.on(`ended`,()=>{a.paused=!0,n.trigger(`ended`)});let f=!1;s.on(`timeupdate`,e=>{let{seconds:t,duration:r}=e;a.currentTime=t,a.duration=r,n.trigger(`timeupdate`),r&&!f&&(f=!0,n.trigger(`durationchange`))}),s.on(`loaded`,()=>{f=!1,n.trigger(`durationchange`)}),s.on(`seeked`,e=>{a.currentTime=e.seconds,n.trigger(`seeked`),n.trigger(`timeupdate`)}),s.on(`bufferstart`,()=>n.trigger(`waiting`)),s.on(`bufferend`,()=>n.trigger(`canplay`)),s.on(`volumechange`,e=>{a.volume=e.volume,n.trigger(`volumechange`)}),s.on(`error`,()=>n.trigger(`error`))},hasPlayer:()=>!!s,play:()=>s?.play(),pause:()=>void s?.pause().catch(()=>{}),seekToSdk:e=>void s?.setCurrentTime(e).catch(()=>{}),volumeToSdk:e=>void s?.setVolume(e).catch(()=>{}),muteToSdk:({emitter:e,schedule:t},n)=>{s?.setMuted(n).then(()=>t(()=>e.trigger(`volumechange`),50)).catch(()=>{})},sdkFullscreenEnter:()=>void s?.requestFullscreen().catch(()=>{}),destroyPlayer:()=>{let e=s;s=null,e?.destroy().catch(()=>{})}})}export{a as createVimeoAdapter};
@@ -0,0 +1 @@
1
+ import{y as e}from"./constants-35ZnLsDv.mjs";import{t}from"./platform-Dg9JBh8M.mjs";import{a as n,c as r,i,l as a,n as o,t as s,u as c}from"./embedShared-CbArTtuR.mjs";import{t as l}from"./loadScript-CxzeXqTe.mjs";function u(e,t){return t===e.PlayerState.PLAYING||t===e.PlayerState.BUFFERING}function d(e){let t={videoId:null,listId:null},n=e.match(/^.*(youtu\.be\/|v\/|u\/\w\/|embed\/|watch\?v=|shorts\/|&v=)([^#&?]*).*/);n?.[2]?.length===11&&(t.videoId=n[2]);let r=e.match(/[?&]list=([^#&?]+)/);return r?.[1]&&(t.listId=r[1]),t}let f=null,p=null;function m(){return f?Promise.resolve(f):(p||(p=l(`https://www.youtube.com/iframe_api`).then(()=>new Promise((e,t)=>{let n=window.YT;if(!n){t(Error(`The YouTube player failed to load.`));return}n.ready(()=>{f=n,e(n)})})),p.catch(()=>{p=null})),p)}function h(l,p){let h=c(),{techId:g,wrapper:_}=o(l,e,p.nativeUi),v=d(p.src),y=null,b=v.videoId,x=!1,S=!1,C=!1,w=null,T=!1,E=null,D=null,O=!1,k=!1,{schedule:A,clearAll:j}=i(),M=null,N={active:!1,wasPaused:!1,timeBefore:0,catchUpInterval:null};function P(){try{let e=y?.getPlayerResponse()?.adPlacements;return Array.isArray(e)&&e.length>0}catch{return!1}}function F(e){y?.loadVideoById({videoId:e})}function I(e){y?.cueVideoById({videoId:e})}function L(){return v.videoId?(N.wasPaused=!1,x?b===v.videoId?y?.playVideo():(F(v.videoId),b=v.videoId):(h.trigger(`waiting`),S=!0),Promise.resolve()):Promise.resolve()}function R(){N.catchUpInterval&&clearInterval(N.catchUpInterval),N.active=!1,N.wasPaused&&y?.pauseVideo(),h.trigger(`seeked`)}function z(){k=(y?.getAvailablePlaybackRates()??[]).length>1,x=!0,p.muted&&y?.mute(),p.volume!==void 0&&y?.setVolume(p.volume*100),S?L():C&&v.videoId&&(I(v.videoId),b=v.videoId)}function B(e){if(e===w||E!==null)return;w=e;let t=P();t!==T&&(T=t,h.trigger(t?`adstart`:`adend`));let n=window.YT;if(n){switch(e){case-1:h.trigger(`durationchange`),h.trigger(`ratechange`);break;case n.PlayerState.ENDED:h.trigger(`ended`);break;case n.PlayerState.PLAYING:h.trigger(`timeupdate`),h.trigger(`durationchange`),h.trigger(`playing`),h.trigger(`play`),N.active&&R();break;case n.PlayerState.PAUSED:h.trigger(`canplay`),N.active||h.trigger(`pause`);break;case n.PlayerState.BUFFERING:h.trigger(`waiting`);break;case n.PlayerState.CUED:h.trigger(`canplay`)}M&&=(clearInterval(M),null),e===n.PlayerState.PLAYING&&(M=setInterval(()=>h.trigger(`timeupdate`),250))}}function V(){let e={controls:+!!p.nativeUi,modestbranding:1,rel:0,showinfo:0,mute:+!!p.muted,origin:window.location.origin,allowfullscreen:1,fullscreen:1,fs:1,autoplay:0,playsinline:1};b=v.videoId,y=new window.YT.Player(g,{videoId:b??void 0,playerVars:e,events:{onReady:z,onStateChange:e=>B(e.data),onPlaybackRateChange:()=>h.trigger(`ratechange`),onVolumeChange:()=>h.trigger(`volumechange`),onError:e=>{E=e.data,h.trigger(`error`),A(()=>{E=null})}}})}function H(){if(f){V();return}m().then(()=>{O||V()},e=>{O||(D={code:4,message:e instanceof Error?e.message:`The YouTube player failed to load.`},h.trigger(`error`))})}H(),p.autoplay?x?L():S=!0:v.videoId&&(C=!0);function U(){if(!y)return;let e=y.getCurrentTime(),{video_id:t}=y.getVideoData();y.pauseVideo();let{overlay:n,reveal:i,finish:a}=r(h),o=document.createElement(`div`);o.id=`yt-fs-${Math.random().toString(36).slice(2)}`,n.appendChild(o);let s=null,c=()=>{document.removeEventListener(`pointerdown`,l,!0),a(()=>{let t=s?.getCurrentTime()??e;try{s?.destroy()}catch{}y?.seekTo(t,!0),h.trigger(`timeupdate`)})};function l(){c()}s=new window.YT.Player(o.id,{videoId:t,playerVars:{playsinline:0,autoplay:0,controls:1,modestbranding:1,rel:0,start:Math.floor(e)},events:{onReady:t=>{i(),t.target.seekTo(e,!0),t.target.playVideo()},onStateChange:e=>{let t=window.YT;t&&(e.data===t.PlayerState.ENDED?c():e.data===t.PlayerState.PAUSED?(document.removeEventListener(`pointerdown`,l,!0),document.addEventListener(`pointerdown`,l,{capture:!0,once:!0})):(document.removeEventListener(`pointerdown`,l,!0),i()))}}})}function W(){n(l,()=>{if(!y)return!1;U()})}return{el:_,play:L,pause:()=>y?.pauseVideo(),paused:()=>{if(!y)return!0;let e=window.YT;return!e||!u(e,w)},currentTime:()=>x?y?.getCurrentTime()??0:0,setCurrentTime:e=>{if(!x||!y)return;let t=window.YT;t&&w===t.PlayerState.PAUSED&&(N.timeBefore=y.getCurrentTime()),N.active||(N.wasPaused=!t||!u(t,w)),y.seekTo(e,!0),h.trigger(`timeupdate`),N.active=!0,t&&w===t.PlayerState.PAUSED&&N.timeBefore!==e&&(N.catchUpInterval&&clearInterval(N.catchUpInterval),N.catchUpInterval=setInterval(()=>{w!==t.PlayerState.PAUSED||!N.active?N.catchUpInterval&&clearInterval(N.catchUpInterval):y&&y.getCurrentTime()!==N.timeBefore&&(h.trigger(`timeupdate`),R())},250))},duration:()=>x?y?.getDuration()??0:0,volume:()=>x&&y?y.getVolume()/100:1,setVolume:e=>{x&&y?.setVolume(e*100)},muted:()=>x?y?.isMuted()??!1:!1,setMuted:e=>{x&&y&&(e?y.mute():y.unMute(),A(()=>h.trigger(`volumechange`),50))},playbackRate:()=>x?y?.getPlaybackRate()??1:1,setPlaybackRate:e=>{x&&y?.setPlaybackRate(e)},bufferedEnd:()=>!x||!y?.getVideoLoadedFraction?0:y.getVideoLoadedFraction()*y.getDuration(),error:()=>D??(E===null?null:{code:E,message:`This video could not be played.`}),setSrc:e=>{let t=d(e);if(v.videoId=t.videoId,v.listId=t.listId,v.videoId){if(D){D=null,p.autoplay||(C=!0),H();return}x?(F(v.videoId),b=v.videoId):C=!0}},supportsPlaybackRate:()=>k,...s,enterFullscreen:W,exitFullscreen:t,on:h.on,off:h.off,dispose:()=>{if(O=!0,j(),M&&clearInterval(M),N.catchUpInterval&&clearInterval(N.catchUpInterval),y)try{y.stopVideo(),y.destroy()}catch{}y=null,a(l,_,e),h.dispose()}}}export{h as createYoutubeAdapter};
@@ -1 +1 @@
1
- import{c as e,f as t,p as n}from"./constants-zR-UwEWY.mjs";import{n as r}from"./platform-Dg9JBh8M.mjs";import{t as i}from"./loadScript-Du6JsTc2.mjs";function a(){return window.google?.ima?Promise.resolve():i(e,`ima`)}function o(e,i,o,s){let c=document.createElement(`div`);c.className=`ima-ad-container`,e.appendChild(c);let l=o,u=null,d=null,f=null,p=!1,m=!1,h=!1,g=!1,_=!1,v=!1,y=1,b=!1,x=``,S=new ResizeObserver(([e])=>{let t=window.google?.ima;if(!f||!t)return;let{width:n,height:r}=e.contentRect;f.resize(n,r,t.ViewMode.NORMAL)});S.observe(i);function C(){d?.contentComplete()}function w(r){g=r,e.classList.toggle(n,r),r||(_=!1,e.classList.remove(t))}function T(){if(p||!m||!h||!u||!d||!l)return;p=!0;let e=window.google?.ima;if(!e)return;u.initialize();let t=new e.AdsRequest;t.adTagUrl=l,d.requestAds(t)}function E(e){l=e,T()}a().then(()=>{if(v)return;let n=window.google?.ima;n&&(u=new n.AdDisplayContainer(c,i),d=new n.AdsLoader(u),m=!0,d.addEventListener(n.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,a=>{if(v)return;let o=new n.AdsRenderingSettings;o.restoreCustomPlaybackStateOnAdBreakComplete=!0,f=a.getAdsManager(i,o),i.addEventListener(`ended`,C),x=i.currentSrc,f.addEventListener(n.AdEvent.Type.CONTENT_PAUSE_REQUESTED,()=>{i.removeEventListener(`ended`,C),i.ended&&r()&&(b=!0),i.pause(),w(!0),s.onAdStart();let e=f?.getVolume()??1;e>0&&(y=e),s.onAdMuteChange(e===0)}),f.addEventListener(n.AdEvent.Type.CONTENT_RESUME_REQUESTED,()=>{if(i.addEventListener(`ended`,C),w(!1),s.onAdEnd(),b){b=!1,x&&i.currentSrc!==x&&(i.src=x);let e=i.duration;e&&isFinite(e)&&(i.currentTime=e-.5);return}i.ended||i.play()}),f.addEventListener(n.AdEvent.Type.PAUSED,()=>{_=!0,e.classList.add(t),s.onAdPauseChange(!0)}),f.addEventListener(n.AdEvent.Type.RESUMED,()=>{_=!1,e.classList.remove(t),s.onAdPauseChange(!1)}),f.addEventListener(n.AdEvent.Type.AD_PROGRESS,()=>{s.onAdProgress(f?.getRemainingTime()??0)}),f.addEventListener(n.AdErrorEvent.Type.AD_ERROR,e=>{w(!1),s.onError(e.getError().getMessage()),i.play()});try{f.init(i.clientWidth,i.clientHeight,n.ViewMode.NORMAL),f.start()}catch(e){s.onError(e instanceof Error?e.message:`Ad playback failed to start.`)}}),d.addEventListener(n.AdErrorEvent.Type.AD_ERROR,e=>{s.onError(e.getError().getMessage())}),T())}).catch(e=>s.onError(e.message));function D(){h=!0,T()}function O(){if(!f)return;let e=f.getVolume();e>0?(y=e,f.setVolume(0)):f.setVolume(y||1),s.onAdMuteChange(f.getVolume()===0)}return{isAdPlaying:()=>g,isAdPaused:()=>_,requestAdsOnFirstPlay:D,setAdTagUrl:E,pauseAd:()=>f?.pause(),resumeAd:()=>f?.resume(),toggleAdMute:O,dispose:()=>{v=!0,b=!1,x=``,S.disconnect(),i.removeEventListener(`ended`,C),f?.destroy(),d?.destroy(),c.remove(),e.classList.remove(n,t)}}}export{o as attachAds};
1
+ import{c as e,f as t,p as n}from"./constants-35ZnLsDv.mjs";import{n as r}from"./platform-Dg9JBh8M.mjs";import{t as i}from"./loadScript-CxzeXqTe.mjs";function a(){return window.google?.ima?Promise.resolve():i(e,`ima`)}function o(e,i,o,s){let c=document.createElement(`div`);c.className=`ima-ad-container`,e.appendChild(c);let l=o,u=null,d=null,f=null,p=!1,m=!1,h=!1,g=!1,_=!1,v=!1,y=1,b=!1,x=``,S=new ResizeObserver(([e])=>{let t=window.google?.ima;if(!f||!t)return;let{width:n,height:r}=e.contentRect;f.resize(n,r,t.ViewMode.NORMAL)});S.observe(i);function C(){d?.contentComplete()}function w(r){g=r,e.classList.toggle(n,r),r||(_=!1,e.classList.remove(t))}function T(){if(p||!m||!h||!u||!d||!l)return;p=!0;let e=window.google?.ima;if(!e)return;u.initialize();let t=new e.AdsRequest;t.adTagUrl=l,d.requestAds(t)}function E(e){l=e,T()}a().then(()=>{if(v)return;let n=window.google?.ima;n&&(u=new n.AdDisplayContainer(c,i),d=new n.AdsLoader(u),m=!0,d.addEventListener(n.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,a=>{if(v)return;let o=new n.AdsRenderingSettings;o.restoreCustomPlaybackStateOnAdBreakComplete=!0,f=a.getAdsManager(i,o),i.addEventListener(`ended`,C),x=i.currentSrc,f.addEventListener(n.AdEvent.Type.CONTENT_PAUSE_REQUESTED,()=>{i.removeEventListener(`ended`,C),i.ended&&r()&&(b=!0),i.pause(),w(!0),s.onAdStart();let e=f?.getVolume()??1;e>0&&(y=e),s.onAdMuteChange(e===0)}),f.addEventListener(n.AdEvent.Type.CONTENT_RESUME_REQUESTED,()=>{if(i.addEventListener(`ended`,C),w(!1),s.onAdEnd(),b){b=!1,x&&i.currentSrc!==x&&(i.src=x);let e=i.duration;e&&isFinite(e)&&(i.currentTime=e-.5);return}i.ended||i.play().catch(()=>{})}),f.addEventListener(n.AdEvent.Type.PAUSED,()=>{_=!0,e.classList.add(t),s.onAdPauseChange(!0)}),f.addEventListener(n.AdEvent.Type.RESUMED,()=>{_=!1,e.classList.remove(t),s.onAdPauseChange(!1)}),f.addEventListener(n.AdEvent.Type.AD_PROGRESS,()=>{s.onAdProgress(f?.getRemainingTime()??0)}),f.addEventListener(n.AdErrorEvent.Type.AD_ERROR,e=>{w(!1),s.onError(e.getError().getMessage()),i.play().catch(()=>{})});try{f.init(i.clientWidth,i.clientHeight,n.ViewMode.NORMAL),f.start()}catch(e){s.onError(e instanceof Error?e.message:`Ad playback failed to start.`)}}),d.addEventListener(n.AdErrorEvent.Type.AD_ERROR,e=>{s.onError(e.getError().getMessage())}),T())}).catch(e=>s.onError(e.message));function D(){h=!0,T()}function O(){if(!f)return;let e=f.getVolume();e>0?(y=e,f.setVolume(0)):f.setVolume(y||1),s.onAdMuteChange(f.getVolume()===0)}return{isAdPlaying:()=>g,isAdPaused:()=>_,requestAdsOnFirstPlay:D,setAdTagUrl:E,pauseAd:()=>f?.pause(),resumeAd:()=>f?.resume(),toggleAdMute:O,dispose:()=>{v=!0,b=!1,x=``,S.disconnect(),i.removeEventListener(`ended`,C),f?.destroy(),d?.destroy(),c.remove(),e.classList.remove(n,t)}}}export{o as attachAds};
@@ -1 +1 @@
1
- import{n as e,t}from"./constants-zR-UwEWY.mjs";import{n,t as r}from"./sourceHelpers-rbs6D6ZG.mjs";function i(e){let t;try{t=new URL(e)}catch{return null}if(t.hostname!==`players.brightcove.net`)return null;let[,n,r]=t.pathname.split(`/`),i=t.searchParams.get(`videoId`),a=r?.indexOf(`_`)??-1;return!n||a===-1||!i?null:{accountId:n,playerId:r.slice(0,a),embed:r.slice(a+1),videoId:i}}function a(e){for(let t of e?.plugins??[]){let e=t.options?.serverUrl??t.options?.imaOptions?.serverUrl;if(e)return e}return null}const o=r(async(t,n,r,i)=>{let o=await fetch(`${e}/${t}/${n}_${r}/config.json`);if(!o.ok)throw Error(`Brightcove: could not load player config (${o.status})`);let s=await o.json(),c=i??s?.video_cloud?.policy_key;if(!c)throw Error(`Brightcove: policy_key not found in player config`);return{policyKey:c,adTagUrl:a(s)}},(e,t,n)=>`${e}/${t}_${n}`);async function s(e,r,i){let a=await fetch(`${t}/${e}/videos/${r}`,{headers:{Accept:`application/json;pk=${i}`}});if(!a.ok)throw Error(`Brightcove Playback API error: ${a.status}`);let o=await a.json(),s=n(o.sources||[]);if(!s.length)throw Error(`Brightcove: no playable sources found`);return{sources:s.map(e=>({src:e.src,type:e.type})),poster:o.poster??o.thumbnail??null}}async function c(e,t){let n=i(e);if(!n)throw Error(`Brightcove: invalid src — expected a Brightcove embed URL, e.g. "https://players.brightcove.net/{accountId}/{playerId}_{embed}/index.html?videoId={videoId}"`);let{accountId:r,playerId:a,embed:c,videoId:l}=n,{policyKey:u,adTagUrl:d}=await o(r,a,c,t),{sources:f,poster:p}=await s(r,l,u);return{...f[0],poster:p,adTagUrl:d}}export{c as resolveSource};
1
+ import{n as e,t}from"./constants-35ZnLsDv.mjs";import{n,t as r}from"./sourceHelpers-B0tH-grj.mjs";function i(e){let t;try{t=new URL(e)}catch{return null}if(t.hostname!==`players.brightcove.net`)return null;let[,n,r]=t.pathname.split(`/`),i=t.searchParams.get(`videoId`),a=r?.indexOf(`_`)??-1;return!n||a===-1||!i?null:{accountId:n,playerId:r.slice(0,a),embed:r.slice(a+1),videoId:i}}function a(e){for(let t of e?.plugins??[]){let e=t.options?.serverUrl??t.options?.imaOptions?.serverUrl;if(e)return e}return null}const o=r(async(t,n,r,i)=>{let o=await fetch(`${e}/${t}/${n}_${r}/config.json`);if(!o.ok)throw Error(`Brightcove: could not load player config (${o.status})`);let s=await o.json(),c=i??s?.video_cloud?.policy_key;if(!c)throw Error(`Brightcove: policy_key not found in player config`);return{policyKey:c,adTagUrl:a(s)}},(e,t,n)=>`${e}/${t}_${n}`);async function s(e,r,i){let a=await fetch(`${t}/${e}/videos/${r}`,{headers:{Accept:`application/json;pk=${i}`}});if(!a.ok)throw Error(`Brightcove Playback API error: ${a.status}`);let o=await a.json(),s=n(o.sources||[]);if(!s.length)throw Error(`Brightcove: no playable sources found`);return{sources:s.map(e=>({src:e.src,type:e.type})),poster:o.poster??o.thumbnail??null}}async function c(e,t){let n=i(e);if(!n)throw Error(`Brightcove: invalid src — expected a Brightcove embed URL, e.g. "https://players.brightcove.net/{accountId}/{playerId}_{embed}/index.html?videoId={videoId}"`);let{accountId:r,playerId:a,embed:c,videoId:l}=n,{policyKey:u,adTagUrl:d}=await o(r,a,c,t),{sources:f,poster:p}=await s(r,l,u);return{...f[0],poster:p,adTagUrl:d}}export{c as resolveSource};
@@ -0,0 +1 @@
1
+ const e=`video-select`,t=`video-toggle`,n=`fullscreen-pending`,r=`fullscreen-pending-done`,i=`player:positions`,a=`player:autoAdvance`,o=`player:audio`,s={muted:!1,volume:1},c=`mlv-tech`,l=`mlv-youtube`,u=`mlv-vimeo`,d=`mlv-dailymotion`,f=`mlv-ad-playing`,p=`mlv-ad-paused`,m=`16:9`,h=`application/x-mpegURL`,g=`application/dash+xml`,_=`video/mp4`,v=[h,_],y=[.5,.75,1,1.25,1.5,2],b=3500,x=.1,S=3e3,C=[[.25,`firstQuartile`],[.5,`midpoint`],[.75,`thirdQuartile`]],w=.1,T=`https://imasdk.googleapis.com/js/sdkloader/ima3.js`,E=`https://player.vimeo.com/api/player.js`,D=`https://cdn.jwplayer.com/v2/media`,O=`https://edge.api.brightcove.com/playback/v1/accounts`,k=`https://players.brightcove.net`;export{t as A,S as C,i as D,a as E,E as O,C as S,o as T,c as _,s as a,x as b,T as c,_ as d,p as f,r as g,n as h,m as i,e as k,D as l,d as m,k as n,h as o,f as p,g as r,b as s,O as t,w as u,u as v,v as w,y as x,l as y};
@@ -0,0 +1 @@
1
+ import{m as e}from"./constants-35ZnLsDv.mjs";import{r as t}from"./embedShared-CbArTtuR.mjs";import{t as n}from"./loadScript-CxzeXqTe.mjs";function r(e){let t=e.match(/[?&]video=([a-zA-Z0-9]+)/);return t?t[1]:e.match(/(?:dailymotion\.com\/(?:embed\/)?video\/|dai\.ly\/)([a-zA-Z0-9]+)/)?.[1]??null}function i(i,a){let o=null;return t(i,a,{cssClass:e,connect:async({techId:e,emitter:t,state:i,isDisposed:s,consumeQueuedPlay:c})=>{let l=r(a.src);if(!l){i.errorState={code:4,message:`Could not parse video ID from source URL`},t.trigger(`error`);return}let u=!1;try{let r=await n(`https://geo.dailymotion.com/libs/player.js`,`dailymotion-sdk`).then(()=>window.dailymotion);if(!r||s())return;let d=await r.createPlayer(e,{video:l,params:{autoplay:!!a.autoplay,mute:!!a.muted}});o=d,a.volume!==void 0&&d.setVolume(a.volume);let f=r.events;c(()=>o?.play()),d.on(f.VIDEO_PLAY,()=>{i.paused=!1,t.trigger(`play`),t.trigger(`playing`),!a.autoplay&&!u&&(u=!0,d.pause())}),d.on(f.VIDEO_PLAYING,()=>{i.paused=!1,t.trigger(`play`),t.trigger(`playing`)}),d.on(f.VIDEO_PAUSE,()=>{i.paused=!0,t.trigger(`pause`)}),f.VIDEO_BUFFERING&&d.on(f.VIDEO_BUFFERING,()=>t.trigger(`waiting`)),d.on(f.VIDEO_END,()=>{i.paused=!0,t.trigger(`ended`)}),d.on(f.VIDEO_TIMECHANGE,e=>{i.currentTime=e.videoTime??i.currentTime,i.duration=e.videoDuration??i.duration,t.trigger(`timeupdate`)}),d.on(f.VIDEO_DURATIONCHANGE,e=>{i.duration=e.videoDuration??i.duration,t.trigger(`durationchange`)}),d.on(f.VIDEO_SEEKEND,e=>{i.currentTime=e.videoTime??i.currentTime,t.trigger(`seeked`)}),d.on(f.PLAYER_VOLUMECHANGE,e=>{i.volume=e.playerVolume??i.volume,i.muted=e.playerIsMuted??i.muted,t.trigger(`volumechange`)}),d.on(f.PLAYER_ERROR,()=>t.trigger(`error`)),f.AD_START&&d.on(f.AD_START,()=>{i.paused=!1,t.trigger(`play`),t.trigger(`adstart`)}),f.AD_END&&d.on(f.AD_END,()=>t.trigger(`adend`))}catch(e){i.errorState={code:4,message:e instanceof Error?e.message:`This video could not be played.`},t.trigger(`error`)}},hasPlayer:()=>!!o,play:()=>o?.play(),pause:()=>o?.pause(),seekToSdk:e=>o?.seek(e),volumeToSdk:e=>o?.setVolume(e),muteToSdk:(e,t)=>o?.setMute(t),sdkFullscreenEnter:()=>o?.setFullscreen(!0),sdkFullscreenExit:()=>o?.setFullscreen(!1),destroyPlayer:()=>{let e=o;o=null,e?.destroy?.()}})}export{i as createDailymotionAdapter};
@@ -0,0 +1 @@
1
+ import{_ as e,g as t,h as n}from"./constants-35ZnLsDv.mjs";import{n as r,r as i,t as a}from"./platform-Dg9JBh8M.mjs";function o(){let e=new Map;function t(t,n){e.has(t)||e.set(t,new Set),e.get(t)?.add(n)}function n(t,n){e.get(t)?.delete(n)}function r(t,...n){e.get(t)?.forEach(e=>e(...n))}function i(){e.clear()}return{on:t,off:n,trigger:r,dispose:i}}const s={supportsCaptions:()=>!1,getCaptionTracks:()=>[],setCaptionTrack:()=>{},getActiveCaptionTrack:()=>null,supportsQuality:()=>!1,getQualityLevels:()=>[],getCurrentQuality:()=>null,isAutoQuality:()=>!0,setQuality:()=>{},supportsPip:()=>!1,isPipActive:()=>!1,togglePip:()=>{}};let c=0;function l(e){let t=e.querySelector(`iframe`);if(t){t.tabIndex=-1;return}let n=new MutationObserver(()=>{let t=e.querySelector(`iframe`);t&&(t.tabIndex=-1,n.disconnect())});n.observe(e,{childList:!0,subtree:!0})}function u(t,n,r){t.parentElement?.classList.add(n);let i=`${n}-${++c}`,a=document.createElement(`div`);a.id=i,a.className=e,a.style.cssText=`width:100%;height:100%;top:0;left:0;position:absolute`;let o=document.createElement(`div`);return o.style.cssText=`width:100%;height:100%;position:absolute;inset:0;opacity:0;pointer-events:none;transition:opacity 0.2s`,o.appendChild(a),t.parentElement?.insertBefore(o,t),r||l(o),{techId:i,wrapper:o}}function d(e,t){e.style.display=`none`,t.style.opacity=`1`,t.style.pointerEvents=``}function f(e,t,n){t.remove(),e.parentElement?.classList.remove(n),e.style.display=``}function p(e){return e.closest(`.player__shell`)}function m(e,t){if(r()&&t()!==!1)return;let n=p(e);n&&i(n)}function h(){let e=new Set;return{schedule(t,n=0){let r=setTimeout(()=>{e.delete(r),t()},n);e.add(r)},clearAll(){e.forEach(clearTimeout),e.clear()}}}function g(e){e.trigger(n);let r=document.createElement(`div`);r.style.cssText=`position:fixed;inset:0;z-index:99999;opacity:0;pointer-events:none`,document.body.appendChild(r);let i=!1;function a(){i||e.trigger(t)}function o(n){i||(i=!0,e.trigger(t),r.remove(),n?.())}return{overlay:r,reveal:a,finish:o}}function _(e,t,n){let i=o(),{techId:c,wrapper:l}=u(e,n.cssClass,t.nativeUi),{schedule:d,clearAll:p}=h(),g={currentTime:0,duration:0,volume:t.volume??1,muted:!1,paused:!0,playQueued:!1,errorState:null},_=!1,v={techId:c,wrapper:l,emitter:i,state:g,schedule:d,isDisposed:()=>_,consumeQueuedPlay(e){g.playQueued&&(g.playQueued=!1,e())}};n.connect(v);function y(){m(e,()=>{if(!n.sdkFullscreenEnter)return!1;n.sdkFullscreenEnter()})}function b(){if(r()&&n.sdkFullscreenExit){n.sdkFullscreenExit();return}a()}return{el:l,play:()=>n.hasPlayer()?Promise.resolve(n.play()):(g.playQueued=!0,Promise.resolve()),pause:()=>n.pause(),paused:()=>g.paused,currentTime:()=>g.currentTime,setCurrentTime:e=>{g.currentTime=e,n.seekToSdk?.(e)},duration:()=>g.duration,volume:()=>g.volume,setVolume:e=>{g.volume=e,n.volumeToSdk(e)},muted:()=>g.muted,setMuted:e=>{g.muted=e,n.muteToSdk(v,e)},playbackRate:()=>1,setPlaybackRate:()=>{},bufferedEnd:()=>g.currentTime,error:()=>g.errorState,setSrc:e=>{(!n.hasPlayer()||g.errorState)&&(t.src=e,g.errorState=null,n.destroyPlayer(),n.connect(v))},supportsPlaybackRate:()=>!1,...s,enterFullscreen:y,exitFullscreen:b,on:i.on,off:i.off,dispose:()=>{_=!0,p(),n.destroyPlayer(),f(e,l,n.cssClass),i.dispose()}}}export{m as a,g as c,h as i,f as l,u as n,p as o,_ as r,d as s,s as t,o as u};
@@ -1 +1 @@
1
- import{d as e,l as t,o as n}from"./constants-zR-UwEWY.mjs";import{n as r,t as i}from"./sourceHelpers-rbs6D6ZG.mjs";function a(e){return e.match(/cdn\.jwplayer\.com\/videos\/([^-]+)/)?.[1]??e.match(/cdn\.jwplayer\.com\/manifests\/([^.]+)/)?.[1]??e.match(/^jwplayer:\/\/([^/]+)$/)?.[1]??null}function o(e){let t=e?.advertising?.schedule;return Array.isArray(t)&&t.length?t[0].tag??null:e?.advertising?.tag??null}const s=i(async e=>{let n=await fetch(`${t}/${e}`);if(!n.ok)throw Error(`JW Platform API error: ${n.status}`);let i=(await n.json()).playlist?.[0];if(!i)throw Error(`JW Platform: empty playlist`);let a=r((i.sources??[]).map(e=>({src:e.file,type:e.type})));if(!a.length)throw Error(`JW Platform: no playable sources found`);return{src:a[0].src,type:a[0].type,poster:i.image??null,adTagUrl:o(i)}});async function c(t){let r=a(t);if(!r)throw Error(`JW Platform: unrecognised source URL: ${t}`);let i=await s(r);if(t.startsWith(`jwplayer://`))return i;let o=/\.mp4(\?|#|$)/.test(t)?e:n;return{...i,src:t,type:o}}export{c as resolveSource};
1
+ import{d as e,l as t,o as n}from"./constants-35ZnLsDv.mjs";import{n as r,t as i}from"./sourceHelpers-B0tH-grj.mjs";function a(e){return e.match(/cdn\.jwplayer\.com\/videos\/([^-]+)/)?.[1]??e.match(/cdn\.jwplayer\.com\/manifests\/([^.]+)/)?.[1]??e.match(/^jwplayer:\/\/([^/]+)$/)?.[1]??null}function o(e){let t=e?.advertising?.schedule;return Array.isArray(t)&&t.length?t[0].tag??null:e?.advertising?.tag??null}const s=i(async e=>{let n=await fetch(`${t}/${e}`);if(!n.ok)throw Error(`JW Platform API error: ${n.status}`);let i=(await n.json()).playlist?.[0];if(!i)throw Error(`JW Platform: empty playlist`);let a=r((i.sources??[]).map(e=>({src:e.file,type:e.type})));if(!a.length)throw Error(`JW Platform: no playable sources found`);return{src:a[0].src,type:a[0].type,poster:i.image??null,adTagUrl:o(i)}});async function c(t){let r=a(t);if(!r)throw Error(`JW Platform: unrecognised source URL: ${t}`);let i=await s(r);if(t.startsWith(`jwplayer://`))return i;let o=/\.mp4(\?|#|$)/.test(t)?e:n;return{...i,src:t,type:o}}export{c as resolveSource};
@@ -0,0 +1 @@
1
+ const e={};function t(t,n=t){if(!e[n]){let r=new Promise((e,n)=>{let r=document.createElement(`script`);r.src=t,r.onload=()=>e(),r.onerror=()=>{r.remove(),n(Error(`Failed to load script: ${t}`))},document.head.appendChild(r)});r.catch(()=>{e[n]===r&&delete e[n]}),e[n]=r}return e[n]}export{t};
@@ -1 +1 @@
1
- import{w as e}from"./constants-zR-UwEWY.mjs";function t(e,t=(...e)=>String(e[0])){let n={};return async(...r)=>{let i=t(...r);if(n[i])return n[i];let a=await e(...r);return n[i]=a,a}}function n(t){return t.filter(t=>t.src&&e.includes(t.type)).sort((t,n)=>e.indexOf(t.type)-e.indexOf(n.type))}export{n,t};
1
+ import{w as e}from"./constants-35ZnLsDv.mjs";function t(e,t=(...e)=>String(e[0])){let n={};return async(...r)=>{let i=t(...r);if(n[i])return n[i];let a=await e(...r);return n[i]=a,a}}function n(t){return t.filter(t=>t.src&&e.includes(t.type)).sort((t,n)=>e.indexOf(t.type)-e.indexOf(n.type))}export{n,t};
@@ -0,0 +1 @@
1
+ import{O as e,v as t}from"./constants-35ZnLsDv.mjs";import{r as n}from"./embedShared-CbArTtuR.mjs";import{t as r}from"./loadScript-CxzeXqTe.mjs";function i(e){return e.match(/(?:vimeo\.com\/(?:video\/|channels\/[^/]+\/|groups\/[^/]+\/videos\/)?|player\.vimeo\.com\/video\/)(\d+)/)?.[1]??null}function a(a,o){let s=null;return n(a,o,{cssClass:t,connect:async({techId:t,emitter:n,state:a,isDisposed:c,consumeQueuedPlay:l})=>{let u=i(o.src);if(!u)return;try{await r(e,`vimeo`)}catch(e){if(c())return;a.errorState={code:4,message:e instanceof Error?e.message:`The Vimeo player failed to load.`},n.trigger(`error`);return}if(c())return;if(!window.Vimeo){a.errorState={code:4,message:`The Vimeo player failed to load.`},n.trigger(`error`);return}let d={id:Number(u),byline:!1,portrait:!1,title:!1,transparent:!0,controls:!!o.nativeUi,autopause:!1,...o.autoplay!==void 0&&{autoplay:o.autoplay},...o.muted!==void 0&&{muted:o.muted}};s=new window.Vimeo.Player(t,d),o.autoplay&&(a.playQueued=!0),s.ready().then(()=>{o.muted&&s?.setMuted(!0).catch(()=>{}),o.volume!==void 0&&s?.setVolume(o.volume).catch(()=>{}),l(()=>void s?.play().catch(()=>{}))}).catch(e=>{a.errorState={code:4,message:e?.message||`This video is unavailable or cannot be embedded here.`},n.trigger(`error`)}),s.on(`play`,()=>{a.paused=!1,n.trigger(`play`),n.trigger(`playing`)}),s.on(`pause`,()=>{a.paused=!0,n.trigger(`pause`)}),s.on(`ended`,()=>{a.paused=!0,n.trigger(`ended`)});let f=!1;s.on(`timeupdate`,e=>{let{seconds:t,duration:r}=e;a.currentTime=t,a.duration=r,n.trigger(`timeupdate`),r&&!f&&(f=!0,n.trigger(`durationchange`))}),s.on(`loaded`,()=>{f=!1,n.trigger(`durationchange`)}),s.on(`seeked`,e=>{a.currentTime=e.seconds,n.trigger(`seeked`),n.trigger(`timeupdate`)}),s.on(`bufferstart`,()=>n.trigger(`waiting`)),s.on(`bufferend`,()=>n.trigger(`canplay`)),s.on(`volumechange`,e=>{a.volume=e.volume,n.trigger(`volumechange`)}),s.on(`error`,()=>n.trigger(`error`))},hasPlayer:()=>!!s,play:()=>s?.play(),pause:()=>void s?.pause().catch(()=>{}),seekToSdk:e=>void s?.setCurrentTime(e).catch(()=>{}),volumeToSdk:e=>void s?.setVolume(e).catch(()=>{}),muteToSdk:({emitter:e,schedule:t},n)=>{s?.setMuted(n).then(()=>t(()=>e.trigger(`volumechange`),50)).catch(()=>{})},sdkFullscreenEnter:()=>void s?.requestFullscreen().catch(()=>{}),destroyPlayer:()=>{let e=s;s=null,e?.destroy().catch(()=>{})}})}export{a as createVimeoAdapter};
@@ -0,0 +1 @@
1
+ import{y as e}from"./constants-35ZnLsDv.mjs";import{t}from"./platform-Dg9JBh8M.mjs";import{a as n,c as r,i,l as a,n as o,t as s,u as c}from"./embedShared-CbArTtuR.mjs";import{t as l}from"./loadScript-CxzeXqTe.mjs";function u(e,t){return t===e.PlayerState.PLAYING||t===e.PlayerState.BUFFERING}function d(e){let t={videoId:null,listId:null},n=e.match(/^.*(youtu\.be\/|v\/|u\/\w\/|embed\/|watch\?v=|shorts\/|&v=)([^#&?]*).*/);n?.[2]?.length===11&&(t.videoId=n[2]);let r=e.match(/[?&]list=([^#&?]+)/);return r?.[1]&&(t.listId=r[1]),t}let f=null,p=null;function m(){return f?Promise.resolve(f):(p||(p=l(`https://www.youtube.com/iframe_api`).then(()=>new Promise((e,t)=>{let n=window.YT;if(!n){t(Error(`The YouTube player failed to load.`));return}n.ready(()=>{f=n,e(n)})})),p.catch(()=>{p=null})),p)}function h(l,p){let h=c(),{techId:g,wrapper:_}=o(l,e,p.nativeUi),v=d(p.src),y=null,b=v.videoId,x=!1,S=!1,C=!1,w=null,T=!1,E=null,D=null,O=!1,k=!1,{schedule:A,clearAll:j}=i(),M=null,N={active:!1,wasPaused:!1,timeBefore:0,catchUpInterval:null};function P(){try{let e=y?.getPlayerResponse()?.adPlacements;return Array.isArray(e)&&e.length>0}catch{return!1}}function F(e){y?.loadVideoById({videoId:e})}function I(e){y?.cueVideoById({videoId:e})}function L(){return v.videoId?(N.wasPaused=!1,x?b===v.videoId?y?.playVideo():(F(v.videoId),b=v.videoId):(h.trigger(`waiting`),S=!0),Promise.resolve()):Promise.resolve()}function R(){N.catchUpInterval&&clearInterval(N.catchUpInterval),N.active=!1,N.wasPaused&&y?.pauseVideo(),h.trigger(`seeked`)}function z(){k=(y?.getAvailablePlaybackRates()??[]).length>1,x=!0,p.muted&&y?.mute(),p.volume!==void 0&&y?.setVolume(p.volume*100),S?L():C&&v.videoId&&(I(v.videoId),b=v.videoId)}function B(e){if(e===w||E!==null)return;w=e;let t=P();t!==T&&(T=t,h.trigger(t?`adstart`:`adend`));let n=window.YT;if(n){switch(e){case-1:h.trigger(`durationchange`),h.trigger(`ratechange`);break;case n.PlayerState.ENDED:h.trigger(`ended`);break;case n.PlayerState.PLAYING:h.trigger(`timeupdate`),h.trigger(`durationchange`),h.trigger(`playing`),h.trigger(`play`),N.active&&R();break;case n.PlayerState.PAUSED:h.trigger(`canplay`),N.active||h.trigger(`pause`);break;case n.PlayerState.BUFFERING:h.trigger(`waiting`);break;case n.PlayerState.CUED:h.trigger(`canplay`)}M&&=(clearInterval(M),null),e===n.PlayerState.PLAYING&&(M=setInterval(()=>h.trigger(`timeupdate`),250))}}function V(){let e={controls:+!!p.nativeUi,modestbranding:1,rel:0,showinfo:0,mute:+!!p.muted,origin:window.location.origin,allowfullscreen:1,fullscreen:1,fs:1,autoplay:0,playsinline:1};b=v.videoId,y=new window.YT.Player(g,{videoId:b??void 0,playerVars:e,events:{onReady:z,onStateChange:e=>B(e.data),onPlaybackRateChange:()=>h.trigger(`ratechange`),onVolumeChange:()=>h.trigger(`volumechange`),onError:e=>{E=e.data,h.trigger(`error`),A(()=>{E=null})}}})}function H(){if(f){V();return}m().then(()=>{O||V()},e=>{O||(D={code:4,message:e instanceof Error?e.message:`The YouTube player failed to load.`},h.trigger(`error`))})}H(),p.autoplay?x?L():S=!0:v.videoId&&(C=!0);function U(){if(!y)return;let e=y.getCurrentTime(),{video_id:t}=y.getVideoData();y.pauseVideo();let{overlay:n,reveal:i,finish:a}=r(h),o=document.createElement(`div`);o.id=`yt-fs-${Math.random().toString(36).slice(2)}`,n.appendChild(o);let s=null,c=()=>{document.removeEventListener(`pointerdown`,l,!0),a(()=>{let t=s?.getCurrentTime()??e;try{s?.destroy()}catch{}y?.seekTo(t,!0),h.trigger(`timeupdate`)})};function l(){c()}s=new window.YT.Player(o.id,{videoId:t,playerVars:{playsinline:0,autoplay:0,controls:1,modestbranding:1,rel:0,start:Math.floor(e)},events:{onReady:t=>{i(),t.target.seekTo(e,!0),t.target.playVideo()},onStateChange:e=>{let t=window.YT;t&&(e.data===t.PlayerState.ENDED?c():e.data===t.PlayerState.PAUSED?(document.removeEventListener(`pointerdown`,l,!0),document.addEventListener(`pointerdown`,l,{capture:!0,once:!0})):(document.removeEventListener(`pointerdown`,l,!0),i()))}}})}function W(){n(l,()=>{if(!y)return!1;U()})}return{el:_,play:L,pause:()=>y?.pauseVideo(),paused:()=>{if(!y)return!0;let e=window.YT;return!e||!u(e,w)},currentTime:()=>x?y?.getCurrentTime()??0:0,setCurrentTime:e=>{if(!x||!y)return;let t=window.YT;t&&w===t.PlayerState.PAUSED&&(N.timeBefore=y.getCurrentTime()),N.active||(N.wasPaused=!t||!u(t,w)),y.seekTo(e,!0),h.trigger(`timeupdate`),N.active=!0,t&&w===t.PlayerState.PAUSED&&N.timeBefore!==e&&(N.catchUpInterval&&clearInterval(N.catchUpInterval),N.catchUpInterval=setInterval(()=>{w!==t.PlayerState.PAUSED||!N.active?N.catchUpInterval&&clearInterval(N.catchUpInterval):y&&y.getCurrentTime()!==N.timeBefore&&(h.trigger(`timeupdate`),R())},250))},duration:()=>x?y?.getDuration()??0:0,volume:()=>x&&y?y.getVolume()/100:1,setVolume:e=>{x&&y?.setVolume(e*100)},muted:()=>x?y?.isMuted()??!1:!1,setMuted:e=>{x&&y&&(e?y.mute():y.unMute(),A(()=>h.trigger(`volumechange`),50))},playbackRate:()=>x?y?.getPlaybackRate()??1:1,setPlaybackRate:e=>{x&&y?.setPlaybackRate(e)},bufferedEnd:()=>!x||!y?.getVideoLoadedFraction?0:y.getVideoLoadedFraction()*y.getDuration(),error:()=>D??(E===null?null:{code:E,message:`This video could not be played.`}),setSrc:e=>{let t=d(e);if(v.videoId=t.videoId,v.listId=t.listId,v.videoId){if(D){D=null,p.autoplay||(C=!0),H();return}x?(F(v.videoId),b=v.videoId):C=!0}},supportsPlaybackRate:()=>k,...s,enterFullscreen:W,exitFullscreen:t,on:h.on,off:h.off,dispose:()=>{if(O=!0,j(),M&&clearInterval(M),N.catchUpInterval&&clearInterval(N.catchUpInterval),y)try{y.stopVideo(),y.destroy()}catch{}y=null,a(l,_,e),h.dispose()}}}export{h as createYoutubeAdapter};
@@ -1,4 +1,4 @@
1
- import "vue";
1
+ import { Ref, UnwrapNestedRefs } from "vue";
2
2
  //#region src/types/playback.d.ts
3
3
  interface CaptionTrackInfo {
4
4
  index: number;
@@ -12,49 +12,177 @@ interface QualityLevelInfo {
12
12
  label: string;
13
13
  }
14
14
  //#endregion
15
+ //#region src/composables/player/playerState.d.ts
16
+ declare function createPlayerState(props: PlayerProps): {
17
+ isPlaying: import("vue").Ref<boolean, boolean>;
18
+ hasEnded: import("vue").Ref<boolean, boolean>;
19
+ isReady: import("vue").Ref<boolean, boolean>;
20
+ isLoaded: import("vue").Ref<boolean, boolean>;
21
+ isLive: import("vue").Ref<boolean, boolean>;
22
+ hasStarted: import("vue").Ref<boolean, boolean>;
23
+ isError: import("vue").Ref<boolean, boolean>;
24
+ errorMessage: import("vue").Ref<string, string>;
25
+ current: import("vue").Ref<number, number>;
26
+ total: import("vue").Ref<number, number>;
27
+ buffered: import("vue").Ref<number, number>;
28
+ progress: import("vue").ComputedRef<number>;
29
+ bufferedDisplay: import("vue").ComputedRef<number>;
30
+ vol: import("vue").Ref<number, number>;
31
+ isMuted: import("vue").Ref<boolean, boolean>;
32
+ isAudible: import("vue").ComputedRef<boolean>;
33
+ isLooping: import("vue").Ref<boolean, boolean>;
34
+ currentPlaybackRate: import("vue").Ref<number, number>;
35
+ supportsPlaybackRate: import("vue").Ref<boolean, boolean>;
36
+ isAdPlaying: import("vue").Ref<boolean, boolean>;
37
+ isAdPaused: import("vue").Ref<boolean, boolean>;
38
+ isAdMuted: import("vue").Ref<boolean, boolean>;
39
+ adRemainingTime: import("vue").Ref<number, number>;
40
+ supportsCaptions: import("vue").Ref<boolean, boolean>;
41
+ captionTracks: import("vue").Ref<{
42
+ index: number;
43
+ label: string;
44
+ language: string;
45
+ }[], CaptionTrackInfo[] | {
46
+ index: number;
47
+ label: string;
48
+ language: string;
49
+ }[]>;
50
+ activeCaptionIndex: import("vue").Ref<number | null, number | null>;
51
+ supportsQuality: import("vue").Ref<boolean, boolean>;
52
+ qualityLevels: import("vue").Ref<{
53
+ index: number;
54
+ height: number;
55
+ bitrate: number;
56
+ label: string;
57
+ }[], QualityLevelInfo[] | {
58
+ index: number;
59
+ height: number;
60
+ bitrate: number;
61
+ label: string;
62
+ }[]>;
63
+ currentQualityIndex: import("vue").Ref<number | null, number | null>;
64
+ isAutoQuality: import("vue").Ref<boolean, boolean>;
65
+ supportsPip: import("vue").Ref<boolean, boolean>;
66
+ isPipActive: import("vue").Ref<boolean, boolean>;
67
+ isNativeUi: import("vue").Ref<boolean, boolean>;
68
+ };
69
+ type PlayerState = ReturnType<typeof createPlayerState>;
70
+ //#endregion
71
+ //#region src/composables/player/usePlayerControls.d.ts
72
+ interface UsePlayerControlsReturn {
73
+ play: () => Promise<void>;
74
+ pause: () => void;
75
+ replay: () => Promise<void>;
76
+ togglePlay: () => void;
77
+ seek: (percent: number) => void;
78
+ seekTo: (seconds: number) => void;
79
+ toggleMute: () => void;
80
+ setVolume: (vol: number) => void;
81
+ toggleLoop: () => void;
82
+ setPlaybackRate: (rate: number) => void;
83
+ setCaptionTrack: (index: number | null) => void;
84
+ setQuality: (index: number | null) => void;
85
+ togglePip: () => void;
86
+ }
87
+ //#endregion
88
+ //#region src/composables/player/usePlayer.d.ts
89
+ type UsePlayerReturn = PlayerState & UsePlayerControlsReturn & {
90
+ fire: (type: StateChangeType, extras?: Partial<StateChangeEvent>) => void;
91
+ retry: () => void;
92
+ isBuffering: Ref<boolean>;
93
+ toggleAdMute: () => void;
94
+ isFullscreen: Ref<boolean>;
95
+ isFullscreenPending: Ref<boolean>;
96
+ toggleFullscreen: () => void;
97
+ };
98
+ //#endregion
99
+ //#region src/composables/player/playerSurface.d.ts
100
+ declare const PLAYER_METHOD_KEYS: readonly ["retry", "play", "pause", "replay", "togglePlay", "seek", "seekTo", "toggleMute", "setVolume", "toggleFullscreen", "toggleLoop", "toggleAdMute", "setPlaybackRate", "setCaptionTrack", "setQuality", "togglePip"];
101
+ declare const PLAYER_STATE_KEYS: readonly ["isPlaying", "hasEnded", "isReady", "isLoaded", "isAdPlaying", "isAdPaused", "isAdMuted", "adRemainingTime", "isLive", "isBuffering", "current", "total", "vol", "isMuted", "isAudible", "isLooping", "currentPlaybackRate", "hasStarted", "isError", "errorMessage", "progress", "bufferedDisplay", "isFullscreen", "supportsPlaybackRate", "supportsCaptions", "captionTracks", "activeCaptionIndex", "supportsQuality", "qualityLevels", "currentQualityIndex", "isAutoQuality", "supportsPip", "isPipActive", "isNativeUi"];
102
+ type PlayerMethodKey = (typeof PLAYER_METHOD_KEYS)[number];
103
+ type PlayerStateKey = (typeof PLAYER_STATE_KEYS)[number];
104
+ //#endregion
15
105
  //#region src/types/player.d.ts
106
+ type BuiltinAction = 'mute' | 'loop' | 'autoplay';
107
+ interface CustomAction {
108
+ icon: string;
109
+ label: string;
110
+ onClick: () => void;
111
+ }
112
+ type PlayerAction = BuiltinAction | CustomAction;
113
+ type StateChangeType = 'loaded' | 'play' | 'pause' | 'ended' | 'seeked' | 'error' | 'adstart' | 'adend' | 'volumechange' | 'ratechange' | 'captionchange' | 'qualitychange' | 'pipchange' | 'loopchange' | 'firstQuartile' | 'midpoint' | 'thirdQuartile' | 'controlsopen' | 'controlsclose' | 'stageopen' | 'stageclose' | 'bufferstart' | 'bufferend' | 'timeupdate' | 'tap';
114
+ interface StateChangeEvent {
115
+ type: StateChangeType;
116
+ currentTime: number;
117
+ duration: number;
118
+ src: string;
119
+ error?: {
120
+ code: number;
121
+ message: string;
122
+ } | null;
123
+ isMuted?: boolean;
124
+ playbackRate?: number;
125
+ captionIndex?: number | null;
126
+ qualityIndex?: number | null;
127
+ isPipActive?: boolean;
128
+ isLooping?: boolean;
129
+ element?: HTMLElement | null;
130
+ payload?: Record<string, unknown>;
131
+ }
132
+ interface HeaderBiddingAdUnit {
133
+ code: string;
134
+ mediaTypes: {
135
+ video: Record<string, unknown>;
136
+ };
137
+ bids: Array<{
138
+ bidder: string;
139
+ params?: Record<string, unknown>;
140
+ }>;
141
+ }
142
+ interface HeaderBiddingConfig {
143
+ adUnit: HeaderBiddingAdUnit;
144
+ params?: Record<string, string>;
145
+ timeoutMs?: number;
146
+ }
147
+ interface CaptionTrackDef {
148
+ src: string;
149
+ kind?: 'captions' | 'subtitles';
150
+ srclang?: string;
151
+ label?: string;
152
+ default?: boolean;
153
+ }
154
+ interface PlayerProps {
155
+ src: string;
156
+ label?: string;
157
+ poster?: string;
158
+ aspectRatio?: string;
159
+ adTagUrl?: string;
160
+ adMacroParams?: Record<string, string>;
161
+ headerBidding?: HeaderBiddingConfig;
162
+ tracks?: CaptionTrackDef[];
163
+ autoplay?: boolean;
164
+ muted?: boolean;
165
+ volume?: number;
166
+ playbackRate?: number;
167
+ nativeUi?: boolean;
168
+ payload?: Record<string, unknown> | string;
169
+ action?: PlayerAction | null;
170
+ disableTapCapture?: boolean;
171
+ disableKeyboardShortcuts?: boolean;
172
+ controls?: boolean;
173
+ playInView?: boolean;
174
+ pin?: PinCorner;
175
+ loop?: boolean;
176
+ preload?: PreloadMode;
177
+ }
178
+ type PinCorner = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
179
+ type PreloadMode = 'none' | 'metadata' | 'auto';
16
180
  interface TranscriptCue {
17
181
  time: number;
18
182
  end?: number;
19
183
  text: string;
20
184
  }
21
- interface PlayerHandle {
22
- isPlaying: boolean;
23
- togglePlay(): void;
24
- hasEnded: boolean;
25
- isError: boolean;
26
- retry(): void;
27
- isMuted: boolean;
28
- toggleMute(): void;
29
- isAudible: boolean;
30
- isFullscreen: boolean;
31
- toggleFullscreen(): void;
32
- current: number;
33
- total: number;
34
- seek(percent: number): void;
35
- bufferedDisplay: number;
36
- isBuffering: boolean;
37
- isLive: boolean;
38
- vol: number;
39
- setVolume(vol: number): void;
40
- isLooping: boolean;
41
- toggleLoop(): void;
42
- supportsPip: boolean;
43
- isPipActive: boolean;
44
- togglePip(): void;
45
- supportsCaptions: boolean;
46
- captionTracks: CaptionTrackInfo[];
47
- activeCaptionIndex: number | null;
48
- setCaptionTrack(index: number | null): void;
49
- supportsQuality: boolean;
50
- qualityLevels: QualityLevelInfo[];
51
- currentQualityIndex: number | null;
52
- isAutoQuality: boolean;
53
- setQuality(index: number | null): void;
54
- supportsPlaybackRate: boolean;
55
- currentPlaybackRate: number;
56
- setPlaybackRate(rate: number): void;
57
- }
185
+ type PlayerHandle = Pick<UnwrapNestedRefs<UsePlayerReturn>, PlayerMethodKey | PlayerStateKey>;
58
186
  //#endregion
59
187
  //#region src/composables/controls/useResolvedPlayer.d.ts
60
188
  interface ResolvedPlayerProps {