@rntp/player 5.0.0 → 5.1.1

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 (60) hide show
  1. package/android/src/main/java/com/doublesymmetry/trackplayer/HeaderInjectingDataSourceFactory.kt +5 -1
  2. package/android/src/main/java/com/doublesymmetry/trackplayer/TrackPlayerModule.kt +23 -3
  3. package/android/src/main/java/com/doublesymmetry/trackplayer/models/EmitEventType.kt +22 -0
  4. package/android/src/main/java/com/doublesymmetry/trackplayer/models/MetadataApplier.kt +36 -0
  5. package/android/src/main/java/com/doublesymmetry/trackplayer/models/PlayerConfig.kt +10 -0
  6. package/android/src/main/java/com/doublesymmetry/trackplayer/models/StreamMetadataExtractor.kt +98 -0
  7. package/android/src/main/java/com/doublesymmetry/trackplayer/models/TrackPlayerMediaItem.kt +20 -8
  8. package/android/src/test/java/com/doublesymmetry/trackplayer/models/EmitEventTest.kt +33 -0
  9. package/android/src/test/java/com/doublesymmetry/trackplayer/models/MetadataApplierTest.kt +224 -0
  10. package/android/src/test/java/com/doublesymmetry/trackplayer/models/PlayerConfigTest.kt +33 -0
  11. package/android/src/test/java/com/doublesymmetry/trackplayer/models/StreamMetadataExtractorTest.kt +254 -0
  12. package/android/src/test/java/com/doublesymmetry/trackplayer/models/TrackPlayerMediaItemTest.kt +202 -0
  13. package/ios/TrackPlayer.swift +28 -2
  14. package/ios/models/EmitEvent.swift +28 -0
  15. package/ios/models/MediaItem.swift +8 -3
  16. package/ios/tests/AVPlayerEngineIntegrationTests.swift +7 -4
  17. package/lib/commonjs/audio.js +1 -0
  18. package/lib/commonjs/audio.js.map +1 -1
  19. package/lib/commonjs/events/MediaMetadataChanged.js +2 -0
  20. package/lib/commonjs/events/MediaMetadataChanged.js.map +1 -0
  21. package/lib/commonjs/events/index.js +13 -0
  22. package/lib/commonjs/events/index.js.map +1 -1
  23. package/lib/commonjs/hooks/useActiveMediaItem.js +3 -3
  24. package/lib/commonjs/hooks/useActiveMediaItem.js.map +1 -1
  25. package/lib/commonjs/hooks/useProgress.js.map +1 -1
  26. package/lib/commonjs/interfaces/PlayerConfig.js +1 -0
  27. package/lib/commonjs/interfaces/PlayerConfig.js.map +1 -1
  28. package/lib/module/audio.js +1 -0
  29. package/lib/module/audio.js.map +1 -1
  30. package/lib/module/events/MediaMetadataChanged.js +2 -0
  31. package/lib/module/events/MediaMetadataChanged.js.map +1 -0
  32. package/lib/module/events/index.js +2 -0
  33. package/lib/module/events/index.js.map +1 -1
  34. package/lib/module/hooks/useActiveMediaItem.js +3 -3
  35. package/lib/module/hooks/useActiveMediaItem.js.map +1 -1
  36. package/lib/module/hooks/useProgress.js.map +1 -1
  37. package/lib/module/interfaces/PlayerConfig.js +1 -0
  38. package/lib/module/interfaces/PlayerConfig.js.map +1 -1
  39. package/lib/typescript/src/audio.d.ts.map +1 -1
  40. package/lib/typescript/src/events/MediaMetadataChanged.d.ts +18 -0
  41. package/lib/typescript/src/events/MediaMetadataChanged.d.ts.map +1 -0
  42. package/lib/typescript/src/events/MetadataReceived.d.ts +15 -0
  43. package/lib/typescript/src/events/MetadataReceived.d.ts.map +1 -1
  44. package/lib/typescript/src/events/index.d.ts +4 -0
  45. package/lib/typescript/src/events/index.d.ts.map +1 -1
  46. package/lib/typescript/src/hooks/useActiveMediaItem.d.ts +2 -2
  47. package/lib/typescript/src/hooks/useProgress.d.ts.map +1 -1
  48. package/lib/typescript/src/interfaces/MediaItem.d.ts +15 -0
  49. package/lib/typescript/src/interfaces/MediaItem.d.ts.map +1 -1
  50. package/lib/typescript/src/interfaces/PlayerConfig.d.ts +8 -0
  51. package/lib/typescript/src/interfaces/PlayerConfig.d.ts.map +1 -1
  52. package/package.json +1 -1
  53. package/src/audio.ts +3 -0
  54. package/src/events/MediaMetadataChanged.ts +18 -0
  55. package/src/events/MetadataReceived.ts +15 -0
  56. package/src/events/index.ts +4 -0
  57. package/src/hooks/useActiveMediaItem.ts +3 -3
  58. package/src/hooks/useProgress.ts +1 -1
  59. package/src/interfaces/MediaItem.ts +15 -0
  60. package/src/interfaces/PlayerConfig.ts +9 -0
package/src/audio.ts CHANGED
@@ -107,6 +107,9 @@ function normalizePlayerConfig(options: PlayerConfig) {
107
107
  handleAudioBecomingNoisy:
108
108
  options.handleAudioBecomingNoisy ??
109
109
  DEFAULT_PLAYER_CONFIG.handleAudioBecomingNoisy,
110
+ autoUpdateMetadataFromStream:
111
+ options.autoUpdateMetadataFromStream ??
112
+ DEFAULT_PLAYER_CONFIG.autoUpdateMetadataFromStream,
110
113
  ...(cache ? { cache } : {}),
111
114
  ...(options.progressSync ? { progressSync: options.progressSync } : {}),
112
115
  android,
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Copyright (c) Double Symmetry GmbH
3
+ * Commercial use requires a license. See https://rntp.dev/pricing
4
+ */
5
+
6
+ /**
7
+ * Effective metadata for the active item ({@link getActiveMediaItem}, Now Playing).
8
+ * Use {@link MetadataReceivedEvent} for raw per-frame stream metadata instead.
9
+ *
10
+ * @since 5.1.0
11
+ */
12
+ export interface MediaMetadataChangedEvent {
13
+ title?: string;
14
+ artist?: string;
15
+ albumTitle?: string;
16
+ artworkUrl?: string;
17
+ genre?: string;
18
+ }
@@ -3,6 +3,21 @@
3
3
  * Commercial use requires a license. See https://rntp.dev/pricing
4
4
  */
5
5
 
6
+ /**
7
+ * Fired for every metadata frame the audio stream pushes — ICY blocks
8
+ * (Shoutcast/Icecast radio), ID3 tags, Vorbis comments, QuickTime metadata.
9
+ * The payload reflects *stream-derived* fields only; user-supplied fields on
10
+ * the queued MediaItem (e.g. a static `genre` or `albumTitle`) are not
11
+ * merged in here.
12
+ *
13
+ * For the effective merged view that `getActiveMediaItem` returns (and that
14
+ * the lock screen / system Now Playing info reflects), subscribe to
15
+ * {@link MediaMetadataChangedEvent} instead.
16
+ *
17
+ * Typical consumers: analytics / scrobbling, sanitization pipelines that
18
+ * filter the raw stream before calling {@link updateMetadata} themselves
19
+ * (use with `PlayerConfig.autoUpdateMetadataFromStream: false`).
20
+ */
6
21
  export interface MetadataReceivedEvent {
7
22
  title?: string;
8
23
  artist?: string;
@@ -6,6 +6,7 @@
6
6
  import type { PlaybackStateChangedEvent } from './PlaybackStateChanged';
7
7
  import type { IsPlayingChangedEvent } from './IsPlayingChanged';
8
8
  import type { MediaItemTransitionEvent } from './MediaItemTransition';
9
+ import type { MediaMetadataChangedEvent } from './MediaMetadataChanged';
9
10
  import type { MetadataReceivedEvent } from './MetadataReceived';
10
11
  import type {
11
12
  RemotePlayEvent,
@@ -26,6 +27,7 @@ export enum Event {
26
27
  PlaybackStateChanged = 'event.playback-state-changed',
27
28
  IsPlayingChanged = 'event.is-playing-changed',
28
29
  MediaItemTransition = 'event.media-item-transition',
30
+ MediaMetadataChanged = 'event.media-metadata-changed',
29
31
  MetadataReceived = 'event.metadata-received',
30
32
  PlaybackError = 'event.playback-error',
31
33
  PlaybackProgressUpdated = 'event.playback-progress-updated',
@@ -45,6 +47,7 @@ export type EventPayloadByEvent = {
45
47
  [Event.PlaybackStateChanged]: PlaybackStateChangedEvent;
46
48
  [Event.IsPlayingChanged]: IsPlayingChangedEvent;
47
49
  [Event.MediaItemTransition]: MediaItemTransitionEvent;
50
+ [Event.MediaMetadataChanged]: MediaMetadataChangedEvent;
48
51
  [Event.MetadataReceived]: MetadataReceivedEvent;
49
52
  [Event.PlaybackError]: PlaybackErrorEvent;
50
53
  [Event.PlaybackProgressUpdated]: PlaybackProgressUpdatedEvent;
@@ -75,6 +78,7 @@ export type BackgroundEvent =
75
78
  export * from './PlaybackStateChanged';
76
79
  export * from './IsPlayingChanged';
77
80
  export * from './MediaItemTransition';
81
+ export * from './MediaMetadataChanged';
78
82
  export * from './MetadataReceived';
79
83
  export * from './RemoteControl';
80
84
  export * from './PlaybackError';
@@ -9,8 +9,8 @@ import { Event } from '../events';
9
9
  import type { MediaItem } from '../interfaces';
10
10
 
11
11
  /**
12
- * Returns the currently active media item, updating on item transitions
13
- * and when stream metadata changes (e.g. ICY tags from live radio).
12
+ * Active media item; refreshes on {@link Event.MediaItemTransition} and
13
+ * {@link Event.MediaMetadataChanged} (after native merges stream metadata).
14
14
  */
15
15
  export function useActiveMediaItem(): MediaItem | null {
16
16
  const [item, setItem] = useState<MediaItem | null>(() =>
@@ -25,7 +25,7 @@ export function useActiveMediaItem(): MediaItem | null {
25
25
  }
26
26
  );
27
27
  const metadataSub = TrackPlayer.addEventListener(
28
- Event.MetadataReceived,
28
+ Event.MediaMetadataChanged,
29
29
  () => {
30
30
  setItem(TrackPlayer.getActiveMediaItem());
31
31
  }
@@ -11,7 +11,7 @@ import type { Progress } from '../interfaces';
11
11
  * Returns the current playback progress, polling at the given interval.
12
12
  * @param updateInterval Polling interval in seconds (default: 1)
13
13
  */
14
- export function useProgress(updateInterval = 1): Progress {
14
+ export function useProgress(updateInterval: number = 1): Progress {
15
15
  const [progress, setProgress] = useState<Progress>(() =>
16
16
  TrackPlayer.getProgress()
17
17
  );
@@ -47,4 +47,19 @@ export interface MediaItem {
47
47
  * receiver can identify the format — without it the track will be skipped.
48
48
  */
49
49
  mimeType?: string;
50
+ /**
51
+ * App-defined payload attached to this media item. Opaque to the player —
52
+ * stored verbatim and returned unchanged by {@link getActiveMediaItem},
53
+ * {@link getQueue}, and the {@link Event.MediaItemTransition} event.
54
+ *
55
+ * Use this for app-specific metadata that should travel with the item
56
+ * (e.g. recommendation source, ISRC, internal IDs) without polluting the
57
+ * typed fields.
58
+ *
59
+ * Must be JSON-serializable. Keep payloads small — large blobs are better
60
+ * kept in your own JS state, keyed by {@link mediaId}.
61
+ *
62
+ * @since 5.1.0
63
+ */
64
+ extras?: Record<string, unknown>;
50
65
  }
@@ -85,6 +85,7 @@ export const DEFAULT_PLAYER_CONFIG: Required<
85
85
  } = {
86
86
  contentType: 'music',
87
87
  handleAudioBecomingNoisy: true,
88
+ autoUpdateMetadataFromStream: true,
88
89
  android: DEFAULT_ANDROID_PLAYER_CONFIG,
89
90
  };
90
91
 
@@ -134,6 +135,14 @@ export interface PlayerConfig {
134
135
  * (e.g. headphones disconnected). Defaults to true.
135
136
  */
136
137
  handleAudioBecomingNoisy?: boolean;
138
+ /**
139
+ * When `true` (default), ICY/ID3 metadata updates the queued MediaItem and Now Playing.
140
+ * When `false`, only {@link Event.MetadataReceived} is emitted; call {@link updateMetadata} yourself.
141
+ *
142
+ * @default true
143
+ * @since 5.1.0
144
+ */
145
+ autoUpdateMetadataFromStream?: boolean;
137
146
  /**
138
147
  * Enable disk caching and preloading.
139
148
  *