@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.
- package/README.md +49 -33
- package/dist/chunks/{ads-BV769SMr.mjs → ads-Dph3guS9.mjs} +1 -1
- package/dist/{elements/chunks/brightcove-rNI-XRxB.mjs → chunks/brightcove-DiJF_74z.mjs} +1 -1
- package/dist/chunks/constants-35ZnLsDv.mjs +1 -0
- package/dist/chunks/dailymotion-DTooszoV.mjs +1 -0
- package/dist/chunks/embedShared-CbArTtuR.mjs +1 -0
- package/dist/chunks/{jwplayer-WIkwoJTA.mjs → jwplayer-Dhq65VxK.mjs} +1 -1
- package/dist/chunks/loadScript-CxzeXqTe.mjs +1 -0
- package/dist/chunks/{sourceHelpers-rbs6D6ZG.mjs → sourceHelpers-B0tH-grj.mjs} +1 -1
- package/dist/chunks/vimeo-D0GAjId0.mjs +1 -0
- package/dist/chunks/youtube-B8AT2F-4.mjs +1 -0
- package/dist/elements/chunks/{ads-BV769SMr.mjs → ads-Dph3guS9.mjs} +1 -1
- package/dist/{chunks/brightcove-rNI-XRxB.mjs → elements/chunks/brightcove-DiJF_74z.mjs} +1 -1
- package/dist/elements/chunks/constants-35ZnLsDv.mjs +1 -0
- package/dist/elements/chunks/dailymotion-DTooszoV.mjs +1 -0
- package/dist/elements/chunks/embedShared-CbArTtuR.mjs +1 -0
- package/dist/elements/chunks/{jwplayer-WIkwoJTA.mjs → jwplayer-Dhq65VxK.mjs} +1 -1
- package/dist/elements/chunks/loadScript-CxzeXqTe.mjs +1 -0
- package/dist/elements/chunks/{sourceHelpers-rbs6D6ZG.mjs → sourceHelpers-B0tH-grj.mjs} +1 -1
- package/dist/elements/chunks/vimeo-D0GAjId0.mjs +1 -0
- package/dist/elements/chunks/youtube-B8AT2F-4.mjs +1 -0
- package/dist/elements/controls.d.mts +166 -38
- package/dist/elements/controls.mjs +1 -1
- package/dist/elements/core.d.mts +26 -31
- package/dist/elements/core.mjs +1 -1
- package/dist/elements/index.d.mts +136 -69
- package/dist/elements/index.mjs +1 -1
- package/dist/index.d.mts +208 -209
- package/dist/index.mjs +1 -1
- package/package.json +5 -3
- package/dist/chunks/constants-zR-UwEWY.mjs +0 -1
- package/dist/chunks/dailymotion-gEquA4h5.mjs +0 -1
- package/dist/chunks/embedShared-duyOYFQN.mjs +0 -1
- package/dist/chunks/loadScript-Du6JsTc2.mjs +0 -1
- package/dist/chunks/vimeo-WJYDJPA3.mjs +0 -1
- package/dist/chunks/youtube-DbJ-IrvP.mjs +0 -1
- package/dist/elements/chunks/constants-zR-UwEWY.mjs +0 -1
- package/dist/elements/chunks/dailymotion-gEquA4h5.mjs +0 -1
- package/dist/elements/chunks/embedShared-duyOYFQN.mjs +0 -1
- package/dist/elements/chunks/loadScript-Du6JsTc2.mjs +0 -1
- package/dist/elements/chunks/vimeo-WJYDJPA3.mjs +0 -1
- 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
|
-
|
|
23
|
+
label="Big Buck Bunny"
|
|
24
24
|
src="https://cdn.jwplayer.com/videos/O5chtspP-4VHSaSK0.mp4"
|
|
25
|
-
poster="https://
|
|
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
|
-
| `
|
|
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
|
|
113
|
-
| `nativeUi` | `boolean` | `false` | Use the platform's native controls (YouTube, Vimeo, Dailymotion only)
|
|
114
|
-
| `autoStage` | `boolean` | `false` |
|
|
115
|
-
| `playbackRate` | `number` | `1` | Initial playback rate
|
|
116
|
-
| `
|
|
117
|
-
| `
|
|
118
|
-
| `
|
|
119
|
-
| `
|
|
120
|
-
| `
|
|
121
|
-
| `
|
|
122
|
-
| `
|
|
123
|
-
| `
|
|
124
|
-
| `
|
|
125
|
-
| `
|
|
126
|
-
|
|
127
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
539
|
-
poster="https://
|
|
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.
|
|
662
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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 {
|