vidply 1.0.51 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dev/{vidply.AudioDescriptionManager-HA3UD3AE.js → vidply.AudioDescriptionManager-2LDAC6BR.js} +18 -5
- package/dist/dev/vidply.AudioDescriptionManager-2LDAC6BR.js.map +7 -0
- package/dist/dev/{vidply.DASHRenderer-7BNDQ2Y3.js → vidply.DASHRenderer-JGJTNVPH.js} +35 -9
- package/dist/dev/vidply.DASHRenderer-JGJTNVPH.js.map +7 -0
- package/dist/dev/{vidply.HLSRenderer-N5HHMRN3.js → vidply.HLSRenderer-2NVGMMXD.js} +30 -12
- package/dist/dev/vidply.HLSRenderer-2NVGMMXD.js.map +7 -0
- package/dist/dev/{vidply.HTML5Renderer-Z6XYGT4E.js → vidply.HTML5Renderer-GUKQRF4M.js} +2 -2
- package/dist/dev/{vidply.SignLanguageManager-WXJM3TOW.js → vidply.SignLanguageManager-OOZLX2GI.js} +64 -25
- package/dist/dev/vidply.SignLanguageManager-OOZLX2GI.js.map +7 -0
- package/dist/dev/{vidply.SoundCloudRenderer-HCMKXHSX.js → vidply.SoundCloudRenderer-T64HDIWO.js} +25 -9
- package/dist/dev/vidply.SoundCloudRenderer-T64HDIWO.js.map +7 -0
- package/dist/dev/{vidply.TranscriptManager-HCMCD7I5.js → vidply.TranscriptManager-BOYEUAA4.js} +65 -16
- package/dist/dev/vidply.TranscriptManager-BOYEUAA4.js.map +7 -0
- package/dist/dev/{vidply.VimeoRenderer-SLEBCZTT.js → vidply.VimeoRenderer-6CLUVHOQ.js} +14 -5
- package/dist/dev/vidply.VimeoRenderer-6CLUVHOQ.js.map +7 -0
- package/dist/dev/{vidply.YouTubeRenderer-E6F4UGVF.js → vidply.YouTubeRenderer-6ONOAU4R.js} +24 -7
- package/dist/dev/vidply.YouTubeRenderer-6ONOAU4R.js.map +7 -0
- package/dist/dev/{vidply.chunk-XOI3AMU5.js → vidply.chunk-37V7VOIQ.js} +84 -47
- package/dist/dev/vidply.chunk-37V7VOIQ.js.map +7 -0
- package/dist/dev/{vidply.chunk-LB6ZIMVJ.js → vidply.chunk-ELJA4GMZ.js} +17 -8
- package/dist/dev/vidply.chunk-ELJA4GMZ.js.map +7 -0
- package/dist/dev/{vidply.chunk-ZU6FUKLF.js → vidply.chunk-S36ISCDT.js} +3 -15
- package/dist/dev/vidply.chunk-S36ISCDT.js.map +7 -0
- package/dist/dev/{vidply.chunk-JZWZJC4C.js → vidply.chunk-SXDZXXZD.js} +6 -69
- package/dist/dev/vidply.chunk-SXDZXXZD.js.map +7 -0
- package/dist/dev/{vidply.chunk-4IYIPSCH.js → vidply.chunk-VLF6H5PZ.js} +37 -120
- package/dist/dev/vidply.chunk-VLF6H5PZ.js.map +7 -0
- package/dist/dev/{vidply.chunk-2D4L3SNZ.js → vidply.chunk-WBI7UGH6.js} +7 -4
- package/dist/dev/vidply.chunk-WBI7UGH6.js.map +7 -0
- package/dist/dev/{vidply.de-OLKUZNDR.js → vidply.de-HLO4IOPX.js} +2 -2
- package/dist/dev/{vidply.de-OLKUZNDR.js.map → vidply.de-HLO4IOPX.js.map} +1 -1
- package/dist/dev/{vidply.es-GZOBAJMJ.js → vidply.es-OBOYSHKU.js} +2 -2
- package/dist/dev/{vidply.es-GZOBAJMJ.js.map → vidply.es-OBOYSHKU.js.map} +1 -1
- package/dist/dev/vidply.esm.js +256 -60
- package/dist/dev/vidply.esm.js.map +3 -3
- package/dist/dev/{vidply.fr-FMZS5E5S.js → vidply.fr-WDRPLLB6.js} +2 -2
- package/dist/dev/{vidply.fr-FMZS5E5S.js.map → vidply.fr-WDRPLLB6.js.map} +1 -1
- package/dist/dev/{vidply.ja-VUCNBXJT.js → vidply.ja-ILEIPUNW.js} +2 -2
- package/dist/dev/{vidply.ja-VUCNBXJT.js.map → vidply.ja-ILEIPUNW.js.map} +1 -1
- package/dist/legacy/vidply.js +717 -401
- package/dist/legacy/vidply.js.map +4 -4
- package/dist/legacy/vidply.min.js +1 -1
- package/dist/legacy/vidply.min.meta.json +294 -206
- package/dist/prod/vidply.AudioDescriptionManager-ILVU6JG2.min.js +6 -0
- package/dist/prod/vidply.DASHRenderer-FGI4X7JZ.min.js +6 -0
- package/dist/prod/vidply.HLSRenderer-YSDXHYDM.min.js +6 -0
- package/dist/prod/{vidply.HTML5Renderer-PKYFSC7X.min.js → vidply.HTML5Renderer-3NGIW3DA.min.js} +1 -1
- package/dist/prod/vidply.SignLanguageManager-UPGXSO5F.min.js +6 -0
- package/dist/prod/vidply.SoundCloudRenderer-SSSBPFSU.min.js +6 -0
- package/dist/prod/vidply.TranscriptManager-PLVKPYNB.min.js +6 -0
- package/dist/prod/vidply.VimeoRenderer-7FAARTHC.min.js +6 -0
- package/dist/prod/vidply.YouTubeRenderer-G2EWGQR6.min.js +6 -0
- package/dist/prod/vidply.chunk-6XO2O3OT.min.js +6 -0
- package/dist/prod/{vidply.chunk-UTQ3UAR2.min.js → vidply.chunk-ALJYNEGS.min.js} +1 -1
- package/dist/prod/vidply.chunk-KYQFJSLN.min.js +6 -0
- package/dist/prod/vidply.chunk-OWFTRRQS.min.js +6 -0
- package/dist/prod/vidply.chunk-UO33KGOT.min.js +6 -0
- package/dist/prod/vidply.chunk-XHLTMSR5.min.js +6 -0
- package/dist/prod/vidply.esm.min.js +1 -1
- package/dist/vidply.css +21 -3
- package/dist/vidply.esm.min.meta.json +269 -269
- package/dist/vidply.min.css +1 -1
- package/package.json +8 -3
- package/src/controls/{CaptionManager.js → CaptionManager.ts} +23 -12
- package/src/controls/{ControlBar.js → ControlBar.ts} +121 -96
- package/src/controls/{KeyboardManager.js → KeyboardManager.ts} +15 -9
- package/src/controls/{SettingsDialog.js → SettingsDialog.ts} +24 -18
- package/src/controls/{TranscriptManager.js → TranscriptManager.ts} +144 -74
- package/src/core/{AudioDescriptionManager.js → AudioDescriptionManager.ts} +43 -28
- package/src/core/{Player.js → Player.ts} +416 -243
- package/src/core/{SignLanguageManager.js → SignLanguageManager.ts} +104 -63
- package/src/features/{PlaylistManager.js → PlaylistManager.ts} +85 -41
- package/src/i18n/{i18n.js → i18n.ts} +171 -184
- package/src/i18n/translations.ts +28 -0
- package/src/icons/Icons.ts +125 -0
- package/src/{index.js → index.ts} +14 -22
- package/src/renderers/{DASHRenderer.js → DASHRenderer.ts} +64 -30
- package/src/renderers/{HLSRenderer.js → HLSRenderer.ts} +47 -31
- package/src/renderers/{HTML5Renderer.js → HTML5Renderer.ts} +18 -15
- package/src/renderers/{SoundCloudRenderer.js → SoundCloudRenderer.ts} +48 -32
- package/src/renderers/{VimeoRenderer.js → VimeoRenderer.ts} +36 -26
- package/src/renderers/{YouTubeRenderer.js → YouTubeRenderer.ts} +39 -22
- package/src/styles/vidply.css +21 -3
- package/src/types/events.ts +86 -0
- package/src/types/globals.d.ts +230 -0
- package/src/types/index.ts +4 -0
- package/src/types/options.ts +154 -0
- package/src/types/renderer.ts +31 -0
- package/src/types/state.ts +23 -0
- package/src/utils/DOMUtils.ts +183 -0
- package/src/utils/{DraggableResizable.js → DraggableResizable.ts} +129 -76
- package/src/utils/EventEmitter.ts +50 -0
- package/src/utils/FocusUtils.ts +26 -0
- package/src/utils/FormUtils.ts +95 -0
- package/src/utils/{MenuFactory.js → MenuFactory.ts} +112 -25
- package/src/utils/MenuUtils.ts +172 -0
- package/src/utils/PerformanceUtils.ts +40 -0
- package/src/utils/ResizeHandles.ts +58 -0
- package/src/utils/{SettingsMenuFactory.js → SettingsMenuFactory.ts} +37 -14
- package/src/utils/StorageManager.ts +162 -0
- package/src/utils/{TimeUtils.js → TimeUtils.ts} +67 -87
- package/src/utils/VideoFrameCapture.ts +96 -0
- package/src/utils/{WindowComponents.js → WindowComponents.ts} +45 -5
- package/dist/dev/vidply.AudioDescriptionManager-HA3UD3AE.js.map +0 -7
- package/dist/dev/vidply.DASHRenderer-7BNDQ2Y3.js.map +0 -7
- package/dist/dev/vidply.HLSRenderer-N5HHMRN3.js.map +0 -7
- package/dist/dev/vidply.SignLanguageManager-WXJM3TOW.js.map +0 -7
- package/dist/dev/vidply.SoundCloudRenderer-HCMKXHSX.js.map +0 -7
- package/dist/dev/vidply.TranscriptManager-HCMCD7I5.js.map +0 -7
- package/dist/dev/vidply.VimeoRenderer-SLEBCZTT.js.map +0 -7
- package/dist/dev/vidply.YouTubeRenderer-E6F4UGVF.js.map +0 -7
- package/dist/dev/vidply.chunk-2D4L3SNZ.js.map +0 -7
- package/dist/dev/vidply.chunk-4IYIPSCH.js.map +0 -7
- package/dist/dev/vidply.chunk-JZWZJC4C.js.map +0 -7
- package/dist/dev/vidply.chunk-LB6ZIMVJ.js.map +0 -7
- package/dist/dev/vidply.chunk-XOI3AMU5.js.map +0 -7
- package/dist/dev/vidply.chunk-ZU6FUKLF.js.map +0 -7
- package/dist/prod/vidply.AudioDescriptionManager-NLQNWZ3J.min.js +0 -6
- package/dist/prod/vidply.DASHRenderer-VPATJU4E.min.js +0 -6
- package/dist/prod/vidply.HLSRenderer-GNTNO7YX.min.js +0 -6
- package/dist/prod/vidply.SignLanguageManager-PWBEA2O5.min.js +0 -6
- package/dist/prod/vidply.SoundCloudRenderer-S7DCYVO3.min.js +0 -6
- package/dist/prod/vidply.TranscriptManager-GKWZWRXP.min.js +0 -6
- package/dist/prod/vidply.VimeoRenderer-PVOJ6FAM.min.js +0 -6
- package/dist/prod/vidply.YouTubeRenderer-CTEREOSQ.min.js +0 -6
- package/dist/prod/vidply.chunk-AE2Z46L5.min.js +0 -6
- package/dist/prod/vidply.chunk-CEOGTO2N.min.js +0 -6
- package/dist/prod/vidply.chunk-GTZOF7HM.min.js +0 -6
- package/dist/prod/vidply.chunk-J4LHJRWK.min.js +0 -6
- package/dist/prod/vidply.chunk-ZS57MUEI.min.js +0 -6
- package/src/i18n/translations.js +0 -48
- package/src/icons/Icons.js +0 -179
- package/src/utils/DOMUtils.js +0 -260
- package/src/utils/EventEmitter.js +0 -53
- package/src/utils/FocusUtils.js +0 -37
- package/src/utils/FormUtils.js +0 -104
- package/src/utils/MenuUtils.js +0 -171
- package/src/utils/PerformanceUtils.js +0 -67
- package/src/utils/ResizeHandles.js +0 -77
- package/src/utils/StorageManager.js +0 -232
- package/src/utils/VideoFrameCapture.js +0 -119
- /package/dist/dev/{vidply.HTML5Renderer-Z6XYGT4E.js.map → vidply.HTML5Renderer-GUKQRF4M.js.map} +0 -0
- /package/dist/prod/{vidply.de-AW7EBVA7.min.js → vidply.de-CKLFPHNF.min.js} +0 -0
- /package/dist/prod/{vidply.es-WTNVZPEC.min.js → vidply.es-FYZBTBVH.min.js} +0 -0
- /package/dist/prod/{vidply.fr-SHC4HZXE.min.js → vidply.fr-E7FMYILU.min.js} +0 -0
- /package/dist/prod/{vidply.ja-M25JJ36V.min.js → vidply.ja-NOW6P3IH.min.js} +0 -0
- /package/src/i18n/languages/{de.js → de.ts} +0 -0
- /package/src/i18n/languages/{en.js → en.ts} +0 -0
- /package/src/i18n/languages/{es.js → es.ts} +0 -0
- /package/src/i18n/languages/{fr.js → fr.ts} +0 -0
- /package/src/i18n/languages/{ja.js → ja.ts} +0 -0
|
@@ -5,12 +5,19 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import {
|
|
7
7
|
CaptionManager
|
|
8
|
-
} from "./vidply.chunk-
|
|
9
|
-
import "./vidply.chunk-
|
|
10
|
-
import "./vidply.chunk-
|
|
8
|
+
} from "./vidply.chunk-ELJA4GMZ.js";
|
|
9
|
+
import "./vidply.chunk-SXDZXXZD.js";
|
|
10
|
+
import "./vidply.chunk-VLF6H5PZ.js";
|
|
11
11
|
|
|
12
|
-
// src/core/AudioDescriptionManager.
|
|
12
|
+
// src/core/AudioDescriptionManager.ts
|
|
13
13
|
var AudioDescriptionManager = class {
|
|
14
|
+
player;
|
|
15
|
+
captionTracks;
|
|
16
|
+
desiredState;
|
|
17
|
+
enabled;
|
|
18
|
+
originalSource;
|
|
19
|
+
sourceElement;
|
|
20
|
+
src;
|
|
14
21
|
constructor(player) {
|
|
15
22
|
this.player = player;
|
|
16
23
|
this.enabled = false;
|
|
@@ -327,6 +334,9 @@ var AudioDescriptionManager = class {
|
|
|
327
334
|
}
|
|
328
335
|
sourceElements.forEach((sourceEl) => sourceEl.remove());
|
|
329
336
|
sourcesToUpdate.forEach((sourceInfo) => {
|
|
337
|
+
if (!sourceInfo.src) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
330
340
|
const newSource = document.createElement("source");
|
|
331
341
|
newSource.setAttribute("src", sourceInfo.src);
|
|
332
342
|
if (sourceInfo.type) {
|
|
@@ -497,6 +507,9 @@ var AudioDescriptionManager = class {
|
|
|
497
507
|
this.player.element.poster = posterValue;
|
|
498
508
|
}
|
|
499
509
|
const originalSrcToUse = this.originalSource || this.player.originalSrc;
|
|
510
|
+
if (!originalSrcToUse) {
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
500
513
|
this.player.element.src = originalSrcToUse;
|
|
501
514
|
this.player.element.load();
|
|
502
515
|
await this._waitForMediaReady(currentTime > 0 || wasPlaying);
|
|
@@ -556,4 +569,4 @@ var AudioDescriptionManager = class {
|
|
|
556
569
|
export {
|
|
557
570
|
AudioDescriptionManager
|
|
558
571
|
};
|
|
559
|
-
//# sourceMappingURL=vidply.AudioDescriptionManager-
|
|
572
|
+
//# sourceMappingURL=vidply.AudioDescriptionManager-2LDAC6BR.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/core/AudioDescriptionManager.ts"],
|
|
4
|
+
"sourcesContent": ["/**\r\n * Audio Description Manager\r\n * Handles audio-described video source switching and caption track swapping\r\n */\r\n\r\nimport { CaptionManager } from '../controls/CaptionManager.js';\r\nimport type { Player } from './Player.js';\r\n\r\nexport class AudioDescriptionManager {\r\n player: Player;\r\n captionTracks: any[];\r\n desiredState: boolean;\r\n enabled: boolean;\r\n originalSource: any;\r\n sourceElement: any;\r\n src: any;\r\n\r\n constructor(player: Player) {\r\n this.player = player;\r\n \r\n // State\r\n this.enabled = false;\r\n this.desiredState = false;\r\n \r\n // Sources\r\n this.src = player.options.audioDescriptionSrc;\r\n this.sourceElement = null;\r\n this.originalSource = null;\r\n this.captionTracks = [];\r\n }\r\n\r\n /**\r\n * Initialize audio description from source elements\r\n * Called during player initialization\r\n */\r\n initFromSourceElements(sourceElements: Element[], trackElements: Element[]) {\r\n // Check for source elements with audio description attributes\r\n for (const sourceEl of sourceElements) {\r\n const descSrc = sourceEl.getAttribute('data-desc-src');\r\n const origSrc = sourceEl.getAttribute('data-orig-src');\r\n \r\n if (descSrc || origSrc) {\r\n if (!this.sourceElement) {\r\n this.sourceElement = sourceEl;\r\n }\r\n \r\n if (origSrc) {\r\n if (!this.originalSource) {\r\n this.originalSource = origSrc;\r\n }\r\n if (!this.player.originalSrc) {\r\n this.player.originalSrc = origSrc;\r\n }\r\n } else {\r\n const currentSrcAttr = sourceEl.getAttribute('src');\r\n if (!this.originalSource && currentSrcAttr) {\r\n this.originalSource = currentSrcAttr;\r\n }\r\n if (!this.player.originalSrc && currentSrcAttr) {\r\n this.player.originalSrc = currentSrcAttr;\r\n }\r\n }\r\n \r\n if (descSrc && !this.src) {\r\n this.src = descSrc;\r\n }\r\n }\r\n }\r\n\r\n // Check for text tracks with audio description versions\r\n trackElements.forEach((trackEl: Element) => {\r\n const trackKind = trackEl.getAttribute('kind');\r\n const trackDescSrc = trackEl.getAttribute('data-desc-src');\r\n \r\n if ((trackKind === 'captions' || trackKind === 'subtitles' || \r\n trackKind === 'chapters' || trackKind === 'descriptions') && trackDescSrc) {\r\n this.captionTracks.push({\r\n trackElement: trackEl,\r\n originalSrc: trackEl.getAttribute('src'),\r\n describedSrc: trackDescSrc,\r\n originalTrackSrc: trackEl.getAttribute('data-orig-src') || trackEl.getAttribute('src'),\r\n explicit: true\r\n });\r\n this.player.log(`Found explicit described ${trackKind} track: ${trackEl.getAttribute('src')} -> ${trackDescSrc}`);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Check if audio description is available\r\n */\r\n isAvailable() {\r\n const hasSourceElementsWithDesc = this.player.sourceElements.some(\r\n (el: Element) => el.getAttribute('data-desc-src')\r\n );\r\n return !!(this.src || hasSourceElementsWithDesc || this.captionTracks.length > 0);\r\n }\r\n\r\n /**\r\n * Enable audio description\r\n */\r\n async enable() {\r\n const hasSourceElementsWithDesc = this.player.sourceElements.some(\r\n (el: Element) => el.getAttribute('data-desc-src')\r\n );\r\n const hasTracksWithDesc = this.captionTracks.length > 0;\r\n \r\n if (!this.src && !hasSourceElementsWithDesc && !hasTracksWithDesc) {\r\n console.warn('VidPly: No audio description source, source elements, or tracks provided');\r\n return;\r\n }\r\n\r\n this.desiredState = true;\r\n\r\n // Store current state for restoration\r\n const currentTime = this.player.state.currentTime;\r\n const wasPlaying = this.player.state.playing;\r\n const posterValue = (this.player.element as HTMLVideoElement).poster || \r\n this.player.element.getAttribute('poster') || \r\n this.player.options.poster;\r\n const shouldKeepPoster = currentTime < 0.1 && !wasPlaying;\r\n\r\n // Get current caption text for synchronization\r\n const currentCaptionText = this._getCurrentCaptionText();\r\n\r\n // Switch to audio-described version based on what's available\r\n if (this.sourceElement) {\r\n // Use source element approach (data-desc-src on <source> elements)\r\n await this._enableWithSourceElement(currentTime, wasPlaying, posterValue, shouldKeepPoster, currentCaptionText);\r\n } else if (this.src) {\r\n // Use direct src approach (audioDescriptionSrc option)\r\n await this._enableWithDirectSrc(currentTime, wasPlaying, posterValue, shouldKeepPoster);\r\n } else if (hasTracksWithDesc) {\r\n // Only caption tracks with descriptions - swap tracks without changing video source\r\n await this._swapCaptionTracks(true);\r\n this.enabled = true;\r\n this.player.emit('audiodescriptionenabled');\r\n }\r\n // If none of the above, we already returned at the top check\r\n }\r\n\r\n /**\r\n * Disable audio description\r\n */\r\n async disable() {\r\n this.desiredState = false;\r\n\r\n // If we only had caption tracks (no video source swap), just swap tracks back\r\n const hasTracksWithDesc = this.captionTracks.length > 0;\r\n if (!this.sourceElement && !this.src && hasTracksWithDesc) {\r\n await this._swapCaptionTracks(false);\r\n this.enabled = false;\r\n this.player.emit('audiodescriptiondisabled');\r\n return;\r\n }\r\n\r\n if (!this.player.originalSrc) {\r\n return;\r\n }\r\n\r\n // Store current state\r\n const currentTime = this.player.state.currentTime;\r\n const wasPlaying = this.player.state.playing;\r\n const posterValue = (this.player.element as HTMLVideoElement).poster || \r\n this.player.element.getAttribute('poster') || \r\n this.player.options.poster;\r\n const shouldKeepPoster = currentTime < 0.1 && !wasPlaying;\r\n\r\n // Get current caption for sync\r\n const currentCaptionText = this._getCurrentCaptionText();\r\n\r\n if (this.sourceElement) {\r\n await this._disableWithSourceElement(currentTime, wasPlaying, posterValue, shouldKeepPoster, currentCaptionText);\r\n } else if (this.src) {\r\n await this._disableWithDirectSrc(currentTime, wasPlaying, posterValue);\r\n }\r\n }\r\n\r\n /**\r\n * Toggle audio description\r\n */\r\n async toggle() {\r\n const descriptionTrack = this.player.findTextTrack('descriptions');\r\n const hasAudioDescriptionSrc = this.isAvailable();\r\n \r\n if (descriptionTrack && !hasAudioDescriptionSrc) {\r\n // Toggle description track playback\r\n if (descriptionTrack.mode === 'showing') {\r\n descriptionTrack.mode = 'hidden';\r\n this.enabled = false;\r\n this.player.emit('audiodescriptiondisabled');\r\n } else {\r\n descriptionTrack.mode = 'showing';\r\n this.enabled = true;\r\n this.player.emit('audiodescriptionenabled');\r\n }\r\n } else if (descriptionTrack && hasAudioDescriptionSrc) {\r\n // Toggle both\r\n if (this.enabled) {\r\n this.desiredState = false;\r\n await this.disable();\r\n } else {\r\n descriptionTrack.mode = 'showing';\r\n this.desiredState = true;\r\n await this.enable();\r\n }\r\n } else if (hasAudioDescriptionSrc) {\r\n // Toggle source\r\n if (this.enabled) {\r\n this.desiredState = false;\r\n await this.disable();\r\n } else {\r\n this.desiredState = true;\r\n await this.enable();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get current caption text for synchronization\r\n */\r\n _getCurrentCaptionText() {\r\n if (this.player.captionManager && \r\n this.player.captionManager.currentTrack && \r\n this.player.captionManager.currentCue) {\r\n return this.player.captionManager.currentCue.text;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Validate that a track URL exists\r\n */\r\n async _validateTrackExists(url: string) {\r\n try {\r\n const response = await fetch(url, { method: 'HEAD' });\r\n return response.ok;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Swap caption tracks to described versions\r\n */\r\n async _swapCaptionTracks(toDescribed = true) {\r\n if (this.captionTracks.length === 0) return [];\r\n \r\n const swappedTracks: any[] = [];\r\n \r\n const validationPromises = this.captionTracks.map(async (trackInfo) => {\r\n if (trackInfo.trackElement && trackInfo.describedSrc) {\r\n if (trackInfo.explicit === true) {\r\n try {\r\n const exists = await this._validateTrackExists(\r\n toDescribed ? trackInfo.describedSrc : trackInfo.originalSrc\r\n );\r\n return { trackInfo, exists };\r\n } catch {\r\n return { trackInfo, exists: false };\r\n }\r\n }\r\n }\r\n return { trackInfo, exists: false };\r\n });\r\n \r\n const validationResults = await Promise.all(validationPromises);\r\n const tracksToSwap = validationResults.filter(result => result.exists);\r\n \r\n if (tracksToSwap.length > 0) {\r\n // Store track modes before removing\r\n const trackModes = new Map();\r\n tracksToSwap.forEach(({ trackInfo }) => {\r\n const textTrack = trackInfo.trackElement.track;\r\n if (textTrack) {\r\n trackModes.set(trackInfo, {\r\n wasShowing: textTrack.mode === 'showing',\r\n wasHidden: textTrack.mode === 'hidden'\r\n });\r\n } else {\r\n trackModes.set(trackInfo, { wasShowing: false, wasHidden: false });\r\n }\r\n });\r\n \r\n // Store track info and remove\r\n const tracksToReadd = tracksToSwap.map(({ trackInfo }) => {\r\n const attributes: Record<string, string> = {};\r\n Array.from(trackInfo.trackElement.attributes).forEach((attr: any) => {\r\n attributes[attr.name] = attr.value;\r\n });\r\n \r\n const result = {\r\n trackInfo,\r\n oldSrc: trackInfo.trackElement.getAttribute('src'),\r\n parent: trackInfo.trackElement.parentNode,\r\n nextSibling: trackInfo.trackElement.nextSibling,\r\n attributes\r\n };\r\n \r\n trackInfo.trackElement.remove();\r\n return result;\r\n });\r\n \r\n // Force browser to process removal\r\n this.player.element.load();\r\n \r\n // Re-add tracks with new src\r\n await new Promise<void>(resolve => {\r\n setTimeout(() => {\r\n tracksToReadd.forEach(({ trackInfo, parent, nextSibling, attributes }) => {\r\n swappedTracks.push(trackInfo);\r\n \r\n const newTrackElement = document.createElement('track');\r\n const newSrc = toDescribed ? trackInfo.describedSrc : trackInfo.originalSrc;\r\n newTrackElement.setAttribute('src', newSrc);\r\n \r\n Object.keys(attributes).forEach(attrName => {\r\n if (attrName !== 'src' && attrName !== 'data-desc-src') {\r\n newTrackElement.setAttribute(attrName, attributes[attrName]);\r\n }\r\n });\r\n \r\n // Use the player's video element as parent if the original parent is null\r\n const targetParent = parent || this.player.element;\r\n \r\n if (nextSibling && nextSibling.parentNode) {\r\n targetParent.insertBefore(newTrackElement, nextSibling);\r\n } else {\r\n targetParent.appendChild(newTrackElement);\r\n }\r\n \r\n trackInfo.trackElement = newTrackElement;\r\n });\r\n \r\n this.player.invalidateTrackCache();\r\n \r\n // Setup new tracks\r\n const setupNewTracks = () => {\r\n this.player.setManagedTimeout(() => {\r\n swappedTracks.forEach((trackInfo) => {\r\n const newTextTrack = trackInfo.trackElement.track;\r\n if (newTextTrack) {\r\n const modeInfo = trackModes.get(trackInfo) || { wasShowing: false, wasHidden: false };\r\n newTextTrack.mode = 'hidden';\r\n \r\n const restoreMode = () => {\r\n if (modeInfo.wasShowing || modeInfo.wasHidden) {\r\n newTextTrack.mode = 'hidden';\r\n } else {\r\n newTextTrack.mode = 'disabled';\r\n }\r\n };\r\n \r\n if (newTextTrack.readyState >= 2) {\r\n restoreMode();\r\n } else {\r\n newTextTrack.addEventListener('load', restoreMode, { once: true });\r\n newTextTrack.addEventListener('error', restoreMode, { once: true });\r\n }\r\n }\r\n });\r\n }, 300);\r\n };\r\n \r\n if (this.player.element.readyState >= 1) {\r\n setTimeout(setupNewTracks, 200);\r\n } else {\r\n this.player.element.addEventListener('loadedmetadata', setupNewTracks, { once: true });\r\n setTimeout(setupNewTracks, 2000);\r\n }\r\n \r\n resolve();\r\n }, 100);\r\n });\r\n }\r\n \r\n return swappedTracks;\r\n }\r\n\r\n /**\r\n * Update source elements to described versions\r\n */\r\n _updateSourceElements(toDescribed = true) {\r\n const sourceElements = this.player.sourceElements;\r\n const sourcesToUpdate: Array<{ src: string | null; type: string | null; origSrc: string | null; descSrc: string | null }> = [];\r\n \r\n sourceElements.forEach((sourceEl: Element) => {\r\n const descSrcAttr = sourceEl.getAttribute('data-desc-src');\r\n const currentSrc = sourceEl.getAttribute('src');\r\n \r\n if (descSrcAttr) {\r\n const type = sourceEl.getAttribute('type');\r\n let origSrc = sourceEl.getAttribute('data-orig-src') || currentSrc;\r\n \r\n sourcesToUpdate.push({\r\n src: toDescribed ? descSrcAttr : origSrc,\r\n type,\r\n origSrc,\r\n descSrc: descSrcAttr\r\n });\r\n } else {\r\n sourcesToUpdate.push({\r\n src: sourceEl.getAttribute('src'),\r\n type: sourceEl.getAttribute('type'),\r\n origSrc: null,\r\n descSrc: null\r\n });\r\n }\r\n });\r\n \r\n // Remove src attribute if present\r\n if (this.player.element.hasAttribute('src')) {\r\n this.player.element.removeAttribute('src');\r\n }\r\n \r\n // Remove all source elements\r\n sourceElements.forEach((sourceEl: Element) => sourceEl.remove());\r\n \r\n // Re-add with updated src\r\n sourcesToUpdate.forEach((sourceInfo) => {\r\n if (!sourceInfo.src) {\r\n return;\r\n }\r\n const newSource = document.createElement('source');\r\n newSource.setAttribute('src', sourceInfo.src);\r\n if (sourceInfo.type) {\r\n newSource.setAttribute('type', sourceInfo.type);\r\n }\r\n if (sourceInfo.origSrc) {\r\n newSource.setAttribute('data-orig-src', sourceInfo.origSrc);\r\n }\r\n if (sourceInfo.descSrc) {\r\n newSource.setAttribute('data-desc-src', sourceInfo.descSrc);\r\n }\r\n \r\n const firstTrack = this.player.element.querySelector('track');\r\n if (firstTrack) {\r\n this.player.element.insertBefore(newSource, firstTrack);\r\n } else {\r\n this.player.element.appendChild(newSource);\r\n }\r\n });\r\n \r\n this.player._sourceElementsDirty = true;\r\n this.player._sourceElementsCache = null;\r\n }\r\n\r\n /**\r\n * Wait for media to be ready\r\n */\r\n async _waitForMediaReady(needSeek = false) {\r\n // Wait for metadata\r\n await new Promise<void>((resolve) => {\r\n if (this.player.element.readyState >= 1) {\r\n resolve();\r\n } else {\r\n const onLoad = () => {\r\n this.player.element.removeEventListener('loadedmetadata', onLoad);\r\n resolve();\r\n };\r\n this.player.element.addEventListener('loadedmetadata', onLoad);\r\n }\r\n });\r\n \r\n // Wait for tracks\r\n await new Promise(resolve => setTimeout(resolve, 300));\r\n \r\n // Wait for playback if needed\r\n if (needSeek) {\r\n await new Promise<void>((resolve) => {\r\n if (this.player.element.readyState >= 3) {\r\n resolve();\r\n } else {\r\n const onCanPlay = () => {\r\n this.player.element.removeEventListener('canplay', onCanPlay);\r\n this.player.element.removeEventListener('canplaythrough', onCanPlay);\r\n resolve();\r\n };\r\n this.player.element.addEventListener('canplay', onCanPlay, { once: true });\r\n this.player.element.addEventListener('canplaythrough', onCanPlay, { once: true });\r\n setTimeout(() => {\r\n this.player.element.removeEventListener('canplay', onCanPlay);\r\n this.player.element.removeEventListener('canplaythrough', onCanPlay);\r\n resolve();\r\n }, 3000);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Restore playback state after source change\r\n */\r\n async _restorePlaybackState(currentTime: number, wasPlaying: boolean, shouldKeepPoster: boolean, currentCaptionText: string | null) {\r\n // Try to find matching caption for sync\r\n let syncTime = currentTime;\r\n if (currentCaptionText && this.player.captionManager && this.player.captionManager.tracks.length > 0) {\r\n await new Promise(resolve => setTimeout(resolve, 500));\r\n const matchingTime = this.player.findMatchingCaptionTime(\r\n currentCaptionText, \r\n this.player.captionManager.tracks\r\n );\r\n if (matchingTime !== null) {\r\n syncTime = matchingTime;\r\n if (this.player.options.debug) {\r\n this.player.log(`[VidPly] Syncing via caption: ${currentTime}s -> ${syncTime}s`);\r\n }\r\n }\r\n }\r\n \r\n // Seek\r\n if (syncTime > 0) {\r\n this.player.seek(syncTime);\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n }\r\n \r\n // Play/pause\r\n if (wasPlaying) {\r\n await this.player.play();\r\n this.player.setManagedTimeout(() => {\r\n this.player.hidePosterOverlay();\r\n }, 100);\r\n } else {\r\n this.player.pause();\r\n if (!shouldKeepPoster) {\r\n this.player.hidePosterOverlay();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Enable with source element method\r\n */\r\n async _enableWithSourceElement(currentTime: number, wasPlaying: boolean, posterValue: string | null, shouldKeepPoster: boolean, currentCaptionText: string | null) {\r\n // Swap caption tracks\r\n await this._swapCaptionTracks(true);\r\n \r\n // Update source elements\r\n this._updateSourceElements(true);\r\n \r\n // Preserve poster\r\n if (posterValue && this.player.element.tagName === 'VIDEO') {\r\n (this.player.element as HTMLVideoElement).poster = posterValue;\r\n }\r\n \r\n // Reload\r\n this.player.element.load();\r\n \r\n // Wait for ready\r\n await this._waitForMediaReady(currentTime > 0 || wasPlaying);\r\n \r\n // Restore playback\r\n await this._restorePlaybackState(currentTime, wasPlaying, shouldKeepPoster, currentCaptionText);\r\n \r\n // Update state\r\n if (!this.desiredState) return;\r\n this.enabled = true;\r\n this.player.state.audioDescriptionEnabled = true;\r\n this.player.emit('audiodescriptionenabled');\r\n \r\n // Reload transcript if visible\r\n this._reloadTranscript();\r\n }\r\n\r\n /**\r\n * Enable with direct src method\r\n */\r\n async _enableWithDirectSrc(currentTime: number, wasPlaying: boolean, posterValue: string | null, shouldKeepPoster: boolean) {\r\n // Swap caption tracks\r\n await this._swapCaptionTracks(true);\r\n \r\n // Set poster\r\n if (posterValue && this.player.element.tagName === 'VIDEO') {\r\n (this.player.element as HTMLVideoElement).poster = posterValue;\r\n }\r\n \r\n // Set src (this method should only be called when this.src exists)\r\n this.player.element.src = this.src;\r\n \r\n // Wait and restore\r\n await this._waitForMediaReady(currentTime > 0 || wasPlaying);\r\n \r\n if (currentTime > 0) {\r\n this.player.seek(currentTime);\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n }\r\n \r\n if (wasPlaying) {\r\n await this.player.play();\r\n } else {\r\n this.player.pause();\r\n if (!shouldKeepPoster) {\r\n this.player.hidePosterOverlay();\r\n }\r\n }\r\n \r\n if (!this.desiredState) return;\r\n this.enabled = true;\r\n this.player.state.audioDescriptionEnabled = true;\r\n this.player.emit('audiodescriptionenabled');\r\n \r\n // Reload transcript if visible\r\n this._reloadTranscript();\r\n }\r\n\r\n /**\r\n * Disable with source element method\r\n */\r\n async _disableWithSourceElement(currentTime: number, wasPlaying: boolean, posterValue: string | null, shouldKeepPoster: boolean, currentCaptionText: string | null) {\r\n // Swap caption tracks back\r\n await this._swapCaptionTracks(false);\r\n \r\n // Update source elements\r\n this._updateSourceElements(false);\r\n \r\n // Preserve poster\r\n if (posterValue && this.player.element.tagName === 'VIDEO') {\r\n (this.player.element as HTMLVideoElement).poster = posterValue;\r\n }\r\n \r\n // Reload\r\n this.player.element.load();\r\n this.player.invalidateTrackCache();\r\n \r\n // Wait for ready\r\n await this._waitForMediaReady(currentTime > 0 || wasPlaying);\r\n \r\n // Restore playback\r\n await this._restorePlaybackState(currentTime, wasPlaying, shouldKeepPoster, currentCaptionText);\r\n \r\n // Reinitialize caption manager\r\n if (this.player.captionManager) {\r\n this.player.captionManager.destroy();\r\n this.player.captionManager = new CaptionManager(this.player);\r\n }\r\n \r\n // Update state\r\n if (this.desiredState) return;\r\n this.enabled = false;\r\n this.player.state.audioDescriptionEnabled = false;\r\n this.player.emit('audiodescriptiondisabled');\r\n \r\n // Reload transcript if visible\r\n this._reloadTranscript();\r\n }\r\n\r\n /**\r\n * Disable with direct src method\r\n */\r\n async _disableWithDirectSrc(currentTime: number, wasPlaying: boolean, posterValue: string | null) {\r\n // Swap caption tracks back\r\n await this._swapCaptionTracks(false);\r\n \r\n // Set poster\r\n if (posterValue && this.player.element.tagName === 'VIDEO') {\r\n (this.player.element as HTMLVideoElement).poster = posterValue;\r\n }\r\n \r\n // Restore original src\r\n const originalSrcToUse = this.originalSource || this.player.originalSrc;\r\n if (!originalSrcToUse) {\r\n return;\r\n }\r\n this.player.element.src = originalSrcToUse;\r\n this.player.element.load();\r\n \r\n // Wait and restore\r\n await this._waitForMediaReady(currentTime > 0 || wasPlaying);\r\n \r\n if (currentTime > 0) {\r\n this.player.seek(currentTime);\r\n }\r\n \r\n if (wasPlaying) {\r\n await this.player.play();\r\n }\r\n \r\n if (this.desiredState) return;\r\n this.enabled = false;\r\n this.player.state.audioDescriptionEnabled = false;\r\n this.player.emit('audiodescriptiondisabled');\r\n \r\n // Reload transcript if visible\r\n this._reloadTranscript();\r\n }\r\n\r\n /**\r\n * Reload transcript after audio description state change\r\n */\r\n _reloadTranscript() {\r\n if (this.player.transcriptManager && this.player.transcriptManager.isVisible) {\r\n // Wait for tracks to load after source swap\r\n this.player.setManagedTimeout(() => {\r\n if (this.player.transcriptManager && this.player.transcriptManager.loadTranscriptData) {\r\n this.player.transcriptManager.loadTranscriptData();\r\n }\r\n }, 800);\r\n }\r\n }\r\n\r\n /**\r\n * Update sources (called when playlist changes)\r\n */\r\n updateSources(audioDescriptionSrc: string) {\r\n this.src = audioDescriptionSrc || null;\r\n // Reset state for new playlist item\r\n this.enabled = false;\r\n this.desiredState = false;\r\n this.sourceElement = null;\r\n this.originalSource = null;\r\n this.captionTracks = [];\r\n }\r\n \r\n /**\r\n * Reinitialize from current player elements (called after playlist loads new tracks)\r\n */\r\n reinitialize() {\r\n this.player.invalidateTrackCache();\r\n this.initFromSourceElements(this.player.sourceElements, this.player.trackElements);\r\n }\r\n\r\n /**\r\n * Cleanup\r\n */\r\n destroy() {\r\n this.enabled = false;\r\n this.desiredState = false;\r\n this.captionTracks = [];\r\n this.sourceElement = null;\r\n this.originalSource = null;\r\n }\r\n}\r\n\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -4,8 +4,22 @@
|
|
|
4
4
|
* Released under GPL-2.0-or-later License
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
// src/renderers/DASHRenderer.
|
|
7
|
+
// src/renderers/DASHRenderer.ts
|
|
8
8
|
var DASHRenderer = class {
|
|
9
|
+
player;
|
|
10
|
+
media;
|
|
11
|
+
dash;
|
|
12
|
+
_dashSourceLoaded;
|
|
13
|
+
_pendingSrc;
|
|
14
|
+
_dashSubtitleTracksCount;
|
|
15
|
+
_dashTextTracks;
|
|
16
|
+
_cueUpdateTimer;
|
|
17
|
+
_captionEnabledHandler;
|
|
18
|
+
_captionDisabledHandler;
|
|
19
|
+
_lastKnownCueCount;
|
|
20
|
+
_dashTextIsTtml;
|
|
21
|
+
_pendingTimeouts;
|
|
22
|
+
_ttmlDiv;
|
|
9
23
|
constructor(player) {
|
|
10
24
|
this.player = player;
|
|
11
25
|
this.media = player.element;
|
|
@@ -20,6 +34,7 @@ var DASHRenderer = class {
|
|
|
20
34
|
this._lastKnownCueCount = 0;
|
|
21
35
|
this._dashTextIsTtml = false;
|
|
22
36
|
this._pendingTimeouts = [];
|
|
37
|
+
this._ttmlDiv = null;
|
|
23
38
|
}
|
|
24
39
|
async init() {
|
|
25
40
|
this.player.log("Using dash.js for DASH support");
|
|
@@ -38,7 +53,11 @@ var DASHRenderer = class {
|
|
|
38
53
|
sourceElements.forEach((source) => source.remove());
|
|
39
54
|
this.player.log("Removed <source> elements for HTML5 validity (dash.js uses MSE)");
|
|
40
55
|
}
|
|
41
|
-
|
|
56
|
+
const dashjs = window.dashjs;
|
|
57
|
+
if (!dashjs) {
|
|
58
|
+
throw new Error("dash.js not available");
|
|
59
|
+
}
|
|
60
|
+
this.dash = dashjs.MediaPlayer().create();
|
|
42
61
|
this.dash.updateSettings({
|
|
43
62
|
debug: {
|
|
44
63
|
logLevel: this.player.options.debug ? 4 : 0
|
|
@@ -125,7 +144,10 @@ var DASHRenderer = class {
|
|
|
125
144
|
return id;
|
|
126
145
|
}
|
|
127
146
|
attachDashEvents() {
|
|
128
|
-
|
|
147
|
+
const dashjs = window.dashjs;
|
|
148
|
+
if (!dashjs) return;
|
|
149
|
+
const dashEvents = dashjs.MediaPlayer.events;
|
|
150
|
+
this.dash.on(dashEvents.MANIFEST_LOADED, (e) => {
|
|
129
151
|
const data = e.data || e;
|
|
130
152
|
this.player.log("DASH manifest loaded");
|
|
131
153
|
this.player.emit("dashmanifestloaded", data);
|
|
@@ -136,13 +158,13 @@ var DASHRenderer = class {
|
|
|
136
158
|
this._checkSubtitleTracks();
|
|
137
159
|
}, 500);
|
|
138
160
|
});
|
|
139
|
-
this.dash.on(
|
|
161
|
+
this.dash.on(dashEvents.QUALITY_CHANGE_RENDERED, (e) => {
|
|
140
162
|
if (e.mediaType === "video") {
|
|
141
163
|
this.player.log("DASH quality changed to index " + e.newQuality);
|
|
142
164
|
this.player.emit("dashqualitychanged", e);
|
|
143
165
|
}
|
|
144
166
|
});
|
|
145
|
-
this.dash.on(
|
|
167
|
+
this.dash.on(dashEvents.TEXT_TRACKS_ADDED, (e) => {
|
|
146
168
|
const tracks = e.tracks || [];
|
|
147
169
|
this._dashTextTracks = tracks;
|
|
148
170
|
this._dashTextIsTtml = tracks.some(
|
|
@@ -162,7 +184,7 @@ var DASHRenderer = class {
|
|
|
162
184
|
}
|
|
163
185
|
}
|
|
164
186
|
});
|
|
165
|
-
this.dash.on(
|
|
187
|
+
this.dash.on(dashEvents.STREAM_INITIALIZED, () => {
|
|
166
188
|
this.player.log("DASH stream initialized");
|
|
167
189
|
this.player.emit("dashstreaminitialized");
|
|
168
190
|
this._setTimeout(() => {
|
|
@@ -172,11 +194,15 @@ var DASHRenderer = class {
|
|
|
172
194
|
}
|
|
173
195
|
}, 300);
|
|
174
196
|
});
|
|
175
|
-
this.dash.on(
|
|
197
|
+
this.dash.on(dashEvents.ERROR, (e) => {
|
|
176
198
|
this.handleDashError(e);
|
|
177
199
|
});
|
|
178
|
-
this.dash.on(
|
|
200
|
+
this.dash.on(dashEvents.FRAGMENT_LOADING_COMPLETED, (e) => {
|
|
201
|
+
const wasBuffering = this.player.state.buffering === true;
|
|
179
202
|
this.player.state.buffering = false;
|
|
203
|
+
if (wasBuffering) {
|
|
204
|
+
this.player.emit("canplay");
|
|
205
|
+
}
|
|
180
206
|
if (e.request && e.request.mediaType === "text" && !this._dashTextIsTtml) {
|
|
181
207
|
this._setTimeout(() => {
|
|
182
208
|
const count = this._getTotalCueCount();
|
|
@@ -657,4 +683,4 @@ var DASHRenderer = class {
|
|
|
657
683
|
export {
|
|
658
684
|
DASHRenderer
|
|
659
685
|
};
|
|
660
|
-
//# sourceMappingURL=vidply.DASHRenderer-
|
|
686
|
+
//# sourceMappingURL=vidply.DASHRenderer-JGJTNVPH.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/renderers/DASHRenderer.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Renderer } from '../types/renderer.js';\r\nimport type { Player } from '../core/Player.js';\r\n\r\ninterface DashTextTrack {\r\n lang?: string;\r\n language?: string;\r\n srclang?: string;\r\n kind?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport class DASHRenderer implements Renderer {\r\n player: Player;\r\n media: HTMLMediaElement;\r\n dash: any;\r\n _dashSourceLoaded: boolean;\r\n _pendingSrc: string | null;\r\n _dashSubtitleTracksCount: number | undefined;\r\n _dashTextTracks: DashTextTrack[];\r\n _cueUpdateTimer: ReturnType<typeof setInterval> | null;\r\n _captionEnabledHandler: ((...args: any[]) => void) | null;\r\n _captionDisabledHandler: ((...args: any[]) => void) | null;\r\n _lastKnownCueCount: number;\r\n _dashTextIsTtml: boolean;\r\n _pendingTimeouts: ReturnType<typeof setTimeout>[];\r\n _ttmlDiv: HTMLElement | null;\r\n\r\n constructor(player: Player) {\r\n this.player = player;\r\n this.media = player.element;\r\n this.dash = null;\r\n this._dashSourceLoaded = false;\r\n this._pendingSrc = null;\r\n this._dashSubtitleTracksCount = undefined;\r\n this._dashTextTracks = [];\r\n this._cueUpdateTimer = null;\r\n this._captionEnabledHandler = null;\r\n this._captionDisabledHandler = null;\r\n this._lastKnownCueCount = 0;\r\n this._dashTextIsTtml = false;\r\n this._pendingTimeouts = [];\r\n this._ttmlDiv = null;\r\n }\r\n\r\n async init() {\r\n this.player.log('Using dash.js for DASH support');\r\n await this.initDashJs();\r\n }\r\n\r\n async initDashJs() {\r\n this.media.controls = false;\r\n this.media.removeAttribute('controls');\r\n\r\n if (!window.dashjs) {\r\n await this.loadDashJs();\r\n }\r\n\r\n // Remove <source> children — dash.js manages the src via MSE\r\n const sourceElements = Array.from(this.media.querySelectorAll('source'));\r\n let originalSrc = null;\r\n if (sourceElements.length > 0) {\r\n originalSrc = sourceElements[0].getAttribute('src');\r\n sourceElements.forEach(source => source.remove());\r\n this.player.log('Removed <source> elements for HTML5 validity (dash.js uses MSE)');\r\n }\r\n\r\n const dashjs = window.dashjs;\r\n if (!dashjs) {\r\n throw new Error('dash.js not available');\r\n }\r\n this.dash = dashjs.MediaPlayer().create();\r\n\r\n this.dash.updateSettings({\r\n debug: {\r\n logLevel: this.player.options.debug ? 4 : 0\r\n },\r\n streaming: {\r\n buffer: {\r\n bufferTimeAtTopQuality: 30,\r\n bufferTimeAtTopQualityLongForm: 60,\r\n stableBufferTime: 12,\r\n bufferToKeep: 20,\r\n bufferPruningInterval: 10\r\n },\r\n retryAttempts: {\r\n MPD: 4,\r\n MediaSegment: 6,\r\n InitializationSegment: 4,\r\n BitstreamSwitchingSegment: 4\r\n },\r\n retryIntervals: {\r\n MPD: 1000,\r\n MediaSegment: 1000,\r\n InitializationSegment: 1000,\r\n BitstreamSwitchingSegment: 1000\r\n },\r\n abr: {\r\n autoSwitchBitrate: { video: true, audio: true }\r\n },\r\n text: {\r\n defaultEnabled: true\r\n }\r\n }\r\n });\r\n\r\n // Create the TTML rendering div before initialize() so the DOM element\r\n // exists, but attach it to dash.js after initialize() because\r\n // attachTTMLRenderingDiv() requires attachView() which initialize() calls.\r\n this._ttmlDiv = document.createElement('div');\r\n this._ttmlDiv.className = 'vidply-dash-ttml';\r\n this._ttmlDiv.style.visibility = 'hidden';\r\n const wrapper = this.player.videoWrapper || this.media.parentElement;\r\n if (wrapper) {\r\n wrapper.appendChild(this._ttmlDiv);\r\n }\r\n\r\n this.dash.initialize(this.media, null, false);\r\n this.dash.attachTTMLRenderingDiv(this._ttmlDiv);\r\n\r\n // Resolve source URL\r\n let src = this.player.currentSource;\r\n\r\n if (!src && originalSrc) {\r\n src = originalSrc;\r\n }\r\n\r\n if (!src) {\r\n src = this.player.element.getAttribute('data-vidply-src');\r\n }\r\n\r\n if (!src) {\r\n const elementSrc = this.player.element.getAttribute('src') || this.player.element.src;\r\n if (elementSrc && !elementSrc.startsWith('blob:')) {\r\n src = elementSrc;\r\n }\r\n }\r\n\r\n this.player.log(`Loading DASH source: ${src}`, 'log');\r\n\r\n if (!src) {\r\n throw new Error('No DASH source found');\r\n }\r\n\r\n if (this.player.options.deferLoad) {\r\n this._pendingSrc = src;\r\n } else {\r\n this.dash.attachSource(src);\r\n this._dashSourceLoaded = true;\r\n }\r\n\r\n this.attachDashEvents();\r\n this.attachMediaEvents();\r\n this._setupCaptionSync();\r\n }\r\n\r\n async loadDashJs() {\r\n return new Promise<void>((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = 'https://cdn.jsdelivr.net/npm/dashjs@latest/dist/dash.all.min.js';\r\n script.onload = () => resolve();\r\n script.onerror = () => reject(new Error('Failed to load dash.js'));\r\n document.head.appendChild(script);\r\n });\r\n }\r\n\r\n _setTimeout(fn: () => void, delay: number) {\r\n const id = setTimeout(() => {\r\n this._pendingTimeouts = this._pendingTimeouts.filter(t => t !== id);\r\n fn();\r\n }, delay);\r\n this._pendingTimeouts.push(id);\r\n return id;\r\n }\r\n\r\n attachDashEvents() {\r\n const dashjs = window.dashjs;\r\n if (!dashjs) return;\r\n const dashEvents = dashjs.MediaPlayer.events;\r\n\r\n this.dash.on(dashEvents.MANIFEST_LOADED, (e: any) => {\r\n const data = e.data || e;\r\n this.player.log('DASH manifest loaded');\r\n this.player.emit('dashmanifestloaded', data);\r\n\r\n if (this.player.container) {\r\n this.player.container.classList.remove('vidply-external-controls');\r\n }\r\n\r\n this._setTimeout(() => {\r\n this._checkSubtitleTracks();\r\n }, 500);\r\n });\r\n\r\n this.dash.on(dashEvents.QUALITY_CHANGE_RENDERED, (e: any) => {\r\n if (e.mediaType === 'video') {\r\n this.player.log('DASH quality changed to index ' + e.newQuality);\r\n this.player.emit('dashqualitychanged', e);\r\n }\r\n });\r\n\r\n this.dash.on(dashEvents.TEXT_TRACKS_ADDED, (e: any) => {\r\n const tracks = e.tracks || [];\r\n this._dashTextTracks = tracks;\r\n this._dashTextIsTtml = tracks.some((t: any) =>\r\n t.isTTML || /stpp|ttml/i.test(t.codec || '') || /ttml/i.test(t.mimeType || '')\r\n );\r\n this.player.log(`DASH text tracks added: ${tracks.length} tracks, format: ${this._dashTextIsTtml ? 'TTML' : 'WebVTT'}`);\r\n this._dashSubtitleTracksCount = tracks.length;\r\n this.player.emit('dashsubtitletracksupdated', { tracks });\r\n this.updateCaptionButtonsForDash();\r\n\r\n if (tracks.length > 0) {\r\n try {\r\n this.dash.setTextTrack(0);\r\n } catch (err) {\r\n // ignore if not ready yet\r\n }\r\n if (!this._dashTextIsTtml) {\r\n this._startCueUpdatePolling();\r\n }\r\n }\r\n });\r\n\r\n this.dash.on(dashEvents.STREAM_INITIALIZED, () => {\r\n this.player.log('DASH stream initialized');\r\n this.player.emit('dashstreaminitialized');\r\n\r\n this._setTimeout(() => {\r\n const qualities = this.getQualities();\r\n if (qualities.length > 0) {\r\n this.player.emit('dashmanifestparsed', { qualities });\r\n }\r\n }, 300);\r\n });\r\n\r\n this.dash.on(dashEvents.ERROR, (e: any) => {\r\n this.handleDashError(e);\r\n });\r\n\r\n this.dash.on(dashEvents.FRAGMENT_LOADING_COMPLETED, (e: any) => {\r\n const wasBuffering = this.player.state.buffering === true;\r\n this.player.state.buffering = false;\r\n if (wasBuffering) {\r\n this.player.emit('canplay');\r\n }\r\n if (e.request && e.request.mediaType === 'text' && !this._dashTextIsTtml) {\r\n this._setTimeout(() => {\r\n const count = this._getTotalCueCount();\r\n if (count > this._lastKnownCueCount) {\r\n this._lastKnownCueCount = count;\r\n this.player.emit('textcuesupdate');\r\n }\r\n }, 100);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Count total cues across all subtitle/caption tracks (for WebVTT DASH).\r\n */\r\n _getTotalCueCount() {\r\n const textTracks = this.media.textTracks;\r\n let total = 0;\r\n if (!textTracks) return total;\r\n for (let i = 0; i < textTracks.length; i++) {\r\n const track = textTracks[i];\r\n if ((track.kind === 'subtitles' || track.kind === 'captions') && !track._vidplyStale && track.cues) {\r\n total += track.cues.length;\r\n }\r\n }\r\n return total;\r\n }\r\n\r\n /**\r\n * Sync VidPly caption track switches with dash.js so it loads\r\n * subtitle segments for the selected language.\r\n */\r\n _setupCaptionSync() {\r\n this._captionEnabledHandler = (selectedTrack) => {\r\n if (this._dashTextIsTtml) {\r\n // dash.js only renders TTML content to the rendering div when the\r\n // TextTrack mode is 'showing'. CaptionManager sets it to 'hidden',\r\n // so we override it here. VidPly's own caption overlay is skipped\r\n // via handlesOwnCaptions().\r\n if (selectedTrack.track) {\r\n selectedTrack.track.mode = 'showing';\r\n }\r\n if (this._ttmlDiv) {\r\n this._ttmlDiv.style.visibility = 'visible';\r\n }\r\n }\r\n this._syncDashTextTrack(selectedTrack);\r\n };\r\n this._captionDisabledHandler = () => {\r\n if (this._dashTextIsTtml && this._ttmlDiv) {\r\n this._ttmlDiv.style.visibility = 'hidden';\r\n }\r\n if (this.dash) {\r\n try { this.dash.setTextTrack(-1); } catch (e) { /* ignore */ }\r\n }\r\n };\r\n this.player.on('captionsenabled', this._captionEnabledHandler);\r\n this.player.on('captionsdisabled', this._captionDisabledHandler);\r\n }\r\n\r\n /**\r\n * Map a VidPly caption track to the corresponding dash.js track index\r\n * and switch dash.js to load segments for that language.\r\n */\r\n _syncDashTextTrack(selectedTrack: any) {\r\n if (!this.dash || !this._dashTextTracks.length) return;\r\n\r\n const lang = selectedTrack.language;\r\n if (!lang) return;\r\n\r\n const dashIndex = this._dashTextTracks.findIndex(dt => {\r\n const dtLang = dt.lang || dt.language || dt.srclang || '';\r\n if (!dtLang) return false;\r\n return dtLang === lang || dtLang.startsWith(lang) || lang.startsWith(dtLang);\r\n });\r\n\r\n if (dashIndex >= 0) {\r\n this.player.log(`Syncing DASH text track to index ${dashIndex} (${lang})`);\r\n try {\r\n this.dash.setTextTrack(dashIndex);\r\n } catch (err) { /* ignore */ }\r\n if (!this._dashTextIsTtml) {\r\n this._lastKnownCueCount = 0;\r\n this._startCueUpdatePolling();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Poll for new WebVTT cues being added by dash.js as subtitle segments load.\r\n * Emits events for transcript refresh when new cues arrive.\r\n */\r\n _startCueUpdatePolling() {\r\n this._stopCueUpdatePolling();\r\n let prevCueCount = 0;\r\n let stableRounds = 0;\r\n\r\n this._cueUpdateTimer = setInterval(() => {\r\n const count = this._getTotalCueCount();\r\n\r\n if (count > prevCueCount) {\r\n prevCueCount = count;\r\n stableRounds = 0;\r\n this.player.emit('textcuesupdate');\r\n } else {\r\n stableRounds++;\r\n if (stableRounds >= 8) {\r\n this._stopCueUpdatePolling();\r\n if (count > 0) {\r\n this.player.emit('textcuesupdate');\r\n }\r\n }\r\n }\r\n }, 500);\r\n }\r\n\r\n _stopCueUpdatePolling() {\r\n if (this._cueUpdateTimer) {\r\n clearInterval(this._cueUpdateTimer);\r\n this._cueUpdateTimer = null;\r\n }\r\n }\r\n\r\n _checkSubtitleTracks() {\r\n if (this._dashSubtitleTracksCount !== undefined && this._dashSubtitleTracksCount > 0) {\r\n return;\r\n }\r\n const tracks = this.media.textTracks;\r\n let count = 0;\r\n for (let i = 0; i < tracks.length; i++) {\r\n const track = tracks[i];\r\n if ((track.kind === 'subtitles' || track.kind === 'captions') && !track._vidplyStale) {\r\n count++;\r\n }\r\n }\r\n this._dashSubtitleTracksCount = count;\r\n this.updateCaptionButtonsForDash();\r\n }\r\n\r\n updateCaptionButtonsForDash() {\r\n const tracksCount = this._dashSubtitleTracksCount || 0;\r\n\r\n const doUpdate = () => {\r\n this.player.invalidateTrackCache();\r\n\r\n if (tracksCount > 0) {\r\n if (this.player.captionManager) {\r\n this.player.captionManager.refreshTracks();\r\n }\r\n\r\n if (!this._dashTextIsTtml && this.player.transcriptManager?.isVisible) {\r\n this.player.transcriptManager.loadTranscriptData();\r\n this.player.transcriptManager.updateLanguageSelector();\r\n }\r\n\r\n if (this.player.controlBar) {\r\n this.player.controlBar.ensureCaptionsButton();\r\n if (!this._dashTextIsTtml) {\r\n this.player.controlBar.ensureCaptionStyleButton();\r\n this.player.controlBar.ensureTranscriptButton();\r\n }\r\n }\r\n } else {\r\n if (this.player.captionManager) {\r\n this.player.captionManager.refreshTracks();\r\n }\r\n\r\n if (this.player.transcriptManager?.isVisible) {\r\n this.player.transcriptManager.hideTranscript();\r\n }\r\n\r\n if (this.player.controlBar) {\r\n this.player.controlBar.removeHlsCaptionButtons(true);\r\n }\r\n }\r\n };\r\n\r\n if (this.player.controlBar) {\r\n doUpdate();\r\n return;\r\n }\r\n\r\n const onReady = () => {\r\n this.player.off('ready', onReady);\r\n doUpdate();\r\n };\r\n this.player.on('ready', onReady);\r\n }\r\n\r\n attachMediaEvents() {\r\n this.media.addEventListener('loadedmetadata', () => {\r\n this.player.state.duration = this.media.duration;\r\n this.player.emit('loadedmetadata');\r\n });\r\n\r\n this.media.addEventListener('durationchange', () => {\r\n const duration = this.media.duration;\r\n if (duration && isFinite(duration) && duration > 0) {\r\n this.player.state.duration = duration;\r\n this.player.emit('durationchange', duration);\r\n }\r\n });\r\n\r\n this.media.addEventListener('play', () => {\r\n this.player.state.playing = true;\r\n this.player.state.paused = false;\r\n this.player.state.ended = false;\r\n this.player.emit('play');\r\n\r\n if (this.player.options.onPlay) {\r\n this.player.options.onPlay.call(this.player);\r\n }\r\n });\r\n\r\n this.media.addEventListener('pause', () => {\r\n this.player.state.playing = false;\r\n this.player.state.paused = true;\r\n this.player.emit('pause');\r\n\r\n if (this.player.options.onPause) {\r\n this.player.options.onPause.call(this.player);\r\n }\r\n });\r\n\r\n this.media.addEventListener('ended', () => {\r\n this.player.state.playing = false;\r\n this.player.state.paused = true;\r\n this.player.state.ended = true;\r\n this.player.emit('ended');\r\n\r\n if (this.player.options.onEnded) {\r\n this.player.options.onEnded.call(this.player);\r\n }\r\n\r\n if (this.player.options.loop) {\r\n this.player.seek(0);\r\n this.player.play();\r\n }\r\n });\r\n\r\n this.media.addEventListener('timeupdate', () => {\r\n this.player.state.currentTime = this.media.currentTime;\r\n this.player.emit('timeupdate', this.media.currentTime);\r\n\r\n if (this.player.options.onTimeUpdate) {\r\n this.player.options.onTimeUpdate.call(this.player, this.media.currentTime);\r\n }\r\n });\r\n\r\n this.media.addEventListener('volumechange', () => {\r\n this.player.state.volume = this.media.volume;\r\n this.player.state.muted = this.media.muted;\r\n this.player.emit('volumechange', this.media.volume);\r\n });\r\n\r\n this.media.addEventListener('seeking', () => {\r\n this.player.state.seeking = true;\r\n this.player.emit('seeking');\r\n });\r\n\r\n this.media.addEventListener('seeked', () => {\r\n this.player.state.seeking = false;\r\n this.player.emit('seeked');\r\n });\r\n\r\n this.media.addEventListener('waiting', () => {\r\n this.player.state.buffering = true;\r\n this.player.emit('waiting');\r\n });\r\n\r\n this.media.addEventListener('canplay', () => {\r\n this.player.state.buffering = false;\r\n this.player.emit('canplay');\r\n });\r\n\r\n this.media.addEventListener('error', () => {\r\n this.player.handleError(this.media.error);\r\n });\r\n }\r\n\r\n handleDashError(e: any) {\r\n const error = e.error || e;\r\n if (!error) return;\r\n const code = error.code ?? '';\r\n const message = error.message || '';\r\n this.player.log(`DASH Error - Code: ${code}, Message: ${message}`, 'warn');\r\n\r\n if (code && code >= 100) {\r\n this.player.log('Fatal DASH error', 'error');\r\n this.player.handleError(new Error(`DASH Error: ${code} - ${message}`));\r\n } else {\r\n this.player.log('Non-fatal DASH error: ' + (message || error), 'warn');\r\n }\r\n }\r\n\r\n ensureLoaded() {\r\n if (!this.player.options.deferLoad) {\r\n return;\r\n }\r\n\r\n if (!this.dash) {\r\n return;\r\n }\r\n\r\n if (this._dashSourceLoaded) {\r\n return;\r\n }\r\n\r\n const src = this._pendingSrc || this.player._pendingSource || this.player.currentSource;\r\n if (!src) {\r\n return;\r\n }\r\n\r\n try {\r\n this.dash.attachSource(src);\r\n this._dashSourceLoaded = true;\r\n } catch (e) {\r\n // ignore\r\n }\r\n }\r\n\r\n play() {\r\n const scrollX = window.scrollX;\r\n const scrollY = window.scrollY;\r\n\r\n if (this.player.options.deferLoad && this.dash && !this._dashSourceLoaded) {\r\n const src = this._pendingSrc || this.player.currentSource;\r\n if (src) {\r\n try {\r\n this.dash.attachSource(src);\r\n this._dashSourceLoaded = true;\r\n } catch (e) {\r\n // ignore and let media.play() surface errors if any\r\n }\r\n }\r\n }\r\n\r\n const promise = this.media.play();\r\n\r\n window.scrollTo(scrollX, scrollY);\r\n\r\n if (promise !== undefined) {\r\n promise.catch(error => {\r\n this.player.log('Play failed:', error, 'warn');\r\n });\r\n }\r\n }\r\n\r\n pause() {\r\n this.media.pause();\r\n }\r\n\r\n seek(time: number) {\r\n this.media.currentTime = time;\r\n }\r\n\r\n setVolume(volume: number) {\r\n this.media.volume = volume;\r\n }\r\n\r\n setMuted(muted: boolean) {\r\n this.media.muted = muted;\r\n }\r\n\r\n setPlaybackSpeed(speed: number) {\r\n this.media.playbackRate = speed;\r\n }\r\n\r\n switchQuality(qualityIndex: number) {\r\n if (!this.dash) return;\r\n\r\n if (qualityIndex === -1) {\r\n // Re-enable ABR auto-switching\r\n if (typeof this.dash.setAutoSwitchQualityFor === 'function') {\r\n this.dash.setAutoSwitchQualityFor('video', true);\r\n } else {\r\n this.dash.updateSettings({\r\n streaming: { abr: { autoSwitchBitrate: { video: true } } }\r\n });\r\n }\r\n } else {\r\n // Disable ABR and lock to the chosen quality\r\n if (typeof this.dash.setAutoSwitchQualityFor === 'function') {\r\n this.dash.setAutoSwitchQualityFor('video', false);\r\n } else {\r\n this.dash.updateSettings({\r\n streaming: { abr: { autoSwitchBitrate: { video: false } } }\r\n });\r\n }\r\n\r\n if (typeof this.dash.setRepresentationForTypeByIndex === 'function') {\r\n this.dash.setRepresentationForTypeByIndex('video', qualityIndex);\r\n } else if (typeof this.dash.setQualityFor === 'function') {\r\n this.dash.setQualityFor('video', qualityIndex, true);\r\n }\r\n }\r\n }\r\n\r\n getQualities() {\r\n if (!this.dash) return [];\r\n\r\n try {\r\n // dash.js v5+: getRepresentationsByType\r\n let reps = null;\r\n if (typeof this.dash.getRepresentationsByType === 'function') {\r\n reps = this.dash.getRepresentationsByType('video');\r\n }\r\n\r\n if (reps && reps.length > 0) {\r\n const heightCounts: Record<number, number> = {};\r\n reps.forEach((r: any) => {\r\n const h = Number(r.height) || 0;\r\n heightCounts[h] = (heightCounts[h] || 0) + 1;\r\n });\r\n\r\n return reps.map((rep: any, index: number) => {\r\n const height = Number(rep.height) || 0;\r\n const bitrate = Number(rep.bandwidth || rep.bitrate) || 0;\r\n const kb = bitrate > 0 ? Math.round(bitrate / 1000) : 0;\r\n let name;\r\n if (height > 0 && heightCounts[height] > 1 && kb > 0) {\r\n name = `${height}p (${kb} kbps)`;\r\n } else if (height > 0) {\r\n name = `${height}p`;\r\n } else {\r\n name = kb > 0 ? `${kb} kbps` : 'Auto';\r\n }\r\n return {\r\n index,\r\n id: rep.id,\r\n height: rep.height,\r\n width: rep.width,\r\n bitrate,\r\n name\r\n };\r\n });\r\n }\r\n\r\n // Fallback: dash.js v4 and earlier\r\n const bitrateList = this.dash.getBitrateInfoListFor('video');\r\n if (!bitrateList || bitrateList.length === 0) return [];\r\n\r\n const heightCounts: Record<number, number> = {};\r\n bitrateList.forEach((info: any) => {\r\n const h = Number(info.height) || 0;\r\n heightCounts[h] = (heightCounts[h] || 0) + 1;\r\n });\r\n\r\n return bitrateList.map((info: any, index: number) => {\r\n const height = Number(info.height) || 0;\r\n const bitrate = Number(info.bitrate) || 0;\r\n const kb = bitrate > 0 ? Math.round(bitrate / 1000) : 0;\r\n let name;\r\n if (height > 0 && heightCounts[height] > 1 && kb > 0) {\r\n name = `${height}p (${kb} kbps)`;\r\n } else if (height > 0) {\r\n name = `${height}p`;\r\n } else {\r\n name = kb > 0 ? `${kb} kbps` : 'Auto';\r\n }\r\n return {\r\n index,\r\n height: info.height,\r\n width: info.width,\r\n bitrate: info.bitrate,\r\n name\r\n };\r\n });\r\n } catch (e) {\r\n return [];\r\n }\r\n }\r\n\r\n getCurrentQuality() {\r\n if (!this.dash) return -1;\r\n try {\r\n if (typeof this.dash.getRepresentationsByType === 'function') {\r\n const reps = this.dash.getRepresentationsByType('video');\r\n const current = this.dash.getCurrentRepresentationForType?.('video');\r\n if (current && reps) {\r\n const idx = reps.findIndex((r: any) => r.id === current.id);\r\n if (idx >= 0) return idx;\r\n }\r\n }\r\n return this.dash.getQualityFor('video');\r\n } catch (e) {\r\n return -1;\r\n }\r\n }\r\n\r\n handlesOwnCaptions() {\r\n return this._dashTextIsTtml;\r\n }\r\n\r\n supportsAutoQuality() {\r\n return true;\r\n }\r\n\r\n isAutoQuality() {\r\n if (!this.dash) return true;\r\n try {\r\n if (typeof this.dash.getAutoSwitchQualityFor === 'function') {\r\n return this.dash.getAutoSwitchQualityFor('video');\r\n }\r\n const settings = this.dash.getSettings();\r\n return settings?.streaming?.abr?.autoSwitchBitrate?.video !== false;\r\n } catch (e) {\r\n return true;\r\n }\r\n }\r\n\r\n destroy() {\r\n this._pendingTimeouts.forEach(id => clearTimeout(id));\r\n this._pendingTimeouts = [];\r\n this._stopCueUpdatePolling();\r\n this._lastKnownCueCount = 0;\r\n\r\n if (this._captionEnabledHandler) {\r\n this.player.off('captionsenabled', this._captionEnabledHandler);\r\n this._captionEnabledHandler = null;\r\n }\r\n if (this._captionDisabledHandler) {\r\n this.player.off('captionsdisabled', this._captionDisabledHandler);\r\n this._captionDisabledHandler = null;\r\n }\r\n\r\n if (this._ttmlDiv && this._ttmlDiv.parentNode) {\r\n this._ttmlDiv.parentNode.removeChild(this._ttmlDiv);\r\n this._ttmlDiv = null;\r\n }\r\n\r\n // Mark all subtitle/caption text tracks as stale. dash.js creates\r\n // programmatic TextTrack objects that persist on the <video> element\r\n // after destroy() and cannot be removed via standard APIs. The stale\r\n // flag prevents _checkSubtitleTracks() in a new renderer instance from\r\n // treating them as tracks belonging to the current stream.\r\n const textTracks = this.media.textTracks;\r\n for (let i = 0; i < textTracks.length; i++) {\r\n const track = textTracks[i];\r\n if (track.kind === 'subtitles' || track.kind === 'captions') {\r\n track._vidplyStale = true;\r\n track.mode = 'disabled';\r\n }\r\n }\r\n\r\n if (this.dash) {\r\n try {\r\n // Silence dash.js logging during teardown to suppress harmless\r\n // SourceBuffer errors from in-flight async operations.\r\n this.dash.updateSettings({ debug: { logLevel: 0 } });\r\n // reset() cleanly detaches from MediaSource and cancels pending\r\n // buffer operations before destroy() releases all resources.\r\n this.dash.reset();\r\n } catch (e) { /* ignore teardown errors */ }\r\n try {\r\n this.dash.destroy();\r\n } catch (e) { /* ignore teardown errors */ }\r\n this.dash = null;\r\n }\r\n this._dashTextTracks = [];\r\n this._dashTextIsTtml = false;\r\n }\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["heightCounts"]
|
|
7
|
+
}
|
|
@@ -4,8 +4,19 @@
|
|
|
4
4
|
* Released under GPL-2.0-or-later License
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
// src/renderers/HLSRenderer.
|
|
7
|
+
// src/renderers/HLSRenderer.ts
|
|
8
8
|
var HLSRenderer = class {
|
|
9
|
+
player;
|
|
10
|
+
media;
|
|
11
|
+
hls;
|
|
12
|
+
_hlsSourceLoaded;
|
|
13
|
+
_pendingSrc;
|
|
14
|
+
_hlsSubtitleTracksCount;
|
|
15
|
+
_cueUpdateTimer;
|
|
16
|
+
_lastKnownCueCount;
|
|
17
|
+
_nativeTrackListenersDestroyed;
|
|
18
|
+
_didDeferredLoad;
|
|
19
|
+
_cleanupNativeTextTrackListeners;
|
|
9
20
|
constructor(player) {
|
|
10
21
|
this.player = player;
|
|
11
22
|
this.media = player.element;
|
|
@@ -15,6 +26,8 @@ var HLSRenderer = class {
|
|
|
15
26
|
this._hlsSubtitleTracksCount = void 0;
|
|
16
27
|
this._cueUpdateTimer = null;
|
|
17
28
|
this._lastKnownCueCount = 0;
|
|
29
|
+
this._cleanupNativeTextTrackListeners = () => {
|
|
30
|
+
};
|
|
18
31
|
}
|
|
19
32
|
async init() {
|
|
20
33
|
if (this.canPlayNatively()) {
|
|
@@ -35,7 +48,7 @@ var HLSRenderer = class {
|
|
|
35
48
|
return video.canPlayType("application/vnd.apple.mpegurl") !== "";
|
|
36
49
|
}
|
|
37
50
|
async initNative() {
|
|
38
|
-
const HTML5Renderer = (await import("./vidply.HTML5Renderer-
|
|
51
|
+
const HTML5Renderer = (await import("./vidply.HTML5Renderer-GUKQRF4M.js")).HTML5Renderer;
|
|
39
52
|
const renderer = new HTML5Renderer(this.player);
|
|
40
53
|
await renderer.init();
|
|
41
54
|
Object.getOwnPropertyNames(Object.getPrototypeOf(renderer)).forEach((method) => {
|
|
@@ -55,7 +68,7 @@ var HLSRenderer = class {
|
|
|
55
68
|
* Debounces rapid addtrack bursts (one per subtitle rendition in the manifest).
|
|
56
69
|
*/
|
|
57
70
|
_attachNativeTextTrackListeners() {
|
|
58
|
-
let debounceTimer
|
|
71
|
+
let debounceTimer;
|
|
59
72
|
const checkTracks = () => {
|
|
60
73
|
clearTimeout(debounceTimer);
|
|
61
74
|
debounceTimer = setTimeout(() => {
|
|
@@ -89,9 +102,10 @@ var HLSRenderer = class {
|
|
|
89
102
|
if (!window.Hls) {
|
|
90
103
|
await this.loadHlsJs();
|
|
91
104
|
}
|
|
92
|
-
if (!window.Hls
|
|
105
|
+
if (!window.Hls?.isSupported()) {
|
|
93
106
|
throw new Error("HLS is not supported in this browser");
|
|
94
107
|
}
|
|
108
|
+
const HlsCtor = window.Hls;
|
|
95
109
|
const sourceElements = Array.from(this.media.querySelectorAll("source"));
|
|
96
110
|
let originalSrc = null;
|
|
97
111
|
if (sourceElements.length > 0) {
|
|
@@ -99,7 +113,7 @@ var HLSRenderer = class {
|
|
|
99
113
|
sourceElements.forEach((source) => source.remove());
|
|
100
114
|
this.player.log("Removed <source> elements for HTML5 validity (hls.js uses src attribute)");
|
|
101
115
|
}
|
|
102
|
-
this.hls = new
|
|
116
|
+
this.hls = new HlsCtor({
|
|
103
117
|
debug: this.player.options.debug,
|
|
104
118
|
// When deferLoad is enabled, do not start loading until the first play().
|
|
105
119
|
autoStartLoad: !this.player.options.deferLoad,
|
|
@@ -161,7 +175,7 @@ var HLSRenderer = class {
|
|
|
161
175
|
});
|
|
162
176
|
}
|
|
163
177
|
attachHlsEvents() {
|
|
164
|
-
this.hls.on(window.Hls.Events.MANIFEST_PARSED, (
|
|
178
|
+
this.hls.on(window.Hls.Events.MANIFEST_PARSED, (_event, data) => {
|
|
165
179
|
this.player.log("HLS manifest loaded, found " + data.levels.length + " quality levels");
|
|
166
180
|
this.player.emit("hlsmanifestparsed", data);
|
|
167
181
|
if (this.player.container) {
|
|
@@ -177,11 +191,11 @@ var HLSRenderer = class {
|
|
|
177
191
|
}
|
|
178
192
|
}, 500);
|
|
179
193
|
});
|
|
180
|
-
this.hls.on(window.Hls.Events.LEVEL_SWITCHED, (
|
|
194
|
+
this.hls.on(window.Hls.Events.LEVEL_SWITCHED, (_event, data) => {
|
|
181
195
|
this.player.log("HLS level switched to " + data.level);
|
|
182
196
|
this.player.emit("hlslevelswitched", data);
|
|
183
197
|
});
|
|
184
|
-
this.hls.on(window.Hls.Events.SUBTITLE_TRACKS_UPDATED, (
|
|
198
|
+
this.hls.on(window.Hls.Events.SUBTITLE_TRACKS_UPDATED, (_event, data) => {
|
|
185
199
|
this.player.log("HLS subtitle tracks updated, found " + data.subtitleTracks.length + " tracks");
|
|
186
200
|
this.player.emit("hlssubtitletracksupdated", data);
|
|
187
201
|
this._hlsSubtitleTracksCount = data.subtitleTracks.length;
|
|
@@ -190,17 +204,21 @@ var HLSRenderer = class {
|
|
|
190
204
|
this._startCueUpdatePolling();
|
|
191
205
|
}
|
|
192
206
|
});
|
|
193
|
-
this.hls.on(window.Hls.Events.SUBTITLE_TRACK_SWITCH, (
|
|
207
|
+
this.hls.on(window.Hls.Events.SUBTITLE_TRACK_SWITCH, (_event, data) => {
|
|
194
208
|
this.player.log("HLS subtitle track switched to " + data.id);
|
|
195
209
|
this.player.emit("hlssubtitletrackswitch", data);
|
|
196
210
|
this._lastKnownCueCount = 0;
|
|
197
211
|
this._startCueUpdatePolling();
|
|
198
212
|
});
|
|
199
|
-
this.hls.on(window.Hls.Events.ERROR, (
|
|
213
|
+
this.hls.on(window.Hls.Events.ERROR, (_event, data) => {
|
|
200
214
|
this.handleHlsError(data);
|
|
201
215
|
});
|
|
202
|
-
this.hls.on(window.Hls.Events.FRAG_BUFFERED, (
|
|
216
|
+
this.hls.on(window.Hls.Events.FRAG_BUFFERED, (_event, data) => {
|
|
217
|
+
const wasBuffering = this.player.state.buffering === true;
|
|
203
218
|
this.player.state.buffering = false;
|
|
219
|
+
if (wasBuffering) {
|
|
220
|
+
this.player.emit("canplay");
|
|
221
|
+
}
|
|
204
222
|
if (data.frag && data.frag.type === "subtitle") {
|
|
205
223
|
setTimeout(() => {
|
|
206
224
|
const count = this._getTotalCueCount();
|
|
@@ -500,4 +518,4 @@ var HLSRenderer = class {
|
|
|
500
518
|
export {
|
|
501
519
|
HLSRenderer
|
|
502
520
|
};
|
|
503
|
-
//# sourceMappingURL=vidply.HLSRenderer-
|
|
521
|
+
//# sourceMappingURL=vidply.HLSRenderer-2NVGMMXD.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/renderers/HLSRenderer.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Renderer } from '../types/renderer.js';\r\nimport type { Player } from '../core/Player.js';\r\n\r\nexport class HLSRenderer implements Renderer {\r\n player: Player;\r\n media: HTMLMediaElement;\r\n hls: any;\r\n _hlsSourceLoaded: boolean;\r\n _pendingSrc: string | null;\r\n _hlsSubtitleTracksCount: number | undefined;\r\n _cueUpdateTimer: ReturnType<typeof setInterval> | null;\r\n _lastKnownCueCount: number;\r\n _nativeTrackListenersDestroyed?: boolean;\r\n _didDeferredLoad?: boolean;\r\n _cleanupNativeTextTrackListeners: () => void;\r\n\r\n constructor(player: Player) {\r\n this.player = player;\r\n this.media = player.element;\r\n this.hls = null;\r\n this._hlsSourceLoaded = false;\r\n this._pendingSrc = null;\r\n this._hlsSubtitleTracksCount = undefined;\r\n this._cueUpdateTimer = null;\r\n this._lastKnownCueCount = 0;\r\n this._cleanupNativeTextTrackListeners = () => {};\r\n }\r\n\r\n async init() {\r\n // Check if browser natively supports HLS (Safari)\r\n if (this.canPlayNatively()) {\r\n this.player.log('Using native HLS support');\r\n await this.initNative();\r\n } else {\r\n this.player.log('Using hls.js for HLS support');\r\n await this.initHlsJs();\r\n }\r\n }\r\n\r\n canPlayNatively() {\r\n // Use native HLS only on iOS/iPadOS (MSE unavailable); desktop macOS Safari uses hls.js\r\n // for quality switching and parity with Chrome/Firefox.\r\n const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;\r\n // iPad in desktop mode reports MacIntel but has touch\r\n const isIPadDesktopMode = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\r\n\r\n if (!isIOS && !isIPadDesktopMode) {\r\n return false;\r\n }\r\n\r\n const video = document.createElement('video');\r\n return video.canPlayType('application/vnd.apple.mpegurl') !== '';\r\n }\r\n\r\n async initNative() {\r\n // Use HTML5 renderer for native HLS support\r\n const HTML5Renderer = (await import('./HTML5Renderer.js')).HTML5Renderer;\r\n const renderer = new HTML5Renderer(this.player);\r\n await renderer.init();\r\n\r\n // Copy methods from HTML5Renderer onto this instance\r\n Object.getOwnPropertyNames(Object.getPrototypeOf(renderer)).forEach((method: string) => {\r\n if (method !== 'constructor' && typeof (renderer as any)[method] === 'function') {\r\n (this as any)[method] = (renderer as any)[method].bind(renderer);\r\n }\r\n });\r\n\r\n this._attachNativeTextTrackListeners();\r\n\r\n // The method-copy above shadows HLSRenderer.prototype.destroy with\r\n // HTML5Renderer's destroy. Wrap it so our listeners are also cleaned up.\r\n const html5Destroy = this.destroy;\r\n this.destroy = () => {\r\n this._cleanupNativeTextTrackListeners();\r\n html5Destroy();\r\n };\r\n }\r\n\r\n /**\r\n * Listen for HLS-exposed text tracks so captions/transcript buttons appear on native HLS.\r\n * Debounces rapid addtrack bursts (one per subtitle rendition in the manifest).\r\n */\r\n _attachNativeTextTrackListeners() {\r\n let debounceTimer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n const checkTracks = () => {\r\n clearTimeout(debounceTimer);\r\n debounceTimer = setTimeout(() => {\r\n if (this._nativeTrackListenersDestroyed) return;\r\n const tracks = this.media.textTracks;\r\n let count = 0;\r\n for (let i = 0; i < tracks.length; i++) {\r\n const k = tracks[i].kind;\r\n if (k === 'subtitles' || k === 'captions') {\r\n count++;\r\n }\r\n }\r\n this._hlsSubtitleTracksCount = count;\r\n this.updateCaptionButtonsForHls();\r\n }, 150);\r\n };\r\n\r\n this.media.textTracks.addEventListener('addtrack', checkTracks);\r\n this.media.textTracks.addEventListener('removetrack', checkTracks);\r\n this.media.addEventListener('loadedmetadata', checkTracks);\r\n\r\n this._cleanupNativeTextTrackListeners = () => {\r\n this._nativeTrackListenersDestroyed = true;\r\n clearTimeout(debounceTimer);\r\n this.media.textTracks.removeEventListener('addtrack', checkTracks);\r\n this.media.textTracks.removeEventListener('removetrack', checkTracks);\r\n this.media.removeEventListener('loadedmetadata', checkTracks);\r\n };\r\n }\r\n\r\n async initHlsJs() {\r\n // Hide native controls\r\n this.media.controls = false;\r\n this.media.removeAttribute('controls');\r\n \r\n // Load hls.js if not already loaded\r\n if (!window.Hls) {\r\n await this.loadHlsJs();\r\n }\r\n\r\n if (!window.Hls?.isSupported()) {\r\n throw new Error('HLS is not supported in this browser');\r\n }\r\n const HlsCtor = window.Hls!;\r\n\r\n // HTML5 spec: If video has src attribute, <source> children are not allowed.\r\n // hls.js sets a blob: URL on the src attribute, so we must remove any <source> elements\r\n // to maintain valid HTML. Store the original source URL first.\r\n const sourceElements = Array.from(this.media.querySelectorAll('source'));\r\n let originalSrc = null;\r\n if (sourceElements.length > 0) {\r\n originalSrc = sourceElements[0].getAttribute('src');\r\n sourceElements.forEach(source => source.remove());\r\n this.player.log('Removed <source> elements for HTML5 validity (hls.js uses src attribute)');\r\n }\r\n\r\n // Create hls.js instance with better error recovery\r\n this.hls = new HlsCtor({\r\n debug: this.player.options.debug,\r\n // When deferLoad is enabled, do not start loading until the first play().\r\n autoStartLoad: !this.player.options.deferLoad,\r\n enableWorker: true,\r\n lowLatencyMode: false,\r\n backBufferLength: 90,\r\n maxBufferLength: 30,\r\n maxMaxBufferLength: 600,\r\n maxBufferSize: 60 * 1000 * 1000,\r\n maxBufferHole: 0.5,\r\n // Network retry settings\r\n manifestLoadingTimeOut: 10000,\r\n manifestLoadingMaxRetry: 4,\r\n manifestLoadingRetryDelay: 1000,\r\n manifestLoadingMaxRetryTimeout: 64000,\r\n levelLoadingTimeOut: 10000,\r\n levelLoadingMaxRetry: 4,\r\n levelLoadingRetryDelay: 1000,\r\n levelLoadingMaxRetryTimeout: 64000,\r\n fragLoadingTimeOut: 20000,\r\n fragLoadingMaxRetry: 6,\r\n fragLoadingRetryDelay: 1000,\r\n fragLoadingMaxRetryTimeout: 64000\r\n });\r\n\r\n // Attach media element\r\n this.hls.attachMedia(this.media);\r\n\r\n // Load source - use currentSource for external renderers, or get from attribute\r\n // Priority: currentSource > originalSrc (from removed <source>) > data-vidply-src > src attribute\r\n let src = this.player.currentSource;\r\n \r\n if (!src && originalSrc) {\r\n src = originalSrc;\r\n }\r\n \r\n if (!src) {\r\n // Try data-vidply-src attribute (used by TYPO3 integration)\r\n src = this.player.element.getAttribute('data-vidply-src');\r\n }\r\n \r\n if (!src) {\r\n // Fallback to element's src attribute (but not blob: URLs)\r\n const elementSrc = this.player.element.getAttribute('src') || this.player.element.src;\r\n if (elementSrc && !elementSrc.startsWith('blob:')) {\r\n src = elementSrc;\r\n }\r\n }\r\n \r\n this.player.log(`Loading HLS source: ${src}`, 'log');\r\n \r\n if (!src) {\r\n throw new Error('No HLS source found');\r\n }\r\n \r\n if (this.player.options.deferLoad) {\r\n // Defer manifest/segment loading until first play()\r\n this._pendingSrc = src;\r\n } else {\r\n this.hls.loadSource(src);\r\n this._hlsSourceLoaded = true;\r\n }\r\n\r\n // Attach events\r\n this.attachHlsEvents();\r\n this.attachMediaEvents();\r\n }\r\n\r\n async loadHlsJs() {\r\n return new Promise<void>((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = 'https://cdn.jsdelivr.net/npm/hls.js@latest';\r\n script.onload = () => resolve();\r\n script.onerror = () => reject(new Error('Failed to load hls.js'));\r\n document.head.appendChild(script);\r\n });\r\n }\r\n\r\n attachHlsEvents() {\r\n this.hls.on(window.Hls!.Events.MANIFEST_PARSED, (_event: any, data: any) => {\r\n this.player.log('HLS manifest loaded, found ' + data.levels.length + ' quality levels');\r\n this.player.emit('hlsmanifestparsed', data);\r\n \r\n // Show VidPly controls (remove external controls class if present)\r\n if (this.player.container) {\r\n this.player.container.classList.remove('vidply-external-controls');\r\n }\r\n \r\n // Check for subtitle tracks after manifest parse\r\n // This handles streams without subtitles (SUBTITLE_TRACKS_UPDATED won't fire for them)\r\n setTimeout(() => {\r\n if (this._hlsSubtitleTracksCount === undefined || this._hlsSubtitleTracksCount === 0) {\r\n const currentCount = this.hls?.subtitleTracks?.length || 0;\r\n if (currentCount === 0) {\r\n this._hlsSubtitleTracksCount = 0;\r\n this.updateCaptionButtonsForHls();\r\n }\r\n }\r\n }, 500);\r\n });\r\n\r\n this.hls.on(window.Hls!.Events.LEVEL_SWITCHED, (_event: any, data: any) => {\r\n this.player.log('HLS level switched to ' + data.level);\r\n this.player.emit('hlslevelswitched', data);\r\n });\r\n\r\n // Handle HLS subtitle tracks\r\n this.hls.on(window.Hls!.Events.SUBTITLE_TRACKS_UPDATED, (_event: any, data: any) => {\r\n this.player.log('HLS subtitle tracks updated, found ' + data.subtitleTracks.length + ' tracks');\r\n this.player.emit('hlssubtitletracksupdated', data);\r\n this._hlsSubtitleTracksCount = data.subtitleTracks.length;\r\n this.updateCaptionButtonsForHls();\r\n if (data.subtitleTracks.length > 0) {\r\n this._startCueUpdatePolling();\r\n }\r\n });\r\n\r\n this.hls.on(window.Hls!.Events.SUBTITLE_TRACK_SWITCH, (_event: any, data: any) => {\r\n this.player.log('HLS subtitle track switched to ' + data.id);\r\n this.player.emit('hlssubtitletrackswitch', data);\r\n this._lastKnownCueCount = 0;\r\n this._startCueUpdatePolling();\r\n });\r\n\r\n this.hls.on(window.Hls!.Events.ERROR, (_event: any, data: any) => {\r\n this.handleHlsError(data);\r\n });\r\n\r\n this.hls.on(window.Hls!.Events.FRAG_BUFFERED, (_event: any, data: any) => {\r\n const wasBuffering = this.player.state.buffering === true;\r\n this.player.state.buffering = false;\r\n if (wasBuffering) {\r\n this.player.emit('canplay');\r\n }\r\n if (data.frag && data.frag.type === 'subtitle') {\r\n setTimeout(() => {\r\n const count = this._getTotalCueCount();\r\n if (count > this._lastKnownCueCount) {\r\n this._lastKnownCueCount = count;\r\n this.player.emit('textcuesupdate');\r\n }\r\n }, 100);\r\n }\r\n });\r\n }\r\n\r\n _getTotalCueCount() {\r\n const textTracks = this.media.textTracks;\r\n let total = 0;\r\n if (!textTracks) return total;\r\n for (let i = 0; i < textTracks.length; i++) {\r\n const track = textTracks[i];\r\n if ((track.kind === 'subtitles' || track.kind === 'captions') && track.cues) {\r\n total += track.cues.length;\r\n }\r\n }\r\n return total;\r\n }\r\n\r\n _startCueUpdatePolling() {\r\n this._stopCueUpdatePolling();\r\n let prevCueCount = 0;\r\n let stableRounds = 0;\r\n\r\n this._cueUpdateTimer = setInterval(() => {\r\n const count = this._getTotalCueCount();\r\n\r\n if (count > prevCueCount) {\r\n prevCueCount = count;\r\n stableRounds = 0;\r\n this.player.emit('textcuesupdate');\r\n } else {\r\n stableRounds++;\r\n if (stableRounds >= 8) {\r\n this._stopCueUpdatePolling();\r\n if (count > 0) {\r\n this.player.emit('textcuesupdate');\r\n }\r\n }\r\n }\r\n }, 500);\r\n }\r\n\r\n _stopCueUpdatePolling() {\r\n if (this._cueUpdateTimer) {\r\n clearInterval(this._cueUpdateTimer);\r\n this._cueUpdateTimer = null;\r\n }\r\n }\r\n\r\n /**\r\n * Update caption buttons based on HLS subtitle tracks\r\n * Handles the case where control bar may not exist yet\r\n */\r\n updateCaptionButtonsForHls() {\r\n const tracksCount = this._hlsSubtitleTracksCount || 0;\r\n \r\n const doUpdate = () => {\r\n this.player.invalidateTrackCache();\r\n \r\n if (tracksCount > 0) {\r\n // HLS has subtitle tracks - refresh managers and add buttons\r\n if (this.player.captionManager) {\r\n this.player.captionManager.refreshTracks();\r\n }\r\n \r\n if (this.player.transcriptManager?.isVisible) {\r\n this.player.transcriptManager.loadTranscriptData();\r\n this.player.transcriptManager.updateLanguageSelector();\r\n }\r\n \r\n if (this.player.controlBar) {\r\n this.player.controlBar.ensureCaptionsButton();\r\n this.player.controlBar.ensureCaptionStyleButton();\r\n this.player.controlBar.ensureTranscriptButton();\r\n }\r\n } else {\r\n // No HLS subtitle tracks - clean up\r\n if (this.player.captionManager) {\r\n this.player.captionManager.refreshTracks();\r\n }\r\n \r\n if (this.player.transcriptManager?.isVisible) {\r\n this.player.transcriptManager.hideTranscript();\r\n }\r\n \r\n if (this.player.controlBar) {\r\n this.player.controlBar.removeHlsCaptionButtons(true);\r\n }\r\n }\r\n };\r\n \r\n if (this.player.controlBar) {\r\n doUpdate();\r\n return;\r\n }\r\n \r\n // Control bar doesn't exist yet - wait for ready event\r\n const onReady = () => {\r\n this.player.off('ready', onReady);\r\n doUpdate();\r\n };\r\n this.player.on('ready', onReady);\r\n }\r\n\r\n attachMediaEvents() {\r\n // Use same events as HTML5 renderer\r\n this.media.addEventListener('loadedmetadata', () => {\r\n this.player.state.duration = this.media.duration;\r\n this.player.emit('loadedmetadata');\r\n });\r\n\r\n this.media.addEventListener('durationchange', () => {\r\n const duration = this.media.duration;\r\n if (duration && isFinite(duration) && duration > 0) {\r\n this.player.state.duration = duration;\r\n this.player.emit('durationchange', duration);\r\n }\r\n });\r\n\r\n this.media.addEventListener('play', () => {\r\n this.player.state.playing = true;\r\n this.player.state.paused = false;\r\n this.player.state.ended = false;\r\n this.player.emit('play');\r\n \r\n if (this.player.options.onPlay) {\r\n this.player.options.onPlay.call(this.player);\r\n }\r\n });\r\n\r\n this.media.addEventListener('pause', () => {\r\n this.player.state.playing = false;\r\n this.player.state.paused = true;\r\n this.player.emit('pause');\r\n \r\n if (this.player.options.onPause) {\r\n this.player.options.onPause.call(this.player);\r\n }\r\n });\r\n\r\n this.media.addEventListener('ended', () => {\r\n this.player.state.playing = false;\r\n this.player.state.paused = true;\r\n this.player.state.ended = true;\r\n this.player.emit('ended');\r\n \r\n if (this.player.options.onEnded) {\r\n this.player.options.onEnded.call(this.player);\r\n }\r\n \r\n if (this.player.options.loop) {\r\n this.player.seek(0);\r\n this.player.play();\r\n }\r\n });\r\n\r\n this.media.addEventListener('timeupdate', () => {\r\n this.player.state.currentTime = this.media.currentTime;\r\n this.player.emit('timeupdate', this.media.currentTime);\r\n \r\n if (this.player.options.onTimeUpdate) {\r\n this.player.options.onTimeUpdate.call(this.player, this.media.currentTime);\r\n }\r\n });\r\n\r\n this.media.addEventListener('volumechange', () => {\r\n this.player.state.volume = this.media.volume;\r\n this.player.state.muted = this.media.muted;\r\n this.player.emit('volumechange', this.media.volume);\r\n });\r\n\r\n this.media.addEventListener('waiting', () => {\r\n this.player.state.buffering = true;\r\n this.player.emit('waiting');\r\n });\r\n\r\n this.media.addEventListener('canplay', () => {\r\n this.player.state.buffering = false;\r\n this.player.emit('canplay');\r\n });\r\n\r\n this.media.addEventListener('error', () => {\r\n this.player.handleError(this.media.error);\r\n });\r\n }\r\n\r\n handleHlsError(data: any) {\r\n // Log detailed error info\r\n this.player.log(`HLS Error - Type: ${data.type}, Details: ${data.details}, Fatal: ${data.fatal}`, 'warn');\r\n if (data.response) {\r\n this.player.log(`Response code: ${data.response.code}, URL: ${data.response.url}`, 'warn');\r\n }\r\n \r\n if (data.fatal) {\r\n switch (data.type) {\r\n case window.Hls!.ErrorTypes.NETWORK_ERROR:\r\n this.player.log('Fatal network error, trying to recover...', 'error');\r\n this.player.log(`Network error details: ${data.details}`, 'error');\r\n setTimeout(() => {\r\n this.hls.startLoad();\r\n }, 1000);\r\n break;\r\n \r\n case window.Hls!.ErrorTypes.MEDIA_ERROR:\r\n this.player.log('Fatal media error, trying to recover...', 'error');\r\n this.hls.recoverMediaError();\r\n break;\r\n \r\n default:\r\n this.player.log('Fatal error, cannot recover', 'error');\r\n this.player.handleError(new Error(`HLS Error: ${data.type} - ${data.details}`));\r\n this.hls.destroy();\r\n break;\r\n }\r\n } else {\r\n this.player.log('Non-fatal HLS error: ' + data.details, 'warn');\r\n }\r\n }\r\n\r\n /**\r\n * Ensure the HLS manifest/initial loading is started without starting playback.\r\n * This makes playlist selection behave more like single-video initialization.\r\n */\r\n ensureLoaded() {\r\n if (!this.player.options.deferLoad) {\r\n return;\r\n }\r\n\r\n // Native HLS path delegates to HTML5Renderer; if we got here and have no hls.js instance,\r\n // there's nothing to do.\r\n if (!this.hls) {\r\n return;\r\n }\r\n\r\n if (this._hlsSourceLoaded) {\r\n return;\r\n }\r\n\r\n const src = this._pendingSrc || this.player._pendingSource || this.player.currentSource;\r\n if (!src) {\r\n return;\r\n }\r\n\r\n try {\r\n this.hls.loadSource(src);\r\n this._hlsSourceLoaded = true;\r\n // Start loading so manifest is parsed and levels/tracks become available.\r\n // Note: this may fetch initial fragments depending on stream/config.\r\n this.hls.startLoad();\r\n } catch (e) {\r\n // ignore\r\n }\r\n }\r\n\r\n play() {\r\n // Save scroll position to prevent browser from scrolling to video\r\n const scrollX = window.scrollX;\r\n const scrollY = window.scrollY;\r\n\r\n // If deferLoad is enabled, start HLS loading only on the first user play request.\r\n if (this.player.options.deferLoad && this.hls && !this._hlsSourceLoaded) {\r\n const src = this._pendingSrc || this.player.currentSource;\r\n if (src) {\r\n try {\r\n this.hls.loadSource(src);\r\n this.hls.startLoad();\r\n this._hlsSourceLoaded = true;\r\n } catch (e) {\r\n // ignore and let media.play() surface errors if any\r\n }\r\n }\r\n }\r\n \r\n const promise = this.media.play();\r\n \r\n // Restore scroll position immediately to prevent auto-scroll\r\n window.scrollTo(scrollX, scrollY);\r\n \r\n if (promise !== undefined) {\r\n promise.catch(error => {\r\n this.player.log('Play failed:', error, 'warn');\r\n });\r\n }\r\n }\r\n\r\n pause() {\r\n this.media.pause();\r\n }\r\n\r\n seek(time: number) {\r\n this.media.currentTime = time;\r\n }\r\n\r\n setVolume(volume: number) {\r\n this.media.volume = volume;\r\n }\r\n\r\n setMuted(muted: boolean) {\r\n this.media.muted = muted;\r\n }\r\n\r\n setPlaybackSpeed(speed: number) {\r\n this.media.playbackRate = speed;\r\n }\r\n\r\n switchQuality(levelIndex: number) {\r\n if (this.hls) {\r\n this.hls.currentLevel = levelIndex;\r\n }\r\n }\r\n\r\n getQualities() {\r\n if (this.hls && this.hls.levels) {\r\n // hls.js creates separate levels for each video+audio-group combination,\r\n // producing duplicates (e.g. three \"720p\" entries). Deduplicate by\r\n // resolution height, keeping the entry with the highest bitrate per height.\r\n const byHeight = new Map();\r\n\r\n this.hls.levels.forEach((level: any, index: number) => {\r\n const height = Number(level.height) || 0;\r\n const bitrate = Number(level.bitrate) || 0;\r\n const key = height > 0 ? height : `br_${bitrate}`;\r\n const existing = byHeight.get(key);\r\n\r\n if (!existing || bitrate > (existing.bitrate || 0)) {\r\n byHeight.set(key, { index, height: level.height, width: level.width, bitrate, level });\r\n }\r\n });\r\n\r\n return Array.from(byHeight.values()).map((entry: any) => {\r\n const height = Number(entry.height) || 0;\r\n const kb = entry.bitrate > 0 ? Math.round(entry.bitrate / 1000) : 0;\r\n const name = height > 0 ? `${height}p` : (kb > 0 ? `${kb} kb` : 'Auto');\r\n return { index: entry.index, height: entry.height, width: entry.width, bitrate: entry.bitrate, name };\r\n });\r\n }\r\n return [];\r\n }\r\n\r\n getCurrentQuality() {\r\n if (this.hls) {\r\n return this.hls.currentLevel;\r\n }\r\n return -1;\r\n }\r\n\r\n supportsAutoQuality() {\r\n return true;\r\n }\r\n\r\n isAutoQuality() {\r\n return this.hls?.currentLevel === -1;\r\n }\r\n\r\n destroy() {\r\n this._stopCueUpdatePolling();\r\n this._lastKnownCueCount = 0;\r\n if (this.hls) {\r\n this.hls.destroy();\r\n this.hls = null;\r\n }\r\n }\r\n}\r\n\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import {
|
|
7
7
|
HTML5Renderer
|
|
8
|
-
} from "./vidply.chunk-
|
|
8
|
+
} from "./vidply.chunk-WBI7UGH6.js";
|
|
9
9
|
export {
|
|
10
10
|
HTML5Renderer
|
|
11
11
|
};
|
|
12
|
-
//# sourceMappingURL=vidply.HTML5Renderer-
|
|
12
|
+
//# sourceMappingURL=vidply.HTML5Renderer-GUKQRF4M.js.map
|