react-native-audio-browser 0.2.0-next.17 → 0.2.0-next.19

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.
Files changed (81) hide show
  1. package/android/build.gradle +2 -1
  2. package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +160 -106
  3. package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +11 -29
  4. package/android/src/main/java/com/audiobrowser/player/CrossOriginHeaderStripper.kt +77 -0
  5. package/android/src/main/java/com/audiobrowser/player/MediaFactory.kt +28 -10
  6. package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +377 -110
  7. package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +13 -1
  8. package/android/src/main/res/values/strings.xml +6 -21
  9. package/android/src/test/java/com/audiobrowser/player/BrowseTilesTest.kt +385 -0
  10. package/android/src/test/java/com/audiobrowser/player/CrossOriginHeaderStripperTest.kt +94 -0
  11. package/lib/commonjs/features/browser.js +8 -0
  12. package/lib/commonjs/features/browser.js.map +1 -1
  13. package/lib/commonjs/web/NativeAudioBrowser.js +163 -50
  14. package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -1
  15. package/lib/commonjs/web/TrackPlayer/LoadAttempt.js +37 -0
  16. package/lib/commonjs/web/TrackPlayer/LoadAttempt.js.map +1 -0
  17. package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js +18 -2
  18. package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js.map +1 -1
  19. package/lib/commonjs/web/TrackPlayer/Player.js +232 -39
  20. package/lib/commonjs/web/TrackPlayer/Player.js.map +1 -1
  21. package/lib/commonjs/web/TrackPlayer/QueuePlayer.js +33 -12
  22. package/lib/commonjs/web/TrackPlayer/QueuePlayer.js.map +1 -1
  23. package/lib/commonjs/web/browser/BrowserManager.js +30 -12
  24. package/lib/commonjs/web/browser/BrowserManager.js.map +1 -1
  25. package/lib/commonjs/web/browser/SearchManager.js +16 -19
  26. package/lib/commonjs/web/browser/SearchManager.js.map +1 -1
  27. package/lib/commonjs/web/http/RequestConfigBuilder.js +110 -27
  28. package/lib/commonjs/web/http/RequestConfigBuilder.js.map +1 -1
  29. package/lib/commonjs/web/http/followMediaRedirect.js +219 -0
  30. package/lib/commonjs/web/http/followMediaRedirect.js.map +1 -0
  31. package/lib/module/features/browser.js +8 -0
  32. package/lib/module/features/browser.js.map +1 -1
  33. package/lib/module/web/NativeAudioBrowser.js +163 -50
  34. package/lib/module/web/NativeAudioBrowser.js.map +1 -1
  35. package/lib/module/web/TrackPlayer/LoadAttempt.js +32 -0
  36. package/lib/module/web/TrackPlayer/LoadAttempt.js.map +1 -0
  37. package/lib/module/web/TrackPlayer/PlaybackStateMachine.js +18 -2
  38. package/lib/module/web/TrackPlayer/PlaybackStateMachine.js.map +1 -1
  39. package/lib/module/web/TrackPlayer/Player.js +232 -39
  40. package/lib/module/web/TrackPlayer/Player.js.map +1 -1
  41. package/lib/module/web/TrackPlayer/QueuePlayer.js +33 -12
  42. package/lib/module/web/TrackPlayer/QueuePlayer.js.map +1 -1
  43. package/lib/module/web/browser/BrowserManager.js +30 -12
  44. package/lib/module/web/browser/BrowserManager.js.map +1 -1
  45. package/lib/module/web/browser/SearchManager.js +16 -19
  46. package/lib/module/web/browser/SearchManager.js.map +1 -1
  47. package/lib/module/web/http/RequestConfigBuilder.js +110 -27
  48. package/lib/module/web/http/RequestConfigBuilder.js.map +1 -1
  49. package/lib/module/web/http/followMediaRedirect.js +215 -0
  50. package/lib/module/web/http/followMediaRedirect.js.map +1 -0
  51. package/lib/typescript/src/features/browser.d.ts +8 -0
  52. package/lib/typescript/src/features/browser.d.ts.map +1 -1
  53. package/lib/typescript/src/types/browser.d.ts +13 -4
  54. package/lib/typescript/src/types/browser.d.ts.map +1 -1
  55. package/package.json +1 -1
  56. package/src/features/browser.ts +8 -0
  57. package/src/types/browser.ts +13 -4
  58. package/src/web/NativeAudioBrowser.playWhenReady.test.ts +232 -2
  59. package/src/web/NativeAudioBrowser.ts +193 -60
  60. package/src/web/TrackPlayer/LoadAttempt.ts +29 -0
  61. package/src/web/TrackPlayer/PlaybackStateMachine.test.ts +60 -13
  62. package/src/web/TrackPlayer/PlaybackStateMachine.ts +22 -6
  63. package/src/web/TrackPlayer/Player.dispatch.test.ts +5 -3
  64. package/src/web/TrackPlayer/Player.load.test.ts +137 -1
  65. package/src/web/TrackPlayer/Player.ts +256 -37
  66. package/src/web/TrackPlayer/QueuePlayer.ts +33 -14
  67. package/src/web/__tests__/lifecycle.test.ts +345 -0
  68. package/src/web/__tests__/lifecycleHarness.ts +351 -0
  69. package/src/web/__tests__/loadEdgeCases.test.ts +195 -0
  70. package/src/web/__tests__/loadSupersession.test.ts +175 -0
  71. package/src/web/__tests__/retry.test.ts +169 -0
  72. package/src/web/browser/BrowserManager.ts +32 -15
  73. package/src/web/browser/SearchManager.test.ts +75 -0
  74. package/src/web/browser/SearchManager.ts +23 -26
  75. package/src/web/browser/__tests__/artwork-resolution.test.ts +117 -0
  76. package/src/web/browser/__tests__/layer-resolver.test.ts +35 -0
  77. package/src/web/browser/__tests__/search-navigation.test.ts +76 -0
  78. package/src/web/http/RequestConfigBuilder.test.ts +241 -1
  79. package/src/web/http/RequestConfigBuilder.ts +140 -33
  80. package/src/web/http/followMediaRedirect.test.ts +289 -0
  81. package/src/web/http/followMediaRedirect.ts +253 -0
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import { playbackErrorKind } from '../playbackErrorKind';
4
+ import { LoadAttempt } from './LoadAttempt';
4
5
  import { nextPlaybackState } from './PlaybackStateMachine';
5
6
  import { SetupNotCalledError } from './SetupNotCalledError';
6
7
  import { State } from './State';
@@ -9,6 +10,15 @@ import { State } from './State';
9
10
 
10
11
  // Shaka event type definitions
11
12
 
13
+ /** Per-load overrides that don't belong on the track itself. */
14
+
15
+ /** The mutable request Shaka hands to a networking-engine request filter. */
16
+
17
+ /**
18
+ * `shaka.util.Error.Code.LOAD_INTERRUPTED`. Inlined because shaka is imported
19
+ * for types only here, as the codes in `playbackErrorKind.ts` are.
20
+ */
21
+ const LOAD_INTERRUPTED = 7000;
12
22
  export class Player {
13
23
  hasInitialized = false;
14
24
  _current = undefined;
@@ -18,6 +28,13 @@ export class Player {
18
28
  };
19
29
  _isStopped = false;
20
30
  _loadInProgress = false;
31
+
32
+ /**
33
+ * Headers for the track currently loaded, applied by the request filter
34
+ * installed in `setupPlayer`. On the instance rather than per request so the
35
+ * manifest, its segments and any key requests all carry them.
36
+ */
37
+
21
38
  // current getter/setter
22
39
  get current() {
23
40
  return this._current;
@@ -91,6 +108,18 @@ export class Player {
91
108
  await player.attach(element);
92
109
  this.player = player;
93
110
 
111
+ // Apply the media config's headers to Shaka's requests, as native does to
112
+ // the AVURLAsset / ExoPlayer DataSpec. Without this they resolve and are
113
+ // then dropped, and authenticated media 401s on web alone.
114
+ player.getNetworkingEngine()?.registerRequestFilter((_type, request) => {
115
+ const headers = this.mediaHeaders;
116
+ if (!headers) return;
117
+ request.headers = {
118
+ ...request.headers,
119
+ ...headers
120
+ };
121
+ });
122
+
94
123
  // Listen for relevant events
95
124
  player.addEventListener('error', event => {
96
125
  const errorEvent = event;
@@ -102,22 +131,39 @@ export class Player {
102
131
  element.addEventListener('playing', () => this.dispatch({
103
132
  type: 'playing'
104
133
  }));
105
- element.addEventListener('pause', () => this.dispatch({
106
- type: 'paused',
107
- hasAsset: this.current !== undefined
108
- }));
109
- player.addEventListener('loading', () => this.dispatch({
110
- type: 'trackLoading'
111
- }));
134
+ element.addEventListener('pause', () => {
135
+ // A track playing out fires `pause` and then `ended`. Only the `ended`
136
+ // is meaningful — reporting `paused` first flashes a state Android never
137
+ // reports, mid-queue or at the true end.
138
+ if (element.ended) return;
139
+ this.dispatch({
140
+ type: 'paused',
141
+ hasAsset: this.current !== undefined
142
+ });
143
+ });
144
+ player.addEventListener('loading', () => {
145
+ this.dispatch({
146
+ type: 'trackLoading'
147
+ });
148
+ // Every load passes through `buffering`, as ExoPlayer's always does via
149
+ // STATE_BUFFERING. Shaka only fires its own `buffering` event when a load
150
+ // actually stalls, so a load served from cache would otherwise skip a
151
+ // state native always reports.
152
+ this.dispatch({
153
+ type: 'waiting'
154
+ });
155
+ });
112
156
  player.addEventListener('loaded', () => this.dispatch({
113
- type: 'loadSeekCompleted'
157
+ type: 'loadSeekCompleted',
158
+ playWhenReady: this.playWhenReady
114
159
  }));
115
160
  player.addEventListener('buffering', event => {
116
161
  const bufferingEvent = event;
117
162
  this.dispatch(bufferingEvent.detail.buffering === true ? {
118
163
  type: 'waiting'
119
164
  } : {
120
- type: 'bufferingSufficient'
165
+ type: 'bufferingSufficient',
166
+ playWhenReady: this.playWhenReady
121
167
  });
122
168
  });
123
169
 
@@ -168,6 +214,24 @@ export class Player {
168
214
  };
169
215
  }
170
216
  onError(shakaError) {
217
+ // An interrupted load is not a failure. Shaka raises it when a `load()` is
218
+ // cut short by a newer `load()` or an `unload()` — always something we
219
+ // asked for — and names it accordingly: `createAbortLoadError_()`. Its own
220
+ // code skips its cleanup unload for this code too (player.js:2010).
221
+ //
222
+ // Recognising it here rather than pre-emptively invalidating the load keeps
223
+ // the two independent: any teardown, in any order, can abort a load without
224
+ // the abort reaching a consumer as an error. Eagerly unloading to stop the
225
+ // outgoing track used to flash an error banner on every fast track switch.
226
+ if (shakaError.code === LOAD_INTERRUPTED) {
227
+ console.debug('Load interrupted by a newer load or an unload');
228
+ return;
229
+ }
230
+
231
+ // Before the unload below resets it: a retry resumes from where playback
232
+ // failed, as native does.
233
+ this.rememberResumePosition();
234
+
171
235
  // unload the current track to allow for clean playback on other
172
236
  this.player?.unload().catch(err => {
173
237
  console.error(`Error unloading player on 'onError'`, err);
@@ -191,16 +255,49 @@ export class Player {
191
255
  console.debug('Error code', shakaError.code, 'object', shakaError);
192
256
  }
193
257
 
194
- /** Invalidates the .then/.catch of superseded loads — a Shaka load
195
- * interrupted by stop() or a newer load() rejects, and only the active load
196
- * may surface that (or run its onLoaded side effects). */
197
- _loadGeneration = 0;
198
- load(track, onLoaded) {
258
+ /**
259
+ * The load attempt that owns the player, or none. See {@link LoadAttempt}.
260
+ */
261
+
262
+ /**
263
+ * Starts an attempt, superseding whatever was in flight.
264
+ *
265
+ * Called by the outermost `load()` so supersession is registered when the
266
+ * caller asks for it, not when some inner stage happens to reach it.
267
+ */
268
+ beginLoadAttempt() {
269
+ this._attempt?.cancel();
270
+ const attempt = new LoadAttempt();
271
+ this._attempt = attempt;
272
+ return attempt;
273
+ }
274
+
275
+ /** Abandons the attempt in flight without starting another — `stop()`. */
276
+ cancelLoadAttempt() {
277
+ this._attempt?.cancel();
278
+ this._attempt = undefined;
279
+ }
280
+ load(track, onLoaded, options) {
199
281
  const player = this.requirePlayer();
200
282
  this._isStopped = false;
201
283
  this._loadInProgress = true;
202
- const generation = ++this._loadGeneration;
203
- if (!track.src) {
284
+ const headers = options?.headers;
285
+ this.mediaHeaders = headers && Object.keys(headers).length > 0 ? headers : undefined;
286
+ // What Shaka plays may differ from what the caller queued; `track` is left
287
+ // alone so `current` and `getActiveTrack()` keep the caller's identity for
288
+ // it rather than a transport detail.
289
+ const playbackSrc = options?.src ?? track.src;
290
+ // Current on the attempt, not on success — native derives the active track
291
+ // from the queue, so a failed load is still the active track there and its
292
+ // error has somewhere to show. `getActiveTrackIndex()` already reported the
293
+ // queue's index either way; this makes the pair agree.
294
+ this.current = track;
295
+ // The attempt a subclass began before resolving the URL, so its resolution
296
+ // stage and both continuations below share one token. Passed rather than
297
+ // read off the instance: a direct `load()` is itself the outermost call and
298
+ // must start a fresh attempt, superseding whatever was in flight.
299
+ const attempt = options?.attempt ?? this.beginLoadAttempt();
300
+ if (!playbackSrc) {
204
301
  this._loadInProgress = false;
205
302
  this._pendingSeek = undefined;
206
303
  const error = {
@@ -214,10 +311,9 @@ export class Player {
214
311
  };
215
312
  return;
216
313
  }
217
- player.load(track.src).then(() => {
218
- if (generation !== this._loadGeneration || this._isStopped) return;
314
+ player.load(playbackSrc).then(() => {
315
+ if (!attempt.isCurrent) return;
219
316
  this._loadInProgress = false;
220
- this.current = track;
221
317
  onLoaded?.(track);
222
318
 
223
319
  // Execute any pending seek that arrived during loading
@@ -231,7 +327,7 @@ export class Player {
231
327
  this.play();
232
328
  }
233
329
  }).catch(err => {
234
- if (generation !== this._loadGeneration || this._isStopped) return;
330
+ if (!attempt.isCurrent) return;
235
331
  this._loadInProgress = false;
236
332
  this._pendingSeek = undefined;
237
333
  this.onError(this.toNormalizedError(err));
@@ -240,8 +336,14 @@ export class Player {
240
336
  stop(onComplete) {
241
337
  const player = this.requirePlayer();
242
338
 
339
+ // Whatever was loading no longer owns the player: its continuations, at
340
+ // either boundary, must not revive it.
341
+ this.cancelLoadAttempt();
342
+
243
343
  // Match Android: stop sets playWhenReady=false and state=stopped,
244
- // but keeps the current track so play() can resume.
344
+ // but keeps the current track so play() can resume — from where it
345
+ // stopped, which ExoPlayer preserves across its own stop/prepare pair.
346
+ this.rememberResumePosition();
245
347
  this._isStopped = true;
246
348
  this._loadInProgress = false;
247
349
  this._pendingSeek = undefined;
@@ -254,34 +356,125 @@ export class Player {
254
356
  onComplete?.(); // Still call onComplete so callers aren't left hanging
255
357
  });
256
358
  }
359
+
360
+ /**
361
+ * Where playback was when it failed or was stopped, so a re-prepare can
362
+ * resume rather than restart.
363
+ *
364
+ * Kept against the track it belongs to rather than as a bare number, so it
365
+ * self-invalidates when a different track becomes current and cannot be
366
+ * applied to the wrong one.
367
+ */
368
+
369
+ /**
370
+ * Records the current position, when there is one worth recording.
371
+ *
372
+ * A zero is never recorded: `onError` runs for a *load* failure too, where
373
+ * the element has just been torn down and reads 0, and overwriting a good
374
+ * position with that made a failed retry lose the place a successful one
375
+ * would have resumed from.
376
+ */
377
+ rememberResumePosition() {
378
+ const position = this.element?.currentTime;
379
+ const track = this.current;
380
+ if (!track || typeof position !== 'number' || position <= 0) return;
381
+ this._resume = {
382
+ track,
383
+ position
384
+ };
385
+ }
386
+
387
+ /**
388
+ * Android's `prepare()`, which both `play()` and `retry()` call.
389
+ *
390
+ * It early-returns unless ExoPlayer is STATE_IDLE, so it reconnects after an
391
+ * error or a stop and never re-buffers a healthy stream; `error`/`_isStopped`
392
+ * is web's equivalent of idle. Re-preparing re-resolves the URL, which is the
393
+ * whole point — a signed URL or token may have expired since the failure, and
394
+ * replaying the cached one just fails again. iOS says the same thing in its
395
+ * own `retry()`: "Re-resolve rather than replay the cached URL".
396
+ *
397
+ * Returns whether it handled the call, so `play()` knows not to also poke the
398
+ * element.
399
+ */
400
+ reprepare() {
401
+ if (!this.current) return false;
402
+ if (this.state.state !== State.Error && !this._isStopped) return false;
403
+
404
+ // Not for live: `currentTime` there is elapsed time on a connection that no
405
+ // longer exists, and a fresh connection already *is* the live edge. Seeking
406
+ // to the old value asks for a point the new stream does not have. The
407
+ // track's own `live` declaration is the gate, as it is in `seekToLiveEdge`
408
+ // and on both native platforms.
409
+ const remembered = this._resume?.track === this.current ? this._resume.position : undefined;
410
+ const resume = this.current.live === true ? undefined : remembered;
411
+ this.reloadCurrent(resume);
412
+ return true;
413
+ }
257
414
  play() {
258
415
  const element = this.requireElement();
259
416
  this.playWhenReady = true;
260
- if (this.state.state === State.Error && this.current) {
261
- this.reloadCurrent();
262
- return;
263
- }
264
417
 
265
- // Match Android: play() after stop() re-prepares the current track
266
- if (this._isStopped && this.current) {
267
- this.reloadCurrent();
268
- return;
269
- }
270
- element.play().catch(err => console.error(err));
418
+ // Matches Android's play(): set the intent, then prepare — which does
419
+ // something only when idle, i.e. after an error or a stop.
420
+ if (this.reprepare()) return;
421
+ element.play().catch(err => this.onPlayRejected(err));
422
+ }
423
+
424
+ /**
425
+ * A rejected `element.play()`. Web-only: neither native platform can refuse
426
+ * a play intent, so there is no parity target here.
427
+ *
428
+ * `AbortError` means a newer load interrupted this one — that load owns the
429
+ * state and the intent stands. Anything else, autoplay policy above all, is
430
+ * the browser refusing: the intent cannot be honoured, so it is cleared and
431
+ * the state settles rather than stranding on `loading`/`buffering`, which is
432
+ * where suppressing `ready` under `playWhenReady` would otherwise leave it.
433
+ */
434
+ onPlayRejected(err) {
435
+ console.error(err);
436
+ const name = typeof err === 'object' && err !== null && 'name' in err ? err.name : undefined;
437
+ if (name === 'AbortError') return;
438
+ this.playWhenReady = false;
439
+ this.dispatch({
440
+ type: 'paused',
441
+ hasAsset: this.current !== undefined
442
+ });
271
443
  }
272
444
 
273
445
  /**
274
- * Reloads the current track. `current` holds the *resolved* track, so
275
- * subclasses that resolve media URLs override this to reload from the
276
- * original source instead — re-feeding `current` into `load()` would
277
- * re-resolve an already-resolved URL and leak it into the queue.
446
+ * The track a reload re-feeds. `current` holds it as the caller queued it —
447
+ * `load()` takes the resolved URL separately, via `LoadOptions.src` — so
448
+ * re-feeding it is safe.
449
+ *
450
+ * The overridable part of {@link reloadCurrent}, rather than the whole
451
+ * method: a subclass backed by a queue changes only where the track comes
452
+ * from, and the reload itself stays in one place.
278
453
  */
279
- reloadCurrent() {
280
- if (this.current) this.load(this.current);
454
+ trackToReload() {
455
+ return this.current;
456
+ }
457
+
458
+ /** Reloads the track {@link trackToReload} names, resuming if asked to. */
459
+ reloadCurrent(resumePosition) {
460
+ const track = this.trackToReload();
461
+ if (!track) return;
462
+ this.load(track, resumePosition === undefined ? undefined : () => this.seekTo(resumePosition));
281
463
  }
464
+
465
+ /**
466
+ * Android's `retry()` is `player.prepare()` — the same call `play()` makes,
467
+ * without setting the intent. So this is `play()` minus the intent.
468
+ *
469
+ * It is emphatically not `shaka.Player.retryStreaming()`, which this used to
470
+ * call: that returns false and does nothing at all unless the load mode is
471
+ * MEDIA_SOURCE, so for a progressive file — the case a signed URL is for — it
472
+ * was a silent no-op, while the `play()` the same docs offer as the
473
+ * alternative recovered properly.
474
+ */
282
475
  retry() {
283
- const player = this.requirePlayer();
284
- player.retryStreaming();
476
+ this.requirePlayer();
477
+ this.reprepare();
285
478
  }
286
479
  pause() {
287
480
  const element = this.requireElement();
@@ -1 +1 @@
1
- {"version":3,"names":["playbackErrorKind","nextPlaybackState","SetupNotCalledError","State","Player","hasInitialized","_current","undefined","_playWhenReady","_state","state","None","_isStopped","_loadInProgress","current","cur","newState","playWhenReady","pwr","requireElement","element","requirePlayer","player","setupPlayer","_options","window","shaka","default","polyfill","installAll","isBrowserSupported","Error","error","kind","code","message","document","createElement","setAttribute","body","appendChild","attach","addEventListener","event","errorEvent","onError","detail","dispatch","type","hasAsset","bufferingEvent","buffering","__DEV__","rnab","next","applyState","toNormalizedError","err","e","data","String","shakaError","unload","catch","console","status","httpStatus","navigator","onLine","toString","statusCode","debug","_loadGeneration","load","track","onLoaded","generation","src","_pendingSeek","then","currentTime","play","stop","onComplete","Stopped","reloadCurrent","retry","retryStreaming","pause","togglePlayback","setRate","rate","defaultPlaybackRate","playbackRate","getRate","seekBy","offset","seekTo","seconds","seekToLiveEdge","live","seekable","end","length","setVolume","volume","getVolume","getProgress","buffered","position","duration"],"sourceRoot":"../../../../src","sources":["web/TrackPlayer/Player.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["playbackErrorKind","LoadAttempt","nextPlaybackState","SetupNotCalledError","State","LOAD_INTERRUPTED","Player","hasInitialized","_current","undefined","_playWhenReady","_state","state","None","_isStopped","_loadInProgress","current","cur","newState","playWhenReady","pwr","requireElement","element","requirePlayer","player","setupPlayer","_options","window","shaka","default","polyfill","installAll","isBrowserSupported","Error","error","kind","code","message","document","createElement","setAttribute","body","appendChild","attach","getNetworkingEngine","registerRequestFilter","_type","request","headers","mediaHeaders","addEventListener","event","errorEvent","onError","detail","dispatch","type","ended","hasAsset","bufferingEvent","buffering","__DEV__","rnab","next","applyState","toNormalizedError","err","e","data","String","shakaError","console","debug","rememberResumePosition","unload","catch","status","httpStatus","navigator","onLine","toString","statusCode","beginLoadAttempt","_attempt","cancel","attempt","cancelLoadAttempt","load","track","onLoaded","options","Object","keys","length","playbackSrc","src","_pendingSeek","then","isCurrent","currentTime","play","stop","onComplete","Stopped","position","_resume","reprepare","remembered","resume","live","reloadCurrent","onPlayRejected","name","trackToReload","resumePosition","seekTo","retry","pause","togglePlayback","setRate","rate","defaultPlaybackRate","playbackRate","getRate","seekBy","offset","seconds","seekToLiveEdge","seekable","end","setVolume","volume","getVolume","getProgress","buffered","duration"],"sourceRoot":"../../../../src","sources":["web/TrackPlayer/Player.ts"],"mappings":"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","ignoreList":[]}
@@ -18,35 +18,56 @@ export class QueuePlayer extends Player {
18
18
  // was a silent pause) and armed load()'s auto-play with phantom intent.
19
19
  // Cleared before the state lands so consumers observe the native order
20
20
  // (intent → state → queueEnded), independent of onQueueEnded overrides.
21
- // Per-track ends that advance the queue keep the intent.
22
- if (state === State.Ended && this.endsQueue()) {
23
- this.playWhenReady = false;
21
+ if (state !== State.Ended) {
22
+ super.applyState(state);
23
+ return;
24
24
  }
25
- super.applyState(state);
26
25
 
27
- // dispatch() already gates on _isStopped before reaching applyState, so a
28
- // natural end while stopped never advances the queue.
29
- if (state === State.Ended) {
26
+ // A track ending mid-queue is not an `ended` playback state: ExoPlayer
27
+ // reaches STATE_ENDED only at the end of the *playlist*, and an advance
28
+ // between items stays READY/BUFFERING. Web loads one track at a time, so
29
+ // the element's own `ended` arrives every time — reporting it flashed a
30
+ // terminal state, and dropped `PlayingState.playing` to false, between
31
+ // every pair of tracks. Repeat-one counts as mid-queue for the same
32
+ // reason: native reports nothing there either.
33
+ if (this.endsQueue()) {
34
+ // The real end: the intent goes with it, and the state is genuinely ended.
35
+ this.playWhenReady = false;
36
+ super.applyState(state);
37
+ // dispatch() already gates on _isStopped before reaching applyState, so a
38
+ // natural end while stopped never advances the queue.
30
39
  this.onTrackEnded();
40
+ return;
31
41
  }
42
+
43
+ // Suppressing `ended` is only safe when something takes over the state. A
44
+ // handler that declines to advance — the sleep timer set to end-of-track —
45
+ // leaves nothing to move it, and the player would sit reporting `playing`
46
+ // with nothing playing. Report the end in that case, as before.
47
+ if (!this.onTrackEnded()) super.applyState(state);
32
48
  }
33
49
 
34
50
  /** True when a natural end has nowhere to go: not repeating, no next track. */
35
51
  endsQueue() {
36
52
  return this.queue.repeatMode !== RepeatMode.Track && this.queue.repeatMode !== RepeatMode.Queue && this.queue.nextIndex() === undefined;
37
53
  }
54
+
55
+ /**
56
+ * @returns whether it started another load, and so owns the playback state
57
+ * from here. `false` means the caller still has to report the end itself.
58
+ */
38
59
  onTrackEnded() {
39
60
  if (this.queue.repeatMode === RepeatMode.Track) {
40
- if (this.queue.currentIndex !== undefined) {
41
- this.goToIndex(this.queue.currentIndex);
42
- }
43
- return;
61
+ if (this.queue.currentIndex === undefined) return false;
62
+ this.goToIndex(this.queue.currentIndex);
63
+ return true;
44
64
  }
45
65
  if (this.endsQueue()) {
46
66
  this.onQueueEnded();
47
- return;
67
+ return false;
48
68
  }
49
69
  this.skipToNext();
70
+ return true;
50
71
  }
51
72
 
52
73
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["Player","QueueManager","RepeatMode","State","QueuePlayer","queue","applyState","state","Ended","endsQueue","playWhenReady","onTrackEnded","repeatMode","Track","Queue","nextIndex","undefined","currentIndex","goToIndex","onQueueEnded","skipToNext","index","initialPosition","track","getTrack","onLoaded","_track","seekTo","load","_isStopped","play","add","tracks","insertBeforeIndex","insert","skip","Error","wrapAroundFirstIndex","skipToPrevious","previousIndex","wrapAroundLastIndex","setShuffleEnabled","enabled","getShuffleEnabled","shuffleEnabled","setRepeatMode","mode","getRepeatMode","remove","indexes","outcome","kind","current","stop","onComplete","reset","clear","removeUpcomingTracks","removeUpcoming","move","fromIndex","toIndex"],"sourceRoot":"../../../../src","sources":["web/TrackPlayer/QueuePlayer.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Player","QueueManager","RepeatMode","State","QueuePlayer","queue","applyState","state","Ended","endsQueue","playWhenReady","onTrackEnded","repeatMode","Track","Queue","nextIndex","undefined","currentIndex","goToIndex","onQueueEnded","skipToNext","index","initialPosition","track","getTrack","onLoaded","_track","seekTo","load","_isStopped","play","add","tracks","insertBeforeIndex","insert","skip","Error","wrapAroundFirstIndex","skipToPrevious","previousIndex","wrapAroundLastIndex","setShuffleEnabled","enabled","getShuffleEnabled","shuffleEnabled","setRepeatMode","mode","getRepeatMode","remove","indexes","outcome","kind","current","stop","onComplete","reset","clear","removeUpcomingTracks","removeUpcoming","move","fromIndex","toIndex"],"sourceRoot":"../../../../src","sources":["web/TrackPlayer/QueuePlayer.ts"],"mappings":";;AAKA,SAASA,MAAM,QAAQ,UAAU;AACjC,SAASC,YAAY,QAAQ,gBAAgB;AAC7C,SAASC,UAAU,QAAQ,cAAc;AACzC,SAASC,KAAK,QAAQ,SAAS;;AAE/B;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,WAAW,SAASJ,MAAM,CAAC;EAC5BK,KAAK,GAAG,IAAIJ,YAAY,CAAC,CAAC;EAE1BK,UAAUA,CAACC,KAAoB,EAAE;IACzC;IACA;IACA;IACA;IACA;IACA,IAAIA,KAAK,KAAKJ,KAAK,CAACK,KAAK,EAAE;MACzB,KAAK,CAACF,UAAU,CAACC,KAAK,CAAC;MACvB;IACF;;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,IAAI,IAAI,CAACE,SAAS,CAAC,CAAC,EAAE;MACpB;MACA,IAAI,CAACC,aAAa,GAAG,KAAK;MAC1B,KAAK,CAACJ,UAAU,CAACC,KAAK,CAAC;MACvB;MACA;MACA,IAAI,CAACI,YAAY,CAAC,CAAC;MACnB;IACF;;IAEA;IACA;IACA;IACA;IACA,IAAI,CAAC,IAAI,CAACA,YAAY,CAAC,CAAC,EAAE,KAAK,CAACL,UAAU,CAACC,KAAK,CAAC;EACnD;;EAEA;EACQE,SAASA,CAAA,EAAY;IAC3B,OACE,IAAI,CAACJ,KAAK,CAACO,UAAU,KAAKV,UAAU,CAACW,KAAK,IAC1C,IAAI,CAACR,KAAK,CAACO,UAAU,KAAKV,UAAU,CAACY,KAAK,IAC1C,IAAI,CAACT,KAAK,CAACU,SAAS,CAAC,CAAC,KAAKC,SAAS;EAExC;;EAEA;AACF;AACA;AACA;EACYL,YAAYA,CAAA,EAAY;IAChC,IAAI,IAAI,CAACN,KAAK,CAACO,UAAU,KAAKV,UAAU,CAACW,KAAK,EAAE;MAC9C,IAAI,IAAI,CAACR,KAAK,CAACY,YAAY,KAAKD,SAAS,EAAE,OAAO,KAAK;MACvD,IAAI,CAACE,SAAS,CAAC,IAAI,CAACb,KAAK,CAACY,YAAY,CAAC;MACvC,OAAO,IAAI;IACb;IACA,IAAI,IAAI,CAACR,SAAS,CAAC,CAAC,EAAE;MACpB,IAAI,CAACU,YAAY,CAAC,CAAC;MACnB,OAAO,KAAK;IACd;IACA,IAAI,CAACC,UAAU,CAAC,CAAC;IACjB,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;EACYD,YAAYA,CAAA,EAAG,CAAC;EAEhBD,SAASA,CAACG,KAAa,EAAEC,eAAwB,EAAE;IAC3D,MAAMC,KAAK,GAAG,IAAI,CAAClB,KAAK,CAACmB,QAAQ,CAACH,KAAK,CAAC;IAExC,IAAI,CAACE,KAAK,EAAE;;IAEZ;IACA,MAAME,QAAQ,GAAIC,MAAa,IAAK;MAClC,IAAIJ,eAAe,KAAKN,SAAS,EAAE;QACjC,IAAI,CAACW,MAAM,CAACL,eAAe,CAAC;MAC9B;IACF,CAAC;IAED,IAAI,IAAI,CAACjB,KAAK,CAACY,YAAY,KAAKI,KAAK,EAAE;MACrC,IAAI,CAAChB,KAAK,CAACY,YAAY,GAAGI,KAAK;MAC/B,IAAI,CAACO,IAAI,CAACL,KAAK,EAAEE,QAAQ,CAAC;IAC5B,CAAC,MAAM,IAAI,IAAI,CAACI,UAAU,EAAE;MAC1B;MACA,IAAI,CAACD,IAAI,CAACL,KAAK,EAAEE,QAAQ,CAAC;IAC5B,CAAC,MAAM;MACL;MACA,IAAI,CAACE,MAAM,CAACL,eAAe,IAAI,CAAC,CAAC;MACjC,IAAI,IAAI,CAACZ,aAAa,EAAE;QACtB,IAAI,CAACoB,IAAI,CAAC,CAAC;MACb;IACF;EACF;EAEOC,GAAGA,CAACC,MAAe,EAAEC,iBAA0B,EAAQ;IAC5D,IAAI,CAAC5B,KAAK,CAAC6B,MAAM,CAACF,MAAM,EAAEC,iBAAiB,CAAC;IAE5C,IAAI,IAAI,CAAC5B,KAAK,CAACY,YAAY,KAAKD,SAAS,EAAE;MACzC,IAAI,CAACE,SAAS,CAAC,CAAC,CAAC;IACnB;EACF;EAEOiB,IAAIA,CAACd,KAAa,EAAEC,eAAwB,EAAQ;IACzD,IAAI,IAAI,CAACjB,KAAK,CAACmB,QAAQ,CAACH,KAAK,CAAC,KAAKL,SAAS,EAAE;MAC5C,MAAM,IAAIoB,KAAK,CAAC,qBAAqB,CAAC;IACxC;IAEA,IAAI,CAAClB,SAAS,CAACG,KAAK,EAAEC,eAAe,CAAC;EACxC;EAEOF,UAAUA,CAACE,eAAwB,EAAQ;IAChD,IAAI,IAAI,CAACjB,KAAK,CAACY,YAAY,KAAKD,SAAS,EAAE;IAE3C,MAAMD,SAAS,GACb,IAAI,CAACV,KAAK,CAACU,SAAS,CAAC,CAAC,IAAI,IAAI,CAACV,KAAK,CAACgC,oBAAoB,CAAC,CAAC;IAC7D,IAAItB,SAAS,KAAKC,SAAS,EAAE;IAE7B,IAAI,CAACE,SAAS,CAACH,SAAS,EAAEO,eAAe,CAAC;EAC5C;EAEOgB,cAAcA,CAAChB,eAAwB,EAAQ;IACpD,IAAI,IAAI,CAACjB,KAAK,CAACY,YAAY,KAAKD,SAAS,EAAE;IAE3C,MAAMuB,aAAa,GACjB,IAAI,CAAClC,KAAK,CAACkC,aAAa,CAAC,CAAC,IAAI,IAAI,CAAClC,KAAK,CAACmC,mBAAmB,CAAC,CAAC;IAChE,IAAID,aAAa,KAAKvB,SAAS,EAAE;IAEjC,IAAI,CAACE,SAAS,CAACqB,aAAa,EAAEjB,eAAe,CAAC;EAChD;EAEOmB,iBAAiBA,CAACC,OAAgB,EAAQ;IAC/C,IAAI,CAACrC,KAAK,CAACoC,iBAAiB,CAACC,OAAO,CAAC;EACvC;EAEOC,iBAAiBA,CAAA,EAAY;IAClC,OAAO,IAAI,CAACtC,KAAK,CAACuC,cAAc;EAClC;EAEOpB,QAAQA,CAACH,KAAa,EAAqB;IAChD,OAAO,IAAI,CAAChB,KAAK,CAACmB,QAAQ,CAACH,KAAK,CAAC;EACnC;EAEOwB,aAAaA,CAACC,IAAoB,EAAQ;IAC/C,IAAI,CAACzC,KAAK,CAACO,UAAU,GAAGkC,IAAI;EAC9B;EAEOC,aAAaA,CAAA,EAAmB;IACrC,OAAO,IAAI,CAAC1C,KAAK,CAACO,UAAU;EAC9B;EAEOoC,MAAMA,CAACC,OAAiB,EAAQ;IACrC,MAAMC,OAAO,GAAG,IAAI,CAAC7C,KAAK,CAAC2C,MAAM,CAACC,OAAO,CAAC;IAC1C,QAAQC,OAAO,CAACC,IAAI;MAClB,KAAK,YAAY;MACjB,KAAK,MAAM;QACT;MACF,KAAK,QAAQ;QACX,IAAI,CAACjC,SAAS,CAACgC,OAAO,CAAC7B,KAAK,CAAC;QAC7B;MACF,KAAK,SAAS;QACZ,IAAI,CAAC+B,OAAO,GAAGpC,SAAS;QACxB,IAAI,CAACqC,IAAI,CAAC,CAAC;QACX;IACJ;EACF;EAEOA,IAAIA,CAACC,UAAuB,EAAQ;IACzC,KAAK,CAACD,IAAI,CAACC,UAAU,CAAC;EACxB;EAEOC,KAAKA,CAAA,EAAS;IACnB;IACA;IACA;IACA,IAAI,CAAClD,KAAK,CAACmD,KAAK,CAAC,CAAC;IAClB,IAAI,CAACJ,OAAO,GAAGpC,SAAS;IACxB,IAAI,CAACqC,IAAI,CAAC,CAAC;EACb;EAEOI,oBAAoBA,CAAA,EAAS;IAClC,IAAI,CAACpD,KAAK,CAACqD,cAAc,CAAC,CAAC;EAC7B;EAEOC,IAAIA,CAACC,SAAiB,EAAEC,OAAe,EAAQ;IACpD,IAAI,CAACxD,KAAK,CAACsD,IAAI,CAACC,SAAS,EAAEC,OAAO,CAAC;EACrC;AACF","ignoreList":[]}
@@ -294,6 +294,9 @@ export class BrowserManager {
294
294
  * results (no contextual URLs), like the native `makeSearchResult`.
295
295
  * Matches Android's BrowserManager.search() which bypasses resolve() entirely.
296
296
  *
297
+ * A failed search propagates, so `navigate` turns it into a navigation error
298
+ * the way it does a failed browse resolve.
299
+ *
297
300
  * @param searchPath The search path (format: /__search?q=query)
298
301
  * @returns ResolvedTrack containing search results as one untitled section
299
302
  */
@@ -323,14 +326,9 @@ export class BrowserManager {
323
326
  }
324
327
  // Handle request config-based search via the shared layered fetch.
325
328
  else if (searchRoute.searchConfig) {
326
- try {
327
- searchResults = await this.fetchSearchResults(searchRoute.searchConfig, {
328
- q: query
329
- });
330
- } catch (error) {
331
- console.error('Search failed:', error);
332
- return undefined;
333
- }
329
+ searchResults = await this.fetchSearchResults(searchRoute.searchConfig, {
330
+ q: query
331
+ });
334
332
  }
335
333
 
336
334
  // Search callbacks should return fresh tracks without contextual paths (like Android)
@@ -347,10 +345,13 @@ export class BrowserManager {
347
345
  * Matches Android's artwork URL transformation with full Track access.
348
346
  */
349
347
  async transformArtworkForContent(content) {
348
+ // No short-circuit on a missing artwork config: Android gates per *track*
349
+ // (`artworkConfig == null && track.artwork == null`), so a track carrying a
350
+ // plain `artwork` URL still gets an `artworkSource`. Returning early here
351
+ // meant an app with no `artwork` block never populated the field at all —
352
+ // `resolveArtworkSourceAsync` already handles the no-config case the way
353
+ // `resolveArtworkUrl` does on Android.
350
354
  const artworkConfig = this._configuration.artwork;
351
- if (!artworkConfig) {
352
- return content;
353
- }
354
355
  // The shared request layer applies to artwork too — use the resolved layer
355
356
  // (resolver result or static config) so a resolver-only config still works.
356
357
  await this.ensureLayersResolved();
@@ -430,6 +431,22 @@ export class BrowserManager {
430
431
  return undefined;
431
432
  }
432
433
 
434
+ /**
435
+ * Ensures the request layer is resolved for the current generation and
436
+ * returns it — the resolver's result when a `requestResolver` is configured,
437
+ * else the static `request`.
438
+ *
439
+ * Consumers outside the browse path (media URL building, artwork) must reach
440
+ * the request layer through this rather than reading `configuration.request`,
441
+ * or a resolver-only config silently loses its baseUrl, headers and transform
442
+ * exactly where a credential is needed. Mirrors Android's
443
+ * `BrowserManager.resolvedRequestConfig()`, which carries the same warning.
444
+ */
445
+ async resolvedRequestConfig() {
446
+ await this.ensureLayersResolved();
447
+ return this._resolvedRequest;
448
+ }
449
+
433
450
  /**
434
451
  * Ensures the request/browse layer configs are resolved for the current
435
452
  * generation. Any present resolver is invoked once per generation and the
@@ -578,8 +595,9 @@ export class BrowserManager {
578
595
 
579
596
  // Transform artwork URLs on tabs via the async resolver so the shared
580
597
  // request layer (incl. its transform) applies, matching content/search.
598
+ // Gated per track inside the resolver, as on Android — see
599
+ // `transformArtworkForContent`.
581
600
  const artworkConfig = this._configuration.artwork;
582
- if (!artworkConfig) return tabs;
583
601
  // Resolved request layer (resolver or static), matching content/search.
584
602
  await this.ensureLayersResolved();
585
603
  const requestConfig = this._resolvedRequest;