vidply 1.2.0 → 1.2.3
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 +974 -946
- package/dist/dev/{vidply.AudioDescriptionManager-R47Q4YR4.js → vidply.AudioDescriptionManager-JYYLK5KB.js} +275 -19
- package/dist/dev/vidply.AudioDescriptionManager-JYYLK5KB.js.map +7 -0
- package/dist/dev/{vidply.CaptionStyleMenu-7XHRBWUM.js → vidply.CaptionStyleMenu-47RCKQF5.js} +4 -4
- package/dist/dev/{vidply.DASHRenderer-PWEMC3BT.js → vidply.DASHRenderer-VEJ4HDHO.js} +3 -3
- package/dist/dev/vidply.DASHRenderer-VEJ4HDHO.js.map +7 -0
- package/dist/dev/{vidply.FloatingPlayerManager-PKNNNAS2.js → vidply.FloatingPlayerManager-C2UVRPZY.js} +5 -5
- package/dist/dev/vidply.FloatingPlayerManager-C2UVRPZY.js.map +7 -0
- package/dist/dev/{vidply.HLSRenderer-E7RQ74HI.js → vidply.HLSRenderer-ZVBK2TNQ.js} +4 -4
- package/dist/dev/vidply.HLSRenderer-ZVBK2TNQ.js.map +7 -0
- package/dist/dev/vidply.HTML5Renderer-HLRQUOCU.js +12 -0
- package/dist/dev/{vidply.SignLanguageManager-FET5FQZ7.js → vidply.SignLanguageManager-FLUCBW5H.js} +8 -8
- package/dist/dev/vidply.SignLanguageManager-FLUCBW5H.js.map +7 -0
- package/dist/dev/{vidply.SoundCloudRenderer-RVSJZODO.js → vidply.SoundCloudRenderer-MGMAJ7NK.js} +3 -3
- package/dist/dev/vidply.SoundCloudRenderer-MGMAJ7NK.js.map +7 -0
- package/dist/dev/{vidply.TranscriptManager-5GXOQCLX.js → vidply.TranscriptManager-Y2RYXHJW.js} +10 -10
- package/dist/dev/vidply.TranscriptManager-Y2RYXHJW.js.map +7 -0
- package/dist/dev/{vidply.VimeoRenderer-ER2LSBBW.js → vidply.VimeoRenderer-RQFQD7OE.js} +3 -3
- package/dist/dev/vidply.VimeoRenderer-RQFQD7OE.js.map +7 -0
- package/dist/dev/{vidply.YouTubeRenderer-NFTOWJAB.js → vidply.YouTubeRenderer-EU2BARZF.js} +3 -3
- package/dist/dev/vidply.YouTubeRenderer-EU2BARZF.js.map +7 -0
- package/dist/dev/{vidply.chunk-BNFIUL2Z.js → vidply.chunk-6LYZYI5G.js} +3 -3
- package/dist/dev/vidply.chunk-6LYZYI5G.js.map +7 -0
- package/dist/dev/{vidply.chunk-NQPURMQY.js → vidply.chunk-A4ESEOQ2.js} +6 -6
- package/dist/dev/vidply.chunk-A4ESEOQ2.js.map +7 -0
- package/dist/dev/{vidply.chunk-W25HUCHS.js → vidply.chunk-CGYIED2I.js} +2 -2
- package/dist/dev/vidply.chunk-CGYIED2I.js.map +7 -0
- package/dist/dev/{vidply.chunk-SK4V2DAU.js → vidply.chunk-HZ7UOKOU.js} +3 -3
- package/dist/dev/{vidply.chunk-RZWZGDV7.js → vidply.chunk-I6EDRYGJ.js} +33 -6
- package/dist/dev/vidply.chunk-I6EDRYGJ.js.map +7 -0
- package/dist/dev/{vidply.chunk-64WXMTGL.js → vidply.chunk-JKMQGLCJ.js} +5 -5
- package/dist/dev/vidply.chunk-JKMQGLCJ.js.map +7 -0
- package/dist/dev/{vidply.chunk-DZSDO3B7.js → vidply.chunk-JZNZX32Z.js} +2 -2
- package/dist/dev/{vidply.chunk-VMSQAZM7.js → vidply.chunk-P25MRJ6O.js} +2 -2
- package/dist/dev/{vidply.chunk-6RQA4ROD.js → vidply.chunk-PRFNESYA.js} +2 -2
- package/dist/dev/{vidply.chunk-KI7C3QVL.js → vidply.chunk-UI3RYCVF.js} +4 -3
- package/dist/dev/vidply.chunk-UI3RYCVF.js.map +7 -0
- package/dist/dev/{vidply.chunk-JJ47NO24.js → vidply.chunk-UNFGMABP.js} +2 -2
- package/dist/dev/vidply.chunk-UNFGMABP.js.map +7 -0
- package/dist/dev/{vidply.de-4YAT7FFM.js → vidply.de-VAUVSQXC.js} +29 -2
- package/dist/dev/vidply.de-VAUVSQXC.js.map +7 -0
- package/dist/dev/{vidply.es-LEWIRUBH.js → vidply.es-G65HFWO6.js} +29 -2
- package/dist/dev/vidply.es-G65HFWO6.js.map +7 -0
- package/dist/dev/vidply.esm.js +648 -35
- package/dist/dev/vidply.esm.js.map +3 -3
- package/dist/dev/{vidply.fr-Q4GV2NOE.js → vidply.fr-MJNOZELM.js} +29 -2
- package/dist/dev/vidply.fr-MJNOZELM.js.map +7 -0
- package/dist/dev/{vidply.ja-S6ITA6WU.js → vidply.ja-INMDHIYJ.js} +29 -2
- package/dist/dev/vidply.ja-INMDHIYJ.js.map +7 -0
- package/dist/legacy/vidply.js +1062 -34
- package/dist/legacy/vidply.js.map +3 -3
- package/dist/legacy/vidply.min.js +2 -2
- package/dist/legacy/vidply.min.meta.json +127 -55
- package/dist/prod/vidply.AudioDescriptionManager-EKWUNOPE.min.js +6 -0
- package/dist/prod/{vidply.CaptionStyleMenu-M3KVQWB5.min.js → vidply.CaptionStyleMenu-JTWSNHRQ.min.js} +2 -2
- package/dist/prod/{vidply.DASHRenderer-DN3S27AV.min.js → vidply.DASHRenderer-CIDAHFWM.min.js} +2 -2
- package/dist/prod/{vidply.FloatingPlayerManager-SKAZ4J43.min.js → vidply.FloatingPlayerManager-VZXHPCPM.min.js} +2 -2
- package/dist/prod/{vidply.HLSRenderer-62HH4YTK.min.js → vidply.HLSRenderer-Q6EFYKID.min.js} +2 -2
- package/dist/prod/vidply.HTML5Renderer-XRDJUTOO.min.js +6 -0
- package/dist/prod/{vidply.SignLanguageManager-V3OBTSSF.min.js → vidply.SignLanguageManager-JUOSA5AM.min.js} +2 -2
- package/dist/prod/{vidply.SoundCloudRenderer-CXRVZIAJ.min.js → vidply.SoundCloudRenderer-7ODD46PO.min.js} +2 -2
- package/dist/prod/{vidply.TranscriptManager-SYM3DFUY.min.js → vidply.TranscriptManager-4B2QKYGQ.min.js} +2 -2
- package/dist/prod/{vidply.VimeoRenderer-72TWRYFQ.min.js → vidply.VimeoRenderer-MR3UYLY7.min.js} +2 -2
- package/dist/prod/{vidply.YouTubeRenderer-UMHEV3KD.min.js → vidply.YouTubeRenderer-ITRTC7NR.min.js} +2 -2
- package/dist/prod/{vidply.chunk-YEENJS3Q.min.js → vidply.chunk-3EEDXU4T.min.js} +2 -2
- package/dist/prod/{vidply.chunk-P4UXOHWA.min.js → vidply.chunk-5HTX5QXW.min.js} +1 -1
- package/dist/prod/{vidply.chunk-ABPXVDLZ.min.js → vidply.chunk-6OGHHIYP.min.js} +2 -2
- package/dist/prod/{vidply.chunk-UK7YGOB5.min.js → vidply.chunk-GUPGMFUZ.min.js} +2 -2
- package/dist/prod/{vidply.chunk-WX3MVEAL.min.js → vidply.chunk-MWEBITCP.min.js} +1 -1
- package/dist/prod/{vidply.chunk-2TB6MUHO.min.js → vidply.chunk-PL3P3JHR.min.js} +1 -1
- package/dist/prod/{vidply.chunk-EKEYJWMG.min.js → vidply.chunk-QQZGV7TD.min.js} +2 -2
- package/dist/prod/{vidply.chunk-Z3YDSA7O.min.js → vidply.chunk-U5IRRYG5.min.js} +1 -1
- package/dist/prod/{vidply.chunk-TM6AXJVD.min.js → vidply.chunk-VKHV4QHA.min.js} +2 -2
- package/dist/prod/{vidply.chunk-P3PQBY7N.min.js → vidply.chunk-XA4M574A.min.js} +1 -1
- package/dist/prod/{vidply.chunk-RI3X7WHK.min.js → vidply.chunk-ZPTV4JEP.min.js} +2 -2
- package/dist/prod/{vidply.de-BCHXRQ53.min.js → vidply.de-UZHFCEZU.min.js} +2 -2
- package/dist/prod/{vidply.es-PICAKMZD.min.js → vidply.es-BOISUV2S.min.js} +2 -2
- package/dist/prod/vidply.esm.min.js +2 -2
- package/dist/prod/{vidply.fr-ZILI7CDR.min.js → vidply.fr-ICSMKPFM.min.js} +2 -2
- package/dist/prod/{vidply.ja-5WQ4OK4J.min.js → vidply.ja-VQ2HKGAY.min.js} +2 -2
- package/dist/vidply.css +5852 -5796
- package/dist/vidply.esm.min.meta.json +204 -149
- package/dist/vidply.min.css +1 -1
- package/package.json +11 -11
- package/src/controls/CaptionManager.ts +598 -598
- package/src/controls/ControlBar.ts +4191 -4159
- package/src/controls/KeyboardHelp.ts +326 -0
- package/src/controls/KeyboardManager.ts +387 -383
- package/src/controls/SettingsDialog.ts +488 -488
- package/src/controls/TranscriptManager.ts +2426 -2426
- package/src/core/AudioDescriptionManager.ts +863 -774
- package/src/core/DescriptionSpeechManager.ts +232 -0
- package/src/core/FloatingPlayerManager.ts +674 -674
- package/src/core/LazyInit.ts +80 -80
- package/src/core/MediaSessionManager.ts +341 -0
- package/src/core/MetadataAlertsManager.ts +514 -514
- package/src/core/Player.ts +2973 -2872
- package/src/core/PosterManager.ts +169 -169
- package/src/core/PseudoFullscreen.ts +179 -179
- package/src/core/ResponsiveManager.ts +231 -231
- package/src/core/ResumeManager.ts +236 -236
- package/src/core/SignLanguageManager.ts +1308 -1308
- package/src/core/ThemeManager.ts +157 -157
- package/src/features/PlaylistManager.ts +1838 -1827
- package/src/i18n/i18n.ts +223 -223
- package/src/i18n/languages/de.ts +244 -217
- package/src/i18n/languages/en.ts +245 -218
- package/src/i18n/languages/es.ts +241 -214
- package/src/i18n/languages/fr.ts +241 -214
- package/src/i18n/languages/ja.ts +241 -214
- package/src/icons/Icons.ts +168 -167
- package/src/index.ts +196 -193
- package/src/renderers/DASHRenderer.ts +1077 -1077
- package/src/renderers/HLSRenderer.ts +944 -944
- package/src/renderers/HTML5Renderer.ts +389 -389
- package/src/renderers/SoundCloudRenderer.ts +437 -437
- package/src/renderers/VimeoRenderer.ts +298 -298
- package/src/renderers/YouTubeRenderer.ts +290 -290
- package/src/styles/vidply.css +5852 -5796
- package/src/types/events.ts +128 -122
- package/src/types/globals.d.ts +313 -313
- package/src/types/options.ts +199 -182
- package/src/types/renderer.ts +58 -58
- package/src/utils/DOMUtils.ts +281 -281
- package/src/utils/DownloadInfo.ts +171 -171
- package/src/utils/DraggablePanel.ts +539 -539
- package/src/utils/DraggablePanelMenu.ts +195 -195
- package/src/utils/DraggableResizable.ts +997 -997
- package/src/utils/EventEmitter.ts +59 -59
- package/src/utils/FormUtils.ts +95 -95
- package/src/utils/MenuFactory.ts +483 -483
- package/src/utils/Sanitize.ts +70 -70
- package/src/utils/SettingsMenuFactory.ts +289 -289
- package/src/utils/StorageManager.ts +287 -287
- package/src/utils/TrackLabelUtils.ts +52 -52
- package/src/utils/UrlSafe.ts +69 -69
- package/src/utils/VideoFrameCapture.ts +114 -114
- package/src/utils/WindowComponents.ts +250 -250
- package/dist/dev/vidply.AudioDescriptionManager-R47Q4YR4.js.map +0 -7
- package/dist/dev/vidply.DASHRenderer-PWEMC3BT.js.map +0 -7
- package/dist/dev/vidply.FloatingPlayerManager-PKNNNAS2.js.map +0 -7
- package/dist/dev/vidply.HLSRenderer-E7RQ74HI.js.map +0 -7
- package/dist/dev/vidply.HTML5Renderer-BU4QJJJY.js +0 -12
- package/dist/dev/vidply.SignLanguageManager-FET5FQZ7.js.map +0 -7
- package/dist/dev/vidply.SoundCloudRenderer-RVSJZODO.js.map +0 -7
- package/dist/dev/vidply.TranscriptManager-5GXOQCLX.js.map +0 -7
- package/dist/dev/vidply.VimeoRenderer-ER2LSBBW.js.map +0 -7
- package/dist/dev/vidply.YouTubeRenderer-NFTOWJAB.js.map +0 -7
- package/dist/dev/vidply.chunk-64WXMTGL.js.map +0 -7
- package/dist/dev/vidply.chunk-BNFIUL2Z.js.map +0 -7
- package/dist/dev/vidply.chunk-JJ47NO24.js.map +0 -7
- package/dist/dev/vidply.chunk-KI7C3QVL.js.map +0 -7
- package/dist/dev/vidply.chunk-NQPURMQY.js.map +0 -7
- package/dist/dev/vidply.chunk-RZWZGDV7.js.map +0 -7
- package/dist/dev/vidply.chunk-W25HUCHS.js.map +0 -7
- package/dist/dev/vidply.de-4YAT7FFM.js.map +0 -7
- package/dist/dev/vidply.es-LEWIRUBH.js.map +0 -7
- package/dist/dev/vidply.fr-Q4GV2NOE.js.map +0 -7
- package/dist/dev/vidply.ja-S6ITA6WU.js.map +0 -7
- package/dist/prod/vidply.AudioDescriptionManager-RHLIJW5C.min.js +0 -6
- package/dist/prod/vidply.HTML5Renderer-IU5T3WEW.min.js +0 -6
- /package/dist/dev/{vidply.CaptionStyleMenu-7XHRBWUM.js.map → vidply.CaptionStyleMenu-47RCKQF5.js.map} +0 -0
- /package/dist/dev/{vidply.HTML5Renderer-BU4QJJJY.js.map → vidply.HTML5Renderer-HLRQUOCU.js.map} +0 -0
- /package/dist/dev/{vidply.chunk-SK4V2DAU.js.map → vidply.chunk-HZ7UOKOU.js.map} +0 -0
- /package/dist/dev/{vidply.chunk-DZSDO3B7.js.map → vidply.chunk-JZNZX32Z.js.map} +0 -0
- /package/dist/dev/{vidply.chunk-VMSQAZM7.js.map → vidply.chunk-P25MRJ6O.js.map} +0 -0
- /package/dist/dev/{vidply.chunk-6RQA4ROD.js.map → vidply.chunk-PRFNESYA.js.map} +0 -0
package/dist/prod/{vidply.DASHRenderer-DN3S27AV.min.js → vidply.DASHRenderer-CIDAHFWM.min.js}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* VidPly v1.2.
|
|
2
|
+
* VidPly v1.2.3 - Universal, Accessible Video Player
|
|
3
3
|
* (c) 2026 Matthias Peltzer
|
|
4
4
|
* Released under GPL-2.0-or-later License
|
|
5
5
|
*/
|
|
6
|
-
import{loadScriptOnce as t}from"./vidply.chunk-P4UXOHWA.min.js";var e=class{player;media;dash;isStreaming=!0;_dashSourceLoaded;_pendingSrc;_dashSubtitleTracksCount;_dashTextTracks;_cueUpdateTimer;_captionEnabledHandler;_captionDisabledHandler;_lastKnownCueCount;_dashTextIsTtml;_pendingTimeouts;_ttmlDiv;_manifestUrl;_listenerController;_pendingReadyHandler;constructor(t){this.player=t,this.media=t.element,this.dash=null,this._dashSourceLoaded=!1,this._pendingSrc=null,this._dashSubtitleTracksCount=void 0,this._dashTextTracks=[],this._cueUpdateTimer=null,this._captionEnabledHandler=null,this._captionDisabledHandler=null,this._lastKnownCueCount=0,this._dashTextIsTtml=!1,this._pendingTimeouts=[],this._ttmlDiv=null,this._manifestUrl=null,this._listenerController=new AbortController,this._pendingReadyHandler=null}async init(){this.player.log("Using dash.js for DASH support"),await this.initDashJs()}async initDashJs(){this.media.controls=!1,this.media.removeAttribute("controls"),window.dashjs||await this.loadDashJs();const t=Array.from(this.media.querySelectorAll("source"));let e=null;t.length>0&&(e=t[0]?.getAttribute("src")??null,t.forEach(t=>t.remove()),this.player.log("Removed <source> elements for HTML5 validity (dash.js uses MSE)"));const i=window.dashjs;if(!i)throw new Error("dash.js not available");this.dash=i.MediaPlayer().create(),this.dash.updateSettings({debug:{logLevel:this.player.options.debug?4:0},streaming:{selectionModeForInitialTrack:"firstTrack",buffer:{bufferTimeAtTopQuality:30,bufferTimeAtTopQualityLongForm:60,bufferTimeDefault:12,bufferToKeep:20,bufferPruningInterval:10},retryAttempts:{MPD:4,MediaSegment:6,InitializationSegment:4,BitstreamSwitchingSegment:4},retryIntervals:{MPD:1e3,MediaSegment:1e3,InitializationSegment:1e3,BitstreamSwitchingSegment:1e3},abr:{autoSwitchBitrate:{video:!0,audio:!0}},text:{defaultEnabled:!0}}}),this._ttmlDiv=document.createElement("div"),this._ttmlDiv.className="vidply-dash-ttml",this._ttmlDiv.style.visibility="hidden";const s=this.player.videoWrapper||this.media.parentElement;s&&s.appendChild(this._ttmlDiv),this.dash.initialize(this.media,null,!1),this.dash.attachTTMLRenderingDiv(this._ttmlDiv);let a=this.player.currentSource;if(!a&&e&&(a=e),a||(a=this.player.element.getAttribute("data-vidply-src")),!a){const t=this.player.element.getAttribute("src")||this.player.element.src;t&&!t.startsWith("blob:")&&(a=t)}if(this.player.log(`Loading DASH source: ${a}`,"log"),!a)throw new Error("No DASH source found");this._pendingSrc=a,this._manifestUrl=a,this.dash.attachSource(a),this._dashSourceLoaded=!0,this.player.showPosterOverlay(),this.attachDashEvents(),this.attachMediaEvents(),this._setupCaptionSync()}async loadDashJs(){return t(this.player.options.dashScriptUrl||"https://cdn.jsdelivr.net/npm/dashjs@5.2.0/dist/modern/umd/dash.all.min.js",{integrity:this.player.options.dashScriptIntegrity})}_setTimeout(t,e){const i=setTimeout(()=>{this._pendingTimeouts=this._pendingTimeouts.filter(t=>t!==i),t()},e);return this._pendingTimeouts.push(i),i}attachDashEvents(){const t=window.dashjs,e=this.dash;if(!t||!e)return;const i=t.MediaPlayer.events;e.on(i.MANIFEST_LOADED,(...t)=>{const e=t[0],i=e?.data??e;this.player.log("DASH manifest loaded"),this.player.emit("dashmanifestloaded",i),this.player.container&&this.player.container.classList.remove("vidply-external-controls"),this._setTimeout(()=>{this._checkSubtitleTracks()},500)}),e.on(i.QUALITY_CHANGE_RENDERED,(...t)=>{const e=t[0];"video"===e.mediaType&&(this.player.log("DASH quality changed to index "+e.newQuality),this.player.emit("dashqualitychanged",e))}),e.on(i.TEXT_TRACKS_ADDED,(...t)=>{const i=t[0],s=i?.tracks??[];if(this._dashTextTracks=s,this._dashTextIsTtml=s.some(t=>t.isTTML||/stpp|ttml/i.test(t.codec||"")||/ttml/i.test(t.mimeType||"")),this.player.log(`DASH text tracks added: ${s.length} tracks, format: ${this._dashTextIsTtml?"TTML":"WebVTT"}`),this._dashSubtitleTracksCount=s.length,this.player.emit("dashsubtitletracksupdated",{tracks:s}),this.updateCaptionButtonsForDash(),s.length>0){try{e.setTextTrack(0)}catch{}this._dashTextIsTtml||this._startCueUpdatePolling()}}),e.on(i.STREAM_INITIALIZED,()=>{this.player.log("DASH stream initialized"),this.player.emit("dashstreaminitialized"),this._setTimeout(()=>{const t=this.getQualities();t.length>0&&this.player.emit("dashmanifestparsed",{qualities:t})},300)}),e.on(i.ERROR,(...t)=>{this.handleDashError(t[0])}),e.on(i.FRAGMENT_LOADING_COMPLETED,(...t)=>{const e=t[0];this.player.state.buffering=!1,"text"!==e?.request?.mediaType||this._dashTextIsTtml||this._setTimeout(()=>{const t=this._getTotalCueCount();t>this._lastKnownCueCount&&(this._lastKnownCueCount=t,this.player.emit("textcuesupdate"))},100)})}_getTotalCueCount(){const t=this.media.textTracks;let e=0;if(!t)return e;for(let i=0;i<t.length;i++){const s=t[i];!s||"subtitles"!==s.kind&&"captions"!==s.kind||s._vidplyStale||!s.cues||(e+=s.cues.length)}return e}_isTimeBuffered(t){const e=this.media.buffered;if(!e||0===e.length)return!1;for(let i=0;i<e.length;i++)if(t>=e.start(i)-.25&&t<=e.end(i)+.25)return!0;return!1}_setupCaptionSync(){this._captionEnabledHandler=t=>{this._dashTextIsTtml&&(t.track&&(t.track.mode="showing"),this._ttmlDiv&&(this._ttmlDiv.style.visibility="visible")),this._syncDashTextTrack(t)},this._captionDisabledHandler=()=>{if(this._dashTextIsTtml&&this._ttmlDiv&&(this._ttmlDiv.style.visibility="hidden"),this.dash)try{this.dash.setTextTrack(-1)}catch{}},this.player.on("captionsenabled",this._captionEnabledHandler),this.player.on("captionsdisabled",this._captionDisabledHandler)}_syncDashTextTrack(t){if(!this.dash||!this._dashTextTracks.length)return;const e=t.language;if(!e)return;const i=this._dashTextTracks.findIndex(t=>{const i=t.lang||t.language||t.srclang||"";return!!i&&(i===e||i.startsWith(e)||e.startsWith(i))});if(i>=0){this.player.log(`Syncing DASH text track to index ${i} (${e})`);try{this.dash.setTextTrack(i)}catch{}this._dashTextIsTtml||(this._lastKnownCueCount=0,this._startCueUpdatePolling())}}_startCueUpdatePolling(){this._stopCueUpdatePolling();let t=0,e=0;this._cueUpdateTimer=setInterval(()=>{const i=this._getTotalCueCount();i>t?(t=i,e=0,this.player.emit("textcuesupdate")):(e++,e>=8&&(this._stopCueUpdatePolling(),i>0&&this.player.emit("textcuesupdate")))},500)}_stopCueUpdatePolling(){this._cueUpdateTimer&&(clearInterval(this._cueUpdateTimer),this._cueUpdateTimer=null)}_checkSubtitleTracks(){if(void 0!==this._dashSubtitleTracksCount&&this._dashSubtitleTracksCount>0)return;const t=this.media.textTracks;let e=0;for(let i=0;i<t.length;i++){const s=t[i];!s||"subtitles"!==s.kind&&"captions"!==s.kind||s._vidplyStale||e++}this._dashSubtitleTracksCount=e,this.updateCaptionButtonsForDash()}updateCaptionButtonsForDash(t=0){const e=this._dashSubtitleTracksCount||0,i=()=>{if(this.player.invalidateTrackCache(),e>0){if(this.player.captionManager&&0===this.player.captionManager.refreshTracks()&&t<5){const e=200*(t+1);return this.player.log(`DASH caption tracks not yet on video element, retrying in ${e}ms (attempt ${t+1})`,"info"),void this._setTimeout(()=>{this.updateCaptionButtonsForDash(t+1)},e)}!this._dashTextIsTtml&&this.player.transcriptManager?.isVisible&&(this.player.transcriptManager.loadTranscriptData(),this.player.transcriptManager.updateLanguageSelector()),this.player.controlBar&&(this.player.controlBar.ensureCaptionsButton(),this._dashTextIsTtml||(this.player.controlBar.ensureCaptionStyleButton(),this.player.controlBar.ensureTranscriptButton()))}else this.player.captionManager&&this.player.captionManager.refreshTracks(),this.player.transcriptManager?.isVisible&&this.player.transcriptManager.hideTranscript(),this.player.controlBar&&this.player.controlBar.removeHlsCaptionButtons(!0)};if(this.player.controlBar)return void i();const s=()=>{this.player.off("ready",s),this._pendingReadyHandler=null,i()};this._pendingReadyHandler=s,this.player.on("ready",s)}attachMediaEvents(){const{signal:t}=this._listenerController;this.media.addEventListener("loadedmetadata",()=>{this.player.state.duration=this.media.duration,this.player.emit("loadedmetadata")},{signal:t}),this.media.addEventListener("durationchange",()=>{const t=this.media.duration;t&&isFinite(t)&&t>0&&(this.player.state.duration=t,this.player.emit("durationchange",t))},{signal:t}),this.media.addEventListener("play",()=>{this.player.state.playing=!0,this.player.state.paused=!1,this.player.state.ended=!1,this.player.emit("play"),this.player.options.onPlay&&this.player.options.onPlay.call(this.player)},{signal:t}),this.media.addEventListener("pause",()=>{this.player.state.playing=!1,this.player.state.paused=!0,this.player.emit("pause"),this.player.options.onPause&&this.player.options.onPause.call(this.player)},{signal:t}),this.media.addEventListener("ended",()=>{this.player.state.playing=!1,this.player.state.paused=!0,this.player.state.ended=!0,this.player.emit("ended"),this.player.options.onEnded&&this.player.options.onEnded.call(this.player),this.player.options.loop&&(this.player.seek(0),this.player.play())},{signal:t}),this.media.addEventListener("timeupdate",()=>{this.player.state.currentTime=this.media.currentTime,this.player.emit("timeupdate",this.media.currentTime),this.player.options.onTimeUpdate&&this.player.options.onTimeUpdate.call(this.player,this.media.currentTime)},{signal:t}),this.media.addEventListener("volumechange",()=>{this.player.state.volume=this.media.volume,this.player.state.muted=this.media.muted,this.player.emit("volumechange",this.media.volume)},{signal:t}),this.media.addEventListener("seeking",()=>{this.player.state.seeking=!0,this.player.emit("seeking"),this._isTimeBuffered(this.media.currentTime)||(this.player.state.buffering=!0,this.player.emit("waiting"))},{signal:t}),this.media.addEventListener("seeked",()=>{this.player.state.seeking=!1,this.player.emit("seeked")},{signal:t}),this.media.addEventListener("waiting",()=>{this.player.state.buffering=!0,this.player.emit("waiting")},{signal:t}),this.media.addEventListener("canplay",()=>{this.player.state.buffering=!1,this.player.emit("canplay")},{signal:t}),this.media.addEventListener("error",()=>{this.player.handleError(this.media.error)},{signal:t})}handleDashError(t){const e=t,i=e?.error??e;if(!i)return;const s=i.code??"",a=i.message||"";this.player.log(`DASH Error - Code: ${s}, Message: ${a}`,"warn"),"number"==typeof s&&s>=100?(this.player.log("Fatal DASH error","error"),this.player.handleError(new Error(`DASH Error: ${s} - ${a}`))):this.player.log("Non-fatal DASH error: "+(a||String(i)),"warn")}ensureLoaded(){if(!this.player.options.deferLoad)return;if(!this.dash)return;if(this._dashSourceLoaded)return;const t=this._pendingSrc||this.player._pendingSource||this.player.currentSource;if(t)try{this.dash.attachSource(t),this._dashSourceLoaded=!0}catch{}}play(){const t=window.scrollX,e=window.scrollY;if(this.player.options.deferLoad&&this.dash&&!this._dashSourceLoaded){const t=this._pendingSrc||this.player.currentSource;if(t)try{this.dash.attachSource(t),this._dashSourceLoaded=!0}catch{}}const i=this.media.play();window.scrollTo(t,e),void 0!==i&&i.catch(t=>{this.player.log("Play failed:",t,"warn")})}pause(){this.media.pause()}seek(t){this.media.currentTime=t}setVolume(t){this.media.volume=t}setMuted(t){this.media.muted=t}setPlaybackSpeed(t){this.media.playbackRate=t}switchQuality(t){this.dash&&(-1===t?"function"==typeof this.dash.setAutoSwitchQualityFor?this.dash.setAutoSwitchQualityFor("video",!0):this.dash.updateSettings({streaming:{abr:{autoSwitchBitrate:{video:!0}}}}):("function"==typeof this.dash.setAutoSwitchQualityFor?this.dash.setAutoSwitchQualityFor("video",!1):this.dash.updateSettings({streaming:{abr:{autoSwitchBitrate:{video:!1}}}}),"function"==typeof this.dash.setRepresentationForTypeByIndex?this.dash.setRepresentationForTypeByIndex("video",t):"function"==typeof this.dash.setQualityFor&&this.dash.setQualityFor("video",t,!0)))}getQualities(){if(!this.dash)return[];try{let t=null;if("function"==typeof this.dash.getRepresentationsByType&&(t=this.dash.getRepresentationsByType("video")),t&&t.length>0){const e={};return t.forEach(t=>{const i=Number(t.height)||0;e[i]=(e[i]||0)+1}),t.map((t,i)=>{const s=Number(t.height)||0,a=Number(t.bandwidth||t.bitrate)||0,r=a>0?Math.round(a/1e3):0;let n;return n=s>0&&(e[s]??0)>1&&r>0?`${s}p (${r} kbps)`:s>0?`${s}p`:r>0?`${r} kbps`:"Auto",{index:i,id:t.id,height:t.height,width:t.width,bitrate:a,name:n}})}const e=this.dash.getBitrateInfoListFor("video");if(!e||0===e.length)return[];const i={};return e.forEach(t=>{const e=Number(t.height)||0;i[e]=(i[e]||0)+1}),e.map((t,e)=>{const s=Number(t.height)||0,a=Number(t.bitrate)||0,r=a>0?Math.round(a/1e3):0;let n;return n=s>0&&(i[s]??0)>1&&r>0?`${s}p (${r} kbps)`:s>0?`${s}p`:r>0?`${r} kbps`:"Auto",{index:e,height:t.height,width:t.width,bitrate:t.bitrate,name:n}})}catch{return[]}}getCurrentQuality(){if(!this.dash)return-1;try{if("function"==typeof this.dash.getRepresentationsByType){const t=this.dash.getRepresentationsByType("video"),e=this.dash.getCurrentRepresentationForType?.("video");if(e&&t){const i=t.findIndex(t=>t.id===e.id);if(i>=0)return i}}return this.dash.getQualityFor("video")}catch{return-1}}handlesOwnCaptions(){return this._dashTextIsTtml}activateTextTrackForLanguage(t){if(!this.dash||!this._dashTextTracks.length||!t)return!1;let e=this._dashTextTracks.findIndex(e=>{const i=e.lang||e.language||e.srclang||"";return!!i&&(i===t||i.startsWith(t)||t.startsWith(i))});if(e<0&&(e=this._dashTextTracks.findIndex(e=>(e.label||e.labels||"").toString().toLowerCase().includes(t.toLowerCase()))),e<0)return!1;this.player.log(`Activating DASH text track index ${e} for transcript language "${t}"`);try{this.dash.setTextTrack(e)}catch{}if(this.media.paused){const t=this.media.currentTime,e=this.media.muted;this.media.muted=!0;const i=this.media.play(),s=()=>{this.media&&!this.media.paused&&(this.media.pause(),this.media.muted=e,Math.abs(this.media.currentTime-t)>.5&&(this.media.currentTime=t))};i&&"function"==typeof i.then?i.then(()=>{this._setTimeout(s,250)}).catch(()=>{this.media.muted=e}):this._setTimeout(s,250)}return this._dashTextIsTtml||(this._lastKnownCueCount=0,this._startCueUpdatePolling()),!0}getTextTrackURLs(){if(!this.dash||!this._manifestUrl)return[];try{const t=this.dash.getManifest?.();if(!t)return[];const e=this._manifestUrl.substring(0,this._manifestUrl.lastIndexOf("/")+1),i=[],s=t.Period||t.period||t.periods||t,a=Array.isArray(s)?s:[s];for(const t of a){const s=t.AdaptationSet||t.adaptationSet||t.AdaptationSet_asArray||[],a=Array.isArray(s)?s:[s];for(const t of a){const s=String(t.contentType||t.ContentType||""),a=String(t.mimeType||t.MimeType||"");if("text"!==s&&!/text\/vtt|application\/ttml/i.test(a))continue;const r=String(t.lang||t.language||""),n=t.Representation||t.representation||t.Representation_asArray||[],h=Array.isArray(n)?n:[n];for(const t of h){const s=t.BaseURL||t.baseURL||t.BaseURL_asArray;let a;if(Array.isArray(s)){const t=s[0];a="string"==typeof t?t:t?.__text}else a="string"==typeof s?s:s?.__text;if(!a)continue;const n=a.startsWith("http")?a:new URL(a,e).href;i.push({lang:r,url:n});break}}}return i}catch{return[]}}supportsAutoQuality(){return!0}isAutoQuality(){if(!this.dash)return!0;try{if("function"==typeof this.dash.getAutoSwitchQualityFor)return this.dash.getAutoSwitchQualityFor("video");const t=this.dash.getSettings?.();return!1!==t?.streaming?.abr?.autoSwitchBitrate?.video}catch{return!0}}destroy(){this._pendingTimeouts.forEach(t=>clearTimeout(t)),this._pendingTimeouts=[],this._stopCueUpdatePolling(),this._lastKnownCueCount=0,this._listenerController.abort(),this._pendingReadyHandler&&(this.player.off("ready",this._pendingReadyHandler),this._pendingReadyHandler=null),this._captionEnabledHandler&&(this.player.off("captionsenabled",this._captionEnabledHandler),this._captionEnabledHandler=null),this._captionDisabledHandler&&(this.player.off("captionsdisabled",this._captionDisabledHandler),this._captionDisabledHandler=null),this._ttmlDiv&&this._ttmlDiv.parentNode&&(this._ttmlDiv.parentNode.removeChild(this._ttmlDiv),this._ttmlDiv=null);const t=this.media.textTracks;for(let e=0;e<t.length;e++){const i=t[e];!i||"subtitles"!==i.kind&&"captions"!==i.kind||(i._vidplyStale=!0,i.mode="disabled")}if(this.dash){try{this.dash.updateSettings({debug:{logLevel:0}}),this.dash.reset()}catch{}try{this.dash.destroy()}catch{}this.dash=null}this._dashTextTracks=[],this._dashTextIsTtml=!1,this._manifestUrl=null}};export{e as DASHRenderer};
|
|
6
|
+
import{loadScriptOnce as t}from"./vidply.chunk-5HTX5QXW.min.js";var e=class{player;media;dash;isStreaming=!0;_dashSourceLoaded;_pendingSrc;_dashSubtitleTracksCount;_dashTextTracks;_cueUpdateTimer;_captionEnabledHandler;_captionDisabledHandler;_lastKnownCueCount;_dashTextIsTtml;_pendingTimeouts;_ttmlDiv;_manifestUrl;_listenerController;_pendingReadyHandler;constructor(t){this.player=t,this.media=t.element,this.dash=null,this._dashSourceLoaded=!1,this._pendingSrc=null,this._dashSubtitleTracksCount=void 0,this._dashTextTracks=[],this._cueUpdateTimer=null,this._captionEnabledHandler=null,this._captionDisabledHandler=null,this._lastKnownCueCount=0,this._dashTextIsTtml=!1,this._pendingTimeouts=[],this._ttmlDiv=null,this._manifestUrl=null,this._listenerController=new AbortController,this._pendingReadyHandler=null}async init(){this.player.log("Using dash.js for DASH support"),await this.initDashJs()}async initDashJs(){this.media.controls=!1,this.media.removeAttribute("controls"),window.dashjs||await this.loadDashJs();const t=Array.from(this.media.querySelectorAll("source"));let e=null;t.length>0&&(e=t[0]?.getAttribute("src")??null,t.forEach(t=>t.remove()),this.player.log("Removed <source> elements for HTML5 validity (dash.js uses MSE)"));const i=window.dashjs;if(!i)throw new Error("dash.js not available");this.dash=i.MediaPlayer().create(),this.dash.updateSettings({debug:{logLevel:this.player.options.debug?4:0},streaming:{selectionModeForInitialTrack:"firstTrack",buffer:{bufferTimeAtTopQuality:30,bufferTimeAtTopQualityLongForm:60,bufferTimeDefault:12,bufferToKeep:20,bufferPruningInterval:10},retryAttempts:{MPD:4,MediaSegment:6,InitializationSegment:4,BitstreamSwitchingSegment:4},retryIntervals:{MPD:1e3,MediaSegment:1e3,InitializationSegment:1e3,BitstreamSwitchingSegment:1e3},abr:{autoSwitchBitrate:{video:!0,audio:!0}},text:{defaultEnabled:!0}}}),this._ttmlDiv=document.createElement("div"),this._ttmlDiv.className="vidply-dash-ttml",this._ttmlDiv.style.visibility="hidden";const s=this.player.videoWrapper||this.media.parentElement;s&&s.appendChild(this._ttmlDiv),this.dash.initialize(this.media,null,!1),this.dash.attachTTMLRenderingDiv(this._ttmlDiv);let a=this.player.currentSource;if(!a&&e&&(a=e),a||(a=this.player.element.getAttribute("data-vidply-src")),!a){const t=this.player.element.getAttribute("src")||this.player.element.src;t&&!t.startsWith("blob:")&&(a=t)}if(this.player.log(`Loading DASH source: ${a}`,"log"),!a)throw new Error("No DASH source found");this._pendingSrc=a,this._manifestUrl=a,this.dash.attachSource(a),this._dashSourceLoaded=!0,this.player.showPosterOverlay(),this.attachDashEvents(),this.attachMediaEvents(),this._setupCaptionSync()}async loadDashJs(){return t(this.player.options.dashScriptUrl||"https://cdn.jsdelivr.net/npm/dashjs@5.2.0/dist/modern/umd/dash.all.min.js",{integrity:this.player.options.dashScriptIntegrity})}_setTimeout(t,e){const i=setTimeout(()=>{this._pendingTimeouts=this._pendingTimeouts.filter(t=>t!==i),t()},e);return this._pendingTimeouts.push(i),i}attachDashEvents(){const t=window.dashjs,e=this.dash;if(!t||!e)return;const i=t.MediaPlayer.events;e.on(i.MANIFEST_LOADED,(...t)=>{const e=t[0],i=e?.data??e;this.player.log("DASH manifest loaded"),this.player.emit("dashmanifestloaded",i),this.player.container&&this.player.container.classList.remove("vidply-external-controls"),this._setTimeout(()=>{this._checkSubtitleTracks()},500)}),e.on(i.QUALITY_CHANGE_RENDERED,(...t)=>{const e=t[0];"video"===e.mediaType&&(this.player.log("DASH quality changed to index "+e.newQuality),this.player.emit("dashqualitychanged",e))}),e.on(i.TEXT_TRACKS_ADDED,(...t)=>{const i=t[0],s=i?.tracks??[];if(this._dashTextTracks=s,this._dashTextIsTtml=s.some(t=>t.isTTML||/stpp|ttml/i.test(t.codec||"")||/ttml/i.test(t.mimeType||"")),this.player.log(`DASH text tracks added: ${s.length} tracks, format: ${this._dashTextIsTtml?"TTML":"WebVTT"}`),this._dashSubtitleTracksCount=s.length,this.player.emit("dashsubtitletracksupdated",{tracks:s}),this.updateCaptionButtonsForDash(),s.length>0){try{e.setTextTrack(0)}catch{}this._dashTextIsTtml||this._startCueUpdatePolling()}}),e.on(i.STREAM_INITIALIZED,()=>{this.player.log("DASH stream initialized"),this.player.emit("dashstreaminitialized"),this._setTimeout(()=>{const t=this.getQualities();t.length>0&&this.player.emit("dashmanifestparsed",{qualities:t})},300)}),e.on(i.ERROR,(...t)=>{this.handleDashError(t[0])}),e.on(i.FRAGMENT_LOADING_COMPLETED,(...t)=>{const e=t[0];this.player.state.buffering=!1,"text"!==e?.request?.mediaType||this._dashTextIsTtml||this._setTimeout(()=>{const t=this._getTotalCueCount();t>this._lastKnownCueCount&&(this._lastKnownCueCount=t,this.player.emit("textcuesupdate"))},100)})}_getTotalCueCount(){const t=this.media.textTracks;let e=0;if(!t)return e;for(let i=0;i<t.length;i++){const s=t[i];!s||"subtitles"!==s.kind&&"captions"!==s.kind||s._vidplyStale||!s.cues||(e+=s.cues.length)}return e}_isTimeBuffered(t){const e=this.media.buffered;if(!e||0===e.length)return!1;for(let i=0;i<e.length;i++)if(t>=e.start(i)-.25&&t<=e.end(i)+.25)return!0;return!1}_setupCaptionSync(){this._captionEnabledHandler=t=>{this._dashTextIsTtml&&(t.track&&(t.track.mode="showing"),this._ttmlDiv&&(this._ttmlDiv.style.visibility="visible")),this._syncDashTextTrack(t)},this._captionDisabledHandler=()=>{if(this._dashTextIsTtml&&this._ttmlDiv&&(this._ttmlDiv.style.visibility="hidden"),this.dash)try{this.dash.setTextTrack(-1)}catch{}},this.player.on("captionsenabled",this._captionEnabledHandler),this.player.on("captionsdisabled",this._captionDisabledHandler)}_syncDashTextTrack(t){if(!this.dash||!this._dashTextTracks.length)return;const e=t.language;if(!e)return;const i=this._dashTextTracks.findIndex(t=>{const i=t.lang||t.language||t.srclang||"";return!!i&&(i===e||i.startsWith(e)||e.startsWith(i))});if(i>=0){this.player.log(`Syncing DASH text track to index ${i} (${e})`);try{this.dash.setTextTrack(i)}catch{}this._dashTextIsTtml||(this._lastKnownCueCount=0,this._startCueUpdatePolling())}}_startCueUpdatePolling(){this._stopCueUpdatePolling();let t=0,e=0;this._cueUpdateTimer=setInterval(()=>{const i=this._getTotalCueCount();i>t?(t=i,e=0,this.player.emit("textcuesupdate")):(e++,e>=8&&(this._stopCueUpdatePolling(),i>0&&this.player.emit("textcuesupdate")))},500)}_stopCueUpdatePolling(){this._cueUpdateTimer&&(clearInterval(this._cueUpdateTimer),this._cueUpdateTimer=null)}_checkSubtitleTracks(){if(void 0!==this._dashSubtitleTracksCount&&this._dashSubtitleTracksCount>0)return;const t=this.media.textTracks;let e=0;for(let i=0;i<t.length;i++){const s=t[i];!s||"subtitles"!==s.kind&&"captions"!==s.kind||s._vidplyStale||e++}this._dashSubtitleTracksCount=e,this.updateCaptionButtonsForDash()}updateCaptionButtonsForDash(t=0){const e=this._dashSubtitleTracksCount||0,i=()=>{if(this.player.invalidateTrackCache(),e>0){if(this.player.captionManager&&0===this.player.captionManager.refreshTracks()&&t<5){const e=200*(t+1);return this.player.log(`DASH caption tracks not yet on video element, retrying in ${e}ms (attempt ${t+1})`,"info"),void this._setTimeout(()=>{this.updateCaptionButtonsForDash(t+1)},e)}!this._dashTextIsTtml&&this.player.transcriptManager?.isVisible&&(this.player.transcriptManager.loadTranscriptData(),this.player.transcriptManager.updateLanguageSelector()),this.player.controlBar&&(this.player.controlBar.ensureCaptionsButton(),this._dashTextIsTtml||(this.player.controlBar.ensureCaptionStyleButton(),this.player.controlBar.ensureTranscriptButton()))}else this.player.captionManager&&this.player.captionManager.refreshTracks(),this.player.transcriptManager?.isVisible&&this.player.transcriptManager.hideTranscript(),this.player.controlBar&&this.player.controlBar.removeHlsCaptionButtons(!0)};if(this.player.controlBar)return void i();const s=()=>{this.player.off("ready",s),this._pendingReadyHandler=null,i()};this._pendingReadyHandler=s,this.player.on("ready",s)}attachMediaEvents(){const{signal:t}=this._listenerController;this.media.addEventListener("loadedmetadata",()=>{this.player.state.duration=this.media.duration,this.player.emit("loadedmetadata")},{signal:t}),this.media.addEventListener("durationchange",()=>{const t=this.media.duration;t&&isFinite(t)&&t>0&&(this.player.state.duration=t,this.player.emit("durationchange",t))},{signal:t}),this.media.addEventListener("play",()=>{this.player.state.playing=!0,this.player.state.paused=!1,this.player.state.ended=!1,this.player.emit("play"),this.player.options.onPlay&&this.player.options.onPlay.call(this.player)},{signal:t}),this.media.addEventListener("pause",()=>{this.player.state.playing=!1,this.player.state.paused=!0,this.player.emit("pause"),this.player.options.onPause&&this.player.options.onPause.call(this.player)},{signal:t}),this.media.addEventListener("ended",()=>{this.player.state.playing=!1,this.player.state.paused=!0,this.player.state.ended=!0,this.player.emit("ended"),this.player.options.onEnded&&this.player.options.onEnded.call(this.player),this.player.options.loop&&(this.player.seek(0),this.player.play())},{signal:t}),this.media.addEventListener("timeupdate",()=>{this.player.state.currentTime=this.media.currentTime,this.player.emit("timeupdate",this.media.currentTime),this.player.options.onTimeUpdate&&this.player.options.onTimeUpdate.call(this.player,this.media.currentTime)},{signal:t}),this.media.addEventListener("volumechange",()=>{this.player.state.volume=this.media.volume,this.player.state.muted=this.media.muted,this.player.emit("volumechange",this.media.volume)},{signal:t}),this.media.addEventListener("seeking",()=>{this.player.state.seeking=!0,this.player.emit("seeking"),this._isTimeBuffered(this.media.currentTime)||(this.player.state.buffering=!0,this.player.emit("waiting"))},{signal:t}),this.media.addEventListener("seeked",()=>{this.player.state.seeking=!1,this.player.emit("seeked")},{signal:t}),this.media.addEventListener("waiting",()=>{this.player.state.buffering=!0,this.player.emit("waiting")},{signal:t}),this.media.addEventListener("canplay",()=>{this.player.state.buffering=!1,this.player.emit("canplay")},{signal:t}),this.media.addEventListener("error",()=>{this.player.handleError(this.media.error)},{signal:t})}handleDashError(t){const e=t,i=e?.error??e;if(!i)return;const s=i.code??"",a=i.message||"";this.player.log(`DASH Error - Code: ${s}, Message: ${a}`,"warn"),"number"==typeof s&&s>=100?(this.player.log("Fatal DASH error","error"),this.player.handleError(new Error(`DASH Error: ${s} - ${a}`))):this.player.log("Non-fatal DASH error: "+(a||String(i)),"warn")}ensureLoaded(){if(!this.player.options.deferLoad)return;if(!this.dash)return;if(this._dashSourceLoaded)return;const t=this._pendingSrc||this.player._pendingSource||this.player.currentSource;if(t)try{this.dash.attachSource(t),this._dashSourceLoaded=!0}catch{}}play(){const t=window.scrollX,e=window.scrollY;if(this.player.options.deferLoad&&this.dash&&!this._dashSourceLoaded){const t=this._pendingSrc||this.player.currentSource;if(t)try{this.dash.attachSource(t),this._dashSourceLoaded=!0}catch{}}const i=this.media.play();window.scrollTo(t,e),void 0!==i&&i.catch(t=>{this.player.log("Play failed:",t,"warn")})}pause(){this.media.pause()}seek(t){this.media.currentTime=t}setVolume(t){this.media.volume=t}setMuted(t){this.media.muted=t}setPlaybackSpeed(t){this.media.playbackRate=t}switchQuality(t){this.dash&&(-1===t?"function"==typeof this.dash.setAutoSwitchQualityFor?this.dash.setAutoSwitchQualityFor("video",!0):this.dash.updateSettings({streaming:{abr:{autoSwitchBitrate:{video:!0}}}}):("function"==typeof this.dash.setAutoSwitchQualityFor?this.dash.setAutoSwitchQualityFor("video",!1):this.dash.updateSettings({streaming:{abr:{autoSwitchBitrate:{video:!1}}}}),"function"==typeof this.dash.setRepresentationForTypeByIndex?this.dash.setRepresentationForTypeByIndex("video",t):"function"==typeof this.dash.setQualityFor&&this.dash.setQualityFor("video",t,!0)))}getQualities(){if(!this.dash)return[];try{let t=null;if("function"==typeof this.dash.getRepresentationsByType&&(t=this.dash.getRepresentationsByType("video")),t&&t.length>0){const e={};return t.forEach(t=>{const i=Number(t.height)||0;e[i]=(e[i]||0)+1}),t.map((t,i)=>{const s=Number(t.height)||0,a=Number(t.bandwidth||t.bitrate)||0,r=a>0?Math.round(a/1e3):0;let n;return n=s>0&&(e[s]??0)>1&&r>0?`${s}p (${r} kbps)`:s>0?`${s}p`:r>0?`${r} kbps`:"Auto",{index:i,id:t.id,height:t.height,width:t.width,bitrate:a,name:n}})}const e=this.dash.getBitrateInfoListFor("video");if(!e||0===e.length)return[];const i={};return e.forEach(t=>{const e=Number(t.height)||0;i[e]=(i[e]||0)+1}),e.map((t,e)=>{const s=Number(t.height)||0,a=Number(t.bitrate)||0,r=a>0?Math.round(a/1e3):0;let n;return n=s>0&&(i[s]??0)>1&&r>0?`${s}p (${r} kbps)`:s>0?`${s}p`:r>0?`${r} kbps`:"Auto",{index:e,height:t.height,width:t.width,bitrate:t.bitrate,name:n}})}catch{return[]}}getCurrentQuality(){if(!this.dash)return-1;try{if("function"==typeof this.dash.getRepresentationsByType){const t=this.dash.getRepresentationsByType("video"),e=this.dash.getCurrentRepresentationForType?.("video");if(e&&t){const i=t.findIndex(t=>t.id===e.id);if(i>=0)return i}}return this.dash.getQualityFor("video")}catch{return-1}}handlesOwnCaptions(){return this._dashTextIsTtml}activateTextTrackForLanguage(t){if(!this.dash||!this._dashTextTracks.length||!t)return!1;let e=this._dashTextTracks.findIndex(e=>{const i=e.lang||e.language||e.srclang||"";return!!i&&(i===t||i.startsWith(t)||t.startsWith(i))});if(e<0&&(e=this._dashTextTracks.findIndex(e=>(e.label||e.labels||"").toString().toLowerCase().includes(t.toLowerCase()))),e<0)return!1;this.player.log(`Activating DASH text track index ${e} for transcript language "${t}"`);try{this.dash.setTextTrack(e)}catch{}if(this.media.paused){const t=this.media.currentTime,e=this.media.muted;this.media.muted=!0;const i=this.media.play(),s=()=>{this.media&&!this.media.paused&&(this.media.pause(),this.media.muted=e,Math.abs(this.media.currentTime-t)>.5&&(this.media.currentTime=t))};i&&"function"==typeof i.then?i.then(()=>{this._setTimeout(s,250)}).catch(()=>{this.media.muted=e}):this._setTimeout(s,250)}return this._dashTextIsTtml||(this._lastKnownCueCount=0,this._startCueUpdatePolling()),!0}getTextTrackURLs(){if(!this.dash||!this._manifestUrl)return[];try{const t=this.dash.getManifest?.();if(!t)return[];const e=this._manifestUrl.substring(0,this._manifestUrl.lastIndexOf("/")+1),i=[],s=t.Period||t.period||t.periods||t,a=Array.isArray(s)?s:[s];for(const t of a){const s=t.AdaptationSet||t.adaptationSet||t.AdaptationSet_asArray||[],a=Array.isArray(s)?s:[s];for(const t of a){const s=String(t.contentType||t.ContentType||""),a=String(t.mimeType||t.MimeType||"");if("text"!==s&&!/text\/vtt|application\/ttml/i.test(a))continue;const r=String(t.lang||t.language||""),n=t.Representation||t.representation||t.Representation_asArray||[],h=Array.isArray(n)?n:[n];for(const t of h){const s=t.BaseURL||t.baseURL||t.BaseURL_asArray;let a;if(Array.isArray(s)){const t=s[0];a="string"==typeof t?t:t?.__text}else a="string"==typeof s?s:s?.__text;if(!a)continue;const n=a.startsWith("http")?a:new URL(a,e).href;i.push({lang:r,url:n});break}}}return i}catch{return[]}}supportsAutoQuality(){return!0}isAutoQuality(){if(!this.dash)return!0;try{if("function"==typeof this.dash.getAutoSwitchQualityFor)return this.dash.getAutoSwitchQualityFor("video");const t=this.dash.getSettings?.();return!1!==t?.streaming?.abr?.autoSwitchBitrate?.video}catch{return!0}}destroy(){this._pendingTimeouts.forEach(t=>clearTimeout(t)),this._pendingTimeouts=[],this._stopCueUpdatePolling(),this._lastKnownCueCount=0,this._listenerController.abort(),this._pendingReadyHandler&&(this.player.off("ready",this._pendingReadyHandler),this._pendingReadyHandler=null),this._captionEnabledHandler&&(this.player.off("captionsenabled",this._captionEnabledHandler),this._captionEnabledHandler=null),this._captionDisabledHandler&&(this.player.off("captionsdisabled",this._captionDisabledHandler),this._captionDisabledHandler=null),this._ttmlDiv&&this._ttmlDiv.parentNode&&(this._ttmlDiv.parentNode.removeChild(this._ttmlDiv),this._ttmlDiv=null);const t=this.media.textTracks;for(let e=0;e<t.length;e++){const i=t[e];!i||"subtitles"!==i.kind&&"captions"!==i.kind||(i._vidplyStale=!0,i.mode="disabled")}if(this.dash){try{this.dash.updateSettings({debug:{logLevel:0}}),this.dash.reset()}catch{}try{this.dash.destroy()}catch{}this.dash=null}this._dashTextTracks=[],this._dashTextIsTtml=!1,this._manifestUrl=null}};export{e as DASHRenderer};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* VidPly v1.2.
|
|
2
|
+
* VidPly v1.2.3 - Universal, Accessible Video Player
|
|
3
3
|
* (c) 2026 Matthias Peltzer
|
|
4
4
|
* Released under GPL-2.0-or-later License
|
|
5
5
|
*/
|
|
6
|
-
import{DraggableResizable as t}from"./vidply.chunk-2TB6MUHO.min.js";import{createIconElement as e}from"./vidply.chunk-ABPXVDLZ.min.js";import{DOMUtils as i,i18n as s}from"./vidply.chunk-EKEYJWMG.min.js";var a="vidply:floating-claim",l=240,n=16,r=class{player;classPrefix;shell;dragHandle;closeButton;resizeHandles;placeholder;draggable;originalParent;originalNextSibling;intersectionObserver;observerTarget;lastRatio;_autoDismissedThisPlay;_playListenerAttached;_onPlayAfterDismiss;_onClaim;_onResize;_onKeyDown;_onEnterFullscreen;_destroyed;_triggerFocusEl;_claimId;_lastAutoExitTime;constructor(t){this.player=t,this.classPrefix=t.options.classPrefix||"vidply",this.shell=null,this.dragHandle=null,this.closeButton=null,this.resizeHandles=[],this.placeholder=null,this.draggable=null,this.originalParent=null,this.originalNextSibling=null,this.intersectionObserver=null,this.observerTarget=null,this.lastRatio=1,this._autoDismissedThisPlay=!1,this._playListenerAttached=!1,this._onPlayAfterDismiss=null,this._onClaim=null,this._onResize=null,this._onKeyDown=null,this._onEnterFullscreen=null,this._destroyed=!1,this._triggerFocusEl=null,this._claimId=`floating-${t.instanceId}-${Date.now()}`,this._lastAutoExitTime=0,this._setupClaimListener(),this._setupFullscreenGuard(),this._startObserving()}togglePinned(t){if(!this._destroyed){if("pinned"===this.player.state.floating)return this._autoDismissedThisPlay=!0,this._armPlayListenerToClearDismiss(),void this.exit("manual");this._autoDismissedThisPlay=!1,this._triggerFocusEl=t||this._activeElement(),this.enter("pinned")}}enter(t){if(!this._destroyed&&this.player.state.floating!==t&&this._canFloat(t)){if(this.player.state.floating&&this.player.state.floating!==t)return this.player.state.floating=t,void this.player.emit("floatingchange",t);this._claimSingleton(),this._ensureShell(),this._mountIntoShell(),this._applyInitialGeometry(),this.player.state.floating=t,this.player.emit("floatingchange",t),queueMicrotask(()=>{if(this.closeButton&&this.player.state.floating)try{this.closeButton.focus({preventScroll:!0})}catch{}})}}exit(t="manual"){if(this._destroyed&&"destroy"!==t)return;if(!this.player.state.floating)return;"auto"===t&&(this._lastAutoExitTime=Date.now()),this._unmountFromShell(),this._teardownShell();const e=this._triggerFocusEl;if(this._triggerFocusEl=null,this.player.state.floating=null,this.player.emit("floatingchange",null),("manual"===t||"dismiss"===t)&&e)try{e.focus({preventScroll:!0})}catch{}}dismiss(){if(!this._destroyed){this._autoDismissedThisPlay=!0,this._armPlayListenerToClearDismiss();try{this.player.pause()}catch{}this.exit("dismiss")}}destroy(){if(this._destroyed)return;if(this._destroyed=!0,this.player.state&&this.player.state.floating)try{this.exit("destroy")}catch{}if(this.intersectionObserver){try{this.intersectionObserver.disconnect()}catch{}this.intersectionObserver=null}this.observerTarget=null,this._onClaim&&(window.removeEventListener(a,this._onClaim),this._onClaim=null),this._onResize&&(window.removeEventListener("resize",this._onResize),this._onResize=null);const t=this._onEnterFullscreen;t&&(this.player.off("enterfullscreen",t),this._onEnterFullscreen=null);const e=this._onPlayAfterDismiss;e&&this._playListenerAttached&&(this.player.off("play",e),this._playListenerAttached=!1,this._onPlayAfterDismiss=null)}_canFloat(t){if(!this.player.options.floating)return!1;if(!this.player.container)return!1;if(!this.player.element||"VIDEO"!==this.player.element.tagName)return!1;if(this.player.state.fullscreen)return!1;if(this.player.playlistManager)return!1;if(window.innerWidth<(this.player.options.floatingMinViewportWidth??768))return!1;if("auto"===t){if(this._autoDismissedThisPlay)return!1;if(this.player.state.paused)return!1;if(!this.player.state.hasStartedPlayback)return!1}return!0}_claimSingleton(){try{window.dispatchEvent(new CustomEvent(a,{detail:{claimId:this._claimId}}))}catch{}}_setupClaimListener(){this._onClaim=t=>{const e=t.detail;e&&e.claimId!==this._claimId&&this.player.state.floating&&this.exit("claim")};const t=this.player.lifecycleSignal;window.addEventListener(a,this._onClaim,{signal:t}),this._onResize=()=>{this.player.state.floating&&window.innerWidth<(this.player.options.floatingMinViewportWidth??768)&&this.exit("auto")},window.addEventListener("resize",this._onResize,{signal:t})}_setupFullscreenGuard(){const t=()=>{this.player.state.floating&&this.exit("manual")};this._onEnterFullscreen=t,this.player.on("enterfullscreen",t)}_armPlayListenerToClearDismiss(){if(this._playListenerAttached)return;const t=()=>{this._autoDismissedThisPlay=!1;const t=this._onPlayAfterDismiss;t&&this.player.off("play",t),this._playListenerAttached=!1,this._onPlayAfterDismiss=null};this._onPlayAfterDismiss=t,this.player.on("play",t),this._playListenerAttached=!0}_startObserving(){"IntersectionObserver"in window&&this.player.container&&(this.observerTarget=this.player.container,this.intersectionObserver=new IntersectionObserver(t=>{const e=t[t.length-1];if(e){if(this.lastRatio=e.intersectionRatio,this.player.options.debug)try{console.log("[vidply:floating] intersection",{ratio:Number(e.intersectionRatio.toFixed(3)),state:this.player.state.floating,paused:this.player.state.paused,hasStartedPlayback:this.player.state.hasStartedPlayback,dismissed:this._autoDismissedThisPlay})}catch{}if("auto"!==this.player.state.floating){if("pinned"!==this.player.state.floating&&e.intersectionRatio<.1&&this._canFloat("auto")){const t=500;if(Date.now()-this._lastAutoExitTime<t)return;this.enter("auto")}}else e.intersectionRatio>=.5&&this.exit("auto")}},{threshold:[0,.1,.5,.9]}),this.intersectionObserver.observe(this.observerTarget))}_retargetObserver(t){if(this.intersectionObserver){if(this.observerTarget)try{this.intersectionObserver.unobserve(this.observerTarget)}catch{}this.observerTarget=t;try{this.intersectionObserver.observe(t)}catch{}}}_ensureShell(){if(this.shell)return;this.shell=i.createElement("div",{className:`${this.classPrefix}-floating-shell`,attributes:{role:"dialog","aria-modal":"false","aria-label":s.t("player.floatingPlayer"),"data-vidply-floating":"true",tabindex:"-1"}}),this.dragHandle=i.createElement("div",{className:`${this.classPrefix}-floating-drag-handle`,attributes:{"aria-hidden":"true"}}),this.shell.appendChild(this.dragHandle),this.closeButton=i.createElement("button",{className:`${this.classPrefix}-floating-close`,attributes:{type:"button","aria-label":s.t("player.floatingPlayerClose"),title:s.t("player.floatingPlayerClose")}}),this.closeButton.appendChild(e("close")),this.closeButton.addEventListener("click",t=>{t.stopPropagation(),this.dismiss()}),this.shell.appendChild(this.closeButton),this._createResizeHandles();const t=this.shell;this.resizeHandles.forEach(e=>t.appendChild(e)),this._onKeyDown=t=>{if("Escape"===t.key){const e=this.draggable;if(e&&(e.keyboardDragMode||e.keyboardResizeMode||e.pointerResizeMode))return;t.stopPropagation(),this.dismiss()}},this.shell.addEventListener("keydown",this._onKeyDown)}_createResizeHandles(){this.resizeHandles=["n","s","e","w","ne","nw","se","sw"].map(t=>i.createElement("div",{className:`${this.classPrefix}-floating-resize-handle ${this.classPrefix}-floating-resize-${t}`,attributes:{"data-direction":t,"aria-hidden":"true"}}))}_teardownShell(){if(this.draggable){try{this.draggable.destroy()}catch{}this.draggable=null}this.shell&&(this._onKeyDown&&(this.shell.removeEventListener("keydown",this._onKeyDown),this._onKeyDown=null),this.shell.parentNode&&this.shell.parentNode.removeChild(this.shell)),this.shell=null,this.dragHandle=null,this.closeButton=null,this.resizeHandles=[]}_mountIntoShell(){const t=this.player.container;if(!t||!t.parentNode)return;if(!this.shell)return;const s=t.getBoundingClientRect();this.originalParent=t.parentNode,this.originalNextSibling=t.nextSibling,this.placeholder=i.createElement("div",{className:`${this.classPrefix}-floating-placeholder`,attributes:{"aria-hidden":"true"}}),this.placeholder.style.width=`${Math.max(1,s.width)}px`,this.placeholder.style.height=`${Math.max(1,s.height)}px`;const a=e("pip",`${this.classPrefix}-floating-placeholder-icon`);this.placeholder.appendChild(a),this.originalParent.insertBefore(this.placeholder,t),this.shell.appendChild(t),document.body.appendChild(this.shell),t.classList.add(`${this.classPrefix}-is-floating`),this._retargetObserver(this.placeholder)}_unmountFromShell(){const t=this.player.container;t&&(t.classList.remove(`${this.classPrefix}-is-floating`),t.style.removeProperty("width"),t.style.removeProperty("height")),this.placeholder&&this.placeholder.parentNode?(t&&this.placeholder.parentNode.insertBefore(t,this.placeholder),this.placeholder.parentNode.removeChild(this.placeholder)):t&&this.originalParent&&(this.originalNextSibling&&this.originalNextSibling.parentNode===this.originalParent?this.originalParent.insertBefore(t,this.originalNextSibling):this.originalParent.appendChild(t)),this.placeholder=null,this.originalParent=null,this.originalNextSibling=null,t&&this._retargetObserver(t)}_applyInitialGeometry(){if(!this.shell)return;const t=this.player.storage?.getFloatingPreferences?.()||{},e=window.innerWidth,i=window.innerHeight;let s=t.width&&t.width>=l?t.width:400;s=Math.min(s,Math.max(l,e-32));const a=this.player.container?.getBoundingClientRect(),r=Math.round(s/(a&&a.height>0?a.width/a.height:16/9));let h,o,d=t.height&&t.height>=100?t.height:r;if(d=Math.min(d,Math.max(100,i-32)),"number"==typeof t.left&&"number"==typeof t.top)h=Math.max(n,Math.min(t.left,e-s-n)),o=Math.max(n,Math.min(t.top,i-d-n));else switch(this.player.options.floatingPosition||"bottom-right"){case"bottom-left":h=n,o=i-d-n;break;case"top-right":h=e-s-n,o=n;break;case"top-left":h=n,o=n;break;default:h=e-s-n,o=i-d-n}this.shell.style.width=`${s}px`,this.shell.style.height=`${d}px`,this.shell.style.left=`${h}px`,this.shell.style.top=`${o}px`,this._initDraggable()}_initDraggable(){this.shell&&(this.draggable||(this.draggable=new t(this.shell,{dragHandle:this.dragHandle,resizeHandles:this.resizeHandles,constrainToViewport:!0,maintainAspectRatio:!0,minWidth:l,minHeight:100,maxWidth:()=>Math.max(l,window.innerWidth-32),maxHeight:()=>Math.max(100,window.innerHeight-32),classPrefix:`${this.classPrefix}-floating`,keyboardDragKey:"d",keyboardResizeKey:"r",keyboardStep:10,keyboardStepLarge:50,pointerResizeIndicatorText:s.t("player.floatingPlayerDialog"),onDragEnd:()=>this._savePrefs(),onResizeEnd:()=>this._savePrefs(),onDragStart:t=>{const e=t.target;return!e||!e.closest(`.${this.classPrefix}-floating-close`)&&!e.closest(`.${this.classPrefix}-controls`)&&!e.closest(`.${this.classPrefix}-floating-resize-handle`)}})))}_savePrefs(){if(!this.shell||!this.player.storage?.saveFloatingPreferences)return;const t=this.shell.getBoundingClientRect();this.player.storage.saveFloatingPreferences({width:Math.round(t.width),height:Math.round(t.height),left:Math.round(t.left),top:Math.round(t.top)})}_activeElement(){const t=document.activeElement;return t&&t instanceof HTMLElement?t:null}};export{r as FloatingPlayerManager};
|
|
6
|
+
import{DraggableResizable as t}from"./vidply.chunk-PL3P3JHR.min.js";import{createIconElement as e}from"./vidply.chunk-6OGHHIYP.min.js";import{DOMUtils as i,i18n as s}from"./vidply.chunk-QQZGV7TD.min.js";var a="vidply:floating-claim",l=240,n=16,r=class{player;classPrefix;shell;dragHandle;closeButton;resizeHandles;placeholder;draggable;originalParent;originalNextSibling;intersectionObserver;observerTarget;lastRatio;_autoDismissedThisPlay;_playListenerAttached;_onPlayAfterDismiss;_onClaim;_onResize;_onKeyDown;_onEnterFullscreen;_destroyed;_triggerFocusEl;_claimId;_lastAutoExitTime;constructor(t){this.player=t,this.classPrefix=t.options.classPrefix||"vidply",this.shell=null,this.dragHandle=null,this.closeButton=null,this.resizeHandles=[],this.placeholder=null,this.draggable=null,this.originalParent=null,this.originalNextSibling=null,this.intersectionObserver=null,this.observerTarget=null,this.lastRatio=1,this._autoDismissedThisPlay=!1,this._playListenerAttached=!1,this._onPlayAfterDismiss=null,this._onClaim=null,this._onResize=null,this._onKeyDown=null,this._onEnterFullscreen=null,this._destroyed=!1,this._triggerFocusEl=null,this._claimId=`floating-${t.instanceId}-${Date.now()}`,this._lastAutoExitTime=0,this._setupClaimListener(),this._setupFullscreenGuard(),this._startObserving()}togglePinned(t){if(!this._destroyed){if("pinned"===this.player.state.floating)return this._autoDismissedThisPlay=!0,this._armPlayListenerToClearDismiss(),void this.exit("manual");this._autoDismissedThisPlay=!1,this._triggerFocusEl=t||this._activeElement(),this.enter("pinned")}}enter(t){if(!this._destroyed&&this.player.state.floating!==t&&this._canFloat(t)){if(this.player.state.floating&&this.player.state.floating!==t)return this.player.state.floating=t,void this.player.emit("floatingchange",t);this._claimSingleton(),this._ensureShell(),this._mountIntoShell(),this._applyInitialGeometry(),this.player.state.floating=t,this.player.emit("floatingchange",t),queueMicrotask(()=>{if(this.closeButton&&this.player.state.floating)try{this.closeButton.focus({preventScroll:!0})}catch{}})}}exit(t="manual"){if(this._destroyed&&"destroy"!==t)return;if(!this.player.state.floating)return;"auto"===t&&(this._lastAutoExitTime=Date.now()),this._unmountFromShell(),this._teardownShell();const e=this._triggerFocusEl;if(this._triggerFocusEl=null,this.player.state.floating=null,this.player.emit("floatingchange",null),("manual"===t||"dismiss"===t)&&e)try{e.focus({preventScroll:!0})}catch{}}dismiss(){if(!this._destroyed){this._autoDismissedThisPlay=!0,this._armPlayListenerToClearDismiss();try{this.player.pause()}catch{}this.exit("dismiss")}}destroy(){if(this._destroyed)return;if(this._destroyed=!0,this.player.state&&this.player.state.floating)try{this.exit("destroy")}catch{}if(this.intersectionObserver){try{this.intersectionObserver.disconnect()}catch{}this.intersectionObserver=null}this.observerTarget=null,this._onClaim&&(window.removeEventListener(a,this._onClaim),this._onClaim=null),this._onResize&&(window.removeEventListener("resize",this._onResize),this._onResize=null);const t=this._onEnterFullscreen;t&&(this.player.off("enterfullscreen",t),this._onEnterFullscreen=null);const e=this._onPlayAfterDismiss;e&&this._playListenerAttached&&(this.player.off("play",e),this._playListenerAttached=!1,this._onPlayAfterDismiss=null)}_canFloat(t){if(!this.player.options.floating)return!1;if(!this.player.container)return!1;if(!this.player.element||"VIDEO"!==this.player.element.tagName)return!1;if(this.player.state.fullscreen)return!1;if(this.player.playlistManager)return!1;if(window.innerWidth<(this.player.options.floatingMinViewportWidth??768))return!1;if("auto"===t){if(this._autoDismissedThisPlay)return!1;if(this.player.state.paused)return!1;if(!this.player.state.hasStartedPlayback)return!1}return!0}_claimSingleton(){try{window.dispatchEvent(new CustomEvent(a,{detail:{claimId:this._claimId}}))}catch{}}_setupClaimListener(){this._onClaim=t=>{const e=t.detail;e&&e.claimId!==this._claimId&&this.player.state.floating&&this.exit("claim")};const t=this.player.lifecycleSignal;window.addEventListener(a,this._onClaim,{signal:t}),this._onResize=()=>{this.player.state.floating&&window.innerWidth<(this.player.options.floatingMinViewportWidth??768)&&this.exit("auto")},window.addEventListener("resize",this._onResize,{signal:t})}_setupFullscreenGuard(){const t=()=>{this.player.state.floating&&this.exit("manual")};this._onEnterFullscreen=t,this.player.on("enterfullscreen",t)}_armPlayListenerToClearDismiss(){if(this._playListenerAttached)return;const t=()=>{this._autoDismissedThisPlay=!1;const t=this._onPlayAfterDismiss;t&&this.player.off("play",t),this._playListenerAttached=!1,this._onPlayAfterDismiss=null};this._onPlayAfterDismiss=t,this.player.on("play",t),this._playListenerAttached=!0}_startObserving(){"IntersectionObserver"in window&&this.player.container&&(this.observerTarget=this.player.container,this.intersectionObserver=new IntersectionObserver(t=>{const e=t[t.length-1];if(e){if(this.lastRatio=e.intersectionRatio,this.player.options.debug)try{console.log("[vidply:floating] intersection",{ratio:Number(e.intersectionRatio.toFixed(3)),state:this.player.state.floating,paused:this.player.state.paused,hasStartedPlayback:this.player.state.hasStartedPlayback,dismissed:this._autoDismissedThisPlay})}catch{}if("auto"!==this.player.state.floating){if("pinned"!==this.player.state.floating&&e.intersectionRatio<.1&&this._canFloat("auto")){const t=500;if(Date.now()-this._lastAutoExitTime<t)return;this.enter("auto")}}else e.intersectionRatio>=.5&&this.exit("auto")}},{threshold:[0,.1,.5,.9]}),this.intersectionObserver.observe(this.observerTarget))}_retargetObserver(t){if(this.intersectionObserver){if(this.observerTarget)try{this.intersectionObserver.unobserve(this.observerTarget)}catch{}this.observerTarget=t;try{this.intersectionObserver.observe(t)}catch{}}}_ensureShell(){if(this.shell)return;this.shell=i.createElement("div",{className:`${this.classPrefix}-floating-shell`,attributes:{role:"dialog","aria-modal":"false","aria-label":s.t("player.floatingPlayer"),"data-vidply-floating":"true",tabindex:"-1"}}),this.dragHandle=i.createElement("div",{className:`${this.classPrefix}-floating-drag-handle`,attributes:{"aria-hidden":"true"}}),this.shell.appendChild(this.dragHandle),this.closeButton=i.createElement("button",{className:`${this.classPrefix}-floating-close`,attributes:{type:"button","aria-label":s.t("player.floatingPlayerClose"),title:s.t("player.floatingPlayerClose")}}),this.closeButton.appendChild(e("close")),this.closeButton.addEventListener("click",t=>{t.stopPropagation(),this.dismiss()}),this.shell.appendChild(this.closeButton),this._createResizeHandles();const t=this.shell;this.resizeHandles.forEach(e=>t.appendChild(e)),this._onKeyDown=t=>{if("Escape"===t.key){const e=this.draggable;if(e&&(e.keyboardDragMode||e.keyboardResizeMode||e.pointerResizeMode))return;t.stopPropagation(),this.dismiss()}},this.shell.addEventListener("keydown",this._onKeyDown)}_createResizeHandles(){this.resizeHandles=["n","s","e","w","ne","nw","se","sw"].map(t=>i.createElement("div",{className:`${this.classPrefix}-floating-resize-handle ${this.classPrefix}-floating-resize-${t}`,attributes:{"data-direction":t,"aria-hidden":"true"}}))}_teardownShell(){if(this.draggable){try{this.draggable.destroy()}catch{}this.draggable=null}this.shell&&(this._onKeyDown&&(this.shell.removeEventListener("keydown",this._onKeyDown),this._onKeyDown=null),this.shell.parentNode&&this.shell.parentNode.removeChild(this.shell)),this.shell=null,this.dragHandle=null,this.closeButton=null,this.resizeHandles=[]}_mountIntoShell(){const t=this.player.container;if(!t||!t.parentNode)return;if(!this.shell)return;const s=t.getBoundingClientRect();this.originalParent=t.parentNode,this.originalNextSibling=t.nextSibling,this.placeholder=i.createElement("div",{className:`${this.classPrefix}-floating-placeholder`,attributes:{"aria-hidden":"true"}}),this.placeholder.style.width=`${Math.max(1,s.width)}px`,this.placeholder.style.height=`${Math.max(1,s.height)}px`;const a=e("pip",`${this.classPrefix}-floating-placeholder-icon`);this.placeholder.appendChild(a),this.originalParent.insertBefore(this.placeholder,t),this.shell.appendChild(t),document.body.appendChild(this.shell),t.classList.add(`${this.classPrefix}-is-floating`),this._retargetObserver(this.placeholder)}_unmountFromShell(){const t=this.player.container;t&&(t.classList.remove(`${this.classPrefix}-is-floating`),t.style.removeProperty("width"),t.style.removeProperty("height")),this.placeholder&&this.placeholder.parentNode?(t&&this.placeholder.parentNode.insertBefore(t,this.placeholder),this.placeholder.parentNode.removeChild(this.placeholder)):t&&this.originalParent&&(this.originalNextSibling&&this.originalNextSibling.parentNode===this.originalParent?this.originalParent.insertBefore(t,this.originalNextSibling):this.originalParent.appendChild(t)),this.placeholder=null,this.originalParent=null,this.originalNextSibling=null,t&&this._retargetObserver(t)}_applyInitialGeometry(){if(!this.shell)return;const t=this.player.storage?.getFloatingPreferences?.()||{},e=window.innerWidth,i=window.innerHeight;let s=t.width&&t.width>=l?t.width:400;s=Math.min(s,Math.max(l,e-32));const a=this.player.container?.getBoundingClientRect(),r=Math.round(s/(a&&a.height>0?a.width/a.height:16/9));let h,o,d=t.height&&t.height>=100?t.height:r;if(d=Math.min(d,Math.max(100,i-32)),"number"==typeof t.left&&"number"==typeof t.top)h=Math.max(n,Math.min(t.left,e-s-n)),o=Math.max(n,Math.min(t.top,i-d-n));else switch(this.player.options.floatingPosition||"bottom-right"){case"bottom-left":h=n,o=i-d-n;break;case"top-right":h=e-s-n,o=n;break;case"top-left":h=n,o=n;break;default:h=e-s-n,o=i-d-n}this.shell.style.width=`${s}px`,this.shell.style.height=`${d}px`,this.shell.style.left=`${h}px`,this.shell.style.top=`${o}px`,this._initDraggable()}_initDraggable(){this.shell&&(this.draggable||(this.draggable=new t(this.shell,{dragHandle:this.dragHandle,resizeHandles:this.resizeHandles,constrainToViewport:!0,maintainAspectRatio:!0,minWidth:l,minHeight:100,maxWidth:()=>Math.max(l,window.innerWidth-32),maxHeight:()=>Math.max(100,window.innerHeight-32),classPrefix:`${this.classPrefix}-floating`,keyboardDragKey:"d",keyboardResizeKey:"r",keyboardStep:10,keyboardStepLarge:50,pointerResizeIndicatorText:s.t("player.floatingPlayerDialog"),onDragEnd:()=>this._savePrefs(),onResizeEnd:()=>this._savePrefs(),onDragStart:t=>{const e=t.target;return!e||!e.closest(`.${this.classPrefix}-floating-close`)&&!e.closest(`.${this.classPrefix}-controls`)&&!e.closest(`.${this.classPrefix}-floating-resize-handle`)}})))}_savePrefs(){if(!this.shell||!this.player.storage?.saveFloatingPreferences)return;const t=this.shell.getBoundingClientRect();this.player.storage.saveFloatingPreferences({width:Math.round(t.width),height:Math.round(t.height),left:Math.round(t.left),top:Math.round(t.top)})}_activeElement(){const t=document.activeElement;return t&&t instanceof HTMLElement?t:null}};export{r as FloatingPlayerManager};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* VidPly v1.2.
|
|
2
|
+
* VidPly v1.2.3 - Universal, Accessible Video Player
|
|
3
3
|
* (c) 2026 Matthias Peltzer
|
|
4
4
|
* Released under GPL-2.0-or-later License
|
|
5
5
|
*/
|
|
6
|
-
import{loadScriptOnce as t}from"./vidply.chunk-P4UXOHWA.min.js";var e=class{player;media;hls;get isStreaming(){return null!=this.hls}_hlsSourceLoaded;_pendingSrc;_hlsSubtitleTracksCount;_cueUpdateTimer;_lastKnownCueCount;_nativeTrackListenersDestroyed;_didDeferredLoad;_manifestUrl;_loadingForSeekOnly;_cleanupNativeTextTrackListeners;_listenerController;_timers;_pendingReadyHandler;constructor(t){this.player=t,this.media=t.element,this.hls=null,this._hlsSourceLoaded=!1,this._pendingSrc=null,this._hlsSubtitleTracksCount=void 0,this._cueUpdateTimer=null,this._lastKnownCueCount=0,this._manifestUrl=null,this._cleanupNativeTextTrackListeners=()=>{},this._listenerController=new AbortController,this._timers=new Set,this._pendingReadyHandler=null}_setTimeout(t,e){const i=setTimeout(()=>{this._timers.delete(i),t()},e);this._timers.add(i)}_clearTimers(){for(const t of this._timers)clearTimeout(t);this._timers.clear()}async init(){this.canPlayNatively()?(this.player.log("Using native HLS support"),await this.initNative()):(this.player.log("Using hls.js for HLS support"),await this.initHlsJs())}canPlayNatively(){const t=/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,e="MacIntel"===navigator.platform&&navigator.maxTouchPoints>1;return!(!t&&!e)&&""!==document.createElement("video").canPlayType("application/vnd.apple.mpegurl")}async initNative(){const{HTML5Renderer:t}=await import("./vidply.HTML5Renderer-IU5T3WEW.min.js"),e=new t(this.player);await e.init(),this.play=()=>e.play(),this.pause=()=>e.pause(),this.seek=t=>e.seek(t),this.setVolume=t=>e.setVolume(t),this.setMuted=t=>e.setMuted(t),this.setPlaybackSpeed=t=>e.setPlaybackSpeed(t),this.ensureLoaded=()=>e.ensureLoaded?.(),this.getQualities=()=>e.getQualities?.()??[],this.switchQuality=t=>e.switchQuality?.(t),this.getCurrentQuality=()=>e.getCurrentQuality?.()??0,this._attachNativeTextTrackListeners(),this.destroy=()=>{this._cleanupNativeTextTrackListeners(),this._clearTimers(),this._pendingReadyHandler&&(this.player.off("ready",this._pendingReadyHandler),this._pendingReadyHandler=null),e.destroy()}}_attachNativeTextTrackListeners(){let t;const e=()=>{clearTimeout(t),t=setTimeout(()=>{if(this._nativeTrackListenersDestroyed)return;const t=this.media.textTracks;let e=0;for(let i=0;i<t.length;i++){const s=t[i]?.kind;"subtitles"!==s&&"captions"!==s||e++}this._hlsSubtitleTracksCount=e,this.updateCaptionButtonsForHls()},150)};this.media.textTracks.addEventListener("addtrack",e),this.media.textTracks.addEventListener("removetrack",e),this.media.addEventListener("loadedmetadata",e),this._cleanupNativeTextTrackListeners=()=>{this._nativeTrackListenersDestroyed=!0,clearTimeout(t),this.media.textTracks.removeEventListener("addtrack",e),this.media.textTracks.removeEventListener("removetrack",e),this.media.removeEventListener("loadedmetadata",e)}}async initHlsJs(){this.media.controls=!1,this.media.removeAttribute("controls"),window.Hls||await this.loadHlsJs();const t=window.Hls;if(!t?.isSupported())throw new Error("HLS is not supported in this browser");const e=Array.from(this.media.querySelectorAll("source"));let i=null;e.length>0&&(i=e[0]?.getAttribute("src")??null,e.forEach(t=>t.remove()),this.player.log("Removed <source> elements for HTML5 validity (hls.js uses src attribute)")),this.hls=new t({debug:this.player.options.debug,autoStartLoad:!1,enableWorker:!0,lowLatencyMode:!1,backBufferLength:90,maxBufferLength:12,maxMaxBufferLength:60,maxBufferSize:3e7,maxBufferHole:.5,manifestLoadingTimeOut:1e4,manifestLoadingMaxRetry:4,manifestLoadingRetryDelay:1e3,manifestLoadingMaxRetryTimeout:64e3,levelLoadingTimeOut:1e4,levelLoadingMaxRetry:4,levelLoadingRetryDelay:1e3,levelLoadingMaxRetryTimeout:64e3,fragLoadingTimeOut:2e4,fragLoadingMaxRetry:6,fragLoadingRetryDelay:1e3,fragLoadingMaxRetryTimeout:64e3}),this.hls.attachMedia(this.media);let s=this.player.currentSource;if(!s&&i&&(s=i),s||(s=this.player.element.getAttribute("data-vidply-src")),!s){const t=this.player.element.getAttribute("src")||this.player.element.src;t&&!t.startsWith("blob:")&&(s=t)}if(this.player.log(`Loading HLS source: ${s}`,"log"),!s)throw new Error("No HLS source found");this._pendingSrc=s,this._manifestUrl=s,this.hls.loadSource(s),this._hlsSourceLoaded=!0,this.attachHlsEvents(),this.attachMediaEvents()}async loadHlsJs(){return t(this.player.options.hlsScriptUrl||"https://cdn.jsdelivr.net/npm/hls.js@1.6.16/dist/hls.min.js",{integrity:this.player.options.hlsScriptIntegrity})}attachHlsEvents(){const t=this.hls,e=window.Hls;t&&e&&(t.on(e.Events.MANIFEST_PARSED,(...t)=>{const e=t[1];this.player.log("HLS manifest loaded, found "+e.levels.length+" quality levels"),this.player.emit("hlsmanifestparsed",e),this.player.container&&this.player.container.classList.remove("vidply-external-controls"),this._setTimeout(()=>{void 0!==this._hlsSubtitleTracksCount&&0!==this._hlsSubtitleTracksCount||0===(this.hls?.subtitleTracks?.length||0)&&(this._hlsSubtitleTracksCount=0,this.updateCaptionButtonsForHls())},500)}),t.on(e.Events.LEVEL_SWITCHED,(...t)=>{const e=t[1];this.player.log("HLS level switched to "+e.level),this.player.emit("hlslevelswitched",e)}),t.on(e.Events.SUBTITLE_TRACKS_UPDATED,(...t)=>{const e=t[1];this.player.log("HLS subtitle tracks updated, found "+e.subtitleTracks.length+" tracks"),this.player.emit("hlssubtitletracksupdated",e),this._hlsSubtitleTracksCount=e.subtitleTracks.length,this.updateCaptionButtonsForHls(),e.subtitleTracks.length>0&&this._startCueUpdatePolling()}),t.on(e.Events.SUBTITLE_TRACK_SWITCH,(...t)=>{const e=t[1];this.player.log("HLS subtitle track switched to "+e.id),this.player.emit("hlssubtitletrackswitch",e),this._lastKnownCueCount=0,this._startCueUpdatePolling()}),t.on(e.Events.ERROR,(...t)=>{this.handleHlsError(t[1])}),t.on(e.Events.FRAG_BUFFERED,()=>{if(this.player.state.buffering=!1,this.media.paused){if(this._loadingForSeekOnly&&this._isTimeBuffered(this.media.currentTime)){this._loadingForSeekOnly=!1;try{t.stopLoad()}catch{}}}else this._loadingForSeekOnly=!1}),t.on(e.Events.SUBTITLE_FRAG_PROCESSED,(...t)=>{const e=t[1];if(!e||!e.success)return;const i=this._getTotalCueCount();i>this._lastKnownCueCount&&(this._lastKnownCueCount=i,this.player.emit("textcuesupdate"))}),t.on(e.Events.CUES_PARSED,()=>{this.player.emit("textcuesupdate")}))}_getTotalCueCount(){const t=this.media.textTracks;let e=0;if(!t)return e;for(let i=0;i<t.length;i++){const s=t[i];s&&("subtitles"===s.kind||"captions"===s.kind)&&s.cues&&(e+=s.cues.length)}return e}_isTimeBuffered(t){const e=this.media.buffered;if(!e||0===e.length)return!1;for(let i=0;i<e.length;i++)if(t>=e.start(i)-.25&&t<=e.end(i)+.25)return!0;return!1}_startCueUpdatePolling(){this._stopCueUpdatePolling();let t=0,e=0;this._cueUpdateTimer=setInterval(()=>{const i=this._getTotalCueCount();i>t?(t=i,e=0,this.player.emit("textcuesupdate")):(e++,e>=8&&(this._stopCueUpdatePolling(),i>0&&this.player.emit("textcuesupdate")))},500)}_stopCueUpdatePolling(){this._cueUpdateTimer&&(clearInterval(this._cueUpdateTimer),this._cueUpdateTimer=null)}updateCaptionButtonsForHls(t=0){const e=this._hlsSubtitleTracksCount||0,i=()=>{if(this.player.invalidateTrackCache(),e>0){if(this.player.captionManager&&0===this.player.captionManager.refreshTracks()&&t<5){const e=200*(t+1);return this.player.log(`HLS caption tracks not yet on video element, retrying in ${e}ms (attempt ${t+1})`,"info"),void this._setTimeout(()=>{this.updateCaptionButtonsForHls(t+1)},e)}this.player.transcriptManager?.isVisible&&(this.player.transcriptManager.loadTranscriptData(),this.player.transcriptManager.updateLanguageSelector()),this.player.controlBar&&(this.player.controlBar.ensureCaptionsButton(),this.player.controlBar.ensureCaptionStyleButton(),this.player.controlBar.ensureTranscriptButton())}else this.player.captionManager&&this.player.captionManager.refreshTracks(),this.player.transcriptManager?.isVisible&&this.player.transcriptManager.hideTranscript(),this.player.controlBar&&this.player.controlBar.removeHlsCaptionButtons(!0)};if(this.player.controlBar)return void i();const s=()=>{this.player.off("ready",s),this._pendingReadyHandler=null,i()};this._pendingReadyHandler=s,this.player.on("ready",s)}attachMediaEvents(){const{signal:t}=this._listenerController;this.media.addEventListener("loadedmetadata",()=>{this.player.state.duration=this.media.duration,this.player.emit("loadedmetadata")},{signal:t}),this.media.addEventListener("durationchange",()=>{const t=this.media.duration;t&&isFinite(t)&&t>0&&(this.player.state.duration=t,this.player.emit("durationchange",t))},{signal:t}),this.media.addEventListener("play",()=>{this.player.state.playing=!0,this.player.state.paused=!1,this.player.state.ended=!1,this.player.emit("play"),this.player.options.onPlay&&this.player.options.onPlay.call(this.player)},{signal:t}),this.media.addEventListener("pause",()=>{this.player.state.playing=!1,this.player.state.paused=!0,this.player.emit("pause"),this.player.options.onPause&&this.player.options.onPause.call(this.player)},{signal:t}),this.media.addEventListener("ended",()=>{this.player.state.playing=!1,this.player.state.paused=!0,this.player.state.ended=!0,this.player.emit("ended"),this.player.options.onEnded&&this.player.options.onEnded.call(this.player),this.player.options.loop&&(this.player.seek(0),this.player.play())},{signal:t}),this.media.addEventListener("timeupdate",()=>{this.player.state.currentTime=this.media.currentTime,this.player.emit("timeupdate",this.media.currentTime),this.player.options.onTimeUpdate&&this.player.options.onTimeUpdate.call(this.player,this.media.currentTime)},{signal:t}),this.media.addEventListener("volumechange",()=>{this.player.state.volume=this.media.volume,this.player.state.muted=this.media.muted,this.player.emit("volumechange",this.media.volume)},{signal:t}),this.media.addEventListener("waiting",()=>{this.player.state.buffering=!0,this.player.emit("waiting")},{signal:t}),this.media.addEventListener("seeking",()=>{this.player.state.seeking=!0,this.player.emit("seeking"),this._isTimeBuffered(this.media.currentTime)||(this.player.state.buffering=!0,this.player.emit("waiting"))},{signal:t}),this.media.addEventListener("seeked",()=>{if(this.player.state.seeking=!1,this.player.emit("seeked"),this.media.paused&&this.hls)try{this.hls.stopLoad()}catch{}},{signal:t}),this.media.addEventListener("canplay",()=>{this.player.state.buffering=!1,this.player.emit("canplay")},{signal:t}),this.media.addEventListener("error",()=>{this.player.handleError(this.media.error)},{signal:t})}handleHlsError(t){if(this.player.log(`HLS Error - Type: ${t.type}, Details: ${t.details}, Fatal: ${t.fatal}`,"warn"),t.response&&this.player.log(`Response code: ${t.response.code}, URL: ${t.response.url}`,"warn"),t.fatal){const e=window.Hls?.ErrorTypes;switch(t.type){case e?.NETWORK_ERROR:this.player.log("Fatal network error, trying to recover...","error"),this.player.log(`Network error details: ${t.details}`,"error"),this._setTimeout(()=>{this.hls?.startLoad()},1e3);break;case e?.MEDIA_ERROR:this.player.log("Fatal media error, trying to recover...","error"),this.hls?.recoverMediaError();break;default:this.player.log("Fatal error, cannot recover","error"),this.player.handleError(new Error(`HLS Error: ${t.type} - ${t.details}`)),this.hls?.destroy()}}else this.player.log("Non-fatal HLS error: "+t.details,"warn")}ensureLoaded(){if(this.hls&&!this._didDeferredLoad){try{this.hls.startLoad(-1)}catch{}this._didDeferredLoad=!0}}play(){const t=window.scrollX,e=window.scrollY;if(this.hls){this._loadingForSeekOnly=!1;try{this.hls.startLoad(-1)}catch{}this._didDeferredLoad=!0}const i=this.media.play();window.scrollTo(t,e),void 0!==i&&i.catch(t=>{this.player.log("Play failed:",t,"warn")})}pause(){if(this.media.pause(),this.hls)try{this.hls.stopLoad()}catch{}}seek(t){if(this.media.currentTime=t,this.hls){this.media.paused&&(this._loadingForSeekOnly=!0);try{this.hls.startLoad(-1)}catch{}}}setVolume(t){this.media.volume=t}setMuted(t){this.media.muted=t}setPlaybackSpeed(t){this.media.playbackRate=t}switchQuality(t){this.hls&&(this.hls.currentLevel=t)}getQualities(){if(this.hls&&this.hls.levels){const t=new Map;return this.hls.levels.forEach((e,i)=>{const s=Number(e.height)||0,a=Number(e.bitrate)||0,r=s>0?s:`br_${a}`,n=t.get(r);(!n||a>(n.bitrate||0))&&t.set(r,{index:i,height:e.height,width:e.width,bitrate:a,level:e})}),Array.from(t.values()).map(t=>{const e=Number(t.height)||0,i=t.bitrate>0?Math.round(t.bitrate/1e3):0;return{index:t.index,height:t.height,width:t.width,bitrate:t.bitrate,name:e>0?`${e}p`:i>0?`${i} kb`:"Auto"}})}return[]}getCurrentQuality(){return this.hls?this.hls.currentLevel:-1}activateTextTrackForLanguage(t){if(!this.hls||!t)return!1;const e=this.hls.subtitleTracks;if(!e||0===e.length)return!1;const i=e.findIndex(e=>{const i=e.lang||e.language||"";return i===t||i.startsWith(t)||t.startsWith(i)});return!(i<0||(this.player.log(`Activating HLS subtitle track index ${i} for language "${t}"`),this.hls.subtitleTrack=i,this._lastKnownCueCount=0,this._startCueUpdatePolling(),0))}getTextTrackURLs(){if(!this.hls||!this._manifestUrl)return[];try{const t=this.hls.subtitleTracks;if(!t||0===t.length)return[];const e=[];for(const i of t){const t=i.lang||i.language||"",s=i.url;t&&s&&e.push({lang:t,url:s})}return e}catch{return[]}}supportsAutoQuality(){return!0}isAutoQuality(){return-1===this.hls?.currentLevel}destroy(){this._stopCueUpdatePolling(),this._clearTimers(),this._listenerController.abort(),this._pendingReadyHandler&&(this.player.off("ready",this._pendingReadyHandler),this._pendingReadyHandler=null),this._lastKnownCueCount=0,this._manifestUrl=null,this.hls&&(this.hls.destroy(),this.hls=null)}};export{e as HLSRenderer};
|
|
6
|
+
import{loadScriptOnce as t}from"./vidply.chunk-5HTX5QXW.min.js";var e=class{player;media;hls;get isStreaming(){return null!=this.hls}_hlsSourceLoaded;_pendingSrc;_hlsSubtitleTracksCount;_cueUpdateTimer;_lastKnownCueCount;_nativeTrackListenersDestroyed;_didDeferredLoad;_manifestUrl;_loadingForSeekOnly;_cleanupNativeTextTrackListeners;_listenerController;_timers;_pendingReadyHandler;constructor(t){this.player=t,this.media=t.element,this.hls=null,this._hlsSourceLoaded=!1,this._pendingSrc=null,this._hlsSubtitleTracksCount=void 0,this._cueUpdateTimer=null,this._lastKnownCueCount=0,this._manifestUrl=null,this._cleanupNativeTextTrackListeners=()=>{},this._listenerController=new AbortController,this._timers=new Set,this._pendingReadyHandler=null}_setTimeout(t,e){const i=setTimeout(()=>{this._timers.delete(i),t()},e);this._timers.add(i)}_clearTimers(){for(const t of this._timers)clearTimeout(t);this._timers.clear()}async init(){this.canPlayNatively()?(this.player.log("Using native HLS support"),await this.initNative()):(this.player.log("Using hls.js for HLS support"),await this.initHlsJs())}canPlayNatively(){const t=/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,e="MacIntel"===navigator.platform&&navigator.maxTouchPoints>1;return!(!t&&!e)&&""!==document.createElement("video").canPlayType("application/vnd.apple.mpegurl")}async initNative(){const{HTML5Renderer:t}=await import("./vidply.HTML5Renderer-XRDJUTOO.min.js"),e=new t(this.player);await e.init(),this.play=()=>e.play(),this.pause=()=>e.pause(),this.seek=t=>e.seek(t),this.setVolume=t=>e.setVolume(t),this.setMuted=t=>e.setMuted(t),this.setPlaybackSpeed=t=>e.setPlaybackSpeed(t),this.ensureLoaded=()=>e.ensureLoaded?.(),this.getQualities=()=>e.getQualities?.()??[],this.switchQuality=t=>e.switchQuality?.(t),this.getCurrentQuality=()=>e.getCurrentQuality?.()??0,this._attachNativeTextTrackListeners(),this.destroy=()=>{this._cleanupNativeTextTrackListeners(),this._clearTimers(),this._pendingReadyHandler&&(this.player.off("ready",this._pendingReadyHandler),this._pendingReadyHandler=null),e.destroy()}}_attachNativeTextTrackListeners(){let t;const e=()=>{clearTimeout(t),t=setTimeout(()=>{if(this._nativeTrackListenersDestroyed)return;const t=this.media.textTracks;let e=0;for(let i=0;i<t.length;i++){const s=t[i]?.kind;"subtitles"!==s&&"captions"!==s||e++}this._hlsSubtitleTracksCount=e,this.updateCaptionButtonsForHls()},150)};this.media.textTracks.addEventListener("addtrack",e),this.media.textTracks.addEventListener("removetrack",e),this.media.addEventListener("loadedmetadata",e),this._cleanupNativeTextTrackListeners=()=>{this._nativeTrackListenersDestroyed=!0,clearTimeout(t),this.media.textTracks.removeEventListener("addtrack",e),this.media.textTracks.removeEventListener("removetrack",e),this.media.removeEventListener("loadedmetadata",e)}}async initHlsJs(){this.media.controls=!1,this.media.removeAttribute("controls"),window.Hls||await this.loadHlsJs();const t=window.Hls;if(!t?.isSupported())throw new Error("HLS is not supported in this browser");const e=Array.from(this.media.querySelectorAll("source"));let i=null;e.length>0&&(i=e[0]?.getAttribute("src")??null,e.forEach(t=>t.remove()),this.player.log("Removed <source> elements for HTML5 validity (hls.js uses src attribute)")),this.hls=new t({debug:this.player.options.debug,autoStartLoad:!1,enableWorker:!0,lowLatencyMode:!1,backBufferLength:90,maxBufferLength:12,maxMaxBufferLength:60,maxBufferSize:3e7,maxBufferHole:.5,manifestLoadingTimeOut:1e4,manifestLoadingMaxRetry:4,manifestLoadingRetryDelay:1e3,manifestLoadingMaxRetryTimeout:64e3,levelLoadingTimeOut:1e4,levelLoadingMaxRetry:4,levelLoadingRetryDelay:1e3,levelLoadingMaxRetryTimeout:64e3,fragLoadingTimeOut:2e4,fragLoadingMaxRetry:6,fragLoadingRetryDelay:1e3,fragLoadingMaxRetryTimeout:64e3}),this.hls.attachMedia(this.media);let s=this.player.currentSource;if(!s&&i&&(s=i),s||(s=this.player.element.getAttribute("data-vidply-src")),!s){const t=this.player.element.getAttribute("src")||this.player.element.src;t&&!t.startsWith("blob:")&&(s=t)}if(this.player.log(`Loading HLS source: ${s}`,"log"),!s)throw new Error("No HLS source found");this._pendingSrc=s,this._manifestUrl=s,this.hls.loadSource(s),this._hlsSourceLoaded=!0,this.attachHlsEvents(),this.attachMediaEvents()}async loadHlsJs(){return t(this.player.options.hlsScriptUrl||"https://cdn.jsdelivr.net/npm/hls.js@1.6.16/dist/hls.min.js",{integrity:this.player.options.hlsScriptIntegrity})}attachHlsEvents(){const t=this.hls,e=window.Hls;t&&e&&(t.on(e.Events.MANIFEST_PARSED,(...t)=>{const e=t[1];this.player.log("HLS manifest loaded, found "+e.levels.length+" quality levels"),this.player.emit("hlsmanifestparsed",e),this.player.container&&this.player.container.classList.remove("vidply-external-controls"),this._setTimeout(()=>{void 0!==this._hlsSubtitleTracksCount&&0!==this._hlsSubtitleTracksCount||0===(this.hls?.subtitleTracks?.length||0)&&(this._hlsSubtitleTracksCount=0,this.updateCaptionButtonsForHls())},500)}),t.on(e.Events.LEVEL_SWITCHED,(...t)=>{const e=t[1];this.player.log("HLS level switched to "+e.level),this.player.emit("hlslevelswitched",e)}),t.on(e.Events.SUBTITLE_TRACKS_UPDATED,(...t)=>{const e=t[1];this.player.log("HLS subtitle tracks updated, found "+e.subtitleTracks.length+" tracks"),this.player.emit("hlssubtitletracksupdated",e),this._hlsSubtitleTracksCount=e.subtitleTracks.length,this.updateCaptionButtonsForHls(),e.subtitleTracks.length>0&&this._startCueUpdatePolling()}),t.on(e.Events.SUBTITLE_TRACK_SWITCH,(...t)=>{const e=t[1];this.player.log("HLS subtitle track switched to "+e.id),this.player.emit("hlssubtitletrackswitch",e),this._lastKnownCueCount=0,this._startCueUpdatePolling()}),t.on(e.Events.ERROR,(...t)=>{this.handleHlsError(t[1])}),t.on(e.Events.FRAG_BUFFERED,()=>{if(this.player.state.buffering=!1,this.media.paused){if(this._loadingForSeekOnly&&this._isTimeBuffered(this.media.currentTime)){this._loadingForSeekOnly=!1;try{t.stopLoad()}catch{}}}else this._loadingForSeekOnly=!1}),t.on(e.Events.SUBTITLE_FRAG_PROCESSED,(...t)=>{const e=t[1];if(!e||!e.success)return;const i=this._getTotalCueCount();i>this._lastKnownCueCount&&(this._lastKnownCueCount=i,this.player.emit("textcuesupdate"))}),t.on(e.Events.CUES_PARSED,()=>{this.player.emit("textcuesupdate")}))}_getTotalCueCount(){const t=this.media.textTracks;let e=0;if(!t)return e;for(let i=0;i<t.length;i++){const s=t[i];s&&("subtitles"===s.kind||"captions"===s.kind)&&s.cues&&(e+=s.cues.length)}return e}_isTimeBuffered(t){const e=this.media.buffered;if(!e||0===e.length)return!1;for(let i=0;i<e.length;i++)if(t>=e.start(i)-.25&&t<=e.end(i)+.25)return!0;return!1}_startCueUpdatePolling(){this._stopCueUpdatePolling();let t=0,e=0;this._cueUpdateTimer=setInterval(()=>{const i=this._getTotalCueCount();i>t?(t=i,e=0,this.player.emit("textcuesupdate")):(e++,e>=8&&(this._stopCueUpdatePolling(),i>0&&this.player.emit("textcuesupdate")))},500)}_stopCueUpdatePolling(){this._cueUpdateTimer&&(clearInterval(this._cueUpdateTimer),this._cueUpdateTimer=null)}updateCaptionButtonsForHls(t=0){const e=this._hlsSubtitleTracksCount||0,i=()=>{if(this.player.invalidateTrackCache(),e>0){if(this.player.captionManager&&0===this.player.captionManager.refreshTracks()&&t<5){const e=200*(t+1);return this.player.log(`HLS caption tracks not yet on video element, retrying in ${e}ms (attempt ${t+1})`,"info"),void this._setTimeout(()=>{this.updateCaptionButtonsForHls(t+1)},e)}this.player.transcriptManager?.isVisible&&(this.player.transcriptManager.loadTranscriptData(),this.player.transcriptManager.updateLanguageSelector()),this.player.controlBar&&(this.player.controlBar.ensureCaptionsButton(),this.player.controlBar.ensureCaptionStyleButton(),this.player.controlBar.ensureTranscriptButton())}else this.player.captionManager&&this.player.captionManager.refreshTracks(),this.player.transcriptManager?.isVisible&&this.player.transcriptManager.hideTranscript(),this.player.controlBar&&this.player.controlBar.removeHlsCaptionButtons(!0)};if(this.player.controlBar)return void i();const s=()=>{this.player.off("ready",s),this._pendingReadyHandler=null,i()};this._pendingReadyHandler=s,this.player.on("ready",s)}attachMediaEvents(){const{signal:t}=this._listenerController;this.media.addEventListener("loadedmetadata",()=>{this.player.state.duration=this.media.duration,this.player.emit("loadedmetadata")},{signal:t}),this.media.addEventListener("durationchange",()=>{const t=this.media.duration;t&&isFinite(t)&&t>0&&(this.player.state.duration=t,this.player.emit("durationchange",t))},{signal:t}),this.media.addEventListener("play",()=>{this.player.state.playing=!0,this.player.state.paused=!1,this.player.state.ended=!1,this.player.emit("play"),this.player.options.onPlay&&this.player.options.onPlay.call(this.player)},{signal:t}),this.media.addEventListener("pause",()=>{this.player.state.playing=!1,this.player.state.paused=!0,this.player.emit("pause"),this.player.options.onPause&&this.player.options.onPause.call(this.player)},{signal:t}),this.media.addEventListener("ended",()=>{this.player.state.playing=!1,this.player.state.paused=!0,this.player.state.ended=!0,this.player.emit("ended"),this.player.options.onEnded&&this.player.options.onEnded.call(this.player),this.player.options.loop&&(this.player.seek(0),this.player.play())},{signal:t}),this.media.addEventListener("timeupdate",()=>{this.player.state.currentTime=this.media.currentTime,this.player.emit("timeupdate",this.media.currentTime),this.player.options.onTimeUpdate&&this.player.options.onTimeUpdate.call(this.player,this.media.currentTime)},{signal:t}),this.media.addEventListener("volumechange",()=>{this.player.state.volume=this.media.volume,this.player.state.muted=this.media.muted,this.player.emit("volumechange",this.media.volume)},{signal:t}),this.media.addEventListener("waiting",()=>{this.player.state.buffering=!0,this.player.emit("waiting")},{signal:t}),this.media.addEventListener("seeking",()=>{this.player.state.seeking=!0,this.player.emit("seeking"),this._isTimeBuffered(this.media.currentTime)||(this.player.state.buffering=!0,this.player.emit("waiting"))},{signal:t}),this.media.addEventListener("seeked",()=>{if(this.player.state.seeking=!1,this.player.emit("seeked"),this.media.paused&&this.hls)try{this.hls.stopLoad()}catch{}},{signal:t}),this.media.addEventListener("canplay",()=>{this.player.state.buffering=!1,this.player.emit("canplay")},{signal:t}),this.media.addEventListener("error",()=>{this.player.handleError(this.media.error)},{signal:t})}handleHlsError(t){if(this.player.log(`HLS Error - Type: ${t.type}, Details: ${t.details}, Fatal: ${t.fatal}`,"warn"),t.response&&this.player.log(`Response code: ${t.response.code}, URL: ${t.response.url}`,"warn"),t.fatal){const e=window.Hls?.ErrorTypes;switch(t.type){case e?.NETWORK_ERROR:this.player.log("Fatal network error, trying to recover...","error"),this.player.log(`Network error details: ${t.details}`,"error"),this._setTimeout(()=>{this.hls?.startLoad()},1e3);break;case e?.MEDIA_ERROR:this.player.log("Fatal media error, trying to recover...","error"),this.hls?.recoverMediaError();break;default:this.player.log("Fatal error, cannot recover","error"),this.player.handleError(new Error(`HLS Error: ${t.type} - ${t.details}`)),this.hls?.destroy()}}else this.player.log("Non-fatal HLS error: "+t.details,"warn")}ensureLoaded(){if(this.hls&&!this._didDeferredLoad){try{this.hls.startLoad(-1)}catch{}this._didDeferredLoad=!0}}play(){const t=window.scrollX,e=window.scrollY;if(this.hls){this._loadingForSeekOnly=!1;try{this.hls.startLoad(-1)}catch{}this._didDeferredLoad=!0}const i=this.media.play();window.scrollTo(t,e),void 0!==i&&i.catch(t=>{this.player.log("Play failed:",t,"warn")})}pause(){if(this.media.pause(),this.hls)try{this.hls.stopLoad()}catch{}}seek(t){if(this.media.currentTime=t,this.hls){this.media.paused&&(this._loadingForSeekOnly=!0);try{this.hls.startLoad(-1)}catch{}}}setVolume(t){this.media.volume=t}setMuted(t){this.media.muted=t}setPlaybackSpeed(t){this.media.playbackRate=t}switchQuality(t){this.hls&&(this.hls.currentLevel=t)}getQualities(){if(this.hls&&this.hls.levels){const t=new Map;return this.hls.levels.forEach((e,i)=>{const s=Number(e.height)||0,a=Number(e.bitrate)||0,r=s>0?s:`br_${a}`,n=t.get(r);(!n||a>(n.bitrate||0))&&t.set(r,{index:i,height:e.height,width:e.width,bitrate:a,level:e})}),Array.from(t.values()).map(t=>{const e=Number(t.height)||0,i=t.bitrate>0?Math.round(t.bitrate/1e3):0;return{index:t.index,height:t.height,width:t.width,bitrate:t.bitrate,name:e>0?`${e}p`:i>0?`${i} kb`:"Auto"}})}return[]}getCurrentQuality(){return this.hls?this.hls.currentLevel:-1}activateTextTrackForLanguage(t){if(!this.hls||!t)return!1;const e=this.hls.subtitleTracks;if(!e||0===e.length)return!1;const i=e.findIndex(e=>{const i=e.lang||e.language||"";return i===t||i.startsWith(t)||t.startsWith(i)});return!(i<0||(this.player.log(`Activating HLS subtitle track index ${i} for language "${t}"`),this.hls.subtitleTrack=i,this._lastKnownCueCount=0,this._startCueUpdatePolling(),0))}getTextTrackURLs(){if(!this.hls||!this._manifestUrl)return[];try{const t=this.hls.subtitleTracks;if(!t||0===t.length)return[];const e=[];for(const i of t){const t=i.lang||i.language||"",s=i.url;t&&s&&e.push({lang:t,url:s})}return e}catch{return[]}}supportsAutoQuality(){return!0}isAutoQuality(){return-1===this.hls?.currentLevel}destroy(){this._stopCueUpdatePolling(),this._clearTimers(),this._listenerController.abort(),this._pendingReadyHandler&&(this.player.off("ready",this._pendingReadyHandler),this._pendingReadyHandler=null),this._lastKnownCueCount=0,this._manifestUrl=null,this.hls&&(this.hls.destroy(),this.hls=null)}};export{e as HLSRenderer};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* VidPly v1.2.
|
|
2
|
+
* VidPly v1.2.3 - Universal, Accessible Video Player
|
|
3
3
|
* (c) 2026 Matthias Peltzer
|
|
4
4
|
* Released under GPL-2.0-or-later License
|
|
5
5
|
*/
|
|
6
|
-
import{DraggablePanel as e,createLabeledSelect as t,preventDragOnElement as i}from"./vidply.chunk-YEENJS3Q.min.js";import{DraggableResizable as a}from"./vidply.chunk-2TB6MUHO.min.js";import{createIconElement as s}from"./vidply.chunk-ABPXVDLZ.min.js";import"./vidply.chunk-P3PQBY7N.min.js";import"./vidply.chunk-WX3MVEAL.min.js";import{DOMUtils as n,i18n as r}from"./vidply.chunk-EKEYJWMG.min.js";var l=class{player;_mainViewMutedBefore;_mainViewUsingSourceSwap;currentLanguage;customKeyHandler;desiredPosition;draggable;handlers;header;inMainView;interactionHandlers;mainViewOriginalSources;mainViewOriginalSrc;resizeHandles;selector;settingsButton;settingsHandlers;sources;src;enabled;video;wrapper;_panel=null;get settingsMenu(){return this._panel?.settingsMenu??null}set settingsMenu(e){}get settingsMenuVisible(){return this._panel?.settingsMenuVisible??!1}set settingsMenuVisible(e){}get settingsMenuJustOpened(){return this._panel?.justOpened??!1}set settingsMenuJustOpened(e){}get dragOptionButton(){return this._panel?.dragOptionButton??null}get dragOptionText(){return this._panel?.dragOptionText??null}get resizeOptionButton(){return this._panel?.resizeOptionButton??null}get resizeOptionText(){return this._panel?.resizeOptionText??null}constructor(e){this.player=e,this.src=e.options.signLanguageSrc,this.sources=e.options.signLanguageSources||{},this.currentLanguage=null,this.desiredPosition=e.options.signLanguagePosition||"bottom-right",this.wrapper=null,this.header=null,this.video=null,this.selector=null,this.settingsButton=null,this.resizeHandles=[],this.enabled=!1,this.inMainView=!1,this.mainViewOriginalSrc=null,this.mainViewOriginalSources=null,this._mainViewUsingSourceSwap=!1,this._mainViewMutedBefore=!1,this.handlers=null,this.settingsHandlers=null,this.interactionHandlers=null,this.draggable=null,this.customKeyHandler=null}isAvailable(){return Object.keys(this.sources).length>0||Boolean(this.src)}enable(){const e=Object.keys(this.sources).length>0,t=Boolean(this.src);if(!e&&!t)return void console.warn("No sign language video source provided");if(this.wrapper)return this.wrapper.style.display="block",this.enabled=!0,this.player.state.signLanguageEnabled=!0,this.player.emit("signlanguageenabled"),void this.player.setManagedTimeout(()=>{this.settingsButton&&document.contains(this.settingsButton)&&this.settingsButton.focus({preventScroll:!0})},150);let i=null,a=null;e?(i=this._determineInitialLanguage(),a=this.sources[i]??null,this.currentLanguage=i):a=this.src,this._createWrapper(),this._createHeader(e,i),this._createVideo(a),this._createResizeHandles();const s=this.wrapper,n=this.video;s&&n&&(s.appendChild(this.header),s.appendChild(n),this.resizeHandles.forEach(e=>s.appendChild(e)),this._applyInitialSize(),this.player.container.appendChild(s),requestAnimationFrame(()=>{this.constrainPosition()}),n.currentTime=this.player.state.currentTime,this.player.state.paused||n.play(),this._setupInteraction(),this._setupEventHandlers(e),this.enabled=!0,this.player.state.signLanguageEnabled=!0,this.player.emit("signlanguageenabled"),this.player.setManagedTimeout(()=>{this.settingsButton&&document.contains(this.settingsButton)&&this.settingsButton.focus({preventScroll:!0})},150))}disable(){this.settingsMenuVisible&&this.hideSettingsMenu({focusButton:!1}),this._hideModeBadge(),this.wrapper&&(this.wrapper.style.display="none"),this.enabled=!1,this.player.state.signLanguageEnabled=!1,this.player.emit("signlanguagedisabled")}toggle(){this.enabled?this.disable():this.enable()}async enableInMainView(){const e=Object.keys(this.sources).length>0,t=Boolean(this.src);if(!e&&!t)return;if(!this.player.element||"VIDEO"!==this.player.element.tagName)return;if(this.inMainView)return;let i;if(e){const e=this._determineInitialLanguage();this.currentLanguage=e,i=this.sources[e]}else i=this.src;const a=this.player.element,s=this.player.state.currentTime,n=this.player.state.playing,r=a.poster||a.getAttribute("poster")||this.player.options.poster,l=s<.1&&!n,o=Array.from(a.querySelectorAll("source")),h=o[0];if(this.mainViewOriginalSrc=a.currentSrc&&a.currentSrc.length>0?a.currentSrc:a.src&&a.src.length>0?a.src:h&&h.getAttribute("src")?h.getAttribute("src"):"",this._mainViewMutedBefore=this.player.state.muted,r&&l&&"VIDEO"===a.tagName&&(a.poster=r),o.length>0){this.mainViewOriginalSources=o,this.mainViewOriginalSources.forEach(e=>e.remove());const e=document.createElement("source"),t=i??"";e.setAttribute("src",t);const s=this._inferVideoType(t);s&&e.setAttribute("type",s);const n=a.querySelector("track");n?a.insertBefore(e,n):a.appendChild(e),this._mainViewUsingSourceSwap=!0}else a.src=i??"",this._mainViewUsingSourceSwap=!1;a.muted=!0,this.player.currentSource=i??"","function"==typeof this.player.invalidateTrackCache&&this.player.invalidateTrackCache(),a.load(),await this._waitForMediaReadyMainView(s>0||n),s>0&&(this.player.seek(s),await new Promise(e=>setTimeout(e,100))),n?await this.player.play():(this.player.pause(),!l&&this.player.hidePosterOverlay&&this.player.hidePosterOverlay()),this.inMainView=!0,this.player.state.signLanguageInMainView=!0,this.player.videoWrapper&&this.player.videoWrapper.classList.add("vidply-sign-language-main-view-active"),this.player.emit("signlanguageinmainviewenabled")}async disableInMainView(){if(!this.inMainView)return;if(!this.mainViewOriginalSrc&&!this.mainViewOriginalSources)return this.inMainView=!1,this.player.state.signLanguageInMainView=!1,this.player.videoWrapper&&this.player.videoWrapper.classList.remove("vidply-sign-language-main-view-active"),void this.player.emit("signlanguageinmainviewdisabled");const e=this.player.element,t=this.player.state.currentTime,i=this.player.state.playing;if(this._mainViewUsingSourceSwap&&this.mainViewOriginalSources&&this.mainViewOriginalSources.length>0){Array.from(e.querySelectorAll("source")).forEach(e=>e.remove());const t=e.querySelector("track");this.mainViewOriginalSources.forEach(i=>{t?e.insertBefore(i,t):e.appendChild(i)}),this._mainViewUsingSourceSwap=!1}else this.mainViewOriginalSrc&&(e.src=this.mainViewOriginalSrc);if(e.muted=this._mainViewMutedBefore,this.player.currentSource=this.mainViewOriginalSrc||e.querySelector("source")?.src||"","function"==typeof this.player.invalidateTrackCache&&this.player.invalidateTrackCache(),e.load(),await this._waitForMediaReadyMainView(t>0||i),t>0&&this.player.seek(t),i)try{await this.player.play()}catch(e){this.player.log?.("Sign language main view: play after restore failed",e,"warn")}this.mainViewOriginalSrc=null,this.mainViewOriginalSources=null,this.inMainView=!1,this.player.state.signLanguageInMainView=!1,this.player.videoWrapper&&this.player.videoWrapper.classList.remove("vidply-sign-language-main-view-active"),this.player.emit("signlanguageinmainviewdisabled")}async _waitForMediaReadyMainView(e=!1){const t=this.player.element,i=new Promise(e=>{if(t.readyState>=1)return void e();const i=()=>{t.removeEventListener("loadedmetadata",i),t.removeEventListener("error",a),e()},a=()=>{t.removeEventListener("loadedmetadata",i),t.removeEventListener("error",a),e()};t.addEventListener("loadedmetadata",i),t.addEventListener("error",a,{once:!0})}),a=new Promise(e=>setTimeout(e,1e4));await Promise.race([i,a]),await new Promise(e=>setTimeout(e,300)),e&&await new Promise(e=>{if(t.readyState>=3)e();else{const i=()=>{t.removeEventListener("canplay",i),t.removeEventListener("canplaythrough",i),e()};t.addEventListener("canplay",i,{once:!0}),t.addEventListener("canplaythrough",i,{once:!0}),setTimeout(()=>{t.removeEventListener("canplay",i),t.removeEventListener("canplaythrough",i),e()},3e3)}})}toggleInMainView(){this.inMainView?this.disableInMainView():this.enableInMainView()}switchLanguage(e){if(this.sources[e]){if(this.currentLanguage=e,this.video){const t=this.video.currentTime,i=!this.video.paused;this.video.src=this.sources[e],this.video.currentTime=t,i&&this.video.play().catch(e=>{"undefined"!=typeof console&&console.debug&&console.debug("[VidPly] sign-language play() rejected:",e)})}if(this.inMainView&&this.player.element&&"VIDEO"===this.player.element.tagName){const t=this.player.state.currentTime,i=this.player.state.playing;if(this._mainViewUsingSourceSwap){const t=this.player.element.querySelector("source");if(t){t.setAttribute("src",this.sources[e]);const i=this._inferVideoType(this.sources[e]);i&&t.setAttribute("type",i)}}else this.player.element.src=this.sources[e];this.player.currentSource=this.sources[e],"function"==typeof this.player.invalidateTrackCache&&this.player.invalidateTrackCache(),this.player.element.load(),this._waitForMediaReadyMainView(!0).then(()=>{t>0&&this.player.seek(t),i&&this.player.play()})}this.player.emit("signlanguagelanguagechanged",e)}}_inferVideoType(e){if(!e)return"";const t=(e.split("?")[0]??"").toLowerCase();return t.endsWith(".mp4")?"video/mp4":t.endsWith(".webm")?"video/webm":t.endsWith(".ogv")||t.endsWith(".ogg")?"video/ogg":""}getLanguageLabel(e){return{en:"English",de:"Deutsch",es:"Español",fr:"Français",it:"Italiano",ja:"日本語",pt:"Português",ar:"العربية",hi:"हिन्दी"}[e]||e.toUpperCase()}_determineInitialLanguage(){if(this.player.captionManager&&this.player.captionManager.currentTrack){const e=this.player.captionManager.currentTrack.language?.toLowerCase().split("-")[0];if(e&&this.sources[e])return e}if(this.player.options.language){const e=this.player.options.language.toLowerCase().split("-")[0];if(e&&this.sources[e])return e}return Object.keys(this.sources)[0]??""}_createWrapper(){this.wrapper=document.createElement("div"),this.wrapper.className="vidply-sign-language-wrapper",this.wrapper.setAttribute("tabindex","0"),this.wrapper.setAttribute("aria-label",r.t("player.signLanguageDragResize"))}_createHeader(e,t){const i=this.player.options.classPrefix;this.header=n.createElement("div",{className:`${i}-sign-language-header`,attributes:{tabindex:"0"}});const a=n.createElement("div",{className:`${i}-sign-language-header-left`}),s=n.createElement("h3",{textContent:r.t("player.signLanguageVideo")});this._createSettingsButton(a),e&&this._createLanguageSelector(a,t),a.appendChild(s);const l=this._createCloseButton();this.header.appendChild(a),this.header.appendChild(l)}_createSettingsButton(t){const i=this.player.options.classPrefix,a=r.t("player.signLanguageSettings");this.settingsButton=n.createElement("button",{className:`${i}-sign-language-settings`,attributes:{type:"button","aria-label":a,"aria-expanded":"false"}}),this.settingsButton.appendChild(s("settings")),n.attachTooltip(this.settingsButton,a,i),this._panel=new e({player:this.player,namespace:"sign-language",settingsButton:this.settingsButton,getDraggable:()=>this.draggable,i18nKeys:{enableDrag:"player.enableSignDragMode",disableDrag:"player.disableSignDragMode",enableDragAria:"player.enableSignDragModeAria",disableDragAria:"player.disableSignDragModeAria",enableResize:"player.enableSignResizeMode",disableResize:"player.disableSignResizeMode",enableResizeAria:"player.enableSignResizeModeAria",disableResizeAria:"player.disableSignResizeModeAria",closeMenu:"transcript.closeMenu"},menuAlign:"center",getMenuParent:()=>this.wrapper,getBadgeHost:()=>this.wrapper,badgeClass:`${this.player.options.classPrefix}-sign-mode-badge`,onDragItemClick:e=>{this.toggleKeyboardDragMode(),e.hide({focusButton:!1}),this.draggable?.keyboardDragMode&&setTimeout(()=>{this.wrapper?.focus?.({preventScroll:!0})},20)},onResizeItemClick:e=>{this.toggleResizeMode({focus:!1})?(e.hide({focusButton:!1}),setTimeout(()=>{this.wrapper?.focus?.({preventScroll:!0})},20)):e.hide({focusButton:!0})}}),this.settingsHandlers={click:e=>{e.preventDefault(),e.stopPropagation(),this._panel?.markJustOpenedForClick(),this._panel?.toggle()},keydown:e=>{"d"===e.key||"D"===e.key?(e.preventDefault(),e.stopPropagation(),this.toggleKeyboardDragMode()):"r"===e.key||"R"===e.key?(e.preventDefault(),e.stopPropagation(),this.toggleResizeMode()):"Escape"===e.key&&this.settingsMenuVisible&&(e.preventDefault(),e.stopPropagation(),this.hideSettingsMenu())}},this.settingsButton.addEventListener("click",this.settingsHandlers.click),this.settingsButton.addEventListener("keydown",this.settingsHandlers.keydown),t.appendChild(this.settingsButton)}_createLanguageSelector(e,a){const s=this.player.options.classPrefix,r=`${s}-sign-language-select-${Date.now()}`,l=Object.keys(this.sources).map(e=>({value:e,text:this.getLanguageLabel(e),selected:e===a})),{label:o,select:h}=t({classPrefix:s,labelClass:`${s}-sign-language-label`,selectClass:`${s}-sign-language-select`,labelText:"settings.language",selectId:r,options:l,onChange:e=>{e.stopPropagation(),this.switchLanguage(e.target.value)}});this.selector=h;const g=n.createElement("div",{className:`${s}-sign-language-selector-wrapper`});g.appendChild(o),g.appendChild(this.selector),i(g),e.appendChild(g)}_createCloseButton(){const e=this.player.options.classPrefix,t=r.t("player.closeSignLanguage"),i=n.createElement("button",{className:`${e}-sign-language-close`,attributes:{type:"button","aria-label":t}});return i.appendChild(s("close")),n.attachTooltip(i,t,e),i.addEventListener("click",()=>{this.disable();const e=this.player.controlBar?.controls?.signLanguage;e&&this.player.setManagedTimeout(()=>{e.focus({preventScroll:!0})},0)},{signal:this.player.lifecycleSignal}),i}_createVideo(e){this.video=document.createElement("video"),this.video.className="vidply-sign-language-video",this.video.src=e??"",this.video.setAttribute("aria-label",r.t("player.signLanguage")),this.video.muted=!0,this.video.setAttribute("playsinline","")}_createResizeHandles(){const e=this.player.options.classPrefix;this.resizeHandles=["n","s","e","w","ne","nw","se","sw"].map(t=>{const i=n.createElement("div",{className:`${e}-sign-resize-handle ${e}-sign-resize-${t}`,attributes:{"data-direction":t,"data-vidply-managed-resize":"true","aria-hidden":"true"}});return i.style.display="none",i})}_applyInitialSize(){const e=this.wrapper;if(!e)return;const t=this.player.storage.getSignLanguagePreferences();e.style.width=t?.size?.width?t.size.width:"280px",e.style.height="auto"}_setupInteraction(){if(window.innerWidth<768&&!this.player.state.fullscreen&&!1===this.player?.options?.signLanguageDragOnMobile)return void(this.draggable&&(this.draggable.destroy(),this.draggable=null));if(this.draggable)return;const e=this.wrapper;if(!e)return;const t=this.player.options.classPrefix;this.draggable=new a(e,{dragHandle:this.wrapper,resizeHandles:this.resizeHandles,constrainToViewport:!0,maintainAspectRatio:!0,minWidth:150,minHeight:100,classPrefix:`${t}-sign`,keyboardDragKey:"d",keyboardResizeKey:"r",keyboardStep:10,keyboardStepLarge:50,pointerResizeIndicatorText:r.t("player.signLanguageResizeActive"),onPointerResizeToggle:e=>{this.resizeHandles.forEach(t=>{t.style.display=e?"block":"none"}),e?(this._showModeBadge(r.t("player.signResizeModeHint")),this.player.keyboardManager?.announce(r.t("player.signLanguageResizeActive"))):(this._hideModeBadge(),this.player.keyboardManager?.announce(r.t("player.signResizeModeDisabled")))},onDragStart(e){const i=e.target;return!(i.closest(`.${t}-sign-language-close`)||i.closest(`.${t}-sign-language-settings`)||i.closest(`.${t}-sign-language-select`)||i.closest(`.${t}-sign-language-label`)||i.closest(`.${t}-sign-language-settings-menu`))}}),this._setupCustomKeyHandler(),this.interactionHandlers={draggable:this.draggable,customKeyHandler:this.customKeyHandler}}_setupCustomKeyHandler(){this.customKeyHandler=e=>{const t=e.key.toLowerCase();if(!this.settingsMenuVisible){if("home"===t)return e.preventDefault(),e.stopPropagation(),void(this.draggable&&(this.draggable.pointerResizeMode&&this.draggable.disablePointerResizeMode(),this.draggable.manuallyPositioned=!1,this.constrainPosition()));if("r"===t)return e.preventDefault(),e.stopPropagation(),void(this.toggleResizeMode()&&this.wrapper?.focus({preventScroll:!0}));if("escape"===t){if(e.preventDefault(),e.stopPropagation(),this.draggable?.pointerResizeMode)return void this.draggable.disablePointerResizeMode();if(this.draggable?.keyboardDragMode)return this.draggable.disableKeyboardDragMode(),this._hideModeBadge(),this._updateDragOptionState(),void this.player.keyboardManager?.announce(r.t("player.signDragModeDisabled"));this.disable();const t=this.player.controlBar?.controls?.signLanguage;t&&setTimeout(()=>{t.focus({preventScroll:!0})},0)}}},this.wrapper?.addEventListener("keydown",this.customKeyHandler)}_setupEventHandlers(e){this.handlers={play:()=>{this.video&&this.video.play()},pause:()=>{this.video&&this.video.pause()},timeupdate:()=>{this.video&&Math.abs(this.video.currentTime-this.player.state.currentTime)>.5&&(this.video.currentTime=this.player.state.currentTime)},ratechange:()=>{this.video&&(this.video.playbackRate=this.player.state.playbackSpeed)}},this.player.on("play",this.handlers.play),this.player.on("pause",this.handlers.pause),this.player.on("timeupdate",this.handlers.timeupdate),this.player.on("ratechange",this.handlers.ratechange),e&&(this.handlers.captionChange=()=>{if(this.player.captionManager?.currentTrack&&this.selector){const e=this.player.captionManager.currentTrack.language?.toLowerCase().split("-")[0];e&&this.sources[e]&&this.currentLanguage!==e&&(this.switchLanguage(e),this.selector.value=e)}},this.player.on("captionsenabled",this.handlers.captionChange))}constrainPosition(){if(!this.wrapper||!this.player.videoWrapper)return;if(this.draggable?.manuallyPositioned)return;this.wrapper.style.width||(this.wrapper.style.width="280px");const e=this.player.videoWrapper.getBoundingClientRect(),t=this.player.container.getBoundingClientRect(),i=this.wrapper.getBoundingClientRect(),a=e.left-t.left,s=e.top-t.top,n=e.width,r=e.height,l=i.width||280,o=i.height||157.5;let h,g;const p=16;switch(this.desiredPosition||"bottom-right"){case"bottom-right":default:h=a+n-l-p,g=s+r-o-95;break;case"bottom-left":h=a+p,g=s+r-o-95;break;case"top-right":h=a+n-l-p,g=s+p;break;case"top-left":h=a+p,g=s+p}h=Math.max(a,Math.min(h,a+n-l)),g=Math.max(s,Math.min(g,s+r-o-95)),this.wrapper.style.left=`${h}px`,this.wrapper.style.top=`${g}px`,this.wrapper.style.right="auto",this.wrapper.style.bottom="auto"}showSettingsMenu(){this._panel?.show()}hideSettingsMenu({focusButton:e=!0}={}){this._panel?.hide({focusButton:e})}_showModeBadge(e){this._panel?.showBadge(e)}_hideModeBadge(){this._panel?.hideBadge()}toggleKeyboardDragMode(){if(!this.draggable)return;const e=this.draggable.keyboardDragMode;this.draggable.toggleKeyboardDragMode();const t=this.draggable.keyboardDragMode;!e&&t?(this._enableMoveMode(),this._showModeBadge(r.t("player.signDragModeHint")),this.player.keyboardManager?.announce(r.t("player.signLanguageDragActive"))):e&&!t&&(this._hideModeBadge(),this.player.keyboardManager?.announce(r.t("player.signDragModeDisabled"))),this._updateDragOptionState()}_enableMoveMode(){this.wrapper?.classList.add(`${this.player.options.classPrefix}-sign-move-mode`),this._updateResizeOptionState(),setTimeout(()=>{this.wrapper?.classList.remove(`${this.player.options.classPrefix}-sign-move-mode`)},2e3)}toggleResizeMode({focus:e=!0}={}){return!!this.draggable&&(this.draggable.pointerResizeMode?(this.draggable.disablePointerResizeMode({focus:e}),this._updateResizeOptionState(),!1):(this.draggable.enablePointerResizeMode({focus:e}),this._updateResizeOptionState(),!0))}_updateDragOptionState(){this._panel?.refreshDragState()}_updateResizeOptionState(){this._panel?.refreshResizeState()}savePreferences(){this.wrapper&&this.player.storage.saveSignLanguagePreferences({size:{width:this.wrapper.style.width}})}updateSources(e,t){this.src=e||null,this.sources=t||{},this.currentLanguage=null}cleanup(){if(this.inMainView&&this.player.element){const e=this.player.element;if(this._mainViewUsingSourceSwap&&this.mainViewOriginalSources&&this.mainViewOriginalSources.length>0){Array.from(e.querySelectorAll("source")).forEach(e=>e.remove());const t=e.querySelector("track");this.mainViewOriginalSources.forEach(i=>{t?e.insertBefore(i,t):e.appendChild(i)}),this._mainViewUsingSourceSwap=!1}else this.mainViewOriginalSrc&&(e.src=this.mainViewOriginalSrc);e.muted=this._mainViewMutedBefore,"function"==typeof this.player.invalidateTrackCache&&this.player.invalidateTrackCache(),e.load(),this.mainViewOriginalSrc=null,this.mainViewOriginalSources=null,this.inMainView=!1,this.player.state.signLanguageInMainView=!1,this.player.videoWrapper&&this.player.videoWrapper.classList.remove("vidply-sign-language-main-view-active"),this.player.emit("signlanguageinmainviewdisabled")}this.settingsMenuVisible&&this.hideSettingsMenu({focusButton:!1}),this._panel&&(this._panel.destroy(),this._panel=null),this.settingsHandlers&&this.settingsButton&&(this.settingsButton.removeEventListener("click",this.settingsHandlers.click),this.settingsButton.removeEventListener("keydown",this.settingsHandlers.keydown)),this.settingsHandlers=null,this.handlers&&(this.player.off("play",this.handlers.play),this.player.off("pause",this.handlers.pause),this.player.off("timeupdate",this.handlers.timeupdate),this.player.off("ratechange",this.handlers.ratechange),this.handlers.captionChange&&this.player.off("captionsenabled",this.handlers.captionChange),this.handlers=null),this.wrapper&&this.customKeyHandler&&this.wrapper.removeEventListener("keydown",this.customKeyHandler),this.draggable&&(this.draggable.pointerResizeMode&&this.draggable.disablePointerResizeMode(),this.draggable.destroy(),this.draggable=null),this.interactionHandlers=null,this._hideModeBadge(),this.wrapper?.parentNode&&(this.video&&(this.video.pause(),this.video.src=""),this.wrapper.parentNode.removeChild(this.wrapper)),this.wrapper=null,this.video=null,this.settingsButton=null}destroy(){this.cleanup(),this.enabled=!1}};export{l as SignLanguageManager};
|
|
6
|
+
import{DraggablePanel as e,createLabeledSelect as t,preventDragOnElement as i}from"./vidply.chunk-3EEDXU4T.min.js";import{DraggableResizable as a}from"./vidply.chunk-PL3P3JHR.min.js";import{createIconElement as s}from"./vidply.chunk-6OGHHIYP.min.js";import"./vidply.chunk-XA4M574A.min.js";import"./vidply.chunk-MWEBITCP.min.js";import{DOMUtils as n,i18n as r}from"./vidply.chunk-QQZGV7TD.min.js";var l=class{player;_mainViewMutedBefore;_mainViewUsingSourceSwap;currentLanguage;customKeyHandler;desiredPosition;draggable;handlers;header;inMainView;interactionHandlers;mainViewOriginalSources;mainViewOriginalSrc;resizeHandles;selector;settingsButton;settingsHandlers;sources;src;enabled;video;wrapper;_panel=null;get settingsMenu(){return this._panel?.settingsMenu??null}set settingsMenu(e){}get settingsMenuVisible(){return this._panel?.settingsMenuVisible??!1}set settingsMenuVisible(e){}get settingsMenuJustOpened(){return this._panel?.justOpened??!1}set settingsMenuJustOpened(e){}get dragOptionButton(){return this._panel?.dragOptionButton??null}get dragOptionText(){return this._panel?.dragOptionText??null}get resizeOptionButton(){return this._panel?.resizeOptionButton??null}get resizeOptionText(){return this._panel?.resizeOptionText??null}constructor(e){this.player=e,this.src=e.options.signLanguageSrc,this.sources=e.options.signLanguageSources||{},this.currentLanguage=null,this.desiredPosition=e.options.signLanguagePosition||"bottom-right",this.wrapper=null,this.header=null,this.video=null,this.selector=null,this.settingsButton=null,this.resizeHandles=[],this.enabled=!1,this.inMainView=!1,this.mainViewOriginalSrc=null,this.mainViewOriginalSources=null,this._mainViewUsingSourceSwap=!1,this._mainViewMutedBefore=!1,this.handlers=null,this.settingsHandlers=null,this.interactionHandlers=null,this.draggable=null,this.customKeyHandler=null}isAvailable(){return Object.keys(this.sources).length>0||Boolean(this.src)}enable(){const e=Object.keys(this.sources).length>0,t=Boolean(this.src);if(!e&&!t)return void console.warn("No sign language video source provided");if(this.wrapper)return this.wrapper.style.display="block",this.enabled=!0,this.player.state.signLanguageEnabled=!0,this.player.emit("signlanguageenabled"),void this.player.setManagedTimeout(()=>{this.settingsButton&&document.contains(this.settingsButton)&&this.settingsButton.focus({preventScroll:!0})},150);let i=null,a=null;e?(i=this._determineInitialLanguage(),a=this.sources[i]??null,this.currentLanguage=i):a=this.src,this._createWrapper(),this._createHeader(e,i),this._createVideo(a),this._createResizeHandles();const s=this.wrapper,n=this.video;s&&n&&(s.appendChild(this.header),s.appendChild(n),this.resizeHandles.forEach(e=>s.appendChild(e)),this._applyInitialSize(),this.player.container.appendChild(s),requestAnimationFrame(()=>{this.constrainPosition()}),n.currentTime=this.player.state.currentTime,this.player.state.paused||n.play(),this._setupInteraction(),this._setupEventHandlers(e),this.enabled=!0,this.player.state.signLanguageEnabled=!0,this.player.emit("signlanguageenabled"),this.player.setManagedTimeout(()=>{this.settingsButton&&document.contains(this.settingsButton)&&this.settingsButton.focus({preventScroll:!0})},150))}disable(){this.settingsMenuVisible&&this.hideSettingsMenu({focusButton:!1}),this._hideModeBadge(),this.wrapper&&(this.wrapper.style.display="none"),this.enabled=!1,this.player.state.signLanguageEnabled=!1,this.player.emit("signlanguagedisabled")}toggle(){this.enabled?this.disable():this.enable()}async enableInMainView(){const e=Object.keys(this.sources).length>0,t=Boolean(this.src);if(!e&&!t)return;if(!this.player.element||"VIDEO"!==this.player.element.tagName)return;if(this.inMainView)return;let i;if(e){const e=this._determineInitialLanguage();this.currentLanguage=e,i=this.sources[e]}else i=this.src;const a=this.player.element,s=this.player.state.currentTime,n=this.player.state.playing,r=a.poster||a.getAttribute("poster")||this.player.options.poster,l=s<.1&&!n,o=Array.from(a.querySelectorAll("source")),h=o[0];if(this.mainViewOriginalSrc=a.currentSrc&&a.currentSrc.length>0?a.currentSrc:a.src&&a.src.length>0?a.src:h&&h.getAttribute("src")?h.getAttribute("src"):"",this._mainViewMutedBefore=this.player.state.muted,r&&l&&"VIDEO"===a.tagName&&(a.poster=r),o.length>0){this.mainViewOriginalSources=o,this.mainViewOriginalSources.forEach(e=>e.remove());const e=document.createElement("source"),t=i??"";e.setAttribute("src",t);const s=this._inferVideoType(t);s&&e.setAttribute("type",s);const n=a.querySelector("track");n?a.insertBefore(e,n):a.appendChild(e),this._mainViewUsingSourceSwap=!0}else a.src=i??"",this._mainViewUsingSourceSwap=!1;a.muted=!0,this.player.currentSource=i??"","function"==typeof this.player.invalidateTrackCache&&this.player.invalidateTrackCache(),a.load(),await this._waitForMediaReadyMainView(s>0||n),s>0&&(this.player.seek(s),await new Promise(e=>setTimeout(e,100))),n?await this.player.play():(this.player.pause(),!l&&this.player.hidePosterOverlay&&this.player.hidePosterOverlay()),this.inMainView=!0,this.player.state.signLanguageInMainView=!0,this.player.videoWrapper&&this.player.videoWrapper.classList.add("vidply-sign-language-main-view-active"),this.player.emit("signlanguageinmainviewenabled")}async disableInMainView(){if(!this.inMainView)return;if(!this.mainViewOriginalSrc&&!this.mainViewOriginalSources)return this.inMainView=!1,this.player.state.signLanguageInMainView=!1,this.player.videoWrapper&&this.player.videoWrapper.classList.remove("vidply-sign-language-main-view-active"),void this.player.emit("signlanguageinmainviewdisabled");const e=this.player.element,t=this.player.state.currentTime,i=this.player.state.playing;if(this._mainViewUsingSourceSwap&&this.mainViewOriginalSources&&this.mainViewOriginalSources.length>0){Array.from(e.querySelectorAll("source")).forEach(e=>e.remove());const t=e.querySelector("track");this.mainViewOriginalSources.forEach(i=>{t?e.insertBefore(i,t):e.appendChild(i)}),this._mainViewUsingSourceSwap=!1}else this.mainViewOriginalSrc&&(e.src=this.mainViewOriginalSrc);if(e.muted=this._mainViewMutedBefore,this.player.currentSource=this.mainViewOriginalSrc||e.querySelector("source")?.src||"","function"==typeof this.player.invalidateTrackCache&&this.player.invalidateTrackCache(),e.load(),await this._waitForMediaReadyMainView(t>0||i),t>0&&this.player.seek(t),i)try{await this.player.play()}catch(e){this.player.log?.("Sign language main view: play after restore failed",e,"warn")}this.mainViewOriginalSrc=null,this.mainViewOriginalSources=null,this.inMainView=!1,this.player.state.signLanguageInMainView=!1,this.player.videoWrapper&&this.player.videoWrapper.classList.remove("vidply-sign-language-main-view-active"),this.player.emit("signlanguageinmainviewdisabled")}async _waitForMediaReadyMainView(e=!1){const t=this.player.element,i=new Promise(e=>{if(t.readyState>=1)return void e();const i=()=>{t.removeEventListener("loadedmetadata",i),t.removeEventListener("error",a),e()},a=()=>{t.removeEventListener("loadedmetadata",i),t.removeEventListener("error",a),e()};t.addEventListener("loadedmetadata",i),t.addEventListener("error",a,{once:!0})}),a=new Promise(e=>setTimeout(e,1e4));await Promise.race([i,a]),await new Promise(e=>setTimeout(e,300)),e&&await new Promise(e=>{if(t.readyState>=3)e();else{const i=()=>{t.removeEventListener("canplay",i),t.removeEventListener("canplaythrough",i),e()};t.addEventListener("canplay",i,{once:!0}),t.addEventListener("canplaythrough",i,{once:!0}),setTimeout(()=>{t.removeEventListener("canplay",i),t.removeEventListener("canplaythrough",i),e()},3e3)}})}toggleInMainView(){this.inMainView?this.disableInMainView():this.enableInMainView()}switchLanguage(e){if(this.sources[e]){if(this.currentLanguage=e,this.video){const t=this.video.currentTime,i=!this.video.paused;this.video.src=this.sources[e],this.video.currentTime=t,i&&this.video.play().catch(e=>{"undefined"!=typeof console&&console.debug&&console.debug("[VidPly] sign-language play() rejected:",e)})}if(this.inMainView&&this.player.element&&"VIDEO"===this.player.element.tagName){const t=this.player.state.currentTime,i=this.player.state.playing;if(this._mainViewUsingSourceSwap){const t=this.player.element.querySelector("source");if(t){t.setAttribute("src",this.sources[e]);const i=this._inferVideoType(this.sources[e]);i&&t.setAttribute("type",i)}}else this.player.element.src=this.sources[e];this.player.currentSource=this.sources[e],"function"==typeof this.player.invalidateTrackCache&&this.player.invalidateTrackCache(),this.player.element.load(),this._waitForMediaReadyMainView(!0).then(()=>{t>0&&this.player.seek(t),i&&this.player.play()})}this.player.emit("signlanguagelanguagechanged",e)}}_inferVideoType(e){if(!e)return"";const t=(e.split("?")[0]??"").toLowerCase();return t.endsWith(".mp4")?"video/mp4":t.endsWith(".webm")?"video/webm":t.endsWith(".ogv")||t.endsWith(".ogg")?"video/ogg":""}getLanguageLabel(e){return{en:"English",de:"Deutsch",es:"Español",fr:"Français",it:"Italiano",ja:"日本語",pt:"Português",ar:"العربية",hi:"हिन्दी"}[e]||e.toUpperCase()}_determineInitialLanguage(){if(this.player.captionManager&&this.player.captionManager.currentTrack){const e=this.player.captionManager.currentTrack.language?.toLowerCase().split("-")[0];if(e&&this.sources[e])return e}if(this.player.options.language){const e=this.player.options.language.toLowerCase().split("-")[0];if(e&&this.sources[e])return e}return Object.keys(this.sources)[0]??""}_createWrapper(){this.wrapper=document.createElement("div"),this.wrapper.className="vidply-sign-language-wrapper",this.wrapper.setAttribute("tabindex","0"),this.wrapper.setAttribute("aria-label",r.t("player.signLanguageDragResize"))}_createHeader(e,t){const i=this.player.options.classPrefix;this.header=n.createElement("div",{className:`${i}-sign-language-header`,attributes:{tabindex:"0"}});const a=n.createElement("div",{className:`${i}-sign-language-header-left`}),s=n.createElement("h3",{textContent:r.t("player.signLanguageVideo")});this._createSettingsButton(a),e&&this._createLanguageSelector(a,t),a.appendChild(s);const l=this._createCloseButton();this.header.appendChild(a),this.header.appendChild(l)}_createSettingsButton(t){const i=this.player.options.classPrefix,a=r.t("player.signLanguageSettings");this.settingsButton=n.createElement("button",{className:`${i}-sign-language-settings`,attributes:{type:"button","aria-label":a,"aria-expanded":"false"}}),this.settingsButton.appendChild(s("settings")),n.attachTooltip(this.settingsButton,a,i),this._panel=new e({player:this.player,namespace:"sign-language",settingsButton:this.settingsButton,getDraggable:()=>this.draggable,i18nKeys:{enableDrag:"player.enableSignDragMode",disableDrag:"player.disableSignDragMode",enableDragAria:"player.enableSignDragModeAria",disableDragAria:"player.disableSignDragModeAria",enableResize:"player.enableSignResizeMode",disableResize:"player.disableSignResizeMode",enableResizeAria:"player.enableSignResizeModeAria",disableResizeAria:"player.disableSignResizeModeAria",closeMenu:"transcript.closeMenu"},menuAlign:"center",getMenuParent:()=>this.wrapper,getBadgeHost:()=>this.wrapper,badgeClass:`${this.player.options.classPrefix}-sign-mode-badge`,onDragItemClick:e=>{this.toggleKeyboardDragMode(),e.hide({focusButton:!1}),this.draggable?.keyboardDragMode&&setTimeout(()=>{this.wrapper?.focus?.({preventScroll:!0})},20)},onResizeItemClick:e=>{this.toggleResizeMode({focus:!1})?(e.hide({focusButton:!1}),setTimeout(()=>{this.wrapper?.focus?.({preventScroll:!0})},20)):e.hide({focusButton:!0})}}),this.settingsHandlers={click:e=>{e.preventDefault(),e.stopPropagation(),this._panel?.markJustOpenedForClick(),this._panel?.toggle()},keydown:e=>{"d"===e.key||"D"===e.key?(e.preventDefault(),e.stopPropagation(),this.toggleKeyboardDragMode()):"r"===e.key||"R"===e.key?(e.preventDefault(),e.stopPropagation(),this.toggleResizeMode()):"Escape"===e.key&&this.settingsMenuVisible&&(e.preventDefault(),e.stopPropagation(),this.hideSettingsMenu())}},this.settingsButton.addEventListener("click",this.settingsHandlers.click),this.settingsButton.addEventListener("keydown",this.settingsHandlers.keydown),t.appendChild(this.settingsButton)}_createLanguageSelector(e,a){const s=this.player.options.classPrefix,r=`${s}-sign-language-select-${Date.now()}`,l=Object.keys(this.sources).map(e=>({value:e,text:this.getLanguageLabel(e),selected:e===a})),{label:o,select:h}=t({classPrefix:s,labelClass:`${s}-sign-language-label`,selectClass:`${s}-sign-language-select`,labelText:"settings.language",selectId:r,options:l,onChange:e=>{e.stopPropagation(),this.switchLanguage(e.target.value)}});this.selector=h;const g=n.createElement("div",{className:`${s}-sign-language-selector-wrapper`});g.appendChild(o),g.appendChild(this.selector),i(g),e.appendChild(g)}_createCloseButton(){const e=this.player.options.classPrefix,t=r.t("player.closeSignLanguage"),i=n.createElement("button",{className:`${e}-sign-language-close`,attributes:{type:"button","aria-label":t}});return i.appendChild(s("close")),n.attachTooltip(i,t,e),i.addEventListener("click",()=>{this.disable();const e=this.player.controlBar?.controls?.signLanguage;e&&this.player.setManagedTimeout(()=>{e.focus({preventScroll:!0})},0)},{signal:this.player.lifecycleSignal}),i}_createVideo(e){this.video=document.createElement("video"),this.video.className="vidply-sign-language-video",this.video.src=e??"",this.video.setAttribute("aria-label",r.t("player.signLanguage")),this.video.muted=!0,this.video.setAttribute("playsinline","")}_createResizeHandles(){const e=this.player.options.classPrefix;this.resizeHandles=["n","s","e","w","ne","nw","se","sw"].map(t=>{const i=n.createElement("div",{className:`${e}-sign-resize-handle ${e}-sign-resize-${t}`,attributes:{"data-direction":t,"data-vidply-managed-resize":"true","aria-hidden":"true"}});return i.style.display="none",i})}_applyInitialSize(){const e=this.wrapper;if(!e)return;const t=this.player.storage.getSignLanguagePreferences();e.style.width=t?.size?.width?t.size.width:"280px",e.style.height="auto"}_setupInteraction(){if(window.innerWidth<768&&!this.player.state.fullscreen&&!1===this.player?.options?.signLanguageDragOnMobile)return void(this.draggable&&(this.draggable.destroy(),this.draggable=null));if(this.draggable)return;const e=this.wrapper;if(!e)return;const t=this.player.options.classPrefix;this.draggable=new a(e,{dragHandle:this.wrapper,resizeHandles:this.resizeHandles,constrainToViewport:!0,maintainAspectRatio:!0,minWidth:150,minHeight:100,classPrefix:`${t}-sign`,keyboardDragKey:"d",keyboardResizeKey:"r",keyboardStep:10,keyboardStepLarge:50,pointerResizeIndicatorText:r.t("player.signLanguageResizeActive"),onPointerResizeToggle:e=>{this.resizeHandles.forEach(t=>{t.style.display=e?"block":"none"}),e?(this._showModeBadge(r.t("player.signResizeModeHint")),this.player.keyboardManager?.announce(r.t("player.signLanguageResizeActive"))):(this._hideModeBadge(),this.player.keyboardManager?.announce(r.t("player.signResizeModeDisabled")))},onDragStart(e){const i=e.target;return!(i.closest(`.${t}-sign-language-close`)||i.closest(`.${t}-sign-language-settings`)||i.closest(`.${t}-sign-language-select`)||i.closest(`.${t}-sign-language-label`)||i.closest(`.${t}-sign-language-settings-menu`))}}),this._setupCustomKeyHandler(),this.interactionHandlers={draggable:this.draggable,customKeyHandler:this.customKeyHandler}}_setupCustomKeyHandler(){this.customKeyHandler=e=>{const t=e.key.toLowerCase();if(!this.settingsMenuVisible){if("home"===t)return e.preventDefault(),e.stopPropagation(),void(this.draggable&&(this.draggable.pointerResizeMode&&this.draggable.disablePointerResizeMode(),this.draggable.manuallyPositioned=!1,this.constrainPosition()));if("r"===t)return e.preventDefault(),e.stopPropagation(),void(this.toggleResizeMode()&&this.wrapper?.focus({preventScroll:!0}));if("escape"===t){if(e.preventDefault(),e.stopPropagation(),this.draggable?.pointerResizeMode)return void this.draggable.disablePointerResizeMode();if(this.draggable?.keyboardDragMode)return this.draggable.disableKeyboardDragMode(),this._hideModeBadge(),this._updateDragOptionState(),void this.player.keyboardManager?.announce(r.t("player.signDragModeDisabled"));this.disable();const t=this.player.controlBar?.controls?.signLanguage;t&&setTimeout(()=>{t.focus({preventScroll:!0})},0)}}},this.wrapper?.addEventListener("keydown",this.customKeyHandler)}_setupEventHandlers(e){this.handlers={play:()=>{this.video&&this.video.play()},pause:()=>{this.video&&this.video.pause()},timeupdate:()=>{this.video&&Math.abs(this.video.currentTime-this.player.state.currentTime)>.5&&(this.video.currentTime=this.player.state.currentTime)},ratechange:()=>{this.video&&(this.video.playbackRate=this.player.state.playbackSpeed)}},this.player.on("play",this.handlers.play),this.player.on("pause",this.handlers.pause),this.player.on("timeupdate",this.handlers.timeupdate),this.player.on("ratechange",this.handlers.ratechange),e&&(this.handlers.captionChange=()=>{if(this.player.captionManager?.currentTrack&&this.selector){const e=this.player.captionManager.currentTrack.language?.toLowerCase().split("-")[0];e&&this.sources[e]&&this.currentLanguage!==e&&(this.switchLanguage(e),this.selector.value=e)}},this.player.on("captionsenabled",this.handlers.captionChange))}constrainPosition(){if(!this.wrapper||!this.player.videoWrapper)return;if(this.draggable?.manuallyPositioned)return;this.wrapper.style.width||(this.wrapper.style.width="280px");const e=this.player.videoWrapper.getBoundingClientRect(),t=this.player.container.getBoundingClientRect(),i=this.wrapper.getBoundingClientRect(),a=e.left-t.left,s=e.top-t.top,n=e.width,r=e.height,l=i.width||280,o=i.height||157.5;let h,g;const p=16;switch(this.desiredPosition||"bottom-right"){case"bottom-right":default:h=a+n-l-p,g=s+r-o-95;break;case"bottom-left":h=a+p,g=s+r-o-95;break;case"top-right":h=a+n-l-p,g=s+p;break;case"top-left":h=a+p,g=s+p}h=Math.max(a,Math.min(h,a+n-l)),g=Math.max(s,Math.min(g,s+r-o-95)),this.wrapper.style.left=`${h}px`,this.wrapper.style.top=`${g}px`,this.wrapper.style.right="auto",this.wrapper.style.bottom="auto"}showSettingsMenu(){this._panel?.show()}hideSettingsMenu({focusButton:e=!0}={}){this._panel?.hide({focusButton:e})}_showModeBadge(e){this._panel?.showBadge(e)}_hideModeBadge(){this._panel?.hideBadge()}toggleKeyboardDragMode(){if(!this.draggable)return;const e=this.draggable.keyboardDragMode;this.draggable.toggleKeyboardDragMode();const t=this.draggable.keyboardDragMode;!e&&t?(this._enableMoveMode(),this._showModeBadge(r.t("player.signDragModeHint")),this.player.keyboardManager?.announce(r.t("player.signLanguageDragActive"))):e&&!t&&(this._hideModeBadge(),this.player.keyboardManager?.announce(r.t("player.signDragModeDisabled"))),this._updateDragOptionState()}_enableMoveMode(){this.wrapper?.classList.add(`${this.player.options.classPrefix}-sign-move-mode`),this._updateResizeOptionState(),setTimeout(()=>{this.wrapper?.classList.remove(`${this.player.options.classPrefix}-sign-move-mode`)},2e3)}toggleResizeMode({focus:e=!0}={}){return!!this.draggable&&(this.draggable.pointerResizeMode?(this.draggable.disablePointerResizeMode({focus:e}),this._updateResizeOptionState(),!1):(this.draggable.enablePointerResizeMode({focus:e}),this._updateResizeOptionState(),!0))}_updateDragOptionState(){this._panel?.refreshDragState()}_updateResizeOptionState(){this._panel?.refreshResizeState()}savePreferences(){this.wrapper&&this.player.storage.saveSignLanguagePreferences({size:{width:this.wrapper.style.width}})}updateSources(e,t){this.src=e||null,this.sources=t||{},this.currentLanguage=null}cleanup(){if(this.inMainView&&this.player.element){const e=this.player.element;if(this._mainViewUsingSourceSwap&&this.mainViewOriginalSources&&this.mainViewOriginalSources.length>0){Array.from(e.querySelectorAll("source")).forEach(e=>e.remove());const t=e.querySelector("track");this.mainViewOriginalSources.forEach(i=>{t?e.insertBefore(i,t):e.appendChild(i)}),this._mainViewUsingSourceSwap=!1}else this.mainViewOriginalSrc&&(e.src=this.mainViewOriginalSrc);e.muted=this._mainViewMutedBefore,"function"==typeof this.player.invalidateTrackCache&&this.player.invalidateTrackCache(),e.load(),this.mainViewOriginalSrc=null,this.mainViewOriginalSources=null,this.inMainView=!1,this.player.state.signLanguageInMainView=!1,this.player.videoWrapper&&this.player.videoWrapper.classList.remove("vidply-sign-language-main-view-active"),this.player.emit("signlanguageinmainviewdisabled")}this.settingsMenuVisible&&this.hideSettingsMenu({focusButton:!1}),this._panel&&(this._panel.destroy(),this._panel=null),this.settingsHandlers&&this.settingsButton&&(this.settingsButton.removeEventListener("click",this.settingsHandlers.click),this.settingsButton.removeEventListener("keydown",this.settingsHandlers.keydown)),this.settingsHandlers=null,this.handlers&&(this.player.off("play",this.handlers.play),this.player.off("pause",this.handlers.pause),this.player.off("timeupdate",this.handlers.timeupdate),this.player.off("ratechange",this.handlers.ratechange),this.handlers.captionChange&&this.player.off("captionsenabled",this.handlers.captionChange),this.handlers=null),this.wrapper&&this.customKeyHandler&&this.wrapper.removeEventListener("keydown",this.customKeyHandler),this.draggable&&(this.draggable.pointerResizeMode&&this.draggable.disablePointerResizeMode(),this.draggable.destroy(),this.draggable=null),this.interactionHandlers=null,this._hideModeBadge(),this.wrapper?.parentNode&&(this.video&&(this.video.pause(),this.video.src=""),this.wrapper.parentNode.removeChild(this.wrapper)),this.wrapper=null,this.video=null,this.settingsButton=null}destroy(){this.cleanup(),this.enabled=!1}};export{l as SignLanguageManager};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* VidPly v1.2.
|
|
2
|
+
* VidPly v1.2.3 - Universal, Accessible Video Player
|
|
3
3
|
* (c) 2026 Matthias Peltzer
|
|
4
4
|
* Released under GPL-2.0-or-later License
|
|
5
5
|
*/
|
|
6
|
-
import{loadScriptOnce as t}from"./vidply.chunk-
|
|
6
|
+
import{loadScriptOnce as t}from"./vidply.chunk-5HTX5QXW.min.js";var e=class{player;media;widget;trackUrl;isReady;iframe;iframeId;_previousVolume;_initTimeoutId;_initController;constructor(t){this.player=t,this.media=t.element,this.widget=null,this.trackUrl=null,this.isReady=!1,this.iframe=null,this.iframeId=null,this._previousVolume=100,this._initTimeoutId=null,this._initController=null}async init(){if(this.trackUrl=this.player.currentSource||this.player.element.src||this.player.element.querySelector("source")?.src||null,!this.trackUrl||!this.isValidSoundCloudUrl(this.trackUrl))throw new Error("Invalid SoundCloud URL");await this.loadSoundCloudAPI(),this.createIframe(),await this.initializeWidget()}isValidSoundCloudUrl(t){if("string"!=typeof t||!t)return!1;let e;try{e=new URL(t)}catch{return!1}return"https:"===e.protocol&&new Set(["soundcloud.com","www.soundcloud.com","m.soundcloud.com","api.soundcloud.com","api-v2.soundcloud.com"]).has(e.hostname.toLowerCase())}isPlaylist(){return this.trackUrl&&this.trackUrl.includes("/sets/")}getEmbedUrl(){const t=this.trackUrl;if(!t)throw new Error("SoundCloudRenderer.getEmbedUrl(): trackUrl is not set");return`https://w.soundcloud.com/player/?${new URLSearchParams({url:t,auto_play:this.player.options.autoplay?"true":"false",hide_related:"true",show_comments:"false",show_user:"true",show_reposts:"false",show_teaser:"false",visual:"false",color:"%23007bff"}).toString()}`}async loadSoundCloudAPI(){return void 0!==window.SC?Promise.resolve():t("https://w.soundcloud.com/player/api.js",{isReady:()=>void 0!==window.SC})}createIframe(){this.player.element.style.display="none",this.player.element.removeAttribute("poster"),this.player.videoWrapper&&(this.player.videoWrapper.classList.remove("vidply-forced-poster"),this.player.videoWrapper.style.removeProperty("--vidply-poster-image")),this.iframeId=`soundcloud-player-${Math.random().toString(36).substr(2,9)}`,this.iframe=document.createElement("iframe"),this.iframe.id=this.iframeId,this.iframe.scrolling="no",this.iframe.frameBorder="no",this.iframe.allow="autoplay",this.iframe.src=this.getEmbedUrl(),this.iframe.style.width="100%",this.iframe.style.display="block",this.isPlaylist()?this.iframe.classList.add("vidply-soundcloud-iframe","vidply-soundcloud-playlist"):this.iframe.classList.add("vidply-soundcloud-iframe"),this.iframe.style.maxHeight="100%",this.player.element.parentNode?.insertBefore(this.iframe,this.player.element)}async initializeWidget(){return new Promise((t,e)=>{const i=this.iframe;if(!i||void 0===window.SC)return void e(new Error("SoundCloud widget cannot initialize"));const s=window.SC;s?(this._initController=new AbortController,i.addEventListener("load",()=>{try{const e=s.Widget(i);this.widget=e,e.bind(s.Widget.Events.READY,()=>{this.isReady=!0,null!==this._initTimeoutId&&(clearTimeout(this._initTimeoutId),this._initTimeoutId=null),this.attachEvents(),this.player.container&&this.player.container.classList.add("vidply-external-controls"),e.getCurrentSound(t=>{t&&(this.player.state.duration=t.duration/1e3,this.player.emit("loadedmetadata"))}),t()}),e.bind(s.Widget.Events.ERROR,(...t)=>{const e=t[0];this.player.handleError(new Error(`SoundCloud error: ${e?.message||"Unknown error"}`))})}catch(t){e(t)}},{signal:this._initController.signal}),this._initTimeoutId=setTimeout(()=>{this._initTimeoutId=null,this.isReady||e(new Error("SoundCloud widget initialization timeout"))},1e4)):e(new Error("SoundCloud widget cannot initialize"))})}attachEvents(){const t=this.widget,e=window.SC;if(!t||!e)return;const i=e.Widget.Events;t.bind(i.PLAY,()=>{this.player.state.playing=!0,this.player.state.paused=!1,this.player.state.ended=!1,this.player.emit("play"),this.player.options.onPlay&&this.player.options.onPlay.call(this.player)}),t.bind(i.PAUSE,()=>{this.player.state.playing=!1,this.player.state.paused=!0,this.player.emit("pause"),this.player.options.onPause&&this.player.options.onPause.call(this.player)}),t.bind(i.FINISH,()=>{this.player.state.playing=!1,this.player.state.paused=!0,this.player.state.ended=!0,this.player.emit("ended"),this.player.options.onEnded&&this.player.options.onEnded.call(this.player),this.player.options.loop&&(this.seek(0),this.play())}),t.bind(i.PLAY_PROGRESS,(...t)=>{const e=t[0].currentPosition/1e3;this.player.state.currentTime=e,this.player.emit("timeupdate",e),this.player.options.onTimeUpdate&&this.player.options.onTimeUpdate.call(this.player,e)}),t.bind(i.SEEK,(...t)=>{this.player.state.currentTime=t[0].currentPosition/1e3,this.player.emit("seeked")}),t.bind(i.LOAD_PROGRESS,(...t)=>{const e=t[0];this.player.state.duration&&void 0!==e.loadedProgress&&this.player.emit("progress",e.loadedProgress*this.player.state.duration)})}play(){if(this.isReady&&this.widget){const t=window.scrollX,e=window.scrollY;this.widget.play(),window.scrollTo(t,e)}}pause(){this.isReady&&this.widget&&this.widget.pause()}seek(t){this.isReady&&this.widget&&(this.widget.seekTo(1e3*t),this.player.state.currentTime=t)}setVolume(t){this.isReady&&this.widget&&(this.widget.setVolume(100*t),this.player.state.volume=t)}setMuted(t){const e=this.widget;this.isReady&&e&&(t?e.getVolume(t=>{this._previousVolume=t,e.setVolume(0)}):e.setVolume(this._previousVolume||100),this.player.state.muted=t)}setPlaybackSpeed(t){this.player.log("SoundCloud does not support playback speed control","warn")}getCurrentSound(){return new Promise(t=>{this.isReady&&this.widget?this.widget.getCurrentSound(e=>{t(e)}):t(null)})}destroy(){if(null!==this._initTimeoutId&&(clearTimeout(this._initTimeoutId),this._initTimeoutId=null),this._initController&&(this._initController.abort(),this._initController=null),this.widget&&window.SC){const t=window.SC.Widget.Events;try{this.widget.unbind(t.READY),this.widget.unbind(t.PLAY),this.widget.unbind(t.PAUSE),this.widget.unbind(t.FINISH),this.widget.unbind(t.PLAY_PROGRESS),this.widget.unbind(t.SEEK),this.widget.unbind(t.LOAD_PROGRESS),this.widget.unbind(t.ERROR)}catch{}}this.iframe&&this.iframe.parentNode&&this.iframe.parentNode.removeChild(this.iframe),this.player.element&&(this.player.element.style.display=""),this.widget=null,this.isReady=!1}},i=e;export{e as SoundCloudRenderer,i as default};
|