vidply 1.0.34 → 1.0.36
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.SoundCloudRenderer-RIA3QKP3.js → vidply.SoundCloudRenderer-HCMKXHSX.js} +1 -3
- package/dist/dev/vidply.SoundCloudRenderer-HCMKXHSX.js.map +7 -0
- package/dist/dev/{vidply.TranscriptManager-T3BVTZHZ.js → vidply.TranscriptManager-EIIN5YOF.js} +2 -2
- package/dist/dev/{vidply.VimeoRenderer-DY2FG7LZ.js → vidply.VimeoRenderer-SLEBCZTT.js} +1 -2
- package/dist/dev/vidply.VimeoRenderer-SLEBCZTT.js.map +7 -0
- package/dist/dev/{vidply.YouTubeRenderer-EVXXE34A.js → vidply.YouTubeRenderer-E6F4UGVF.js} +1 -2
- package/dist/dev/vidply.YouTubeRenderer-E6F4UGVF.js.map +7 -0
- package/dist/dev/{vidply.chunk-74NJTDQI.js → vidply.chunk-AXXU22HR.js} +87 -10
- package/dist/dev/{vidply.chunk-74NJTDQI.js.map → vidply.chunk-AXXU22HR.js.map} +2 -2
- package/dist/dev/vidply.esm.js +83 -50
- package/dist/dev/vidply.esm.js.map +2 -2
- package/dist/legacy/vidply.js +170 -58
- package/dist/legacy/vidply.js.map +3 -3
- package/dist/legacy/vidply.min.js +1 -1
- package/dist/legacy/vidply.min.meta.json +18 -18
- package/dist/prod/vidply.SoundCloudRenderer-D2FNOEG6.min.js +6 -0
- package/dist/prod/{vidply.TranscriptManager-GPAOXEK4.min.js → vidply.TranscriptManager-VXCTCJ7X.min.js} +1 -1
- package/dist/prod/vidply.VimeoRenderer-QELFZVDU.min.js +6 -0
- package/dist/prod/vidply.YouTubeRenderer-ZL6YUHTF.min.js +6 -0
- package/dist/prod/{vidply.chunk-OM7DNW5P.min.js → vidply.chunk-Z6BHMOGK.min.js} +1 -1
- package/dist/prod/vidply.esm.min.js +3 -3
- package/dist/vidply.css +293 -108
- package/dist/vidply.esm.min.meta.json +33 -33
- package/dist/vidply.min.css +1 -1
- package/package.json +3 -3
- package/src/controls/ControlBar.js +3 -0
- package/src/controls/KeyboardManager.js +19 -0
- package/src/core/Player.js +75 -64
- package/src/core/SignLanguageManager.js +18 -4
- package/src/index.js +3 -1
- package/src/renderers/SoundCloudRenderer.js +0 -2
- package/src/renderers/VimeoRenderer.js +0 -1
- package/src/renderers/YouTubeRenderer.js +0 -1
- package/src/styles/vidply.css +293 -108
- package/src/utils/DraggableResizable.js +123 -12
- package/dist/dev/vidply.SoundCloudRenderer-RIA3QKP3.js.map +0 -7
- package/dist/dev/vidply.VimeoRenderer-DY2FG7LZ.js.map +0 -7
- package/dist/dev/vidply.YouTubeRenderer-EVXXE34A.js.map +0 -7
- package/dist/prod/vidply.SoundCloudRenderer-BFV5SSIU.min.js +0 -6
- package/dist/prod/vidply.VimeoRenderer-UQWHQ4LC.min.js +0 -6
- package/dist/prod/vidply.YouTubeRenderer-K7A57ICA.min.js +0 -6
- /package/dist/dev/{vidply.TranscriptManager-T3BVTZHZ.js.map → vidply.TranscriptManager-EIIN5YOF.js.map} +0 -0
|
@@ -65,10 +65,19 @@ export class DraggableResizable {
|
|
|
65
65
|
touchstart: this.onTouchStart.bind(this),
|
|
66
66
|
touchmove: this.onTouchMove.bind(this),
|
|
67
67
|
touchend: this.onTouchEnd.bind(this),
|
|
68
|
+
pointerdown: this.onPointerDown.bind(this),
|
|
69
|
+
pointermove: this.onPointerMove.bind(this),
|
|
70
|
+
pointerup: this.onPointerUp.bind(this),
|
|
71
|
+
pointercancel: this.onPointerUp.bind(this),
|
|
68
72
|
keydown: this.onKeyDown.bind(this),
|
|
69
|
-
resizeHandleMousedown: this.onResizeHandleMouseDown.bind(this)
|
|
73
|
+
resizeHandleMousedown: this.onResizeHandleMouseDown.bind(this),
|
|
74
|
+
resizeHandlePointerDown: this.onResizeHandlePointerDown.bind(this)
|
|
70
75
|
};
|
|
71
76
|
|
|
77
|
+
// Pointer tracking (Pointer Events unify mouse + touch)
|
|
78
|
+
this.activePointerId = null;
|
|
79
|
+
this.activePointerType = null;
|
|
80
|
+
|
|
72
81
|
this.init();
|
|
73
82
|
}
|
|
74
83
|
|
|
@@ -114,15 +123,25 @@ export class DraggableResizable {
|
|
|
114
123
|
init() {
|
|
115
124
|
const dragHandle = this.options.dragHandle || this.element;
|
|
116
125
|
|
|
117
|
-
//
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
+
// Prefer Pointer Events when available (covers mouse + touch in one codepath)
|
|
127
|
+
if (typeof window !== 'undefined' && 'PointerEvent' in window) {
|
|
128
|
+
dragHandle.addEventListener('pointerdown', this.handlers.pointerdown);
|
|
129
|
+
|
|
130
|
+
// Document-level move/up events
|
|
131
|
+
document.addEventListener('pointermove', this.handlers.pointermove, { passive: false });
|
|
132
|
+
document.addEventListener('pointerup', this.handlers.pointerup);
|
|
133
|
+
document.addEventListener('pointercancel', this.handlers.pointercancel);
|
|
134
|
+
} else {
|
|
135
|
+
// Fallback for very old browsers
|
|
136
|
+
dragHandle.addEventListener('mousedown', this.handlers.mousedown);
|
|
137
|
+
dragHandle.addEventListener('touchstart', this.handlers.touchstart, { passive: false });
|
|
138
|
+
|
|
139
|
+
// Document-level move/up events
|
|
140
|
+
document.addEventListener('mousemove', this.handlers.mousemove);
|
|
141
|
+
document.addEventListener('mouseup', this.handlers.mouseup);
|
|
142
|
+
document.addEventListener('touchmove', this.handlers.touchmove, { passive: false });
|
|
143
|
+
document.addEventListener('touchend', this.handlers.touchend);
|
|
144
|
+
}
|
|
126
145
|
|
|
127
146
|
// Keyboard events
|
|
128
147
|
this.element.addEventListener('keydown', this.handlers.keydown);
|
|
@@ -130,8 +149,12 @@ export class DraggableResizable {
|
|
|
130
149
|
// Resize handles
|
|
131
150
|
if (this.options.resizeHandles && this.options.resizeHandles.length > 0) {
|
|
132
151
|
this.options.resizeHandles.forEach(handle => {
|
|
133
|
-
|
|
134
|
-
|
|
152
|
+
if (typeof window !== 'undefined' && 'PointerEvent' in window) {
|
|
153
|
+
handle.addEventListener('pointerdown', this.handlers.resizeHandlePointerDown);
|
|
154
|
+
} else {
|
|
155
|
+
handle.addEventListener('mousedown', this.handlers.resizeHandleMousedown);
|
|
156
|
+
handle.addEventListener('touchstart', this.handlers.resizeHandleMousedown, { passive: false });
|
|
157
|
+
}
|
|
135
158
|
|
|
136
159
|
const managed = handle.dataset.vidplyManagedResize === 'true';
|
|
137
160
|
this.resizeHandlesManaged.set(handle, managed);
|
|
@@ -143,6 +166,62 @@ export class DraggableResizable {
|
|
|
143
166
|
}
|
|
144
167
|
}
|
|
145
168
|
|
|
169
|
+
onPointerDown(e) {
|
|
170
|
+
// Only handle primary pointer (avoid multi-touch weirdness)
|
|
171
|
+
if (e.isPrimary === false) return;
|
|
172
|
+
|
|
173
|
+
// Only left click for mouse
|
|
174
|
+
if (e.pointerType === 'mouse' && e.button !== 0) return;
|
|
175
|
+
|
|
176
|
+
// Don't drag if clicking on resize handle
|
|
177
|
+
if (e.target.classList.contains(`${this.options.classPrefix}-resize-handle`)) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Call custom handler if provided
|
|
182
|
+
if (this.options.onDragStart && !this.options.onDragStart(e)) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
this.activePointerId = e.pointerId;
|
|
187
|
+
this.activePointerType = e.pointerType;
|
|
188
|
+
|
|
189
|
+
// Capture pointer so drag continues even if leaving handle
|
|
190
|
+
try {
|
|
191
|
+
e.currentTarget?.setPointerCapture?.(e.pointerId);
|
|
192
|
+
} catch {
|
|
193
|
+
// ignore
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
this.startDragging(e.clientX, e.clientY);
|
|
197
|
+
e.preventDefault();
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
onPointerMove(e) {
|
|
201
|
+
if (this.activePointerId !== null && e.pointerId !== this.activePointerId) return;
|
|
202
|
+
|
|
203
|
+
if (this.isDragging) {
|
|
204
|
+
this.drag(e.clientX, e.clientY);
|
|
205
|
+
e.preventDefault();
|
|
206
|
+
} else if (this.isResizing) {
|
|
207
|
+
this.resize(e.clientX, e.clientY);
|
|
208
|
+
e.preventDefault();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
onPointerUp(e) {
|
|
213
|
+
if (this.activePointerId !== null && e.pointerId !== this.activePointerId) return;
|
|
214
|
+
|
|
215
|
+
if (this.isDragging) {
|
|
216
|
+
this.stopDragging();
|
|
217
|
+
} else if (this.isResizing) {
|
|
218
|
+
this.stopResizing();
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
this.activePointerId = null;
|
|
222
|
+
this.activePointerType = null;
|
|
223
|
+
}
|
|
224
|
+
|
|
146
225
|
onMouseDown(e) {
|
|
147
226
|
// Don't drag if clicking on resize handle
|
|
148
227
|
if (e.target.classList.contains(`${this.options.classPrefix}-resize-handle`)) {
|
|
@@ -171,6 +250,33 @@ export class DraggableResizable {
|
|
|
171
250
|
|
|
172
251
|
const touch = e.touches[0];
|
|
173
252
|
this.startDragging(touch.clientX, touch.clientY);
|
|
253
|
+
// Prevent page scroll while dragging (requires passive:false listener)
|
|
254
|
+
e.preventDefault();
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
onResizeHandlePointerDown(e) {
|
|
258
|
+
// Only handle primary pointer
|
|
259
|
+
if (e.isPrimary === false) return;
|
|
260
|
+
|
|
261
|
+
// Only left click for mouse
|
|
262
|
+
if (e.pointerType === 'mouse' && e.button !== 0) return;
|
|
263
|
+
|
|
264
|
+
e.preventDefault();
|
|
265
|
+
e.stopPropagation();
|
|
266
|
+
|
|
267
|
+
const handle = e.target;
|
|
268
|
+
this.resizeDirection = handle.getAttribute('data-direction');
|
|
269
|
+
|
|
270
|
+
this.activePointerId = e.pointerId;
|
|
271
|
+
this.activePointerType = e.pointerType;
|
|
272
|
+
|
|
273
|
+
try {
|
|
274
|
+
e.currentTarget?.setPointerCapture?.(e.pointerId);
|
|
275
|
+
} catch {
|
|
276
|
+
// ignore
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
this.startResizing(e.clientX, e.clientY);
|
|
174
280
|
}
|
|
175
281
|
|
|
176
282
|
onResizeHandleMouseDown(e) {
|
|
@@ -758,12 +864,16 @@ export class DraggableResizable {
|
|
|
758
864
|
// Remove drag events
|
|
759
865
|
dragHandle.removeEventListener('mousedown', this.handlers.mousedown);
|
|
760
866
|
dragHandle.removeEventListener('touchstart', this.handlers.touchstart);
|
|
867
|
+
dragHandle.removeEventListener('pointerdown', this.handlers.pointerdown);
|
|
761
868
|
|
|
762
869
|
// Remove document-level events
|
|
763
870
|
document.removeEventListener('mousemove', this.handlers.mousemove);
|
|
764
871
|
document.removeEventListener('mouseup', this.handlers.mouseup);
|
|
765
872
|
document.removeEventListener('touchmove', this.handlers.touchmove);
|
|
766
873
|
document.removeEventListener('touchend', this.handlers.touchend);
|
|
874
|
+
document.removeEventListener('pointermove', this.handlers.pointermove);
|
|
875
|
+
document.removeEventListener('pointerup', this.handlers.pointerup);
|
|
876
|
+
document.removeEventListener('pointercancel', this.handlers.pointercancel);
|
|
767
877
|
|
|
768
878
|
// Remove keyboard events
|
|
769
879
|
this.element.removeEventListener('keydown', this.handlers.keydown);
|
|
@@ -773,6 +883,7 @@ export class DraggableResizable {
|
|
|
773
883
|
this.options.resizeHandles.forEach(handle => {
|
|
774
884
|
handle.removeEventListener('mousedown', this.handlers.resizeHandleMousedown);
|
|
775
885
|
handle.removeEventListener('touchstart', this.handlers.resizeHandleMousedown);
|
|
886
|
+
handle.removeEventListener('pointerdown', this.handlers.resizeHandlePointerDown);
|
|
776
887
|
});
|
|
777
888
|
}
|
|
778
889
|
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/renderers/SoundCloudRenderer.js"],
|
|
4
|
-
"sourcesContent": ["/**\r\n * SoundCloud Renderer\r\n * Uses SoundCloud Widget API for embedded track playback\r\n */\r\n\r\nexport class SoundCloudRenderer {\r\n constructor(player) {\r\n this.player = player;\r\n this.widget = null;\r\n this.trackUrl = null;\r\n this.isReady = false;\r\n this.iframe = null;\r\n this.iframeId = null;\r\n }\r\n\r\n async init() {\r\n // Extract track URL - use currentSource which works for external renderers\r\n this.trackUrl = this.player.currentSource || this.player.element.src || this.player.element.querySelector('source')?.src;\r\n \r\n if (!this.trackUrl || !this.isValidSoundCloudUrl(this.trackUrl)) {\r\n throw new Error('Invalid SoundCloud URL');\r\n }\r\n\r\n // Load SoundCloud Widget API\r\n await this.loadSoundCloudAPI();\r\n\r\n // Create iframe\r\n this.createIframe();\r\n\r\n // Initialize widget\r\n await this.initializeWidget();\r\n }\r\n\r\n /**\r\n * Validate SoundCloud URL\r\n * @param {string} url \r\n * @returns {boolean}\r\n */\r\n isValidSoundCloudUrl(url) {\r\n return url.includes('soundcloud.com') || url.includes('api.soundcloud.com');\r\n }\r\n\r\n /**\r\n * Check if URL is a playlist/set\r\n */\r\n isPlaylist() {\r\n return this.trackUrl && this.trackUrl.includes('/sets/');\r\n }\r\n\r\n /**\r\n * Extract track/playlist info from URL for embed\r\n * SoundCloud URLs can be:\r\n * - https://soundcloud.com/artist/track\r\n * - https://soundcloud.com/artist/sets/playlist\r\n * - https://api.soundcloud.com/tracks/123456\r\n */\r\n getEmbedUrl() {\r\n // SoundCloud widget needs the track URL encoded\r\n const encodedUrl = encodeURIComponent(this.trackUrl);\r\n \r\n // Build widget URL with parameters\r\n const params = new URLSearchParams({\r\n url: this.trackUrl,\r\n auto_play: this.player.options.autoplay ? 'true' : 'false',\r\n hide_related: 'true',\r\n show_comments: 'false',\r\n show_user: 'true',\r\n show_reposts: 'false',\r\n show_teaser: 'false',\r\n visual: 'false', // Use classic player for better control\r\n color: '%23007bff'\r\n });\r\n \r\n return `https://w.soundcloud.com/player/?${params.toString()}`;\r\n }\r\n\r\n async loadSoundCloudAPI() {\r\n // Check if API is already loaded\r\n if (window.SC && window.SC.Widget) {\r\n return Promise.resolve();\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = 'https://w.soundcloud.com/player/api.js';\r\n script.onload = () => {\r\n // Wait a bit for SC.Widget to be fully available\r\n setTimeout(() => {\r\n if (window.SC && window.SC.Widget) {\r\n resolve();\r\n } else {\r\n reject(new Error('SoundCloud Widget API not available'));\r\n }\r\n }, 100);\r\n };\r\n script.onerror = () => reject(new Error('Failed to load SoundCloud Widget API'));\r\n document.head.appendChild(script);\r\n });\r\n }\r\n\r\n createIframe() {\r\n // Hide original element and remove poster (SoundCloud has its own visual widget)\r\n this.player.element.style.display = 'none';\r\n this.player.element.removeAttribute('poster');\r\n \r\n // Remove poster overlay from video wrapper if present\r\n if (this.player.videoWrapper) {\r\n this.player.videoWrapper.classList.remove('vidply-forced-poster');\r\n this.player.videoWrapper.style.removeProperty('--vidply-poster-image');\r\n }\r\n\r\n // Generate unique ID for iframe\r\n this.iframeId = `soundcloud-player-${Math.random().toString(36).substr(2, 9)}`;\r\n\r\n // Create iframe for SoundCloud widget\r\n this.iframe = document.createElement('iframe');\r\n this.iframe.id = this.iframeId;\r\n this.iframe.scrolling = 'no';\r\n this.iframe.frameBorder = 'no';\r\n this.iframe.allow = 'autoplay';\r\n this.iframe.src = this.getEmbedUrl();\r\n this.iframe.style.width = '100%';\r\n this.iframe.style.display = 'block';\r\n \r\n // Use different aspect ratio for playlists vs single tracks\r\n // Playlists need more height to show the track list\r\n if (this.isPlaylist()) {\r\n this.iframe.style.aspectRatio = '16 / 9'; // More height for playlist\r\n this.iframe.classList.add('vidply-soundcloud-iframe', 'vidply-soundcloud-playlist');\r\n } else {\r\n this.iframe.style.aspectRatio = '16 / 3'; // Banner-like for single track\r\n this.iframe.classList.add('vidply-soundcloud-iframe');\r\n }\r\n this.iframe.style.maxHeight = '100%';\r\n \r\n this.player.element.parentNode.insertBefore(this.iframe, this.player.element);\r\n }\r\n\r\n async initializeWidget() {\r\n return new Promise((resolve, reject) => {\r\n // Wait for iframe to load\r\n this.iframe.addEventListener('load', () => {\r\n try {\r\n this.widget = window.SC.Widget(this.iframe);\r\n \r\n this.widget.bind(window.SC.Widget.Events.READY, () => {\r\n this.isReady = true;\r\n this.attachEvents();\r\n \r\n // Hide VidPly controls - SoundCloud has its own\r\n if (this.player.container) {\r\n this.player.container.classList.add('vidply-external-controls');\r\n }\r\n \r\n // Get initial sound info\r\n this.widget.getCurrentSound((sound) => {\r\n if (sound) {\r\n this.player.state.duration = sound.duration / 1000; // Convert ms to seconds\r\n this.player.emit('loadedmetadata');\r\n }\r\n });\r\n \r\n resolve();\r\n });\r\n \r\n this.widget.bind(window.SC.Widget.Events.ERROR, (error) => {\r\n this.player.handleError(new Error(`SoundCloud error: ${error.message || 'Unknown error'}`));\r\n });\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n \r\n // Timeout after 10 seconds\r\n setTimeout(() => {\r\n if (!this.isReady) {\r\n reject(new Error('SoundCloud widget initialization timeout'));\r\n }\r\n }, 10000);\r\n });\r\n }\r\n\r\n attachEvents() {\r\n if (!this.widget) return;\r\n \r\n const Events = window.SC.Widget.Events;\r\n\r\n this.widget.bind(Events.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.widget.bind(Events.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.widget.bind(Events.FINISH, () => {\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.seek(0);\r\n this.play();\r\n }\r\n });\r\n\r\n this.widget.bind(Events.PLAY_PROGRESS, (data) => {\r\n // data.currentPosition is in milliseconds\r\n const currentTime = data.currentPosition / 1000;\r\n this.player.state.currentTime = currentTime;\r\n this.player.emit('timeupdate', currentTime);\r\n \r\n if (this.player.options.onTimeUpdate) {\r\n this.player.options.onTimeUpdate.call(this.player, currentTime);\r\n }\r\n });\r\n\r\n this.widget.bind(Events.SEEK, (data) => {\r\n this.player.state.currentTime = data.currentPosition / 1000;\r\n this.player.emit('seeked');\r\n });\r\n\r\n this.widget.bind(Events.LOAD_PROGRESS, (data) => {\r\n // data.loadedProgress is 0-1\r\n if (this.player.state.duration) {\r\n const buffered = data.loadedProgress * this.player.state.duration;\r\n this.player.emit('progress', buffered);\r\n }\r\n });\r\n }\r\n\r\n play() {\r\n if (this.isReady && this.widget) {\r\n // Save scroll position to prevent browser from scrolling\r\n const scrollX = window.scrollX;\r\n const scrollY = window.scrollY;\r\n \r\n this.widget.play();\r\n \r\n // Restore scroll position\r\n window.scrollTo(scrollX, scrollY);\r\n }\r\n }\r\n\r\n pause() {\r\n if (this.isReady && this.widget) {\r\n this.widget.pause();\r\n }\r\n }\r\n\r\n seek(time) {\r\n if (this.isReady && this.widget) {\r\n // SoundCloud seekTo uses milliseconds\r\n this.widget.seekTo(time * 1000);\r\n this.player.state.currentTime = time;\r\n }\r\n }\r\n\r\n setVolume(volume) {\r\n if (this.isReady && this.widget) {\r\n // SoundCloud setVolume expects 0-100\r\n this.widget.setVolume(volume * 100);\r\n this.player.state.volume = volume;\r\n }\r\n }\r\n\r\n setMuted(muted) {\r\n if (this.isReady && this.widget) {\r\n // SoundCloud doesn't have a native mute, use volume instead\r\n if (muted) {\r\n // Store current volume before muting\r\n this.widget.getVolume((vol) => {\r\n this._previousVolume = vol;\r\n this.widget.setVolume(0);\r\n });\r\n } else {\r\n this.widget.setVolume(this._previousVolume || 100);\r\n }\r\n this.player.state.muted = muted;\r\n }\r\n }\r\n\r\n setPlaybackSpeed(speed) {\r\n // SoundCloud Widget API doesn't support playback speed\r\n this.player.log('SoundCloud does not support playback speed control', 'warn');\r\n }\r\n\r\n /**\r\n * Get current track info\r\n * @returns {Promise<Object>}\r\n */\r\n getCurrentSound() {\r\n return new Promise((resolve) => {\r\n if (this.isReady && this.widget) {\r\n this.widget.getCurrentSound((sound) => {\r\n resolve(sound);\r\n });\r\n } else {\r\n resolve(null);\r\n }\r\n });\r\n }\r\n\r\n destroy() {\r\n // Unbind all events\r\n if (this.widget) {\r\n const Events = window.SC.Widget.Events;\r\n try {\r\n this.widget.unbind(Events.READY);\r\n this.widget.unbind(Events.PLAY);\r\n this.widget.unbind(Events.PAUSE);\r\n this.widget.unbind(Events.FINISH);\r\n this.widget.unbind(Events.PLAY_PROGRESS);\r\n this.widget.unbind(Events.SEEK);\r\n this.widget.unbind(Events.LOAD_PROGRESS);\r\n this.widget.unbind(Events.ERROR);\r\n } catch (e) {\r\n // Ignore unbind errors\r\n }\r\n }\r\n\r\n if (this.iframe && this.iframe.parentNode) {\r\n this.iframe.parentNode.removeChild(this.iframe);\r\n }\r\n\r\n // Show original element\r\n if (this.player.element) {\r\n this.player.element.style.display = '';\r\n }\r\n\r\n this.widget = null;\r\n this.isReady = false;\r\n }\r\n}\r\n\r\nexport default SoundCloudRenderer;\r\n\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/renderers/VimeoRenderer.js"],
|
|
4
|
-
"sourcesContent": ["/**\r\n * Vimeo Renderer\r\n */\r\n\r\nexport class VimeoRenderer {\r\n constructor(player) {\r\n this.player = player;\r\n this.vimeo = null;\r\n this.videoId = null;\r\n this.isReady = false;\r\n this.iframe = null;\r\n }\r\n\r\n async init() {\r\n // Extract video ID from URL - use currentSource which works for external renderers\r\n const src = this.player.currentSource || this.player.element.src;\r\n this.videoId = this.extractVideoId(src);\r\n \r\n if (!this.videoId) {\r\n throw new Error('Invalid Vimeo URL');\r\n }\r\n\r\n // Load Vimeo Player API\r\n await this.loadVimeoAPI();\r\n\r\n // Create iframe\r\n this.createIframe();\r\n\r\n // Initialize player\r\n await this.initializePlayer();\r\n }\r\n\r\n extractVideoId(url) {\r\n const patterns = [\r\n /vimeo\\.com\\/(\\d+)/,\r\n /vimeo\\.com\\/video\\/(\\d+)/,\r\n /player\\.vimeo\\.com\\/video\\/(\\d+)/\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n const match = url.match(pattern);\r\n if (match && match[1]) {\r\n return match[1];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n async loadVimeoAPI() {\r\n // Check if API is already loaded\r\n if (window.Vimeo && window.Vimeo.Player) {\r\n return Promise.resolve();\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = 'https://player.vimeo.com/api/player.js';\r\n script.onload = () => resolve();\r\n script.onerror = () => reject(new Error('Failed to load Vimeo API'));\r\n document.head.appendChild(script);\r\n });\r\n }\r\n\r\n createIframe() {\r\n // Hide original element\r\n this.player.element.style.display = 'none';\r\n\r\n // Create container for iframe\r\n this.iframe = document.createElement('div');\r\n this.iframe.id = `vimeo-player-${Math.random().toString(36).substr(2, 9)}`;\r\n this.iframe.style.width = '100%';\r\n this.iframe.style.aspectRatio = '16 / 9';\r\n this.iframe.style.maxHeight = '100%';\r\n \r\n this.player.element.parentNode.insertBefore(this.iframe, this.player.element);\r\n }\r\n\r\n async initializePlayer() {\r\n const options = {\r\n id: this.videoId,\r\n width: '100%',\r\n height: '100%',\r\n controls: true, // Use Vimeo native controls\r\n autoplay: this.player.options.autoplay,\r\n muted: this.player.options.muted,\r\n loop: this.player.options.loop,\r\n keyboard: false\r\n };\r\n\r\n if (this.player.options.startTime > 0) {\r\n options.startTime = this.player.options.startTime;\r\n }\r\n\r\n this.vimeo = new window.Vimeo.Player(this.iframe.id, options);\r\n\r\n // Wait for player to be ready\r\n await this.vimeo.ready();\r\n this.isReady = true;\r\n \r\n // Ensure the iframe has 100% width and height\r\n const vimeoIframe = this.iframe.querySelector('iframe');\r\n if (vimeoIframe) {\r\n vimeoIframe.style.width = '100%';\r\n vimeoIframe.style.height = '100%';\r\n vimeoIframe.setAttribute('width', '100%');\r\n vimeoIframe.setAttribute('height', '100%');\r\n }\r\n \r\n // Hide VidPly controls - Vimeo has its own\r\n if (this.player.container) {\r\n this.player.container.classList.add('vidply-external-controls');\r\n }\r\n\r\n this.attachEvents();\r\n\r\n // Get initial duration\r\n try {\r\n const duration = await this.vimeo.getDuration();\r\n this.player.state.duration = duration;\r\n this.player.emit('loadedmetadata');\r\n } catch (error) {\r\n this.player.log('Error getting duration:', error, 'warn');\r\n }\r\n }\r\n\r\n attachEvents() {\r\n this.vimeo.on('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.vimeo.on('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.vimeo.on('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\r\n this.vimeo.on('timeupdate', (data) => {\r\n this.player.state.currentTime = data.seconds;\r\n this.player.state.duration = data.duration;\r\n this.player.emit('timeupdate', data.seconds);\r\n \r\n if (this.player.options.onTimeUpdate) {\r\n this.player.options.onTimeUpdate.call(this.player, data.seconds);\r\n }\r\n });\r\n\r\n this.vimeo.on('volumechange', (data) => {\r\n this.player.state.volume = data.volume;\r\n this.player.emit('volumechange', data.volume);\r\n });\r\n\r\n this.vimeo.on('bufferstart', () => {\r\n this.player.state.buffering = true;\r\n this.player.emit('waiting');\r\n });\r\n\r\n this.vimeo.on('bufferend', () => {\r\n this.player.state.buffering = false;\r\n this.player.emit('canplay');\r\n });\r\n\r\n this.vimeo.on('seeking', () => {\r\n this.player.state.seeking = true;\r\n this.player.emit('seeking');\r\n });\r\n\r\n this.vimeo.on('seeked', () => {\r\n this.player.state.seeking = false;\r\n this.player.emit('seeked');\r\n });\r\n\r\n this.vimeo.on('playbackratechange', (data) => {\r\n this.player.state.playbackSpeed = data.playbackRate;\r\n this.player.emit('ratechange', data.playbackRate);\r\n });\r\n\r\n this.vimeo.on('error', (error) => {\r\n this.player.handleError(new Error(`Vimeo error: ${error.message}`));\r\n });\r\n }\r\n\r\n play() {\r\n if (this.isReady && this.vimeo) {\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 this.vimeo.play().catch(error => {\r\n this.player.log('Play error:', error, 'warn');\r\n });\r\n \r\n // Restore scroll position immediately to prevent auto-scroll\r\n window.scrollTo(scrollX, scrollY);\r\n }\r\n }\r\n\r\n pause() {\r\n if (this.isReady && this.vimeo) {\r\n this.vimeo.pause().catch(error => {\r\n this.player.log('Pause error:', error, 'warn');\r\n });\r\n }\r\n }\r\n\r\n seek(time) {\r\n if (this.isReady && this.vimeo) {\r\n this.vimeo.setCurrentTime(time).catch(error => {\r\n this.player.log('Seek error:', error, 'warn');\r\n });\r\n }\r\n }\r\n\r\n setVolume(volume) {\r\n if (this.isReady && this.vimeo) {\r\n this.vimeo.setVolume(volume).catch(error => {\r\n this.player.log('Volume error:', error, 'warn');\r\n });\r\n this.player.state.volume = volume;\r\n }\r\n }\r\n\r\n setMuted(muted) {\r\n if (this.isReady && this.vimeo) {\r\n if (muted) {\r\n this.vimeo.setVolume(0);\r\n } else {\r\n this.vimeo.setVolume(this.player.state.volume);\r\n }\r\n this.player.state.muted = muted;\r\n }\r\n }\r\n\r\n setPlaybackSpeed(speed) {\r\n if (this.isReady && this.vimeo) {\r\n this.vimeo.setPlaybackRate(speed).catch(error => {\r\n this.player.log('Playback rate error:', error, 'warn');\r\n });\r\n this.player.state.playbackSpeed = speed;\r\n }\r\n }\r\n\r\n destroy() {\r\n if (this.vimeo && this.vimeo.destroy) {\r\n this.vimeo.destroy();\r\n }\r\n\r\n if (this.iframe && this.iframe.parentNode) {\r\n this.iframe.parentNode.removeChild(this.iframe);\r\n }\r\n\r\n // Show original element\r\n if (this.player.element) {\r\n this.player.element.style.display = '';\r\n }\r\n }\r\n}\r\n\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/renderers/YouTubeRenderer.js"],
|
|
4
|
-
"sourcesContent": ["/**\r\n * YouTube Renderer\r\n */\r\n\r\nexport class YouTubeRenderer {\r\n constructor(player) {\r\n this.player = player;\r\n this.youtube = null;\r\n this.videoId = null;\r\n this.isReady = false;\r\n this.iframe = null;\r\n }\r\n\r\n async init() {\r\n // Extract video ID from URL - use currentSource which works for external renderers\r\n const src = this.player.currentSource || this.player.element.src;\r\n this.videoId = this.extractVideoId(src);\r\n \r\n if (!this.videoId) {\r\n throw new Error('Invalid YouTube URL');\r\n }\r\n\r\n // Load YouTube IFrame API\r\n await this.loadYouTubeAPI();\r\n\r\n // Create iframe\r\n this.createIframe();\r\n\r\n // Initialize player\r\n await this.initializePlayer();\r\n }\r\n\r\n extractVideoId(url) {\r\n const patterns = [\r\n /(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/)([^&\\s]+)/,\r\n /youtube\\.com\\/embed\\/([^&\\s]+)/\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n const match = url.match(pattern);\r\n if (match && match[1]) {\r\n return match[1];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n async loadYouTubeAPI() {\r\n // Check if API is already loaded\r\n if (window.YT && window.YT.Player) {\r\n return Promise.resolve();\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n // Check if script is already being loaded\r\n if (window.onYouTubeIframeAPIReady) {\r\n const originalCallback = window.onYouTubeIframeAPIReady;\r\n window.onYouTubeIframeAPIReady = () => {\r\n originalCallback();\r\n resolve();\r\n };\r\n return;\r\n }\r\n\r\n // Load the API script\r\n const tag = document.createElement('script');\r\n tag.src = 'https://www.youtube.com/iframe_api';\r\n \r\n window.onYouTubeIframeAPIReady = () => {\r\n resolve();\r\n };\r\n\r\n tag.onerror = () => reject(new Error('Failed to load YouTube API'));\r\n \r\n const firstScriptTag = document.getElementsByTagName('script')[0];\r\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\r\n });\r\n }\r\n\r\n createIframe() {\r\n // Hide original element\r\n this.player.element.style.display = 'none';\r\n\r\n // Create container for iframe\r\n this.iframe = document.createElement('div');\r\n this.iframe.id = `youtube-player-${Math.random().toString(36).substr(2, 9)}`;\r\n this.iframe.style.width = '100%';\r\n this.iframe.style.aspectRatio = '16 / 9';\r\n this.iframe.style.maxHeight = '100%';\r\n \r\n this.player.element.parentNode.insertBefore(this.iframe, this.player.element);\r\n }\r\n\r\n async initializePlayer() {\r\n return new Promise((resolve) => {\r\n this.youtube = new window.YT.Player(this.iframe.id, {\r\n videoId: this.videoId,\r\n width: '100%',\r\n height: '100%',\r\n playerVars: {\r\n controls: 1, // Use YouTube native controls\r\n disablekb: 0, // Allow keyboard controls\r\n fs: 1, // Allow fullscreen\r\n modestbranding: 1,\r\n rel: 0,\r\n showinfo: 0,\r\n iv_load_policy: 3,\r\n autoplay: this.player.options.autoplay ? 1 : 0,\r\n mute: this.player.options.muted ? 1 : 0,\r\n start: this.player.options.startTime || 0\r\n },\r\n events: {\r\n onReady: (event) => {\r\n this.isReady = true;\r\n this.attachEvents();\r\n // Hide VidPly controls - YouTube has its own\r\n if (this.player.container) {\r\n this.player.container.classList.add('vidply-external-controls');\r\n }\r\n resolve();\r\n },\r\n onStateChange: (event) => this.handleStateChange(event),\r\n onError: (event) => this.handleError(event)\r\n }\r\n });\r\n });\r\n }\r\n\r\n attachEvents() {\r\n // Set up polling for time updates (YouTube doesn't provide timeupdate events)\r\n this.timeUpdateInterval = setInterval(() => {\r\n if (this.isReady && this.youtube) {\r\n const currentTime = this.youtube.getCurrentTime();\r\n const duration = this.youtube.getDuration();\r\n \r\n this.player.state.currentTime = currentTime;\r\n this.player.state.duration = duration;\r\n \r\n this.player.emit('timeupdate', currentTime);\r\n }\r\n }, 250);\r\n\r\n // Initial metadata\r\n if (this.youtube.getDuration) {\r\n this.player.state.duration = this.youtube.getDuration();\r\n this.player.emit('loadedmetadata');\r\n }\r\n }\r\n\r\n handleStateChange(event) {\r\n const states = window.YT.PlayerState;\r\n\r\n switch (event.data) {\r\n case states.PLAYING:\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.state.buffering = false;\r\n this.player.emit('play');\r\n this.player.emit('playing');\r\n \r\n if (this.player.options.onPlay) {\r\n this.player.options.onPlay.call(this.player);\r\n }\r\n break;\r\n\r\n case states.PAUSED:\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 break;\r\n\r\n case states.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.youtube.seekTo(0);\r\n this.youtube.playVideo();\r\n }\r\n break;\r\n\r\n case states.BUFFERING:\r\n this.player.state.buffering = true;\r\n this.player.emit('waiting');\r\n break;\r\n\r\n case states.CUED:\r\n this.player.emit('loadedmetadata');\r\n break;\r\n }\r\n }\r\n\r\n handleError(event) {\r\n const errors = {\r\n 2: 'Invalid video ID',\r\n 5: 'HTML5 player error',\r\n 100: 'Video not found',\r\n 101: 'Video not allowed to be played in embedded players',\r\n 150: 'Video not allowed to be played in embedded players'\r\n };\r\n\r\n const error = new Error(errors[event.data] || 'YouTube player error');\r\n this.player.handleError(error);\r\n }\r\n\r\n play() {\r\n if (this.isReady && this.youtube) {\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 this.youtube.playVideo();\r\n \r\n // Restore scroll position immediately to prevent auto-scroll\r\n window.scrollTo(scrollX, scrollY);\r\n }\r\n }\r\n\r\n pause() {\r\n if (this.isReady && this.youtube) {\r\n this.youtube.pauseVideo();\r\n }\r\n }\r\n\r\n seek(time) {\r\n if (this.isReady && this.youtube) {\r\n this.youtube.seekTo(time, true);\r\n }\r\n }\r\n\r\n setVolume(volume) {\r\n if (this.isReady && this.youtube) {\r\n this.youtube.setVolume(volume * 100);\r\n this.player.state.volume = volume;\r\n }\r\n }\r\n\r\n setMuted(muted) {\r\n if (this.isReady && this.youtube) {\r\n if (muted) {\r\n this.youtube.mute();\r\n } else {\r\n this.youtube.unMute();\r\n }\r\n this.player.state.muted = muted;\r\n }\r\n }\r\n\r\n setPlaybackSpeed(speed) {\r\n if (this.isReady && this.youtube) {\r\n this.youtube.setPlaybackRate(speed);\r\n this.player.state.playbackSpeed = speed;\r\n }\r\n }\r\n\r\n destroy() {\r\n if (this.timeUpdateInterval) {\r\n clearInterval(this.timeUpdateInterval);\r\n }\r\n\r\n if (this.youtube && this.youtube.destroy) {\r\n this.youtube.destroy();\r\n }\r\n\r\n if (this.iframe && this.iframe.parentNode) {\r\n this.iframe.parentNode.removeChild(this.iframe);\r\n }\r\n\r\n // Show original element\r\n if (this.player.element) {\r\n this.player.element.style.display = '';\r\n }\r\n }\r\n}\r\n\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Universal, Accessible Video Player
|
|
3
|
-
* (c) 2026 Matthias Peltzer
|
|
4
|
-
* Released under GPL-2.0-or-later License
|
|
5
|
-
*/
|
|
6
|
-
var s=class{constructor(e){this.player=e,this.widget=null,this.trackUrl=null,this.isReady=!1,this.iframe=null,this.iframeId=null}async init(){if(this.trackUrl=this.player.currentSource||this.player.element.src||this.player.element.querySelector("source")?.src,!this.trackUrl||!this.isValidSoundCloudUrl(this.trackUrl))throw new Error("Invalid SoundCloud URL");await this.loadSoundCloudAPI(),this.createIframe(),await this.initializeWidget()}isValidSoundCloudUrl(e){return e.includes("soundcloud.com")||e.includes("api.soundcloud.com")}isPlaylist(){return this.trackUrl&&this.trackUrl.includes("/sets/")}getEmbedUrl(){let e=encodeURIComponent(this.trackUrl);return`https://w.soundcloud.com/player/?${new URLSearchParams({url:this.trackUrl,auto_play:this.player.options.autoplay?"true":"false",hide_related:"true",show_comments:"false",show_user:"true",show_reposts:"false",show_teaser:"false",visual:"false",color:"%23007bff"}).toString()}`}async loadSoundCloudAPI(){return window.SC&&window.SC.Widget?Promise.resolve():new Promise((e,t)=>{let i=document.createElement("script");i.src="https://w.soundcloud.com/player/api.js",i.onload=()=>{setTimeout(()=>{window.SC&&window.SC.Widget?e():t(new Error("SoundCloud Widget API not available"))},100)},i.onerror=()=>t(new Error("Failed to load SoundCloud Widget API")),document.head.appendChild(i)})}createIframe(){this.player.element.style.display="none",this.player.element.removeAttribute("poster"),this.player.videoWrapper&&(this.player.videoWrapper.classList.remove("vidply-forced-poster"),this.player.videoWrapper.style.removeProperty("--vidply-poster-image")),this.iframeId=`soundcloud-player-${Math.random().toString(36).substr(2,9)}`,this.iframe=document.createElement("iframe"),this.iframe.id=this.iframeId,this.iframe.scrolling="no",this.iframe.frameBorder="no",this.iframe.allow="autoplay",this.iframe.src=this.getEmbedUrl(),this.iframe.style.width="100%",this.iframe.style.display="block",this.isPlaylist()?(this.iframe.style.aspectRatio="16 / 9",this.iframe.classList.add("vidply-soundcloud-iframe","vidply-soundcloud-playlist")):(this.iframe.style.aspectRatio="16 / 3",this.iframe.classList.add("vidply-soundcloud-iframe")),this.iframe.style.maxHeight="100%",this.player.element.parentNode.insertBefore(this.iframe,this.player.element)}async initializeWidget(){return new Promise((e,t)=>{this.iframe.addEventListener("load",()=>{try{this.widget=window.SC.Widget(this.iframe),this.widget.bind(window.SC.Widget.Events.READY,()=>{this.isReady=!0,this.attachEvents(),this.player.container&&this.player.container.classList.add("vidply-external-controls"),this.widget.getCurrentSound(i=>{i&&(this.player.state.duration=i.duration/1e3,this.player.emit("loadedmetadata"))}),e()}),this.widget.bind(window.SC.Widget.Events.ERROR,i=>{this.player.handleError(new Error(`SoundCloud error: ${i.message||"Unknown error"}`))})}catch(i){t(i)}}),setTimeout(()=>{this.isReady||t(new Error("SoundCloud widget initialization timeout"))},1e4)})}attachEvents(){if(!this.widget)return;let e=window.SC.Widget.Events;this.widget.bind(e.PLAY,()=>{this.player.state.playing=!0,this.player.state.paused=!1,this.player.state.ended=!1,this.player.emit("play"),this.player.options.onPlay&&this.player.options.onPlay.call(this.player)}),this.widget.bind(e.PAUSE,()=>{this.player.state.playing=!1,this.player.state.paused=!0,this.player.emit("pause"),this.player.options.onPause&&this.player.options.onPause.call(this.player)}),this.widget.bind(e.FINISH,()=>{this.player.state.playing=!1,this.player.state.paused=!0,this.player.state.ended=!0,this.player.emit("ended"),this.player.options.onEnded&&this.player.options.onEnded.call(this.player),this.player.options.loop&&(this.seek(0),this.play())}),this.widget.bind(e.PLAY_PROGRESS,t=>{let i=t.currentPosition/1e3;this.player.state.currentTime=i,this.player.emit("timeupdate",i),this.player.options.onTimeUpdate&&this.player.options.onTimeUpdate.call(this.player,i)}),this.widget.bind(e.SEEK,t=>{this.player.state.currentTime=t.currentPosition/1e3,this.player.emit("seeked")}),this.widget.bind(e.LOAD_PROGRESS,t=>{if(this.player.state.duration){let i=t.loadedProgress*this.player.state.duration;this.player.emit("progress",i)}})}play(){if(this.isReady&&this.widget){let e=window.scrollX,t=window.scrollY;this.widget.play(),window.scrollTo(e,t)}}pause(){this.isReady&&this.widget&&this.widget.pause()}seek(e){this.isReady&&this.widget&&(this.widget.seekTo(e*1e3),this.player.state.currentTime=e)}setVolume(e){this.isReady&&this.widget&&(this.widget.setVolume(e*100),this.player.state.volume=e)}setMuted(e){this.isReady&&this.widget&&(e?this.widget.getVolume(t=>{this._previousVolume=t,this.widget.setVolume(0)}):this.widget.setVolume(this._previousVolume||100),this.player.state.muted=e)}setPlaybackSpeed(e){this.player.log("SoundCloud does not support playback speed control","warn")}getCurrentSound(){return new Promise(e=>{this.isReady&&this.widget?this.widget.getCurrentSound(t=>{e(t)}):e(null)})}destroy(){if(this.widget){let e=window.SC.Widget.Events;try{this.widget.unbind(e.READY),this.widget.unbind(e.PLAY),this.widget.unbind(e.PAUSE),this.widget.unbind(e.FINISH),this.widget.unbind(e.PLAY_PROGRESS),this.widget.unbind(e.SEEK),this.widget.unbind(e.LOAD_PROGRESS),this.widget.unbind(e.ERROR)}catch{}}this.iframe&&this.iframe.parentNode&&this.iframe.parentNode.removeChild(this.iframe),this.player.element&&(this.player.element.style.display=""),this.widget=null,this.isReady=!1}},a=s;export{s as SoundCloudRenderer,a as default};
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Universal, Accessible Video Player
|
|
3
|
-
* (c) 2026 Matthias Peltzer
|
|
4
|
-
* Released under GPL-2.0-or-later License
|
|
5
|
-
*/
|
|
6
|
-
var a=class{constructor(e){this.player=e,this.vimeo=null,this.videoId=null,this.isReady=!1,this.iframe=null}async init(){let e=this.player.currentSource||this.player.element.src;if(this.videoId=this.extractVideoId(e),!this.videoId)throw new Error("Invalid Vimeo URL");await this.loadVimeoAPI(),this.createIframe(),await this.initializePlayer()}extractVideoId(e){let t=[/vimeo\.com\/(\d+)/,/vimeo\.com\/video\/(\d+)/,/player\.vimeo\.com\/video\/(\d+)/];for(let i of t){let s=e.match(i);if(s&&s[1])return s[1]}return null}async loadVimeoAPI(){return window.Vimeo&&window.Vimeo.Player?Promise.resolve():new Promise((e,t)=>{let i=document.createElement("script");i.src="https://player.vimeo.com/api/player.js",i.onload=()=>e(),i.onerror=()=>t(new Error("Failed to load Vimeo API")),document.head.appendChild(i)})}createIframe(){this.player.element.style.display="none",this.iframe=document.createElement("div"),this.iframe.id=`vimeo-player-${Math.random().toString(36).substr(2,9)}`,this.iframe.style.width="100%",this.iframe.style.aspectRatio="16 / 9",this.iframe.style.maxHeight="100%",this.player.element.parentNode.insertBefore(this.iframe,this.player.element)}async initializePlayer(){let e={id:this.videoId,width:"100%",height:"100%",controls:!0,autoplay:this.player.options.autoplay,muted:this.player.options.muted,loop:this.player.options.loop,keyboard:!1};this.player.options.startTime>0&&(e.startTime=this.player.options.startTime),this.vimeo=new window.Vimeo.Player(this.iframe.id,e),await this.vimeo.ready(),this.isReady=!0;let t=this.iframe.querySelector("iframe");t&&(t.style.width="100%",t.style.height="100%",t.setAttribute("width","100%"),t.setAttribute("height","100%")),this.player.container&&this.player.container.classList.add("vidply-external-controls"),this.attachEvents();try{let i=await this.vimeo.getDuration();this.player.state.duration=i,this.player.emit("loadedmetadata")}catch(i){this.player.log("Error getting duration:",i,"warn")}}attachEvents(){this.vimeo.on("play",()=>{this.player.state.playing=!0,this.player.state.paused=!1,this.player.state.ended=!1,this.player.emit("play"),this.player.options.onPlay&&this.player.options.onPlay.call(this.player)}),this.vimeo.on("pause",()=>{this.player.state.playing=!1,this.player.state.paused=!0,this.player.emit("pause"),this.player.options.onPause&&this.player.options.onPause.call(this.player)}),this.vimeo.on("ended",()=>{this.player.state.playing=!1,this.player.state.paused=!0,this.player.state.ended=!0,this.player.emit("ended"),this.player.options.onEnded&&this.player.options.onEnded.call(this.player)}),this.vimeo.on("timeupdate",e=>{this.player.state.currentTime=e.seconds,this.player.state.duration=e.duration,this.player.emit("timeupdate",e.seconds),this.player.options.onTimeUpdate&&this.player.options.onTimeUpdate.call(this.player,e.seconds)}),this.vimeo.on("volumechange",e=>{this.player.state.volume=e.volume,this.player.emit("volumechange",e.volume)}),this.vimeo.on("bufferstart",()=>{this.player.state.buffering=!0,this.player.emit("waiting")}),this.vimeo.on("bufferend",()=>{this.player.state.buffering=!1,this.player.emit("canplay")}),this.vimeo.on("seeking",()=>{this.player.state.seeking=!0,this.player.emit("seeking")}),this.vimeo.on("seeked",()=>{this.player.state.seeking=!1,this.player.emit("seeked")}),this.vimeo.on("playbackratechange",e=>{this.player.state.playbackSpeed=e.playbackRate,this.player.emit("ratechange",e.playbackRate)}),this.vimeo.on("error",e=>{this.player.handleError(new Error(`Vimeo error: ${e.message}`))})}play(){if(this.isReady&&this.vimeo){let e=window.scrollX,t=window.scrollY;this.vimeo.play().catch(i=>{this.player.log("Play error:",i,"warn")}),window.scrollTo(e,t)}}pause(){this.isReady&&this.vimeo&&this.vimeo.pause().catch(e=>{this.player.log("Pause error:",e,"warn")})}seek(e){this.isReady&&this.vimeo&&this.vimeo.setCurrentTime(e).catch(t=>{this.player.log("Seek error:",t,"warn")})}setVolume(e){this.isReady&&this.vimeo&&(this.vimeo.setVolume(e).catch(t=>{this.player.log("Volume error:",t,"warn")}),this.player.state.volume=e)}setMuted(e){this.isReady&&this.vimeo&&(e?this.vimeo.setVolume(0):this.vimeo.setVolume(this.player.state.volume),this.player.state.muted=e)}setPlaybackSpeed(e){this.isReady&&this.vimeo&&(this.vimeo.setPlaybackRate(e).catch(t=>{this.player.log("Playback rate error:",t,"warn")}),this.player.state.playbackSpeed=e)}destroy(){this.vimeo&&this.vimeo.destroy&&this.vimeo.destroy(),this.iframe&&this.iframe.parentNode&&this.iframe.parentNode.removeChild(this.iframe),this.player.element&&(this.player.element.style.display="")}};export{a as VimeoRenderer};
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Universal, Accessible Video Player
|
|
3
|
-
* (c) 2026 Matthias Peltzer
|
|
4
|
-
* Released under GPL-2.0-or-later License
|
|
5
|
-
*/
|
|
6
|
-
var s=class{constructor(e){this.player=e,this.youtube=null,this.videoId=null,this.isReady=!1,this.iframe=null}async init(){let e=this.player.currentSource||this.player.element.src;if(this.videoId=this.extractVideoId(e),!this.videoId)throw new Error("Invalid YouTube URL");await this.loadYouTubeAPI(),this.createIframe(),await this.initializePlayer()}extractVideoId(e){let t=[/(?:youtube\.com\/watch\?v=|youtu\.be\/)([^&\s]+)/,/youtube\.com\/embed\/([^&\s]+)/];for(let i of t){let a=e.match(i);if(a&&a[1])return a[1]}return null}async loadYouTubeAPI(){return window.YT&&window.YT.Player?Promise.resolve():new Promise((e,t)=>{if(window.onYouTubeIframeAPIReady){let r=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=()=>{r(),e()};return}let i=document.createElement("script");i.src="https://www.youtube.com/iframe_api",window.onYouTubeIframeAPIReady=()=>{e()},i.onerror=()=>t(new Error("Failed to load YouTube API"));let a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(i,a)})}createIframe(){this.player.element.style.display="none",this.iframe=document.createElement("div"),this.iframe.id=`youtube-player-${Math.random().toString(36).substr(2,9)}`,this.iframe.style.width="100%",this.iframe.style.aspectRatio="16 / 9",this.iframe.style.maxHeight="100%",this.player.element.parentNode.insertBefore(this.iframe,this.player.element)}async initializePlayer(){return new Promise(e=>{this.youtube=new window.YT.Player(this.iframe.id,{videoId:this.videoId,width:"100%",height:"100%",playerVars:{controls:1,disablekb:0,fs:1,modestbranding:1,rel:0,showinfo:0,iv_load_policy:3,autoplay:this.player.options.autoplay?1:0,mute:this.player.options.muted?1:0,start:this.player.options.startTime||0},events:{onReady:t=>{this.isReady=!0,this.attachEvents(),this.player.container&&this.player.container.classList.add("vidply-external-controls"),e()},onStateChange:t=>this.handleStateChange(t),onError:t=>this.handleError(t)}})})}attachEvents(){this.timeUpdateInterval=setInterval(()=>{if(this.isReady&&this.youtube){let e=this.youtube.getCurrentTime(),t=this.youtube.getDuration();this.player.state.currentTime=e,this.player.state.duration=t,this.player.emit("timeupdate",e)}},250),this.youtube.getDuration&&(this.player.state.duration=this.youtube.getDuration(),this.player.emit("loadedmetadata"))}handleStateChange(e){let t=window.YT.PlayerState;switch(e.data){case t.PLAYING:this.player.state.playing=!0,this.player.state.paused=!1,this.player.state.ended=!1,this.player.state.buffering=!1,this.player.emit("play"),this.player.emit("playing"),this.player.options.onPlay&&this.player.options.onPlay.call(this.player);break;case t.PAUSED:this.player.state.playing=!1,this.player.state.paused=!0,this.player.emit("pause"),this.player.options.onPause&&this.player.options.onPause.call(this.player);break;case t.ENDED:this.player.state.playing=!1,this.player.state.paused=!0,this.player.state.ended=!0,this.player.emit("ended"),this.player.options.onEnded&&this.player.options.onEnded.call(this.player),this.player.options.loop&&(this.youtube.seekTo(0),this.youtube.playVideo());break;case t.BUFFERING:this.player.state.buffering=!0,this.player.emit("waiting");break;case t.CUED:this.player.emit("loadedmetadata");break}}handleError(e){let t={2:"Invalid video ID",5:"HTML5 player error",100:"Video not found",101:"Video not allowed to be played in embedded players",150:"Video not allowed to be played in embedded players"},i=new Error(t[e.data]||"YouTube player error");this.player.handleError(i)}play(){if(this.isReady&&this.youtube){let e=window.scrollX,t=window.scrollY;this.youtube.playVideo(),window.scrollTo(e,t)}}pause(){this.isReady&&this.youtube&&this.youtube.pauseVideo()}seek(e){this.isReady&&this.youtube&&this.youtube.seekTo(e,!0)}setVolume(e){this.isReady&&this.youtube&&(this.youtube.setVolume(e*100),this.player.state.volume=e)}setMuted(e){this.isReady&&this.youtube&&(e?this.youtube.mute():this.youtube.unMute(),this.player.state.muted=e)}setPlaybackSpeed(e){this.isReady&&this.youtube&&(this.youtube.setPlaybackRate(e),this.player.state.playbackSpeed=e)}destroy(){this.timeUpdateInterval&&clearInterval(this.timeUpdateInterval),this.youtube&&this.youtube.destroy&&this.youtube.destroy(),this.iframe&&this.iframe.parentNode&&this.iframe.parentNode.removeChild(this.iframe),this.player.element&&(this.player.element.style.display="")}};export{s as YouTubeRenderer};
|
|
File without changes
|