vidply 1.1.1 → 1.1.2

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.
@@ -213,18 +213,20 @@ var HLSRenderer = class {
213
213
  this.hls.on(window.Hls.Events.ERROR, (_event, data) => {
214
214
  this.handleHlsError(data);
215
215
  });
216
- this.hls.on(window.Hls.Events.FRAG_BUFFERED, (_event, data) => {
216
+ this.hls.on(window.Hls.Events.FRAG_BUFFERED, (_event, _data) => {
217
217
  this.player.state.buffering = false;
218
- if (data.frag && data.frag.type === "subtitle") {
219
- setTimeout(() => {
220
- const count = this._getTotalCueCount();
221
- if (count > this._lastKnownCueCount) {
222
- this._lastKnownCueCount = count;
223
- this.player.emit("textcuesupdate");
224
- }
225
- }, 100);
218
+ });
219
+ this.hls.on(window.Hls.Events.SUBTITLE_FRAG_PROCESSED, (_event, data) => {
220
+ if (!data || !data.success) return;
221
+ const count = this._getTotalCueCount();
222
+ if (count > this._lastKnownCueCount) {
223
+ this._lastKnownCueCount = count;
224
+ this.player.emit("textcuesupdate");
226
225
  }
227
226
  });
227
+ this.hls.on(window.Hls.Events.CUES_PARSED, (_event, _data) => {
228
+ this.player.emit("textcuesupdate");
229
+ });
228
230
  }
229
231
  _getTotalCueCount() {
230
232
  const textTracks = this.media.textTracks;
@@ -514,4 +516,4 @@ var HLSRenderer = class {
514
516
  export {
515
517
  HLSRenderer
516
518
  };
517
- //# sourceMappingURL=vidply.HLSRenderer-7F6FCZSH.js.map
519
+ //# sourceMappingURL=vidply.HLSRenderer-IVT5CQQ4.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 this.player.state.buffering = false;\r\n });\r\n\r\n // Subtitle fragments do NOT go through the media source buffer, so\r\n // FRAG_BUFFERED is unreliable for them. SUBTITLE_FRAG_PROCESSED fires\r\n // immediately after hls.js has parsed the WebVTT and appended cues to\r\n // the TextTrack via `addCueToTrack`, which is exactly when we need to\r\n // refresh captions/transcript UIs.\r\n this.hls.on(window.Hls!.Events.SUBTITLE_FRAG_PROCESSED, (_event: any, data: any) => {\r\n if (!data || !data.success) return;\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 });\r\n\r\n // Some streams (e.g. IMSC1/TTML rendered externally by hls.js) deliver\r\n // their cues via CUES_PARSED instead of through a native TextTrack. Echo\r\n // that through to the transcript so it can refresh regardless of the\r\n // underlying subtitle format.\r\n this.hls.on(window.Hls!.Events.CUES_PARSED, (_event: any, _data: any) => {\r\n this.player.emit('textcuesupdate');\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
+ }
@@ -4560,7 +4560,7 @@ var Player = class _Player extends EventEmitter {
4560
4560
  const module = await import("./vidply.VimeoRenderer-6CLUVHOQ.js");
4561
4561
  return module.VimeoRenderer || module.default;
4562
4562
  } else if (src.includes(".m3u8")) {
4563
- const module = await import("./vidply.HLSRenderer-7F6FCZSH.js");
4563
+ const module = await import("./vidply.HLSRenderer-IVT5CQQ4.js");
4564
4564
  return module.HLSRenderer || module.default;
4565
4565
  } else if (src.includes(".mpd")) {
4566
4566
  const module = await import("./vidply.DASHRenderer-HP7BXLGV.js");
@@ -7706,18 +7706,20 @@
7706
7706
  this.hls.on(window.Hls.Events.ERROR, (_event, data) => {
7707
7707
  this.handleHlsError(data);
7708
7708
  });
7709
- this.hls.on(window.Hls.Events.FRAG_BUFFERED, (_event, data) => {
7709
+ this.hls.on(window.Hls.Events.FRAG_BUFFERED, (_event, _data) => {
7710
7710
  this.player.state.buffering = false;
7711
- if (data.frag && data.frag.type === "subtitle") {
7712
- setTimeout(() => {
7713
- const count = this._getTotalCueCount();
7714
- if (count > this._lastKnownCueCount) {
7715
- this._lastKnownCueCount = count;
7716
- this.player.emit("textcuesupdate");
7717
- }
7718
- }, 100);
7711
+ });
7712
+ this.hls.on(window.Hls.Events.SUBTITLE_FRAG_PROCESSED, (_event, data) => {
7713
+ if (!data || !data.success) return;
7714
+ const count = this._getTotalCueCount();
7715
+ if (count > this._lastKnownCueCount) {
7716
+ this._lastKnownCueCount = count;
7717
+ this.player.emit("textcuesupdate");
7719
7718
  }
7720
7719
  });
7720
+ this.hls.on(window.Hls.Events.CUES_PARSED, (_event, _data) => {
7721
+ this.player.emit("textcuesupdate");
7722
+ });
7721
7723
  }
7722
7724
  _getTotalCueCount() {
7723
7725
  const textTracks = this.media.textTracks;