vidply 1.0.20 → 1.0.21
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/vidply.css +31 -0
- package/dist/vidply.esm.js +186 -17
- package/dist/vidply.esm.js.map +2 -2
- package/dist/vidply.esm.min.js +5 -5
- package/dist/vidply.esm.min.meta.json +30 -25
- package/dist/vidply.js +186 -17
- package/dist/vidply.js.map +2 -2
- package/dist/vidply.min.css +1 -1
- package/dist/vidply.min.js +5 -5
- package/dist/vidply.min.meta.json +30 -25
- package/package.json +1 -1
- package/src/controls/ControlBar.js +2 -1
- package/src/core/Player.js +68 -3
- package/src/features/PlaylistManager.js +109 -15
- package/src/i18n/languages/de.js +8 -0
- package/src/i18n/languages/en.js +8 -0
- package/src/i18n/languages/es.js +8 -0
- package/src/i18n/languages/fr.js +8 -0
- package/src/i18n/languages/ja.js +8 -0
- package/src/renderers/HLSRenderer.js +17 -0
- package/src/renderers/HTML5Renderer.js +14 -1
- package/src/renderers/VimeoRenderer.js +7 -0
- package/src/renderers/YouTubeRenderer.js +7 -0
- package/src/styles/vidply.css +31 -0
|
@@ -22,6 +22,16 @@ export class HLSRenderer {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
canPlayNatively() {
|
|
25
|
+
// Only use native HLS on Safari/iOS where it actually works properly
|
|
26
|
+
// Chrome reports it can play HLS but doesn't have proper quality switching
|
|
27
|
+
const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
|
28
|
+
const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
|
|
29
|
+
|
|
30
|
+
if (!isSafari && !isIOS) {
|
|
31
|
+
// Force hls.js on non-Safari browsers for proper quality switching
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
|
|
25
35
|
const video = document.createElement('video');
|
|
26
36
|
return video.canPlayType('application/vnd.apple.mpegurl') !== '';
|
|
27
37
|
}
|
|
@@ -244,8 +254,15 @@ export class HLSRenderer {
|
|
|
244
254
|
}
|
|
245
255
|
|
|
246
256
|
play() {
|
|
257
|
+
// Save scroll position to prevent browser from scrolling to video
|
|
258
|
+
const scrollX = window.scrollX;
|
|
259
|
+
const scrollY = window.scrollY;
|
|
260
|
+
|
|
247
261
|
const promise = this.media.play();
|
|
248
262
|
|
|
263
|
+
// Restore scroll position immediately to prevent auto-scroll
|
|
264
|
+
window.scrollTo(scrollX, scrollY);
|
|
265
|
+
|
|
249
266
|
if (promise !== undefined) {
|
|
250
267
|
promise.catch(error => {
|
|
251
268
|
this.player.log('Play failed:', error, 'warn');
|
|
@@ -142,8 +142,15 @@ export class HTML5Renderer {
|
|
|
142
142
|
}
|
|
143
143
|
|
|
144
144
|
play() {
|
|
145
|
+
// Save scroll position to prevent browser from scrolling to video
|
|
146
|
+
const scrollX = window.scrollX;
|
|
147
|
+
const scrollY = window.scrollY;
|
|
148
|
+
|
|
145
149
|
const promise = this.media.play();
|
|
146
150
|
|
|
151
|
+
// Restore scroll position immediately to prevent auto-scroll
|
|
152
|
+
window.scrollTo(scrollX, scrollY);
|
|
153
|
+
|
|
147
154
|
if (promise !== undefined) {
|
|
148
155
|
promise.catch(error => {
|
|
149
156
|
this.player.log('Play failed:', error, 'warn');
|
|
@@ -152,7 +159,13 @@ export class HTML5Renderer {
|
|
|
152
159
|
if (this.player.options.autoplay && !this.player.state.muted) {
|
|
153
160
|
this.player.log('Retrying play with muted audio', 'info');
|
|
154
161
|
this.media.muted = true;
|
|
155
|
-
|
|
162
|
+
|
|
163
|
+
// Save scroll position again for retry
|
|
164
|
+
const retryScrollX = window.scrollX;
|
|
165
|
+
const retryScrollY = window.scrollY;
|
|
166
|
+
this.media.play().then(() => {
|
|
167
|
+
window.scrollTo(retryScrollX, retryScrollY);
|
|
168
|
+
}).catch(err => {
|
|
156
169
|
this.player.handleError(err);
|
|
157
170
|
});
|
|
158
171
|
}
|
|
@@ -188,9 +188,16 @@ export class VimeoRenderer {
|
|
|
188
188
|
|
|
189
189
|
play() {
|
|
190
190
|
if (this.isReady && this.vimeo) {
|
|
191
|
+
// Save scroll position to prevent browser from scrolling to video
|
|
192
|
+
const scrollX = window.scrollX;
|
|
193
|
+
const scrollY = window.scrollY;
|
|
194
|
+
|
|
191
195
|
this.vimeo.play().catch(error => {
|
|
192
196
|
this.player.log('Play error:', error, 'warn');
|
|
193
197
|
});
|
|
198
|
+
|
|
199
|
+
// Restore scroll position immediately to prevent auto-scroll
|
|
200
|
+
window.scrollTo(scrollX, scrollY);
|
|
194
201
|
}
|
|
195
202
|
}
|
|
196
203
|
|
|
@@ -211,7 +211,14 @@ export class YouTubeRenderer {
|
|
|
211
211
|
|
|
212
212
|
play() {
|
|
213
213
|
if (this.isReady && this.youtube) {
|
|
214
|
+
// Save scroll position to prevent browser from scrolling to video
|
|
215
|
+
const scrollX = window.scrollX;
|
|
216
|
+
const scrollY = window.scrollY;
|
|
217
|
+
|
|
214
218
|
this.youtube.playVideo();
|
|
219
|
+
|
|
220
|
+
// Restore scroll position immediately to prevent auto-scroll
|
|
221
|
+
window.scrollTo(scrollX, scrollY);
|
|
215
222
|
}
|
|
216
223
|
}
|
|
217
224
|
|
package/src/styles/vidply.css
CHANGED
|
@@ -2111,6 +2111,33 @@
|
|
|
2111
2111
|
============================================================================ */
|
|
2112
2112
|
|
|
2113
2113
|
/* Track Info Display (below video, above playlist) */
|
|
2114
|
+
/* Track Artwork - Displays album art/poster above audio player */
|
|
2115
|
+
.vidply-track-artwork {
|
|
2116
|
+
aspect-ratio: 16 / 3;
|
|
2117
|
+
background-color: var(--vidply-black);
|
|
2118
|
+
background-position: center;
|
|
2119
|
+
background-repeat: no-repeat;
|
|
2120
|
+
background-size: cover;
|
|
2121
|
+
border-bottom: 1px solid var(--vidply-border-light);
|
|
2122
|
+
order: 1; /* Before video-wrapper */
|
|
2123
|
+
overflow: hidden;
|
|
2124
|
+
position: relative;
|
|
2125
|
+
transition: background-image 0.3s ease-in-out;
|
|
2126
|
+
width: 100%;
|
|
2127
|
+
}
|
|
2128
|
+
|
|
2129
|
+
/* Optional: Add a subtle overlay for better text readability if needed */
|
|
2130
|
+
.vidply-track-artwork::after {
|
|
2131
|
+
background: linear-gradient(180deg, transparent 0%, var(--vidply-black-30) 100%);
|
|
2132
|
+
bottom: 0;
|
|
2133
|
+
content: '';
|
|
2134
|
+
left: 0;
|
|
2135
|
+
pointer-events: none;
|
|
2136
|
+
position: absolute;
|
|
2137
|
+
right: 0;
|
|
2138
|
+
top: 0;
|
|
2139
|
+
}
|
|
2140
|
+
|
|
2114
2141
|
.vidply-track-info {
|
|
2115
2142
|
background: var(--vidply-bg-track-info);
|
|
2116
2143
|
border-bottom: 1px solid var(--vidply-border-light);
|
|
@@ -3773,6 +3800,10 @@
|
|
|
3773
3800
|
padding: 10px 12px;
|
|
3774
3801
|
}
|
|
3775
3802
|
|
|
3803
|
+
.vidply-track-artwork {
|
|
3804
|
+
aspect-ratio: 16 / 3;
|
|
3805
|
+
}
|
|
3806
|
+
|
|
3776
3807
|
.vidply-track-info {
|
|
3777
3808
|
padding: 12px 16px;
|
|
3778
3809
|
}
|