itube-modern-player 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- "use strict";const e={play:"Play",pause:"Pause",replay:"Replay",mute:"Mute",unmute:"Unmute",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen",pip:"Picture-in-picture",settings:"Playback speed",scenes:"Scenes",sceneTypes:"Scene type",autoplay:"Autoplay",playNext:"Play next",shuffle:"Shuffle",repeat:"Repeat",subtitles:"Subtitles",subtitlesOff:"Off",speed:"Speed",quality:"Quality",qualityAuto:"Auto",next:"Next",nextVideo:"Next video",previous:"Previous",playlist:"Playlist",like:"Like",dislike:"Dislike",addTo:"Save to…",share:"Share",report:"Report",more:"More actions",seekForward:"Seek forward",seekBack:"Seek back",secondsShort:"s",live:"LIVE",related:"More videos",adLabel:"Ad",skipAd:"Skip ad",skipAdIn:"Skip in",visitAdvertiser:"Visit advertiser",sponsored:"Sponsored"};exports.defaultLabels=e;
2
- //# sourceMappingURL=labels-ub9G1Vyq.cjs.map
1
+ "use strict";const e={play:"Play",pause:"Pause",replay:"Replay",mute:"Mute",unmute:"Unmute",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen",pip:"Picture-in-picture",settings:"Playback speed",scenes:"Scenes",sceneTypes:"Scene type",autoplay:"Autoplay",playNext:"Play next",shuffle:"Shuffle",repeat:"Repeat",subtitles:"Subtitles",subtitlesOff:"Off",speed:"Speed",quality:"Quality",qualityAuto:"Auto",next:"Next",nextVideo:"Next video",previous:"Previous",playlist:"Playlist",like:"Like",dislike:"Dislike",addTo:"Save to…",share:"Share",report:"Report",more:"More actions",seekForward:"Seek forward",seekBack:"Seek back",secondsShort:"s",live:"LIVE",related:"More videos",adLabel:"Ad",skipAd:"Skip ad",skipAdIn:"Skip in",visitAdvertiser:"Visit advertiser",sponsored:"Sponsored",videoNotFound:"Video not found or damaged",tryAgain:"Try again",speedNormal:"Normal",volume:"Volume",seek:"Seek",close:"Close"};exports.defaultLabels=e;
2
+ //# sourceMappingURL=labels-BOrrLImF.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"labels-ub9G1Vyq.cjs","sources":["../src/core/labels.ts"],"sourcesContent":["import type { PlayerLabels } from '../types'\n\nexport const defaultLabels: PlayerLabels = {\n play: 'Play',\n pause: 'Pause',\n replay: 'Replay',\n mute: 'Mute',\n unmute: 'Unmute',\n fullscreen: 'Fullscreen',\n exitFullscreen: 'Exit fullscreen',\n pip: 'Picture-in-picture',\n settings: 'Playback speed',\n scenes: 'Scenes',\n sceneTypes: 'Scene type',\n autoplay: 'Autoplay',\n playNext: 'Play next',\n shuffle: 'Shuffle',\n repeat: 'Repeat',\n subtitles: 'Subtitles',\n subtitlesOff: 'Off',\n speed: 'Speed',\n quality: 'Quality',\n qualityAuto: 'Auto',\n next: 'Next',\n nextVideo: 'Next video',\n previous: 'Previous',\n playlist: 'Playlist',\n like: 'Like',\n dislike: 'Dislike',\n addTo: 'Save to…',\n share: 'Share',\n report: 'Report',\n more: 'More actions',\n seekForward: 'Seek forward',\n seekBack: 'Seek back',\n secondsShort: 's',\n live: 'LIVE',\n related: 'More videos',\n adLabel: 'Ad',\n skipAd: 'Skip ad',\n skipAdIn: 'Skip in',\n visitAdvertiser: 'Visit advertiser',\n sponsored: 'Sponsored',\n}\n"],"names":["defaultLabels"],"mappings":"aAEO,MAAMA,EAA8B,CACzC,KAAM,OACN,MAAO,QACP,OAAQ,SACR,KAAM,OACN,OAAQ,SACR,WAAY,aACZ,eAAgB,kBAChB,IAAK,qBACL,SAAU,iBACV,OAAQ,SACR,WAAY,aACZ,SAAU,WACV,SAAU,YACV,QAAS,UACT,OAAQ,SACR,UAAW,YACX,aAAc,MACd,MAAO,QACP,QAAS,UACT,YAAa,OACb,KAAM,OACN,UAAW,aACX,SAAU,WACV,SAAU,WACV,KAAM,OACN,QAAS,UACT,MAAO,WACP,MAAO,QACP,OAAQ,SACR,KAAM,eACN,YAAa,eACb,SAAU,YACV,aAAc,IACd,KAAM,OACN,QAAS,cACT,QAAS,KACT,OAAQ,UACR,SAAU,UACV,gBAAiB,mBACjB,UAAW,WACb"}
1
+ {"version":3,"file":"labels-BOrrLImF.cjs","sources":["../src/core/labels.ts"],"sourcesContent":["import type { PlayerLabels } from '../types'\n\nexport const defaultLabels: PlayerLabels = {\n play: 'Play',\n pause: 'Pause',\n replay: 'Replay',\n mute: 'Mute',\n unmute: 'Unmute',\n fullscreen: 'Fullscreen',\n exitFullscreen: 'Exit fullscreen',\n pip: 'Picture-in-picture',\n settings: 'Playback speed',\n scenes: 'Scenes',\n sceneTypes: 'Scene type',\n autoplay: 'Autoplay',\n playNext: 'Play next',\n shuffle: 'Shuffle',\n repeat: 'Repeat',\n subtitles: 'Subtitles',\n subtitlesOff: 'Off',\n speed: 'Speed',\n quality: 'Quality',\n qualityAuto: 'Auto',\n next: 'Next',\n nextVideo: 'Next video',\n previous: 'Previous',\n playlist: 'Playlist',\n like: 'Like',\n dislike: 'Dislike',\n addTo: 'Save to…',\n share: 'Share',\n report: 'Report',\n more: 'More actions',\n seekForward: 'Seek forward',\n seekBack: 'Seek back',\n secondsShort: 's',\n live: 'LIVE',\n related: 'More videos',\n adLabel: 'Ad',\n skipAd: 'Skip ad',\n skipAdIn: 'Skip in',\n visitAdvertiser: 'Visit advertiser',\n sponsored: 'Sponsored',\n videoNotFound: 'Video not found or damaged',\n tryAgain: 'Try again',\n speedNormal: 'Normal',\n volume: 'Volume',\n seek: 'Seek',\n close: 'Close',\n}\n"],"names":["defaultLabels"],"mappings":"aAEO,MAAMA,EAA8B,CACzC,KAAM,OACN,MAAO,QACP,OAAQ,SACR,KAAM,OACN,OAAQ,SACR,WAAY,aACZ,eAAgB,kBAChB,IAAK,qBACL,SAAU,iBACV,OAAQ,SACR,WAAY,aACZ,SAAU,WACV,SAAU,YACV,QAAS,UACT,OAAQ,SACR,UAAW,YACX,aAAc,MACd,MAAO,QACP,QAAS,UACT,YAAa,OACb,KAAM,OACN,UAAW,aACX,SAAU,WACV,SAAU,WACV,KAAM,OACN,QAAS,UACT,MAAO,WACP,MAAO,QACP,OAAQ,SACR,KAAM,eACN,YAAa,eACb,SAAU,YACV,aAAc,IACd,KAAM,OACN,QAAS,cACT,QAAS,KACT,OAAQ,UACR,SAAU,UACV,gBAAiB,mBACjB,UAAW,YACX,cAAe,6BACf,SAAU,YACV,YAAa,SACb,OAAQ,SACR,KAAM,OACN,MAAO,OACT"}
@@ -38,9 +38,15 @@ const e = {
38
38
  skipAd: "Skip ad",
39
39
  skipAdIn: "Skip in",
40
40
  visitAdvertiser: "Visit advertiser",
41
- sponsored: "Sponsored"
41
+ sponsored: "Sponsored",
42
+ videoNotFound: "Video not found or damaged",
43
+ tryAgain: "Try again",
44
+ speedNormal: "Normal",
45
+ volume: "Volume",
46
+ seek: "Seek",
47
+ close: "Close"
42
48
  };
43
49
  export {
44
50
  e as d
45
51
  };
46
- //# sourceMappingURL=labels-DRuCG6N8.js.map
52
+ //# sourceMappingURL=labels-CCjOCBKU.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"labels-DRuCG6N8.js","sources":["../src/core/labels.ts"],"sourcesContent":["import type { PlayerLabels } from '../types'\n\nexport const defaultLabels: PlayerLabels = {\n play: 'Play',\n pause: 'Pause',\n replay: 'Replay',\n mute: 'Mute',\n unmute: 'Unmute',\n fullscreen: 'Fullscreen',\n exitFullscreen: 'Exit fullscreen',\n pip: 'Picture-in-picture',\n settings: 'Playback speed',\n scenes: 'Scenes',\n sceneTypes: 'Scene type',\n autoplay: 'Autoplay',\n playNext: 'Play next',\n shuffle: 'Shuffle',\n repeat: 'Repeat',\n subtitles: 'Subtitles',\n subtitlesOff: 'Off',\n speed: 'Speed',\n quality: 'Quality',\n qualityAuto: 'Auto',\n next: 'Next',\n nextVideo: 'Next video',\n previous: 'Previous',\n playlist: 'Playlist',\n like: 'Like',\n dislike: 'Dislike',\n addTo: 'Save to…',\n share: 'Share',\n report: 'Report',\n more: 'More actions',\n seekForward: 'Seek forward',\n seekBack: 'Seek back',\n secondsShort: 's',\n live: 'LIVE',\n related: 'More videos',\n adLabel: 'Ad',\n skipAd: 'Skip ad',\n skipAdIn: 'Skip in',\n visitAdvertiser: 'Visit advertiser',\n sponsored: 'Sponsored',\n}\n"],"names":["defaultLabels"],"mappings":"AAEO,MAAMA,IAA8B;AAAA,EACzC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,cAAc;AAAA,EACd,OAAO;AAAA,EACP,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,aAAa;AAAA,EACb,UAAU;AAAA,EACV,cAAc;AAAA,EACd,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAW;AACb;"}
1
+ {"version":3,"file":"labels-CCjOCBKU.js","sources":["../src/core/labels.ts"],"sourcesContent":["import type { PlayerLabels } from '../types'\n\nexport const defaultLabels: PlayerLabels = {\n play: 'Play',\n pause: 'Pause',\n replay: 'Replay',\n mute: 'Mute',\n unmute: 'Unmute',\n fullscreen: 'Fullscreen',\n exitFullscreen: 'Exit fullscreen',\n pip: 'Picture-in-picture',\n settings: 'Playback speed',\n scenes: 'Scenes',\n sceneTypes: 'Scene type',\n autoplay: 'Autoplay',\n playNext: 'Play next',\n shuffle: 'Shuffle',\n repeat: 'Repeat',\n subtitles: 'Subtitles',\n subtitlesOff: 'Off',\n speed: 'Speed',\n quality: 'Quality',\n qualityAuto: 'Auto',\n next: 'Next',\n nextVideo: 'Next video',\n previous: 'Previous',\n playlist: 'Playlist',\n like: 'Like',\n dislike: 'Dislike',\n addTo: 'Save to…',\n share: 'Share',\n report: 'Report',\n more: 'More actions',\n seekForward: 'Seek forward',\n seekBack: 'Seek back',\n secondsShort: 's',\n live: 'LIVE',\n related: 'More videos',\n adLabel: 'Ad',\n skipAd: 'Skip ad',\n skipAdIn: 'Skip in',\n visitAdvertiser: 'Visit advertiser',\n sponsored: 'Sponsored',\n videoNotFound: 'Video not found or damaged',\n tryAgain: 'Try again',\n speedNormal: 'Normal',\n volume: 'Volume',\n seek: 'Seek',\n close: 'Close',\n}\n"],"names":["defaultLabels"],"mappings":"AAEO,MAAMA,IAA8B;AAAA,EACzC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,cAAc;AAAA,EACd,OAAO;AAAA,EACP,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,aAAa;AAAA,EACb,UAAU;AAAA,EACV,cAAc;AAAA,EACd,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,eAAe;AAAA,EACf,UAAU;AAAA,EACV,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AACT;"}
package/dist/lazy.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const P='<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M8 5.14v13.72c0 .8.87 1.3 1.56.88l10.54-6.86a1.05 1.05 0 0 0 0-1.76L9.56 4.26C8.87 3.84 8 4.34 8 5.14Z"/></svg>';function k(a,L={}){const l=typeof a=="string"?document.querySelector(a):a;if(!l)throw new Error(`[itube-player] mount target not found: ${String(a)}`);const{loadOn:f="interaction",...o}=L,v=Array.isArray(o.source)?o.source[0]:o.source,t=document.createElement("div");t.className="imp-player imp-player--lazy";const p=document.createElement("div");p.className="imp-poster";const u=document.createElement("div");u.className="imp-poster__image",v?.poster&&(u.style.backgroundImage=`url("${v.poster}")`);const s=document.createElement("button");s.type="button",s.className="imp-btn imp-poster__play",s.setAttribute("aria-label","Play"),s.innerHTML=P,p.append(u,s),t.append(p),l.append(t);let b,h;const g=new Promise((e,r)=>{b=e,h=r});g.catch(()=>{});const d={ready:g,player:null,el:t,destroy(){m=!0,w(),t.remove(),d.player?.destroy()}};let m=!1,y=!1;const i=[],w=()=>{for(const e of i.splice(0))e()},c=e=>{y||m||(y=!0,w(),Promise.resolve().then(()=>require("./index.cjs")).then(({Player:r})=>{if(m)return;t.remove();const n=new r(l,e?{...o,autoplay:!0}:o);d.player=n,b(n)},r=>{y=!1,h(r)}))},E=()=>c(!0);if(t.addEventListener("click",E),i.push(()=>t.removeEventListener("click",E)),f==="immediate")c(!1);else if(f==="visible"&&typeof IntersectionObserver<"u"){const e=new IntersectionObserver(r=>{r.some(n=>n.isIntersecting)&&c(!1)});e.observe(t),i.push(()=>e.disconnect())}else{const e=()=>c(!1),r=["pointerdown","keydown","touchstart","wheel"];for(const n of r)document.addEventListener(n,e,{once:!0,passive:!0}),i.push(()=>document.removeEventListener(n,e))}return d}exports.createLazyPlayer=k;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const L='<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M8 5.14v13.72c0 .8.87 1.3 1.56.88l10.54-6.86a1.05 1.05 0 0 0 0-1.76L9.56 4.26C8.87 3.84 8 4.34 8 5.14Z"/></svg>';function A(a,P={}){const l=typeof a=="string"?document.querySelector(a):a;if(!l)throw new Error(`[itube-player] mount target not found: ${String(a)}`);const{loadOn:f="interaction",...o}=P,v=Array.isArray(o.source)?o.source[0]:o.source,n=document.createElement("div");n.className="imp-player imp-player--lazy";const p=document.createElement("div");p.className="imp-poster";const i=document.createElement("div");if(i.className="imp-poster__image",v?.poster){const e=document.createElement("img");e.className="imp-cover-img",e.alt="",e.decoding="async",e.fetchPriority="high",e.src=v.poster,i.append(e)}else i.hidden=!0;const s=document.createElement("button");s.type="button",s.className="imp-btn imp-poster__play",s.setAttribute("aria-label","Play"),s.innerHTML=L,p.append(i,s),n.append(p),l.append(n);let h,b;const g=new Promise((e,t)=>{h=e,b=t});g.catch(()=>{});const d={ready:g,player:null,el:n,destroy(){u=!0,w(),n.remove(),d.player?.destroy()}};let u=!1,m=!1;const y=[],w=()=>{for(const e of y.splice(0))e()};let E=!1;const c=e=>{E||(E=e),!(m||u)&&(m=!0,w(),Promise.resolve().then(()=>require("./index.cjs")).then(({Player:t})=>{if(u)return;n.remove();const r=new t(l,E?{...o,autoplay:!0}:o);d.player=r,h(r)},t=>{m=!1,b(t)}))};if(n.addEventListener("click",()=>c(!0)),f==="immediate")c(!1);else if(f==="visible"&&typeof IntersectionObserver<"u"){const e=new IntersectionObserver(t=>{t.some(r=>r.isIntersecting)&&c(!1)});e.observe(n),y.push(()=>e.disconnect())}else{const e=()=>c(!1),t=["pointerdown","keydown","touchstart","wheel"];for(const r of t)document.addEventListener(r,e,{once:!0,passive:!0}),y.push(()=>document.removeEventListener(r,e))}return d}exports.createLazyPlayer=A;
2
2
  //# sourceMappingURL=lazy.cjs.map
package/dist/lazy.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lazy.cjs","sources":["../src/lazy.ts"],"sourcesContent":["/**\n * Micro entry (`itube-modern-player/lazy`) for bundle-deferred setups.\n *\n * Renders an instant poster placeholder (pure DOM, a couple of KB) and pulls\n * the real player chunk on the first user interaction — the pattern used to\n * be hand-rolled around fluid-player; here it is built in.\n *\n * ```ts\n * import { createLazyPlayer } from 'itube-modern-player/lazy'\n * import 'itube-modern-player/style.css'\n *\n * const lazy = createLazyPlayer('#mount', {\n * source: { src: 'stream.m3u8', poster: 'poster.jpg', title: '…' },\n * loadOn: 'interaction',\n * })\n * lazy.ready.then((player) => player.on('ended', …))\n * ```\n */\nimport type { Player } from './player'\nimport type { PlayerOptions } from './types'\n\nexport interface LazyPlayerOptions extends PlayerOptions {\n /**\n * When to download the player bundle:\n * - `\"interaction\"` (default) — first pointerdown / keydown / touch anywhere on the page;\n * - `\"visible\"` — when the placeholder enters the viewport;\n * - `\"immediate\"` — right away (you still get the split chunk + instant placeholder).\n *\n * A click on the placeholder always loads immediately and starts playback.\n */\n loadOn?: 'interaction' | 'visible' | 'immediate'\n}\n\nexport interface LazyPlayer {\n /** Resolves with the real `Player` once the chunk is loaded and constructed. */\n ready: Promise<Player>\n /** The instance, `null` until loaded. */\n player: Player | null\n /** Placeholder root (removed when the player takes over). */\n el: HTMLElement\n destroy(): void\n}\n\nconst PLAY_SVG =\n '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M8 5.14v13.72c0 .8.87 1.3 1.56.88l10.54-6.86a1.05 1.05 0 0 0 0-1.76L9.56 4.26C8.87 3.84 8 4.34 8 5.14Z\"/></svg>'\n\nexport function createLazyPlayer(target: string | HTMLElement, options: LazyPlayerOptions = {}): LazyPlayer {\n const mount = typeof target === 'string' ? document.querySelector<HTMLElement>(target) : target\n if (!mount) throw new Error(`[itube-player] mount target not found: ${String(target)}`)\n\n const { loadOn = 'interaction', ...playerOptions } = options\n const first = Array.isArray(playerOptions.source) ? playerOptions.source[0] : playerOptions.source\n\n // Placeholder reuses the player's own CSS classes — pixel-identical to the\n // real preview poster, so the swap is invisible.\n const ph = document.createElement('div')\n ph.className = 'imp-player imp-player--lazy'\n const poster = document.createElement('div')\n poster.className = 'imp-poster'\n const image = document.createElement('div')\n image.className = 'imp-poster__image'\n if (first?.poster) image.style.backgroundImage = `url(\"${first.poster}\")`\n const btn = document.createElement('button')\n btn.type = 'button'\n btn.className = 'imp-btn imp-poster__play'\n btn.setAttribute('aria-label', 'Play')\n btn.innerHTML = PLAY_SVG\n poster.append(image, btn)\n ph.append(poster)\n mount.append(ph)\n\n let resolveReady!: (p: Player) => void\n let rejectReady!: (e: unknown) => void\n const ready = new Promise<Player>((resolve, reject) => {\n resolveReady = resolve\n rejectReady = reject\n })\n // Consumers may ignore `ready` entirely — that must not crash the app.\n ready.catch(() => {})\n\n const api: LazyPlayer = {\n ready,\n player: null,\n el: ph,\n destroy() {\n destroyed = true\n cleanup()\n ph.remove()\n api.player?.destroy()\n },\n }\n\n let destroyed = false\n let loading = false\n const disposers: Array<() => void> = []\n const cleanup = () => {\n for (const dispose of disposers.splice(0)) dispose()\n }\n\n const load = (autoplay: boolean) => {\n if (loading || destroyed) return\n loading = true\n cleanup()\n // The full entry (not ./player) so built-in locales arrive with the chunk.\n import('./index').then(\n ({ Player: PlayerCtor }) => {\n if (destroyed) return\n ph.remove()\n const player = new PlayerCtor(mount, autoplay ? { ...playerOptions, autoplay: true } : playerOptions)\n api.player = player\n resolveReady(player)\n },\n (err) => {\n loading = false\n rejectReady(err)\n },\n )\n }\n\n // Click always wins: load + play.\n const onClick = () => load(true)\n ph.addEventListener('click', onClick)\n disposers.push(() => ph.removeEventListener('click', onClick))\n\n if (loadOn === 'immediate') {\n load(false)\n } else if (loadOn === 'visible' && typeof IntersectionObserver !== 'undefined') {\n const io = new IntersectionObserver((entries) => {\n if (entries.some((e) => e.isIntersecting)) load(false)\n })\n io.observe(ph)\n disposers.push(() => io.disconnect())\n } else {\n const onFirstInteraction = () => load(false)\n const events: Array<keyof DocumentEventMap> = ['pointerdown', 'keydown', 'touchstart', 'wheel']\n for (const name of events) {\n document.addEventListener(name, onFirstInteraction, { once: true, passive: true })\n disposers.push(() => document.removeEventListener(name, onFirstInteraction))\n }\n }\n\n return api\n}\n"],"names":["PLAY_SVG","createLazyPlayer","target","options","mount","loadOn","playerOptions","first","ph","poster","image","btn","resolveReady","rejectReady","ready","resolve","reject","api","destroyed","cleanup","loading","disposers","dispose","load","autoplay","PlayerCtor","player","err","onClick","io","entries","e","onFirstInteraction","events","name"],"mappings":"gFA2CA,MAAMA,EACJ,2LAEK,SAASC,EAAiBC,EAA8BC,EAA6B,GAAgB,CAC1G,MAAMC,EAAQ,OAAOF,GAAW,SAAW,SAAS,cAA2BA,CAAM,EAAIA,EACzF,GAAI,CAACE,EAAO,MAAM,IAAI,MAAM,0CAA0C,OAAOF,CAAM,CAAC,EAAE,EAEtF,KAAM,CAAE,OAAAG,EAAS,cAAe,GAAGC,GAAkBH,EAC/CI,EAAQ,MAAM,QAAQD,EAAc,MAAM,EAAIA,EAAc,OAAO,CAAC,EAAIA,EAAc,OAItFE,EAAK,SAAS,cAAc,KAAK,EACvCA,EAAG,UAAY,8BACf,MAAMC,EAAS,SAAS,cAAc,KAAK,EAC3CA,EAAO,UAAY,aACnB,MAAMC,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,oBACdH,GAAO,SAAQG,EAAM,MAAM,gBAAkB,QAAQH,EAAM,MAAM,MACrE,MAAMI,EAAM,SAAS,cAAc,QAAQ,EAC3CA,EAAI,KAAO,SACXA,EAAI,UAAY,2BAChBA,EAAI,aAAa,aAAc,MAAM,EACrCA,EAAI,UAAYX,EAChBS,EAAO,OAAOC,EAAOC,CAAG,EACxBH,EAAG,OAAOC,CAAM,EAChBL,EAAM,OAAOI,CAAE,EAEf,IAAII,EACAC,EACJ,MAAMC,EAAQ,IAAI,QAAgB,CAACC,EAASC,IAAW,CACrDJ,EAAeG,EACfF,EAAcG,CAChB,CAAC,EAEDF,EAAM,MAAM,IAAM,CAAC,CAAC,EAEpB,MAAMG,EAAkB,CACtB,MAAAH,EACA,OAAQ,KACR,GAAIN,EACJ,SAAU,CACRU,EAAY,GACZC,EAAA,EACAX,EAAG,OAAA,EACHS,EAAI,QAAQ,QAAA,CACd,CAAA,EAGF,IAAIC,EAAY,GACZE,EAAU,GACd,MAAMC,EAA+B,CAAA,EAC/BF,EAAU,IAAM,CACpB,UAAWG,KAAWD,EAAU,OAAO,CAAC,EAAGC,EAAA,CAC7C,EAEMC,EAAQC,GAAsB,CAC9BJ,GAAWF,IACfE,EAAU,GACVD,EAAA,EAEA,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,aAAS,CAAA,EAAE,KAChB,CAAC,CAAE,OAAQM,KAAiB,CAC1B,GAAIP,EAAW,OACfV,EAAG,OAAA,EACH,MAAMkB,EAAS,IAAID,EAAWrB,EAAOoB,EAAW,CAAE,GAAGlB,EAAe,SAAU,EAAA,EAASA,CAAa,EACpGW,EAAI,OAASS,EACbd,EAAac,CAAM,CACrB,EACCC,GAAQ,CACPP,EAAU,GACVP,EAAYc,CAAG,CACjB,CAAA,EAEJ,EAGMC,EAAU,IAAML,EAAK,EAAI,EAI/B,GAHAf,EAAG,iBAAiB,QAASoB,CAAO,EACpCP,EAAU,KAAK,IAAMb,EAAG,oBAAoB,QAASoB,CAAO,CAAC,EAEzDvB,IAAW,YACbkB,EAAK,EAAK,UACDlB,IAAW,WAAa,OAAO,qBAAyB,IAAa,CAC9E,MAAMwB,EAAK,IAAI,qBAAsBC,GAAY,CAC3CA,EAAQ,KAAMC,GAAMA,EAAE,cAAc,KAAQ,EAAK,CACvD,CAAC,EACDF,EAAG,QAAQrB,CAAE,EACba,EAAU,KAAK,IAAMQ,EAAG,WAAA,CAAY,CACtC,KAAO,CACL,MAAMG,EAAqB,IAAMT,EAAK,EAAK,EACrCU,EAAwC,CAAC,cAAe,UAAW,aAAc,OAAO,EAC9F,UAAWC,KAAQD,EACjB,SAAS,iBAAiBC,EAAMF,EAAoB,CAAE,KAAM,GAAM,QAAS,GAAM,EACjFX,EAAU,KAAK,IAAM,SAAS,oBAAoBa,EAAMF,CAAkB,CAAC,CAE/E,CAEA,OAAOf,CACT"}
1
+ {"version":3,"file":"lazy.cjs","sources":["../src/lazy.ts"],"sourcesContent":["/**\n * Micro entry (`itube-modern-player/lazy`) for bundle-deferred setups.\n *\n * Renders an instant poster placeholder (pure DOM, a couple of KB) and pulls\n * the real player chunk on the first user interaction — the pattern used to\n * be hand-rolled around fluid-player; here it is built in.\n *\n * ```ts\n * import { createLazyPlayer } from 'itube-modern-player/lazy'\n * import 'itube-modern-player/style.css'\n *\n * const lazy = createLazyPlayer('#mount', {\n * source: { src: 'stream.m3u8', poster: 'poster.jpg', title: '…' },\n * loadOn: 'interaction',\n * })\n * lazy.ready.then((player) => player.on('ended', …))\n * ```\n */\nimport type { Player } from './player'\nimport type { PlayerOptions } from './types'\n\nexport interface LazyPlayerOptions extends PlayerOptions {\n /**\n * When to download the player bundle:\n * - `\"interaction\"` (default) — first pointerdown / keydown / touch anywhere on the page;\n * - `\"visible\"` — when the placeholder enters the viewport;\n * - `\"immediate\"` — right away (you still get the split chunk + instant placeholder).\n *\n * A click on the placeholder always loads immediately and starts playback.\n */\n loadOn?: 'interaction' | 'visible' | 'immediate'\n}\n\nexport interface LazyPlayer {\n /** Resolves with the real `Player` once the chunk is loaded and constructed. */\n ready: Promise<Player>\n /** The instance, `null` until loaded. */\n player: Player | null\n /** Placeholder root (removed when the player takes over). */\n el: HTMLElement\n destroy(): void\n}\n\nconst PLAY_SVG =\n '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M8 5.14v13.72c0 .8.87 1.3 1.56.88l10.54-6.86a1.05 1.05 0 0 0 0-1.76L9.56 4.26C8.87 3.84 8 4.34 8 5.14Z\"/></svg>'\n\nexport function createLazyPlayer(target: string | HTMLElement, options: LazyPlayerOptions = {}): LazyPlayer {\n const mount = typeof target === 'string' ? document.querySelector<HTMLElement>(target) : target\n if (!mount) throw new Error(`[itube-player] mount target not found: ${String(target)}`)\n\n const { loadOn = 'interaction', ...playerOptions } = options\n const first = Array.isArray(playerOptions.source) ? playerOptions.source[0] : playerOptions.source\n\n // Placeholder reuses the player's own CSS classes — pixel-identical to the\n // real preview poster, so the swap is invisible.\n const ph = document.createElement('div')\n ph.className = 'imp-player imp-player--lazy'\n const poster = document.createElement('div')\n poster.className = 'imp-poster'\n // Same div > <img> markup as the real player's PosterOverlay — the swap on\n // load is invisible, and the poster <img> is a proper LCP candidate.\n const image = document.createElement('div')\n image.className = 'imp-poster__image'\n if (first?.poster) {\n const img = document.createElement('img')\n img.className = 'imp-cover-img'\n img.alt = ''\n img.decoding = 'async'\n img.fetchPriority = 'high'\n img.src = first.poster\n image.append(img)\n } else {\n image.hidden = true\n }\n const btn = document.createElement('button')\n btn.type = 'button'\n btn.className = 'imp-btn imp-poster__play'\n btn.setAttribute('aria-label', 'Play')\n btn.innerHTML = PLAY_SVG\n poster.append(image, btn)\n ph.append(poster)\n mount.append(ph)\n\n let resolveReady!: (p: Player) => void\n let rejectReady!: (e: unknown) => void\n const ready = new Promise<Player>((resolve, reject) => {\n resolveReady = resolve\n rejectReady = reject\n })\n // Consumers may ignore `ready` entirely — that must not crash the app.\n ready.catch(() => {})\n\n const api: LazyPlayer = {\n ready,\n player: null,\n el: ph,\n destroy() {\n destroyed = true\n cleanup()\n ph.remove()\n api.player?.destroy()\n },\n }\n\n let destroyed = false\n let loading = false\n const disposers: Array<() => void> = []\n const cleanup = () => {\n for (const dispose of disposers.splice(0)) dispose()\n }\n\n // Autoplay intent is accumulated, not tied to the call that started the\n // download: a poster click DURING an in-flight background load ('interaction'\n // trigger) must still start playback once the chunk arrives.\n let wantAutoplay = false\n const load = (autoplay: boolean) => {\n wantAutoplay ||= autoplay\n if (loading || destroyed) return\n loading = true\n cleanup()\n // The full entry (not ./player) so built-in locales arrive with the chunk.\n import('./index').then(\n ({ Player: PlayerCtor }) => {\n if (destroyed) return\n ph.remove()\n const player = new PlayerCtor(mount, wantAutoplay ? { ...playerOptions, autoplay: true } : playerOptions)\n api.player = player\n resolveReady(player)\n },\n (err) => {\n loading = false\n rejectReady(err)\n },\n )\n }\n\n // Click always wins: load + play. NOT in `disposers` — it must survive the\n // load-start cleanup so a click during an in-flight background load still\n // registers the autoplay intent (the listener dies with ph.remove()).\n ph.addEventListener('click', () => load(true))\n\n if (loadOn === 'immediate') {\n load(false)\n } else if (loadOn === 'visible' && typeof IntersectionObserver !== 'undefined') {\n const io = new IntersectionObserver((entries) => {\n if (entries.some((e) => e.isIntersecting)) load(false)\n })\n io.observe(ph)\n disposers.push(() => io.disconnect())\n } else {\n const onFirstInteraction = () => load(false)\n const events: Array<keyof DocumentEventMap> = ['pointerdown', 'keydown', 'touchstart', 'wheel']\n for (const name of events) {\n document.addEventListener(name, onFirstInteraction, { once: true, passive: true })\n disposers.push(() => document.removeEventListener(name, onFirstInteraction))\n }\n }\n\n return api\n}\n"],"names":["PLAY_SVG","createLazyPlayer","target","options","mount","loadOn","playerOptions","first","ph","poster","image","img","btn","resolveReady","rejectReady","ready","resolve","reject","api","destroyed","cleanup","loading","disposers","dispose","wantAutoplay","load","autoplay","PlayerCtor","player","err","io","entries","e","onFirstInteraction","events","name"],"mappings":"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"}
package/dist/lazy.js CHANGED
@@ -1,60 +1,66 @@
1
- const k = '<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M8 5.14v13.72c0 .8.87 1.3 1.56.88l10.54-6.86a1.05 1.05 0 0 0 0-1.76L9.56 4.26C8.87 3.84 8 4.34 8 5.14Z"/></svg>';
2
- function I(a, L = {}) {
1
+ const P = '<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M8 5.14v13.72c0 .8.87 1.3 1.56.88l10.54-6.86a1.05 1.05 0 0 0 0-1.76L9.56 4.26C8.87 3.84 8 4.34 8 5.14Z"/></svg>';
2
+ function A(a, L = {}) {
3
3
  const l = typeof a == "string" ? document.querySelector(a) : a;
4
4
  if (!l) throw new Error(`[itube-player] mount target not found: ${String(a)}`);
5
- const { loadOn: f = "interaction", ...o } = L, v = Array.isArray(o.source) ? o.source[0] : o.source, t = document.createElement("div");
6
- t.className = "imp-player imp-player--lazy";
5
+ const { loadOn: f = "interaction", ...o } = L, v = Array.isArray(o.source) ? o.source[0] : o.source, n = document.createElement("div");
6
+ n.className = "imp-player imp-player--lazy";
7
7
  const p = document.createElement("div");
8
8
  p.className = "imp-poster";
9
- const d = document.createElement("div");
10
- d.className = "imp-poster__image", v?.poster && (d.style.backgroundImage = `url("${v.poster}")`);
9
+ const i = document.createElement("div");
10
+ if (i.className = "imp-poster__image", v?.poster) {
11
+ const e = document.createElement("img");
12
+ e.className = "imp-cover-img", e.alt = "", e.decoding = "async", e.fetchPriority = "high", e.src = v.poster, i.append(e);
13
+ } else
14
+ i.hidden = !0;
11
15
  const s = document.createElement("button");
12
- s.type = "button", s.className = "imp-btn imp-poster__play", s.setAttribute("aria-label", "Play"), s.innerHTML = k, p.append(d, s), t.append(p), l.append(t);
13
- let b, h;
14
- const w = new Promise((e, n) => {
15
- b = e, h = n;
16
+ s.type = "button", s.className = "imp-btn imp-poster__play", s.setAttribute("aria-label", "Play"), s.innerHTML = P, p.append(i, s), n.append(p), l.append(n);
17
+ let h, b;
18
+ const g = new Promise((e, t) => {
19
+ h = e, b = t;
16
20
  });
17
- w.catch(() => {
21
+ g.catch(() => {
18
22
  });
19
- const u = {
20
- ready: w,
23
+ const d = {
24
+ ready: g,
21
25
  player: null,
22
- el: t,
26
+ el: n,
23
27
  destroy() {
24
- m = !0, E(), t.remove(), u.player?.destroy();
28
+ m = !0, w(), n.remove(), d.player?.destroy();
25
29
  }
26
30
  };
27
- let m = !1, y = !1;
28
- const c = [], E = () => {
29
- for (const e of c.splice(0)) e();
30
- }, i = (e) => {
31
- y || m || (y = !0, E(), import("./index.js").then(
32
- ({ Player: n }) => {
31
+ let m = !1, u = !1;
32
+ const y = [], w = () => {
33
+ for (const e of y.splice(0)) e();
34
+ };
35
+ let E = !1;
36
+ const c = (e) => {
37
+ E || (E = e), !(u || m) && (u = !0, w(), import("./index.js").then(
38
+ ({ Player: t }) => {
33
39
  if (m) return;
34
- t.remove();
35
- const r = new n(l, e ? { ...o, autoplay: !0 } : o);
36
- u.player = r, b(r);
40
+ n.remove();
41
+ const r = new t(l, E ? { ...o, autoplay: !0 } : o);
42
+ d.player = r, h(r);
37
43
  },
38
- (n) => {
39
- y = !1, h(n);
44
+ (t) => {
45
+ u = !1, b(t);
40
46
  }
41
47
  ));
42
- }, g = () => i(!0);
43
- if (t.addEventListener("click", g), c.push(() => t.removeEventListener("click", g)), f === "immediate")
44
- i(!1);
48
+ };
49
+ if (n.addEventListener("click", () => c(!0)), f === "immediate")
50
+ c(!1);
45
51
  else if (f === "visible" && typeof IntersectionObserver < "u") {
46
- const e = new IntersectionObserver((n) => {
47
- n.some((r) => r.isIntersecting) && i(!1);
52
+ const e = new IntersectionObserver((t) => {
53
+ t.some((r) => r.isIntersecting) && c(!1);
48
54
  });
49
- e.observe(t), c.push(() => e.disconnect());
55
+ e.observe(n), y.push(() => e.disconnect());
50
56
  } else {
51
- const e = () => i(!1), n = ["pointerdown", "keydown", "touchstart", "wheel"];
52
- for (const r of n)
53
- document.addEventListener(r, e, { once: !0, passive: !0 }), c.push(() => document.removeEventListener(r, e));
57
+ const e = () => c(!1), t = ["pointerdown", "keydown", "touchstart", "wheel"];
58
+ for (const r of t)
59
+ document.addEventListener(r, e, { once: !0, passive: !0 }), y.push(() => document.removeEventListener(r, e));
54
60
  }
55
- return u;
61
+ return d;
56
62
  }
57
63
  export {
58
- I as createLazyPlayer
64
+ A as createLazyPlayer
59
65
  };
60
66
  //# sourceMappingURL=lazy.js.map
package/dist/lazy.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lazy.js","sources":["../src/lazy.ts"],"sourcesContent":["/**\n * Micro entry (`itube-modern-player/lazy`) for bundle-deferred setups.\n *\n * Renders an instant poster placeholder (pure DOM, a couple of KB) and pulls\n * the real player chunk on the first user interaction — the pattern used to\n * be hand-rolled around fluid-player; here it is built in.\n *\n * ```ts\n * import { createLazyPlayer } from 'itube-modern-player/lazy'\n * import 'itube-modern-player/style.css'\n *\n * const lazy = createLazyPlayer('#mount', {\n * source: { src: 'stream.m3u8', poster: 'poster.jpg', title: '…' },\n * loadOn: 'interaction',\n * })\n * lazy.ready.then((player) => player.on('ended', …))\n * ```\n */\nimport type { Player } from './player'\nimport type { PlayerOptions } from './types'\n\nexport interface LazyPlayerOptions extends PlayerOptions {\n /**\n * When to download the player bundle:\n * - `\"interaction\"` (default) — first pointerdown / keydown / touch anywhere on the page;\n * - `\"visible\"` — when the placeholder enters the viewport;\n * - `\"immediate\"` — right away (you still get the split chunk + instant placeholder).\n *\n * A click on the placeholder always loads immediately and starts playback.\n */\n loadOn?: 'interaction' | 'visible' | 'immediate'\n}\n\nexport interface LazyPlayer {\n /** Resolves with the real `Player` once the chunk is loaded and constructed. */\n ready: Promise<Player>\n /** The instance, `null` until loaded. */\n player: Player | null\n /** Placeholder root (removed when the player takes over). */\n el: HTMLElement\n destroy(): void\n}\n\nconst PLAY_SVG =\n '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M8 5.14v13.72c0 .8.87 1.3 1.56.88l10.54-6.86a1.05 1.05 0 0 0 0-1.76L9.56 4.26C8.87 3.84 8 4.34 8 5.14Z\"/></svg>'\n\nexport function createLazyPlayer(target: string | HTMLElement, options: LazyPlayerOptions = {}): LazyPlayer {\n const mount = typeof target === 'string' ? document.querySelector<HTMLElement>(target) : target\n if (!mount) throw new Error(`[itube-player] mount target not found: ${String(target)}`)\n\n const { loadOn = 'interaction', ...playerOptions } = options\n const first = Array.isArray(playerOptions.source) ? playerOptions.source[0] : playerOptions.source\n\n // Placeholder reuses the player's own CSS classes — pixel-identical to the\n // real preview poster, so the swap is invisible.\n const ph = document.createElement('div')\n ph.className = 'imp-player imp-player--lazy'\n const poster = document.createElement('div')\n poster.className = 'imp-poster'\n const image = document.createElement('div')\n image.className = 'imp-poster__image'\n if (first?.poster) image.style.backgroundImage = `url(\"${first.poster}\")`\n const btn = document.createElement('button')\n btn.type = 'button'\n btn.className = 'imp-btn imp-poster__play'\n btn.setAttribute('aria-label', 'Play')\n btn.innerHTML = PLAY_SVG\n poster.append(image, btn)\n ph.append(poster)\n mount.append(ph)\n\n let resolveReady!: (p: Player) => void\n let rejectReady!: (e: unknown) => void\n const ready = new Promise<Player>((resolve, reject) => {\n resolveReady = resolve\n rejectReady = reject\n })\n // Consumers may ignore `ready` entirely — that must not crash the app.\n ready.catch(() => {})\n\n const api: LazyPlayer = {\n ready,\n player: null,\n el: ph,\n destroy() {\n destroyed = true\n cleanup()\n ph.remove()\n api.player?.destroy()\n },\n }\n\n let destroyed = false\n let loading = false\n const disposers: Array<() => void> = []\n const cleanup = () => {\n for (const dispose of disposers.splice(0)) dispose()\n }\n\n const load = (autoplay: boolean) => {\n if (loading || destroyed) return\n loading = true\n cleanup()\n // The full entry (not ./player) so built-in locales arrive with the chunk.\n import('./index').then(\n ({ Player: PlayerCtor }) => {\n if (destroyed) return\n ph.remove()\n const player = new PlayerCtor(mount, autoplay ? { ...playerOptions, autoplay: true } : playerOptions)\n api.player = player\n resolveReady(player)\n },\n (err) => {\n loading = false\n rejectReady(err)\n },\n )\n }\n\n // Click always wins: load + play.\n const onClick = () => load(true)\n ph.addEventListener('click', onClick)\n disposers.push(() => ph.removeEventListener('click', onClick))\n\n if (loadOn === 'immediate') {\n load(false)\n } else if (loadOn === 'visible' && typeof IntersectionObserver !== 'undefined') {\n const io = new IntersectionObserver((entries) => {\n if (entries.some((e) => e.isIntersecting)) load(false)\n })\n io.observe(ph)\n disposers.push(() => io.disconnect())\n } else {\n const onFirstInteraction = () => load(false)\n const events: Array<keyof DocumentEventMap> = ['pointerdown', 'keydown', 'touchstart', 'wheel']\n for (const name of events) {\n document.addEventListener(name, onFirstInteraction, { once: true, passive: true })\n disposers.push(() => document.removeEventListener(name, onFirstInteraction))\n }\n }\n\n return api\n}\n"],"names":["PLAY_SVG","createLazyPlayer","target","options","mount","loadOn","playerOptions","first","ph","poster","image","btn","resolveReady","rejectReady","ready","resolve","reject","api","destroyed","cleanup","loading","disposers","dispose","load","autoplay","PlayerCtor","player","err","onClick","io","entries","e","onFirstInteraction","events","name"],"mappings":"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"}
1
+ {"version":3,"file":"lazy.js","sources":["../src/lazy.ts"],"sourcesContent":["/**\n * Micro entry (`itube-modern-player/lazy`) for bundle-deferred setups.\n *\n * Renders an instant poster placeholder (pure DOM, a couple of KB) and pulls\n * the real player chunk on the first user interaction — the pattern used to\n * be hand-rolled around fluid-player; here it is built in.\n *\n * ```ts\n * import { createLazyPlayer } from 'itube-modern-player/lazy'\n * import 'itube-modern-player/style.css'\n *\n * const lazy = createLazyPlayer('#mount', {\n * source: { src: 'stream.m3u8', poster: 'poster.jpg', title: '…' },\n * loadOn: 'interaction',\n * })\n * lazy.ready.then((player) => player.on('ended', …))\n * ```\n */\nimport type { Player } from './player'\nimport type { PlayerOptions } from './types'\n\nexport interface LazyPlayerOptions extends PlayerOptions {\n /**\n * When to download the player bundle:\n * - `\"interaction\"` (default) — first pointerdown / keydown / touch anywhere on the page;\n * - `\"visible\"` — when the placeholder enters the viewport;\n * - `\"immediate\"` — right away (you still get the split chunk + instant placeholder).\n *\n * A click on the placeholder always loads immediately and starts playback.\n */\n loadOn?: 'interaction' | 'visible' | 'immediate'\n}\n\nexport interface LazyPlayer {\n /** Resolves with the real `Player` once the chunk is loaded and constructed. */\n ready: Promise<Player>\n /** The instance, `null` until loaded. */\n player: Player | null\n /** Placeholder root (removed when the player takes over). */\n el: HTMLElement\n destroy(): void\n}\n\nconst PLAY_SVG =\n '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M8 5.14v13.72c0 .8.87 1.3 1.56.88l10.54-6.86a1.05 1.05 0 0 0 0-1.76L9.56 4.26C8.87 3.84 8 4.34 8 5.14Z\"/></svg>'\n\nexport function createLazyPlayer(target: string | HTMLElement, options: LazyPlayerOptions = {}): LazyPlayer {\n const mount = typeof target === 'string' ? document.querySelector<HTMLElement>(target) : target\n if (!mount) throw new Error(`[itube-player] mount target not found: ${String(target)}`)\n\n const { loadOn = 'interaction', ...playerOptions } = options\n const first = Array.isArray(playerOptions.source) ? playerOptions.source[0] : playerOptions.source\n\n // Placeholder reuses the player's own CSS classes — pixel-identical to the\n // real preview poster, so the swap is invisible.\n const ph = document.createElement('div')\n ph.className = 'imp-player imp-player--lazy'\n const poster = document.createElement('div')\n poster.className = 'imp-poster'\n // Same div > <img> markup as the real player's PosterOverlay — the swap on\n // load is invisible, and the poster <img> is a proper LCP candidate.\n const image = document.createElement('div')\n image.className = 'imp-poster__image'\n if (first?.poster) {\n const img = document.createElement('img')\n img.className = 'imp-cover-img'\n img.alt = ''\n img.decoding = 'async'\n img.fetchPriority = 'high'\n img.src = first.poster\n image.append(img)\n } else {\n image.hidden = true\n }\n const btn = document.createElement('button')\n btn.type = 'button'\n btn.className = 'imp-btn imp-poster__play'\n btn.setAttribute('aria-label', 'Play')\n btn.innerHTML = PLAY_SVG\n poster.append(image, btn)\n ph.append(poster)\n mount.append(ph)\n\n let resolveReady!: (p: Player) => void\n let rejectReady!: (e: unknown) => void\n const ready = new Promise<Player>((resolve, reject) => {\n resolveReady = resolve\n rejectReady = reject\n })\n // Consumers may ignore `ready` entirely — that must not crash the app.\n ready.catch(() => {})\n\n const api: LazyPlayer = {\n ready,\n player: null,\n el: ph,\n destroy() {\n destroyed = true\n cleanup()\n ph.remove()\n api.player?.destroy()\n },\n }\n\n let destroyed = false\n let loading = false\n const disposers: Array<() => void> = []\n const cleanup = () => {\n for (const dispose of disposers.splice(0)) dispose()\n }\n\n // Autoplay intent is accumulated, not tied to the call that started the\n // download: a poster click DURING an in-flight background load ('interaction'\n // trigger) must still start playback once the chunk arrives.\n let wantAutoplay = false\n const load = (autoplay: boolean) => {\n wantAutoplay ||= autoplay\n if (loading || destroyed) return\n loading = true\n cleanup()\n // The full entry (not ./player) so built-in locales arrive with the chunk.\n import('./index').then(\n ({ Player: PlayerCtor }) => {\n if (destroyed) return\n ph.remove()\n const player = new PlayerCtor(mount, wantAutoplay ? { ...playerOptions, autoplay: true } : playerOptions)\n api.player = player\n resolveReady(player)\n },\n (err) => {\n loading = false\n rejectReady(err)\n },\n )\n }\n\n // Click always wins: load + play. NOT in `disposers` — it must survive the\n // load-start cleanup so a click during an in-flight background load still\n // registers the autoplay intent (the listener dies with ph.remove()).\n ph.addEventListener('click', () => load(true))\n\n if (loadOn === 'immediate') {\n load(false)\n } else if (loadOn === 'visible' && typeof IntersectionObserver !== 'undefined') {\n const io = new IntersectionObserver((entries) => {\n if (entries.some((e) => e.isIntersecting)) load(false)\n })\n io.observe(ph)\n disposers.push(() => io.disconnect())\n } else {\n const onFirstInteraction = () => load(false)\n const events: Array<keyof DocumentEventMap> = ['pointerdown', 'keydown', 'touchstart', 'wheel']\n for (const name of events) {\n document.addEventListener(name, onFirstInteraction, { once: true, passive: true })\n disposers.push(() => document.removeEventListener(name, onFirstInteraction))\n }\n }\n\n return api\n}\n"],"names":["PLAY_SVG","createLazyPlayer","target","options","mount","loadOn","playerOptions","first","ph","poster","image","img","btn","resolveReady","rejectReady","ready","resolve","reject","api","destroyed","cleanup","loading","disposers","dispose","wantAutoplay","load","autoplay","PlayerCtor","player","err","io","entries","e","onFirstInteraction","events","name"],"mappings":"AA2CA,MAAMA,IACJ;AAEK,SAASC,EAAiBC,GAA8BC,IAA6B,IAAgB;AAC1G,QAAMC,IAAQ,OAAOF,KAAW,WAAW,SAAS,cAA2BA,CAAM,IAAIA;AACzF,MAAI,CAACE,EAAO,OAAM,IAAI,MAAM,0CAA0C,OAAOF,CAAM,CAAC,EAAE;AAEtF,QAAM,EAAE,QAAAG,IAAS,eAAe,GAAGC,MAAkBH,GAC/CI,IAAQ,MAAM,QAAQD,EAAc,MAAM,IAAIA,EAAc,OAAO,CAAC,IAAIA,EAAc,QAItFE,IAAK,SAAS,cAAc,KAAK;AACvC,EAAAA,EAAG,YAAY;AACf,QAAMC,IAAS,SAAS,cAAc,KAAK;AAC3C,EAAAA,EAAO,YAAY;AAGnB,QAAMC,IAAQ,SAAS,cAAc,KAAK;AAE1C,MADAA,EAAM,YAAY,qBACdH,GAAO,QAAQ;AACjB,UAAMI,IAAM,SAAS,cAAc,KAAK;AACxC,IAAAA,EAAI,YAAY,iBAChBA,EAAI,MAAM,IACVA,EAAI,WAAW,SACfA,EAAI,gBAAgB,QACpBA,EAAI,MAAMJ,EAAM,QAChBG,EAAM,OAAOC,CAAG;AAAA,EAClB;AACE,IAAAD,EAAM,SAAS;AAEjB,QAAME,IAAM,SAAS,cAAc,QAAQ;AAC3C,EAAAA,EAAI,OAAO,UACXA,EAAI,YAAY,4BAChBA,EAAI,aAAa,cAAc,MAAM,GACrCA,EAAI,YAAYZ,GAChBS,EAAO,OAAOC,GAAOE,CAAG,GACxBJ,EAAG,OAAOC,CAAM,GAChBL,EAAM,OAAOI,CAAE;AAEf,MAAIK,GACAC;AACJ,QAAMC,IAAQ,IAAI,QAAgB,CAACC,GAASC,MAAW;AACrD,IAAAJ,IAAeG,GACfF,IAAcG;AAAA,EAChB,CAAC;AAED,EAAAF,EAAM,MAAM,MAAM;AAAA,EAAC,CAAC;AAEpB,QAAMG,IAAkB;AAAA,IACtB,OAAAH;AAAA,IACA,QAAQ;AAAA,IACR,IAAIP;AAAA,IACJ,UAAU;AACR,MAAAW,IAAY,IACZC,EAAA,GACAZ,EAAG,OAAA,GACHU,EAAI,QAAQ,QAAA;AAAA,IACd;AAAA,EAAA;AAGF,MAAIC,IAAY,IACZE,IAAU;AACd,QAAMC,IAA+B,CAAA,GAC/BF,IAAU,MAAM;AACpB,eAAWG,KAAWD,EAAU,OAAO,CAAC,EAAG,CAAAC,EAAA;AAAA,EAC7C;AAKA,MAAIC,IAAe;AACnB,QAAMC,IAAO,CAACC,MAAsB;AAElC,IADAF,UAAiBE,IACb,EAAAL,KAAWF,OACfE,IAAU,IACVD,EAAA,GAEA,OAAO,YAAS,EAAE;AAAA,MAChB,CAAC,EAAE,QAAQO,QAAiB;AAC1B,YAAIR,EAAW;AACf,QAAAX,EAAG,OAAA;AACH,cAAMoB,IAAS,IAAID,EAAWvB,GAAOoB,IAAe,EAAE,GAAGlB,GAAe,UAAU,GAAA,IAASA,CAAa;AACxG,QAAAY,EAAI,SAASU,GACbf,EAAae,CAAM;AAAA,MACrB;AAAA,MACA,CAACC,MAAQ;AACP,QAAAR,IAAU,IACVP,EAAYe,CAAG;AAAA,MACjB;AAAA,IAAA;AAAA,EAEJ;AAOA,MAFArB,EAAG,iBAAiB,SAAS,MAAMiB,EAAK,EAAI,CAAC,GAEzCpB,MAAW;AACb,IAAAoB,EAAK,EAAK;AAAA,WACDpB,MAAW,aAAa,OAAO,uBAAyB,KAAa;AAC9E,UAAMyB,IAAK,IAAI,qBAAqB,CAACC,MAAY;AAC/C,MAAIA,EAAQ,KAAK,CAACC,MAAMA,EAAE,cAAc,OAAQ,EAAK;AAAA,IACvD,CAAC;AACD,IAAAF,EAAG,QAAQtB,CAAE,GACbc,EAAU,KAAK,MAAMQ,EAAG,WAAA,CAAY;AAAA,EACtC,OAAO;AACL,UAAMG,IAAqB,MAAMR,EAAK,EAAK,GACrCS,IAAwC,CAAC,eAAe,WAAW,cAAc,OAAO;AAC9F,eAAWC,KAAQD;AACjB,eAAS,iBAAiBC,GAAMF,GAAoB,EAAE,MAAM,IAAM,SAAS,IAAM,GACjFX,EAAU,KAAK,MAAM,SAAS,oBAAoBa,GAAMF,CAAkB,CAAC;AAAA,EAE/E;AAEA,SAAOf;AACT;"}
package/dist/locales.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./labels-ub9G1Vyq.cjs"),s={en:e.defaultLabels,ru:{play:"Воспроизвести",pause:"Пауза",replay:"Смотреть снова",mute:"Выключить звук",unmute:"Включить звук",fullscreen:"Во весь экран",exitFullscreen:"Выйти из полноэкранного режима",pip:"Картинка в картинке",settings:"Скорость воспроизведения",subtitles:"Субтитры",subtitlesOff:"Выкл.",speed:"Скорость",quality:"Качество",qualityAuto:"Авто",next:"Следующее",nextVideo:"Следующее видео",previous:"Предыдущее",playlist:"Плейлист",scenes:"Сцены",sceneTypes:"Тип сцен",autoplay:"Автовоспроизведение",playNext:"Играть дальше",shuffle:"Перемешать",repeat:"Повтор",like:"Нравится",dislike:"Не нравится",addTo:"Сохранить в…",share:"Поделиться",report:"Пожаловаться",more:"Ещё",seekForward:"Перемотать вперёд",seekBack:"Перемотать назад",secondsShort:"с",live:"В ЭФИРЕ",related:"Похожие видео",adLabel:"Реклама",skipAd:"Пропустить рекламу",skipAdIn:"Пропуск через",visitAdvertiser:"Перейти к рекламодателю",sponsored:"Спонсор"},de:{play:"Wiedergabe",pause:"Pause",replay:"Erneut abspielen",mute:"Stummschalten",unmute:"Ton einschalten",fullscreen:"Vollbild",exitFullscreen:"Vollbild beenden",pip:"Bild im Bild",settings:"Wiedergabegeschwindigkeit",subtitles:"Untertitel",subtitlesOff:"Aus",speed:"Geschwindigkeit",quality:"Qualität",qualityAuto:"Automatisch",next:"Weiter",nextVideo:"Nächstes Video",previous:"Zurück",playlist:"Playlist",scenes:"Szenen",sceneTypes:"Szenentyp",autoplay:"Autoplay",playNext:"Weiter abspielen",shuffle:"Zufallswiedergabe",repeat:"Wiederholen",like:"Mag ich",dislike:"Mag ich nicht",addTo:"Speichern in…",share:"Teilen",report:"Melden",more:"Weitere Aktionen",seekForward:"Vorspulen",seekBack:"Zurückspulen",secondsShort:"s",live:"LIVE",related:"Weitere Videos",adLabel:"Anzeige",skipAd:"Werbung überspringen",skipAdIn:"Überspringen in",visitAdvertiser:"Zum Werbetreibenden",sponsored:"Gesponsert"},es:{play:"Reproducir",pause:"Pausa",replay:"Volver a reproducir",mute:"Silenciar",unmute:"Activar sonido",fullscreen:"Pantalla completa",exitFullscreen:"Salir de pantalla completa",pip:"Imagen en imagen",settings:"Velocidad de reproducción",subtitles:"Subtítulos",subtitlesOff:"Desactivados",speed:"Velocidad",quality:"Calidad",qualityAuto:"Automática",next:"Siguiente",nextVideo:"Siguiente vídeo",previous:"Anterior",playlist:"Lista de reproducción",scenes:"Escenas",sceneTypes:"Tipo de escena",autoplay:"Reproducción automática",playNext:"Reproducir siguiente",shuffle:"Aleatorio",repeat:"Repetir",like:"Me gusta",dislike:"No me gusta",addTo:"Guardar en…",share:"Compartir",report:"Denunciar",more:"Más acciones",seekForward:"Avanzar",seekBack:"Retroceder",secondsShort:"s",live:"EN VIVO",related:"Más vídeos",adLabel:"Anuncio",skipAd:"Omitir anuncio",skipAdIn:"Omitir en",visitAdvertiser:"Visitar al anunciante",sponsored:"Patrocinado"},it:{play:"Riproduci",pause:"Pausa",replay:"Riproduci di nuovo",mute:"Disattiva audio",unmute:"Attiva audio",fullscreen:"Schermo intero",exitFullscreen:"Esci da schermo intero",pip:"Picture-in-picture",settings:"Velocità di riproduzione",subtitles:"Sottotitoli",subtitlesOff:"Disattivati",speed:"Velocità",quality:"Qualità",qualityAuto:"Automatica",next:"Successivo",nextVideo:"Prossimo video",previous:"Precedente",playlist:"Playlist",scenes:"Scene",sceneTypes:"Tipo di scena",autoplay:"Riproduzione automatica",playNext:"Riproduci successivo",shuffle:"Casuale",repeat:"Ripeti",like:"Mi piace",dislike:"Non mi piace",addTo:"Salva in…",share:"Condividi",report:"Segnala",more:"Altre azioni",seekForward:"Avanti veloce",seekBack:"Indietro",secondsShort:"s",live:"LIVE",related:"Altri video",adLabel:"Annuncio",skipAd:"Salta annuncio",skipAdIn:"Salta tra",visitAdvertiser:"Visita l'inserzionista",sponsored:"Sponsorizzato"},ja:{play:"再生",pause:"一時停止",replay:"もう一度見る",mute:"ミュート",unmute:"ミュート解除",fullscreen:"全画面",exitFullscreen:"全画面を終了",pip:"ピクチャーインピクチャー",settings:"再生速度",subtitles:"字幕",subtitlesOff:"オフ",speed:"速度",quality:"画質",qualityAuto:"自動",next:"次へ",nextVideo:"次の動画",previous:"前へ",playlist:"プレイリスト",scenes:"シーン",sceneTypes:"シーンタイプ",autoplay:"自動再生",playNext:"次を再生",shuffle:"シャッフル",repeat:"リピート",like:"高く評価",dislike:"低く評価",addTo:"保存…",share:"共有",report:"報告",more:"その他の操作",seekForward:"早送り",seekBack:"巻き戻し",secondsShort:"秒",live:"ライブ",related:"関連動画",adLabel:"広告",skipAd:"広告をスキップ",skipAdIn:"スキップまで",visitAdvertiser:"広告主のサイトへ",sponsored:"スポンサー"},ko:{play:"재생",pause:"일시정지",replay:"다시 보기",mute:"음소거",unmute:"음소거 해제",fullscreen:"전체화면",exitFullscreen:"전체화면 종료",pip:"PIP 모드",settings:"재생 속도",subtitles:"자막",subtitlesOff:"사용 안 함",speed:"속도",quality:"화질",qualityAuto:"자동",next:"다음",nextVideo:"다음 동영상",previous:"이전",playlist:"재생목록",scenes:"장면",sceneTypes:"장면 유형",autoplay:"자동 재생",playNext:"다음 재생",shuffle:"셔플",repeat:"반복",like:"좋아요",dislike:"싫어요",addTo:"저장…",share:"공유",report:"신고",more:"더보기",seekForward:"앞으로 감기",seekBack:"뒤로 감기",secondsShort:"초",live:"실시간",related:"관련 동영상",adLabel:"광고",skipAd:"광고 건너뛰기",skipAdIn:"건너뛰기까지",visitAdvertiser:"광고주 방문",sponsored:"스폰서"},zh:{play:"播放",pause:"暂停",replay:"重新播放",mute:"静音",unmute:"取消静音",fullscreen:"全屏",exitFullscreen:"退出全屏",pip:"画中画",settings:"播放速度",subtitles:"字幕",subtitlesOff:"关闭",speed:"速度",quality:"画质",qualityAuto:"自动",next:"下一个",nextVideo:"下一个视频",previous:"上一个",playlist:"播放列表",scenes:"场景",sceneTypes:"场景类型",autoplay:"自动播放",playNext:"播放下一个",shuffle:"随机播放",repeat:"循环播放",like:"赞",dislike:"踩",addTo:"保存到…",share:"分享",report:"举报",more:"更多操作",seekForward:"快进",seekBack:"快退",secondsShort:"秒",live:"直播",related:"更多视频",adLabel:"广告",skipAd:"跳过广告",skipAdIn:"可跳过",visitAdvertiser:"访问广告主",sponsored:"赞助"},pt:{play:"Reproduzir",pause:"Pausar",replay:"Assistir novamente",mute:"Sem som",unmute:"Ativar som",fullscreen:"Tela cheia",exitFullscreen:"Sair da tela cheia",pip:"Picture-in-picture",settings:"Velocidade de reprodução",subtitles:"Legendas",subtitlesOff:"Desativadas",speed:"Velocidade",quality:"Qualidade",qualityAuto:"Automática",next:"Próximo",nextVideo:"Próximo vídeo",previous:"Anterior",playlist:"Playlist",scenes:"Cenas",sceneTypes:"Tipo de cena",autoplay:"Reprodução automática",playNext:"Reproduzir próximo",shuffle:"Aleatório",repeat:"Repetir",like:"Gostei",dislike:"Não gostei",addTo:"Salvar em…",share:"Compartilhar",report:"Denunciar",more:"Mais ações",seekForward:"Avançar",seekBack:"Retroceder",secondsShort:"s",live:"AO VIVO",related:"Mais vídeos",adLabel:"Anúncio",skipAd:"Pular anúncio",skipAdIn:"Pular em",visitAdvertiser:"Visitar anunciante",sponsored:"Patrocinado"},ar:{play:"تشغيل",pause:"إيقاف مؤقت",replay:"إعادة التشغيل",mute:"كتم الصوت",unmute:"إلغاء كتم الصوت",fullscreen:"ملء الشاشة",exitFullscreen:"الخروج من ملء الشاشة",pip:"صورة داخل صورة",settings:"سرعة التشغيل",subtitles:"الترجمة",subtitlesOff:"إيقاف",speed:"السرعة",quality:"الجودة",qualityAuto:"تلقائي",next:"التالي",nextVideo:"الفيديو التالي",previous:"السابق",playlist:"قائمة التشغيل",scenes:"المشاهد",sceneTypes:"نوع المشهد",autoplay:"تشغيل تلقائي",playNext:"تشغيل التالي",shuffle:"تشغيل عشوائي",repeat:"تكرار",like:"أعجبني",dislike:"لم يعجبني",addTo:"حفظ في…",share:"مشاركة",report:"إبلاغ",more:"المزيد من الإجراءات",seekForward:"تقديم",seekBack:"إرجاع",secondsShort:"ث",live:"مباشر",related:"المزيد من الفيديوهات",adLabel:"إعلان",skipAd:"تخطي الإعلان",skipAdIn:"التخطي بعد",visitAdvertiser:"زيارة المعلن",sponsored:"برعاية"},hi:{play:"चलाएं",pause:"रोकें",replay:"फिर से चलाएं",mute:"म्यूट करें",unmute:"अनम्यूट करें",fullscreen:"फ़ुल स्क्रीन",exitFullscreen:"फ़ुल स्क्रीन से बाहर निकलें",pip:"पिक्चर-इन-पिक्चर",settings:"प्लेबैक गति",subtitles:"सबटाइटल",subtitlesOff:"बंद",speed:"गति",quality:"क्वालिटी",qualityAuto:"ऑटो",next:"अगला",nextVideo:"अगला वीडियो",previous:"पिछला",playlist:"प्लेलिस्ट",scenes:"दृश्य",sceneTypes:"सीन प्रकार",autoplay:"ऑटोप्ले",playNext:"अगला चलाएं",shuffle:"शफ़ल",repeat:"दोहराएं",like:"पसंद",dislike:"नापसंद",addTo:"इसमें सहेजें…",share:"साझा करें",report:"रिपोर्ट करें",more:"अधिक कार्रवाइयां",seekForward:"आगे बढ़ाएं",seekBack:"पीछे करें",secondsShort:"s",live:"लाइव",related:"और वीडियो",adLabel:"विज्ञापन",skipAd:"विज्ञापन छोड़ें",skipAdIn:"छोड़ें",visitAdvertiser:"विज्ञापनदाता देखें",sponsored:"प्रायोजित"}},i=Object.keys(s);exports.defaultLabels=e.defaultLabels;exports.locales=s;exports.supportedLanguages=i;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./labels-BOrrLImF.cjs"),s={en:e.defaultLabels,ru:{play:"Воспроизвести",pause:"Пауза",replay:"Смотреть снова",mute:"Выключить звук",unmute:"Включить звук",fullscreen:"Во весь экран",exitFullscreen:"Выйти из полноэкранного режима",pip:"Картинка в картинке",settings:"Скорость воспроизведения",subtitles:"Субтитры",subtitlesOff:"Выкл.",speed:"Скорость",quality:"Качество",qualityAuto:"Авто",next:"Следующее",nextVideo:"Следующее видео",previous:"Предыдущее",playlist:"Плейлист",scenes:"Сцены",sceneTypes:"Тип сцен",autoplay:"Автовоспроизведение",playNext:"Играть дальше",shuffle:"Перемешать",repeat:"Повтор",like:"Нравится",dislike:"Не нравится",addTo:"Сохранить в…",share:"Поделиться",report:"Пожаловаться",more:"Ещё",seekForward:"Перемотать вперёд",seekBack:"Перемотать назад",secondsShort:"с",live:"В ЭФИРЕ",related:"Похожие видео",adLabel:"Реклама",skipAd:"Пропустить рекламу",skipAdIn:"Пропуск через",visitAdvertiser:"Перейти к рекламодателю",sponsored:"Спонсор",videoNotFound:"Видео не найдено или повреждено",tryAgain:"Попробовать снова",speedNormal:"Обычная",volume:"Громкость",seek:"Перемотка",close:"Закрыть"},de:{play:"Wiedergabe",pause:"Pause",replay:"Erneut abspielen",mute:"Stummschalten",unmute:"Ton einschalten",fullscreen:"Vollbild",exitFullscreen:"Vollbild beenden",pip:"Bild im Bild",settings:"Wiedergabegeschwindigkeit",subtitles:"Untertitel",subtitlesOff:"Aus",speed:"Geschwindigkeit",quality:"Qualität",qualityAuto:"Automatisch",next:"Weiter",nextVideo:"Nächstes Video",previous:"Zurück",playlist:"Playlist",scenes:"Szenen",sceneTypes:"Szenentyp",autoplay:"Autoplay",playNext:"Weiter abspielen",shuffle:"Zufallswiedergabe",repeat:"Wiederholen",like:"Mag ich",dislike:"Mag ich nicht",addTo:"Speichern in…",share:"Teilen",report:"Melden",more:"Weitere Aktionen",seekForward:"Vorspulen",seekBack:"Zurückspulen",secondsShort:"s",live:"LIVE",related:"Weitere Videos",adLabel:"Anzeige",skipAd:"Werbung überspringen",skipAdIn:"Überspringen in",visitAdvertiser:"Zum Werbetreibenden",sponsored:"Gesponsert",videoNotFound:"Video nicht gefunden oder beschädigt",tryAgain:"Erneut versuchen",speedNormal:"Normal",volume:"Lautstärke",seek:"Spulen",close:"Schließen"},es:{play:"Reproducir",pause:"Pausa",replay:"Volver a reproducir",mute:"Silenciar",unmute:"Activar sonido",fullscreen:"Pantalla completa",exitFullscreen:"Salir de pantalla completa",pip:"Imagen en imagen",settings:"Velocidad de reproducción",subtitles:"Subtítulos",subtitlesOff:"Desactivados",speed:"Velocidad",quality:"Calidad",qualityAuto:"Automática",next:"Siguiente",nextVideo:"Siguiente vídeo",previous:"Anterior",playlist:"Lista de reproducción",scenes:"Escenas",sceneTypes:"Tipo de escena",autoplay:"Reproducción automática",playNext:"Reproducir siguiente",shuffle:"Aleatorio",repeat:"Repetir",like:"Me gusta",dislike:"No me gusta",addTo:"Guardar en…",share:"Compartir",report:"Denunciar",more:"Más acciones",seekForward:"Avanzar",seekBack:"Retroceder",secondsShort:"s",live:"EN VIVO",related:"Más vídeos",adLabel:"Anuncio",skipAd:"Omitir anuncio",skipAdIn:"Omitir en",visitAdvertiser:"Visitar al anunciante",sponsored:"Patrocinado",videoNotFound:"Vídeo no encontrado o dañado",tryAgain:"Intentar de nuevo",speedNormal:"Normal",volume:"Volumen",seek:"Buscar",close:"Cerrar"},it:{play:"Riproduci",pause:"Pausa",replay:"Riproduci di nuovo",mute:"Disattiva audio",unmute:"Attiva audio",fullscreen:"Schermo intero",exitFullscreen:"Esci da schermo intero",pip:"Picture-in-picture",settings:"Velocità di riproduzione",subtitles:"Sottotitoli",subtitlesOff:"Disattivati",speed:"Velocità",quality:"Qualità",qualityAuto:"Automatica",next:"Successivo",nextVideo:"Prossimo video",previous:"Precedente",playlist:"Playlist",scenes:"Scene",sceneTypes:"Tipo di scena",autoplay:"Riproduzione automatica",playNext:"Riproduci successivo",shuffle:"Casuale",repeat:"Ripeti",like:"Mi piace",dislike:"Non mi piace",addTo:"Salva in…",share:"Condividi",report:"Segnala",more:"Altre azioni",seekForward:"Avanti veloce",seekBack:"Indietro",secondsShort:"s",live:"LIVE",related:"Altri video",adLabel:"Annuncio",skipAd:"Salta annuncio",skipAdIn:"Salta tra",visitAdvertiser:"Visita l'inserzionista",sponsored:"Sponsorizzato",videoNotFound:"Video non trovato o danneggiato",tryAgain:"Riprova",speedNormal:"Normale",volume:"Volume",seek:"Avanzamento",close:"Chiudi"},ja:{play:"再生",pause:"一時停止",replay:"もう一度見る",mute:"ミュート",unmute:"ミュート解除",fullscreen:"全画面",exitFullscreen:"全画面を終了",pip:"ピクチャーインピクチャー",settings:"再生速度",subtitles:"字幕",subtitlesOff:"オフ",speed:"速度",quality:"画質",qualityAuto:"自動",next:"次へ",nextVideo:"次の動画",previous:"前へ",playlist:"プレイリスト",scenes:"シーン",sceneTypes:"シーンタイプ",autoplay:"自動再生",playNext:"次を再生",shuffle:"シャッフル",repeat:"リピート",like:"高く評価",dislike:"低く評価",addTo:"保存…",share:"共有",report:"報告",more:"その他の操作",seekForward:"早送り",seekBack:"巻き戻し",secondsShort:"秒",live:"ライブ",related:"関連動画",adLabel:"広告",skipAd:"広告をスキップ",skipAdIn:"スキップまで",visitAdvertiser:"広告主のサイトへ",sponsored:"スポンサー",videoNotFound:"動画が見つからないか破損しています",tryAgain:"もう一度試す",speedNormal:"標準",volume:"音量",seek:"シーク",close:"閉じる"},ko:{play:"재생",pause:"일시정지",replay:"다시 보기",mute:"음소거",unmute:"음소거 해제",fullscreen:"전체화면",exitFullscreen:"전체화면 종료",pip:"PIP 모드",settings:"재생 속도",subtitles:"자막",subtitlesOff:"사용 안 함",speed:"속도",quality:"화질",qualityAuto:"자동",next:"다음",nextVideo:"다음 동영상",previous:"이전",playlist:"재생목록",scenes:"장면",sceneTypes:"장면 유형",autoplay:"자동 재생",playNext:"다음 재생",shuffle:"셔플",repeat:"반복",like:"좋아요",dislike:"싫어요",addTo:"저장…",share:"공유",report:"신고",more:"더보기",seekForward:"앞으로 감기",seekBack:"뒤로 감기",secondsShort:"초",live:"실시간",related:"관련 동영상",adLabel:"광고",skipAd:"광고 건너뛰기",skipAdIn:"건너뛰기까지",visitAdvertiser:"광고주 방문",sponsored:"스폰서",videoNotFound:"동영상을 찾을 수 없거나 손상되었습니다",tryAgain:"다시 시도",speedNormal:"보통",volume:"볼륨",seek:"탐색",close:"닫기"},zh:{play:"播放",pause:"暂停",replay:"重新播放",mute:"静音",unmute:"取消静音",fullscreen:"全屏",exitFullscreen:"退出全屏",pip:"画中画",settings:"播放速度",subtitles:"字幕",subtitlesOff:"关闭",speed:"速度",quality:"画质",qualityAuto:"自动",next:"下一个",nextVideo:"下一个视频",previous:"上一个",playlist:"播放列表",scenes:"场景",sceneTypes:"场景类型",autoplay:"自动播放",playNext:"播放下一个",shuffle:"随机播放",repeat:"循环播放",like:"赞",dislike:"踩",addTo:"保存到…",share:"分享",report:"举报",more:"更多操作",seekForward:"快进",seekBack:"快退",secondsShort:"秒",live:"直播",related:"更多视频",adLabel:"广告",skipAd:"跳过广告",skipAdIn:"可跳过",visitAdvertiser:"访问广告主",sponsored:"赞助",videoNotFound:"未找到视频或视频已损坏",tryAgain:"重试",speedNormal:"正常",volume:"音量",seek:"进度",close:"关闭"},pt:{play:"Reproduzir",pause:"Pausar",replay:"Assistir novamente",mute:"Sem som",unmute:"Ativar som",fullscreen:"Tela cheia",exitFullscreen:"Sair da tela cheia",pip:"Picture-in-picture",settings:"Velocidade de reprodução",subtitles:"Legendas",subtitlesOff:"Desativadas",speed:"Velocidade",quality:"Qualidade",qualityAuto:"Automática",next:"Próximo",nextVideo:"Próximo vídeo",previous:"Anterior",playlist:"Playlist",scenes:"Cenas",sceneTypes:"Tipo de cena",autoplay:"Reprodução automática",playNext:"Reproduzir próximo",shuffle:"Aleatório",repeat:"Repetir",like:"Gostei",dislike:"Não gostei",addTo:"Salvar em…",share:"Compartilhar",report:"Denunciar",more:"Mais ações",seekForward:"Avançar",seekBack:"Retroceder",secondsShort:"s",live:"AO VIVO",related:"Mais vídeos",adLabel:"Anúncio",skipAd:"Pular anúncio",skipAdIn:"Pular em",visitAdvertiser:"Visitar anunciante",sponsored:"Patrocinado",videoNotFound:"Vídeo não encontrado ou danificado",tryAgain:"Tentar novamente",speedNormal:"Normal",volume:"Volume",seek:"Progresso",close:"Fechar"},ar:{play:"تشغيل",pause:"إيقاف مؤقت",replay:"إعادة التشغيل",mute:"كتم الصوت",unmute:"إلغاء كتم الصوت",fullscreen:"ملء الشاشة",exitFullscreen:"الخروج من ملء الشاشة",pip:"صورة داخل صورة",settings:"سرعة التشغيل",subtitles:"الترجمة",subtitlesOff:"إيقاف",speed:"السرعة",quality:"الجودة",qualityAuto:"تلقائي",next:"التالي",nextVideo:"الفيديو التالي",previous:"السابق",playlist:"قائمة التشغيل",scenes:"المشاهد",sceneTypes:"نوع المشهد",autoplay:"تشغيل تلقائي",playNext:"تشغيل التالي",shuffle:"تشغيل عشوائي",repeat:"تكرار",like:"أعجبني",dislike:"لم يعجبني",addTo:"حفظ في…",share:"مشاركة",report:"إبلاغ",more:"المزيد من الإجراءات",seekForward:"تقديم",seekBack:"إرجاع",secondsShort:"ث",live:"مباشر",related:"المزيد من الفيديوهات",adLabel:"إعلان",skipAd:"تخطي الإعلان",skipAdIn:"التخطي بعد",visitAdvertiser:"زيارة المعلن",sponsored:"برعاية",videoNotFound:"الفيديو غير موجود أو تالف",tryAgain:"حاول مرة أخرى",speedNormal:"عادي",volume:"مستوى الصوت",seek:"التقدم",close:"إغلاق"},hi:{play:"चलाएं",pause:"रोकें",replay:"फिर से चलाएं",mute:"म्यूट करें",unmute:"अनम्यूट करें",fullscreen:"फ़ुल स्क्रीन",exitFullscreen:"फ़ुल स्क्रीन से बाहर निकलें",pip:"पिक्चर-इन-पिक्चर",settings:"प्लेबैक गति",subtitles:"सबटाइटल",subtitlesOff:"बंद",speed:"गति",quality:"क्वालिटी",qualityAuto:"ऑटो",next:"अगला",nextVideo:"अगला वीडियो",previous:"पिछला",playlist:"प्लेलिस्ट",scenes:"दृश्य",sceneTypes:"सीन प्रकार",autoplay:"ऑटोप्ले",playNext:"अगला चलाएं",shuffle:"शफ़ल",repeat:"दोहराएं",like:"पसंद",dislike:"नापसंद",addTo:"इसमें सहेजें…",share:"साझा करें",report:"रिपोर्ट करें",more:"अधिक कार्रवाइयां",seekForward:"आगे बढ़ाएं",seekBack:"पीछे करें",secondsShort:"s",live:"लाइव",related:"और वीडियो",adLabel:"विज्ञापन",skipAd:"विज्ञापन छोड़ें",skipAdIn:"छोड़ें",visitAdvertiser:"विज्ञापनदाता देखें",sponsored:"प्रायोजित",videoNotFound:"वीडियो नहीं मिला या क्षतिग्रस्त है",tryAgain:"पुनः प्रयास करें",speedNormal:"सामान्य",volume:"वॉल्यूम",seek:"सीक",close:"बंद करें"}},i=Object.keys(s);exports.defaultLabels=e.defaultLabels;exports.locales=s;exports.supportedLanguages=i;
2
2
  //# sourceMappingURL=locales.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"locales.cjs","sources":["../src/core/locales.ts"],"sourcesContent":["import type { LocaleCode, PlayerLabels } from '../types'\nimport { defaultLabels } from './labels'\n\n/**\n * Built-in static locales. Pick one with `options.language`; any individual\n * string can still be overridden via `options.labels`.\n *\n * The canonical term list is the `PlayerLabels` interface — `defaultLabels`\n * (English) is exported as the reference dictionary for translators.\n */\nexport const locales: Record<LocaleCode, PlayerLabels> = {\n en: defaultLabels,\n\n ru: {\n play: 'Воспроизвести',\n pause: 'Пауза',\n replay: 'Смотреть снова',\n mute: 'Выключить звук',\n unmute: 'Включить звук',\n fullscreen: 'Во весь экран',\n exitFullscreen: 'Выйти из полноэкранного режима',\n pip: 'Картинка в картинке',\n settings: 'Скорость воспроизведения',\n subtitles: 'Субтитры',\n subtitlesOff: 'Выкл.',\n speed: 'Скорость',\n quality: 'Качество',\n qualityAuto: 'Авто',\n next: 'Следующее',\n nextVideo: 'Следующее видео',\n previous: 'Предыдущее',\n playlist: 'Плейлист',\n scenes: 'Сцены',\n sceneTypes: 'Тип сцен',\n autoplay: 'Автовоспроизведение',\n playNext: 'Играть дальше',\n shuffle: 'Перемешать',\n repeat: 'Повтор',\n like: 'Нравится',\n dislike: 'Не нравится',\n addTo: 'Сохранить в…',\n share: 'Поделиться',\n report: 'Пожаловаться',\n more: 'Ещё',\n seekForward: 'Перемотать вперёд',\n seekBack: 'Перемотать назад',\n secondsShort: 'с',\n live: 'В ЭФИРЕ',\n related: 'Похожие видео',\n adLabel: 'Реклама',\n skipAd: 'Пропустить рекламу',\n skipAdIn: 'Пропуск через',\n visitAdvertiser: 'Перейти к рекламодателю',\n sponsored: 'Спонсор',\n },\n\n de: {\n play: 'Wiedergabe',\n pause: 'Pause',\n replay: 'Erneut abspielen',\n mute: 'Stummschalten',\n unmute: 'Ton einschalten',\n fullscreen: 'Vollbild',\n exitFullscreen: 'Vollbild beenden',\n pip: 'Bild im Bild',\n settings: 'Wiedergabegeschwindigkeit',\n subtitles: 'Untertitel',\n subtitlesOff: 'Aus',\n speed: 'Geschwindigkeit',\n quality: 'Qualität',\n qualityAuto: 'Automatisch',\n next: 'Weiter',\n nextVideo: 'Nächstes Video',\n previous: 'Zurück',\n playlist: 'Playlist',\n scenes: 'Szenen',\n sceneTypes: 'Szenentyp',\n autoplay: 'Autoplay',\n playNext: 'Weiter abspielen',\n shuffle: 'Zufallswiedergabe',\n repeat: 'Wiederholen',\n like: 'Mag ich',\n dislike: 'Mag ich nicht',\n addTo: 'Speichern in…',\n share: 'Teilen',\n report: 'Melden',\n more: 'Weitere Aktionen',\n seekForward: 'Vorspulen',\n seekBack: 'Zurückspulen',\n secondsShort: 's',\n live: 'LIVE',\n related: 'Weitere Videos',\n adLabel: 'Anzeige',\n skipAd: 'Werbung überspringen',\n skipAdIn: 'Überspringen in',\n visitAdvertiser: 'Zum Werbetreibenden',\n sponsored: 'Gesponsert',\n },\n\n es: {\n play: 'Reproducir',\n pause: 'Pausa',\n replay: 'Volver a reproducir',\n mute: 'Silenciar',\n unmute: 'Activar sonido',\n fullscreen: 'Pantalla completa',\n exitFullscreen: 'Salir de pantalla completa',\n pip: 'Imagen en imagen',\n settings: 'Velocidad de reproducción',\n subtitles: 'Subtítulos',\n subtitlesOff: 'Desactivados',\n speed: 'Velocidad',\n quality: 'Calidad',\n qualityAuto: 'Automática',\n next: 'Siguiente',\n nextVideo: 'Siguiente vídeo',\n previous: 'Anterior',\n playlist: 'Lista de reproducción',\n scenes: 'Escenas',\n sceneTypes: 'Tipo de escena',\n autoplay: 'Reproducción automática',\n playNext: 'Reproducir siguiente',\n shuffle: 'Aleatorio',\n repeat: 'Repetir',\n like: 'Me gusta',\n dislike: 'No me gusta',\n addTo: 'Guardar en…',\n share: 'Compartir',\n report: 'Denunciar',\n more: 'Más acciones',\n seekForward: 'Avanzar',\n seekBack: 'Retroceder',\n secondsShort: 's',\n live: 'EN VIVO',\n related: 'Más vídeos',\n adLabel: 'Anuncio',\n skipAd: 'Omitir anuncio',\n skipAdIn: 'Omitir en',\n visitAdvertiser: 'Visitar al anunciante',\n sponsored: 'Patrocinado',\n },\n\n it: {\n play: 'Riproduci',\n pause: 'Pausa',\n replay: 'Riproduci di nuovo',\n mute: 'Disattiva audio',\n unmute: 'Attiva audio',\n fullscreen: 'Schermo intero',\n exitFullscreen: 'Esci da schermo intero',\n pip: 'Picture-in-picture',\n settings: 'Velocità di riproduzione',\n subtitles: 'Sottotitoli',\n subtitlesOff: 'Disattivati',\n speed: 'Velocità',\n quality: 'Qualità',\n qualityAuto: 'Automatica',\n next: 'Successivo',\n nextVideo: 'Prossimo video',\n previous: 'Precedente',\n playlist: 'Playlist',\n scenes: 'Scene',\n sceneTypes: 'Tipo di scena',\n autoplay: 'Riproduzione automatica',\n playNext: 'Riproduci successivo',\n shuffle: 'Casuale',\n repeat: 'Ripeti',\n like: 'Mi piace',\n dislike: 'Non mi piace',\n addTo: 'Salva in…',\n share: 'Condividi',\n report: 'Segnala',\n more: 'Altre azioni',\n seekForward: 'Avanti veloce',\n seekBack: 'Indietro',\n secondsShort: 's',\n live: 'LIVE',\n related: 'Altri video',\n adLabel: 'Annuncio',\n skipAd: 'Salta annuncio',\n skipAdIn: 'Salta tra',\n visitAdvertiser: \"Visita l'inserzionista\",\n sponsored: 'Sponsorizzato',\n },\n\n ja: {\n play: '再生',\n pause: '一時停止',\n replay: 'もう一度見る',\n mute: 'ミュート',\n unmute: 'ミュート解除',\n fullscreen: '全画面',\n exitFullscreen: '全画面を終了',\n pip: 'ピクチャーインピクチャー',\n settings: '再生速度',\n subtitles: '字幕',\n subtitlesOff: 'オフ',\n speed: '速度',\n quality: '画質',\n qualityAuto: '自動',\n next: '次へ',\n nextVideo: '次の動画',\n previous: '前へ',\n playlist: 'プレイリスト',\n scenes: 'シーン',\n sceneTypes: 'シーンタイプ',\n autoplay: '自動再生',\n playNext: '次を再生',\n shuffle: 'シャッフル',\n repeat: 'リピート',\n like: '高く評価',\n dislike: '低く評価',\n addTo: '保存…',\n share: '共有',\n report: '報告',\n more: 'その他の操作',\n seekForward: '早送り',\n seekBack: '巻き戻し',\n secondsShort: '秒',\n live: 'ライブ',\n related: '関連動画',\n adLabel: '広告',\n skipAd: '広告をスキップ',\n skipAdIn: 'スキップまで',\n visitAdvertiser: '広告主のサイトへ',\n sponsored: 'スポンサー',\n },\n\n ko: {\n play: '재생',\n pause: '일시정지',\n replay: '다시 보기',\n mute: '음소거',\n unmute: '음소거 해제',\n fullscreen: '전체화면',\n exitFullscreen: '전체화면 종료',\n pip: 'PIP 모드',\n settings: '재생 속도',\n subtitles: '자막',\n subtitlesOff: '사용 안 함',\n speed: '속도',\n quality: '화질',\n qualityAuto: '자동',\n next: '다음',\n nextVideo: '다음 동영상',\n previous: '이전',\n playlist: '재생목록',\n scenes: '장면',\n sceneTypes: '장면 유형',\n autoplay: '자동 재생',\n playNext: '다음 재생',\n shuffle: '셔플',\n repeat: '반복',\n like: '좋아요',\n dislike: '싫어요',\n addTo: '저장…',\n share: '공유',\n report: '신고',\n more: '더보기',\n seekForward: '앞으로 감기',\n seekBack: '뒤로 감기',\n secondsShort: '초',\n live: '실시간',\n related: '관련 동영상',\n adLabel: '광고',\n skipAd: '광고 건너뛰기',\n skipAdIn: '건너뛰기까지',\n visitAdvertiser: '광고주 방문',\n sponsored: '스폰서',\n },\n\n zh: {\n play: '播放',\n pause: '暂停',\n replay: '重新播放',\n mute: '静音',\n unmute: '取消静音',\n fullscreen: '全屏',\n exitFullscreen: '退出全屏',\n pip: '画中画',\n settings: '播放速度',\n subtitles: '字幕',\n subtitlesOff: '关闭',\n speed: '速度',\n quality: '画质',\n qualityAuto: '自动',\n next: '下一个',\n nextVideo: '下一个视频',\n previous: '上一个',\n playlist: '播放列表',\n scenes: '场景',\n sceneTypes: '场景类型',\n autoplay: '自动播放',\n playNext: '播放下一个',\n shuffle: '随机播放',\n repeat: '循环播放',\n like: '赞',\n dislike: '踩',\n addTo: '保存到…',\n share: '分享',\n report: '举报',\n more: '更多操作',\n seekForward: '快进',\n seekBack: '快退',\n secondsShort: '秒',\n live: '直播',\n related: '更多视频',\n adLabel: '广告',\n skipAd: '跳过广告',\n skipAdIn: '可跳过',\n visitAdvertiser: '访问广告主',\n sponsored: '赞助',\n },\n\n pt: {\n play: 'Reproduzir',\n pause: 'Pausar',\n replay: 'Assistir novamente',\n mute: 'Sem som',\n unmute: 'Ativar som',\n fullscreen: 'Tela cheia',\n exitFullscreen: 'Sair da tela cheia',\n pip: 'Picture-in-picture',\n settings: 'Velocidade de reprodução',\n subtitles: 'Legendas',\n subtitlesOff: 'Desativadas',\n speed: 'Velocidade',\n quality: 'Qualidade',\n qualityAuto: 'Automática',\n next: 'Próximo',\n nextVideo: 'Próximo vídeo',\n previous: 'Anterior',\n playlist: 'Playlist',\n scenes: 'Cenas',\n sceneTypes: 'Tipo de cena',\n autoplay: 'Reprodução automática',\n playNext: 'Reproduzir próximo',\n shuffle: 'Aleatório',\n repeat: 'Repetir',\n like: 'Gostei',\n dislike: 'Não gostei',\n addTo: 'Salvar em…',\n share: 'Compartilhar',\n report: 'Denunciar',\n more: 'Mais ações',\n seekForward: 'Avançar',\n seekBack: 'Retroceder',\n secondsShort: 's',\n live: 'AO VIVO',\n related: 'Mais vídeos',\n adLabel: 'Anúncio',\n skipAd: 'Pular anúncio',\n skipAdIn: 'Pular em',\n visitAdvertiser: 'Visitar anunciante',\n sponsored: 'Patrocinado',\n },\n\n ar: {\n play: 'تشغيل',\n pause: 'إيقاف مؤقت',\n replay: 'إعادة التشغيل',\n mute: 'كتم الصوت',\n unmute: 'إلغاء كتم الصوت',\n fullscreen: 'ملء الشاشة',\n exitFullscreen: 'الخروج من ملء الشاشة',\n pip: 'صورة داخل صورة',\n settings: 'سرعة التشغيل',\n subtitles: 'الترجمة',\n subtitlesOff: 'إيقاف',\n speed: 'السرعة',\n quality: 'الجودة',\n qualityAuto: 'تلقائي',\n next: 'التالي',\n nextVideo: 'الفيديو التالي',\n previous: 'السابق',\n playlist: 'قائمة التشغيل',\n scenes: 'المشاهد',\n sceneTypes: 'نوع المشهد',\n autoplay: 'تشغيل تلقائي',\n playNext: 'تشغيل التالي',\n shuffle: 'تشغيل عشوائي',\n repeat: 'تكرار',\n like: 'أعجبني',\n dislike: 'لم يعجبني',\n addTo: 'حفظ في…',\n share: 'مشاركة',\n report: 'إبلاغ',\n more: 'المزيد من الإجراءات',\n seekForward: 'تقديم',\n seekBack: 'إرجاع',\n secondsShort: 'ث',\n live: 'مباشر',\n related: 'المزيد من الفيديوهات',\n adLabel: 'إعلان',\n skipAd: 'تخطي الإعلان',\n skipAdIn: 'التخطي بعد',\n visitAdvertiser: 'زيارة المعلن',\n sponsored: 'برعاية',\n },\n\n hi: {\n play: 'चलाएं',\n pause: 'रोकें',\n replay: 'फिर से चलाएं',\n mute: 'म्यूट करें',\n unmute: 'अनम्यूट करें',\n fullscreen: 'फ़ुल स्क्रीन',\n exitFullscreen: 'फ़ुल स्क्रीन से बाहर निकलें',\n pip: 'पिक्चर-इन-पिक्चर',\n settings: 'प्लेबैक गति',\n subtitles: 'सबटाइटल',\n subtitlesOff: 'बंद',\n speed: 'गति',\n quality: 'क्वालिटी',\n qualityAuto: 'ऑटो',\n next: 'अगला',\n nextVideo: 'अगला वीडियो',\n previous: 'पिछला',\n playlist: 'प्लेलिस्ट',\n scenes: 'दृश्य',\n sceneTypes: 'सीन प्रकार',\n autoplay: 'ऑटोप्ले',\n playNext: 'अगला चलाएं',\n shuffle: 'शफ़ल',\n repeat: 'दोहराएं',\n like: 'पसंद',\n dislike: 'नापसंद',\n addTo: 'इसमें सहेजें…',\n share: 'साझा करें',\n report: 'रिपोर्ट करें',\n more: 'अधिक कार्रवाइयां',\n seekForward: 'आगे बढ़ाएं',\n seekBack: 'पीछे करें',\n secondsShort: 's',\n live: 'लाइव',\n related: 'और वीडियो',\n adLabel: 'विज्ञापन',\n skipAd: 'विज्ञापन छोड़ें',\n skipAdIn: 'छोड़ें',\n visitAdvertiser: 'विज्ञापनदाता देखें',\n sponsored: 'प्रायोजित',\n },\n}\n\n/** Codes of all built-in locales. */\nexport const supportedLanguages = Object.keys(locales) as LocaleCode[]\n"],"names":["locales","defaultLabels","supportedLanguages"],"mappings":"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"}
1
+ {"version":3,"file":"locales.cjs","sources":["../src/core/locales.ts"],"sourcesContent":["import type { LocaleCode, PlayerLabels } from '../types'\nimport { defaultLabels } from './labels'\n\n/**\n * Built-in static locales. Pick one with `options.language`; any individual\n * string can still be overridden via `options.labels`.\n *\n * The canonical term list is the `PlayerLabels` interface — `defaultLabels`\n * (English) is exported as the reference dictionary for translators.\n */\nexport const locales: Record<LocaleCode, PlayerLabels> = {\n en: defaultLabels,\n\n ru: {\n play: 'Воспроизвести',\n pause: 'Пауза',\n replay: 'Смотреть снова',\n mute: 'Выключить звук',\n unmute: 'Включить звук',\n fullscreen: 'Во весь экран',\n exitFullscreen: 'Выйти из полноэкранного режима',\n pip: 'Картинка в картинке',\n settings: 'Скорость воспроизведения',\n subtitles: 'Субтитры',\n subtitlesOff: 'Выкл.',\n speed: 'Скорость',\n quality: 'Качество',\n qualityAuto: 'Авто',\n next: 'Следующее',\n nextVideo: 'Следующее видео',\n previous: 'Предыдущее',\n playlist: 'Плейлист',\n scenes: 'Сцены',\n sceneTypes: 'Тип сцен',\n autoplay: 'Автовоспроизведение',\n playNext: 'Играть дальше',\n shuffle: 'Перемешать',\n repeat: 'Повтор',\n like: 'Нравится',\n dislike: 'Не нравится',\n addTo: 'Сохранить в…',\n share: 'Поделиться',\n report: 'Пожаловаться',\n more: 'Ещё',\n seekForward: 'Перемотать вперёд',\n seekBack: 'Перемотать назад',\n secondsShort: 'с',\n live: 'В ЭФИРЕ',\n related: 'Похожие видео',\n adLabel: 'Реклама',\n skipAd: 'Пропустить рекламу',\n skipAdIn: 'Пропуск через',\n visitAdvertiser: 'Перейти к рекламодателю',\n sponsored: 'Спонсор',\n videoNotFound: 'Видео не найдено или повреждено',\n tryAgain: 'Попробовать снова',\n speedNormal: 'Обычная',\n volume: 'Громкость',\n seek: 'Перемотка',\n close: 'Закрыть',\n },\n\n de: {\n play: 'Wiedergabe',\n pause: 'Pause',\n replay: 'Erneut abspielen',\n mute: 'Stummschalten',\n unmute: 'Ton einschalten',\n fullscreen: 'Vollbild',\n exitFullscreen: 'Vollbild beenden',\n pip: 'Bild im Bild',\n settings: 'Wiedergabegeschwindigkeit',\n subtitles: 'Untertitel',\n subtitlesOff: 'Aus',\n speed: 'Geschwindigkeit',\n quality: 'Qualität',\n qualityAuto: 'Automatisch',\n next: 'Weiter',\n nextVideo: 'Nächstes Video',\n previous: 'Zurück',\n playlist: 'Playlist',\n scenes: 'Szenen',\n sceneTypes: 'Szenentyp',\n autoplay: 'Autoplay',\n playNext: 'Weiter abspielen',\n shuffle: 'Zufallswiedergabe',\n repeat: 'Wiederholen',\n like: 'Mag ich',\n dislike: 'Mag ich nicht',\n addTo: 'Speichern in…',\n share: 'Teilen',\n report: 'Melden',\n more: 'Weitere Aktionen',\n seekForward: 'Vorspulen',\n seekBack: 'Zurückspulen',\n secondsShort: 's',\n live: 'LIVE',\n related: 'Weitere Videos',\n adLabel: 'Anzeige',\n skipAd: 'Werbung überspringen',\n skipAdIn: 'Überspringen in',\n visitAdvertiser: 'Zum Werbetreibenden',\n sponsored: 'Gesponsert',\n videoNotFound: 'Video nicht gefunden oder beschädigt',\n tryAgain: 'Erneut versuchen',\n speedNormal: 'Normal',\n volume: 'Lautstärke',\n seek: 'Spulen',\n close: 'Schließen',\n },\n\n es: {\n play: 'Reproducir',\n pause: 'Pausa',\n replay: 'Volver a reproducir',\n mute: 'Silenciar',\n unmute: 'Activar sonido',\n fullscreen: 'Pantalla completa',\n exitFullscreen: 'Salir de pantalla completa',\n pip: 'Imagen en imagen',\n settings: 'Velocidad de reproducción',\n subtitles: 'Subtítulos',\n subtitlesOff: 'Desactivados',\n speed: 'Velocidad',\n quality: 'Calidad',\n qualityAuto: 'Automática',\n next: 'Siguiente',\n nextVideo: 'Siguiente vídeo',\n previous: 'Anterior',\n playlist: 'Lista de reproducción',\n scenes: 'Escenas',\n sceneTypes: 'Tipo de escena',\n autoplay: 'Reproducción automática',\n playNext: 'Reproducir siguiente',\n shuffle: 'Aleatorio',\n repeat: 'Repetir',\n like: 'Me gusta',\n dislike: 'No me gusta',\n addTo: 'Guardar en…',\n share: 'Compartir',\n report: 'Denunciar',\n more: 'Más acciones',\n seekForward: 'Avanzar',\n seekBack: 'Retroceder',\n secondsShort: 's',\n live: 'EN VIVO',\n related: 'Más vídeos',\n adLabel: 'Anuncio',\n skipAd: 'Omitir anuncio',\n skipAdIn: 'Omitir en',\n visitAdvertiser: 'Visitar al anunciante',\n sponsored: 'Patrocinado',\n videoNotFound: 'Vídeo no encontrado o dañado',\n tryAgain: 'Intentar de nuevo',\n speedNormal: 'Normal',\n volume: 'Volumen',\n seek: 'Buscar',\n close: 'Cerrar',\n },\n\n it: {\n play: 'Riproduci',\n pause: 'Pausa',\n replay: 'Riproduci di nuovo',\n mute: 'Disattiva audio',\n unmute: 'Attiva audio',\n fullscreen: 'Schermo intero',\n exitFullscreen: 'Esci da schermo intero',\n pip: 'Picture-in-picture',\n settings: 'Velocità di riproduzione',\n subtitles: 'Sottotitoli',\n subtitlesOff: 'Disattivati',\n speed: 'Velocità',\n quality: 'Qualità',\n qualityAuto: 'Automatica',\n next: 'Successivo',\n nextVideo: 'Prossimo video',\n previous: 'Precedente',\n playlist: 'Playlist',\n scenes: 'Scene',\n sceneTypes: 'Tipo di scena',\n autoplay: 'Riproduzione automatica',\n playNext: 'Riproduci successivo',\n shuffle: 'Casuale',\n repeat: 'Ripeti',\n like: 'Mi piace',\n dislike: 'Non mi piace',\n addTo: 'Salva in…',\n share: 'Condividi',\n report: 'Segnala',\n more: 'Altre azioni',\n seekForward: 'Avanti veloce',\n seekBack: 'Indietro',\n secondsShort: 's',\n live: 'LIVE',\n related: 'Altri video',\n adLabel: 'Annuncio',\n skipAd: 'Salta annuncio',\n skipAdIn: 'Salta tra',\n visitAdvertiser: \"Visita l'inserzionista\",\n sponsored: 'Sponsorizzato',\n videoNotFound: 'Video non trovato o danneggiato',\n tryAgain: 'Riprova',\n speedNormal: 'Normale',\n volume: 'Volume',\n seek: 'Avanzamento',\n close: 'Chiudi',\n },\n\n ja: {\n play: '再生',\n pause: '一時停止',\n replay: 'もう一度見る',\n mute: 'ミュート',\n unmute: 'ミュート解除',\n fullscreen: '全画面',\n exitFullscreen: '全画面を終了',\n pip: 'ピクチャーインピクチャー',\n settings: '再生速度',\n subtitles: '字幕',\n subtitlesOff: 'オフ',\n speed: '速度',\n quality: '画質',\n qualityAuto: '自動',\n next: '次へ',\n nextVideo: '次の動画',\n previous: '前へ',\n playlist: 'プレイリスト',\n scenes: 'シーン',\n sceneTypes: 'シーンタイプ',\n autoplay: '自動再生',\n playNext: '次を再生',\n shuffle: 'シャッフル',\n repeat: 'リピート',\n like: '高く評価',\n dislike: '低く評価',\n addTo: '保存…',\n share: '共有',\n report: '報告',\n more: 'その他の操作',\n seekForward: '早送り',\n seekBack: '巻き戻し',\n secondsShort: '秒',\n live: 'ライブ',\n related: '関連動画',\n adLabel: '広告',\n skipAd: '広告をスキップ',\n skipAdIn: 'スキップまで',\n visitAdvertiser: '広告主のサイトへ',\n sponsored: 'スポンサー',\n videoNotFound: '動画が見つからないか破損しています',\n tryAgain: 'もう一度試す',\n speedNormal: '標準',\n volume: '音量',\n seek: 'シーク',\n close: '閉じる',\n },\n\n ko: {\n play: '재생',\n pause: '일시정지',\n replay: '다시 보기',\n mute: '음소거',\n unmute: '음소거 해제',\n fullscreen: '전체화면',\n exitFullscreen: '전체화면 종료',\n pip: 'PIP 모드',\n settings: '재생 속도',\n subtitles: '자막',\n subtitlesOff: '사용 안 함',\n speed: '속도',\n quality: '화질',\n qualityAuto: '자동',\n next: '다음',\n nextVideo: '다음 동영상',\n previous: '이전',\n playlist: '재생목록',\n scenes: '장면',\n sceneTypes: '장면 유형',\n autoplay: '자동 재생',\n playNext: '다음 재생',\n shuffle: '셔플',\n repeat: '반복',\n like: '좋아요',\n dislike: '싫어요',\n addTo: '저장…',\n share: '공유',\n report: '신고',\n more: '더보기',\n seekForward: '앞으로 감기',\n seekBack: '뒤로 감기',\n secondsShort: '초',\n live: '실시간',\n related: '관련 동영상',\n adLabel: '광고',\n skipAd: '광고 건너뛰기',\n skipAdIn: '건너뛰기까지',\n visitAdvertiser: '광고주 방문',\n sponsored: '스폰서',\n videoNotFound: '동영상을 찾을 수 없거나 손상되었습니다',\n tryAgain: '다시 시도',\n speedNormal: '보통',\n volume: '볼륨',\n seek: '탐색',\n close: '닫기',\n },\n\n zh: {\n play: '播放',\n pause: '暂停',\n replay: '重新播放',\n mute: '静音',\n unmute: '取消静音',\n fullscreen: '全屏',\n exitFullscreen: '退出全屏',\n pip: '画中画',\n settings: '播放速度',\n subtitles: '字幕',\n subtitlesOff: '关闭',\n speed: '速度',\n quality: '画质',\n qualityAuto: '自动',\n next: '下一个',\n nextVideo: '下一个视频',\n previous: '上一个',\n playlist: '播放列表',\n scenes: '场景',\n sceneTypes: '场景类型',\n autoplay: '自动播放',\n playNext: '播放下一个',\n shuffle: '随机播放',\n repeat: '循环播放',\n like: '赞',\n dislike: '踩',\n addTo: '保存到…',\n share: '分享',\n report: '举报',\n more: '更多操作',\n seekForward: '快进',\n seekBack: '快退',\n secondsShort: '秒',\n live: '直播',\n related: '更多视频',\n adLabel: '广告',\n skipAd: '跳过广告',\n skipAdIn: '可跳过',\n visitAdvertiser: '访问广告主',\n sponsored: '赞助',\n videoNotFound: '未找到视频或视频已损坏',\n tryAgain: '重试',\n speedNormal: '正常',\n volume: '音量',\n seek: '进度',\n close: '关闭',\n },\n\n pt: {\n play: 'Reproduzir',\n pause: 'Pausar',\n replay: 'Assistir novamente',\n mute: 'Sem som',\n unmute: 'Ativar som',\n fullscreen: 'Tela cheia',\n exitFullscreen: 'Sair da tela cheia',\n pip: 'Picture-in-picture',\n settings: 'Velocidade de reprodução',\n subtitles: 'Legendas',\n subtitlesOff: 'Desativadas',\n speed: 'Velocidade',\n quality: 'Qualidade',\n qualityAuto: 'Automática',\n next: 'Próximo',\n nextVideo: 'Próximo vídeo',\n previous: 'Anterior',\n playlist: 'Playlist',\n scenes: 'Cenas',\n sceneTypes: 'Tipo de cena',\n autoplay: 'Reprodução automática',\n playNext: 'Reproduzir próximo',\n shuffle: 'Aleatório',\n repeat: 'Repetir',\n like: 'Gostei',\n dislike: 'Não gostei',\n addTo: 'Salvar em…',\n share: 'Compartilhar',\n report: 'Denunciar',\n more: 'Mais ações',\n seekForward: 'Avançar',\n seekBack: 'Retroceder',\n secondsShort: 's',\n live: 'AO VIVO',\n related: 'Mais vídeos',\n adLabel: 'Anúncio',\n skipAd: 'Pular anúncio',\n skipAdIn: 'Pular em',\n visitAdvertiser: 'Visitar anunciante',\n sponsored: 'Patrocinado',\n videoNotFound: 'Vídeo não encontrado ou danificado',\n tryAgain: 'Tentar novamente',\n speedNormal: 'Normal',\n volume: 'Volume',\n seek: 'Progresso',\n close: 'Fechar',\n },\n\n ar: {\n play: 'تشغيل',\n pause: 'إيقاف مؤقت',\n replay: 'إعادة التشغيل',\n mute: 'كتم الصوت',\n unmute: 'إلغاء كتم الصوت',\n fullscreen: 'ملء الشاشة',\n exitFullscreen: 'الخروج من ملء الشاشة',\n pip: 'صورة داخل صورة',\n settings: 'سرعة التشغيل',\n subtitles: 'الترجمة',\n subtitlesOff: 'إيقاف',\n speed: 'السرعة',\n quality: 'الجودة',\n qualityAuto: 'تلقائي',\n next: 'التالي',\n nextVideo: 'الفيديو التالي',\n previous: 'السابق',\n playlist: 'قائمة التشغيل',\n scenes: 'المشاهد',\n sceneTypes: 'نوع المشهد',\n autoplay: 'تشغيل تلقائي',\n playNext: 'تشغيل التالي',\n shuffle: 'تشغيل عشوائي',\n repeat: 'تكرار',\n like: 'أعجبني',\n dislike: 'لم يعجبني',\n addTo: 'حفظ في…',\n share: 'مشاركة',\n report: 'إبلاغ',\n more: 'المزيد من الإجراءات',\n seekForward: 'تقديم',\n seekBack: 'إرجاع',\n secondsShort: 'ث',\n live: 'مباشر',\n related: 'المزيد من الفيديوهات',\n adLabel: 'إعلان',\n skipAd: 'تخطي الإعلان',\n skipAdIn: 'التخطي بعد',\n visitAdvertiser: 'زيارة المعلن',\n sponsored: 'برعاية',\n videoNotFound: 'الفيديو غير موجود أو تالف',\n tryAgain: 'حاول مرة أخرى',\n speedNormal: 'عادي',\n volume: 'مستوى الصوت',\n seek: 'التقدم',\n close: 'إغلاق',\n },\n\n hi: {\n play: 'चलाएं',\n pause: 'रोकें',\n replay: 'फिर से चलाएं',\n mute: 'म्यूट करें',\n unmute: 'अनम्यूट करें',\n fullscreen: 'फ़ुल स्क्रीन',\n exitFullscreen: 'फ़ुल स्क्रीन से बाहर निकलें',\n pip: 'पिक्चर-इन-पिक्चर',\n settings: 'प्लेबैक गति',\n subtitles: 'सबटाइटल',\n subtitlesOff: 'बंद',\n speed: 'गति',\n quality: 'क्वालिटी',\n qualityAuto: 'ऑटो',\n next: 'अगला',\n nextVideo: 'अगला वीडियो',\n previous: 'पिछला',\n playlist: 'प्लेलिस्ट',\n scenes: 'दृश्य',\n sceneTypes: 'सीन प्रकार',\n autoplay: 'ऑटोप्ले',\n playNext: 'अगला चलाएं',\n shuffle: 'शफ़ल',\n repeat: 'दोहराएं',\n like: 'पसंद',\n dislike: 'नापसंद',\n addTo: 'इसमें सहेजें…',\n share: 'साझा करें',\n report: 'रिपोर्ट करें',\n more: 'अधिक कार्रवाइयां',\n seekForward: 'आगे बढ़ाएं',\n seekBack: 'पीछे करें',\n secondsShort: 's',\n live: 'लाइव',\n related: 'और वीडियो',\n adLabel: 'विज्ञापन',\n skipAd: 'विज्ञापन छोड़ें',\n skipAdIn: 'छोड़ें',\n visitAdvertiser: 'विज्ञापनदाता देखें',\n sponsored: 'प्रायोजित',\n videoNotFound: 'वीडियो नहीं मिला या क्षतिग्रस्त है',\n tryAgain: 'पुनः प्रयास करें',\n speedNormal: 'सामान्य',\n volume: 'वॉल्यूम',\n seek: 'सीक',\n close: 'बंद करें',\n },\n}\n\n/** Codes of all built-in locales. */\nexport const supportedLanguages = Object.keys(locales) as LocaleCode[]\n"],"names":["locales","defaultLabels","supportedLanguages"],"mappings":"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"}