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.
@@ -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
- this.media.play().catch(err => {
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
 
@@ -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
  }