@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.
- package/android/src/main/java/com/doublesymmetry/trackplayer/HeaderInjectingDataSourceFactory.kt +5 -1
- package/android/src/main/java/com/doublesymmetry/trackplayer/TrackPlayerModule.kt +23 -3
- package/android/src/main/java/com/doublesymmetry/trackplayer/models/EmitEventType.kt +22 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/models/MetadataApplier.kt +36 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/models/PlayerConfig.kt +10 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/models/StreamMetadataExtractor.kt +98 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/models/TrackPlayerMediaItem.kt +20 -8
- package/android/src/test/java/com/doublesymmetry/trackplayer/models/EmitEventTest.kt +33 -0
- package/android/src/test/java/com/doublesymmetry/trackplayer/models/MetadataApplierTest.kt +224 -0
- package/android/src/test/java/com/doublesymmetry/trackplayer/models/PlayerConfigTest.kt +33 -0
- package/android/src/test/java/com/doublesymmetry/trackplayer/models/StreamMetadataExtractorTest.kt +254 -0
- package/android/src/test/java/com/doublesymmetry/trackplayer/models/TrackPlayerMediaItemTest.kt +202 -0
- package/ios/TrackPlayer.swift +28 -2
- package/ios/models/EmitEvent.swift +28 -0
- package/ios/models/MediaItem.swift +8 -3
- package/ios/tests/AVPlayerEngineIntegrationTests.swift +7 -4
- package/lib/commonjs/audio.js +1 -0
- package/lib/commonjs/audio.js.map +1 -1
- package/lib/commonjs/events/MediaMetadataChanged.js +2 -0
- package/lib/commonjs/events/MediaMetadataChanged.js.map +1 -0
- package/lib/commonjs/events/index.js +13 -0
- package/lib/commonjs/events/index.js.map +1 -1
- package/lib/commonjs/hooks/useActiveMediaItem.js +3 -3
- package/lib/commonjs/hooks/useActiveMediaItem.js.map +1 -1
- package/lib/commonjs/hooks/useProgress.js.map +1 -1
- package/lib/commonjs/interfaces/PlayerConfig.js +1 -0
- package/lib/commonjs/interfaces/PlayerConfig.js.map +1 -1
- package/lib/module/audio.js +1 -0
- package/lib/module/audio.js.map +1 -1
- package/lib/module/events/MediaMetadataChanged.js +2 -0
- package/lib/module/events/MediaMetadataChanged.js.map +1 -0
- package/lib/module/events/index.js +2 -0
- package/lib/module/events/index.js.map +1 -1
- package/lib/module/hooks/useActiveMediaItem.js +3 -3
- package/lib/module/hooks/useActiveMediaItem.js.map +1 -1
- package/lib/module/hooks/useProgress.js.map +1 -1
- package/lib/module/interfaces/PlayerConfig.js +1 -0
- package/lib/module/interfaces/PlayerConfig.js.map +1 -1
- package/lib/typescript/src/audio.d.ts.map +1 -1
- package/lib/typescript/src/events/MediaMetadataChanged.d.ts +18 -0
- package/lib/typescript/src/events/MediaMetadataChanged.d.ts.map +1 -0
- package/lib/typescript/src/events/MetadataReceived.d.ts +15 -0
- package/lib/typescript/src/events/MetadataReceived.d.ts.map +1 -1
- package/lib/typescript/src/events/index.d.ts +4 -0
- package/lib/typescript/src/events/index.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useActiveMediaItem.d.ts +2 -2
- package/lib/typescript/src/hooks/useProgress.d.ts.map +1 -1
- package/lib/typescript/src/interfaces/MediaItem.d.ts +15 -0
- package/lib/typescript/src/interfaces/MediaItem.d.ts.map +1 -1
- package/lib/typescript/src/interfaces/PlayerConfig.d.ts +8 -0
- package/lib/typescript/src/interfaces/PlayerConfig.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/audio.ts +3 -0
- package/src/events/MediaMetadataChanged.ts +18 -0
- package/src/events/MetadataReceived.ts +15 -0
- package/src/events/index.ts +4 -0
- package/src/hooks/useActiveMediaItem.ts +3 -3
- package/src/hooks/useProgress.ts +1 -1
- package/src/interfaces/MediaItem.ts +15 -0
- 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;
|
package/src/events/index.ts
CHANGED
|
@@ -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
|
-
*
|
|
13
|
-
*
|
|
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.
|
|
28
|
+
Event.MediaMetadataChanged,
|
|
29
29
|
() => {
|
|
30
30
|
setItem(TrackPlayer.getActiveMediaItem());
|
|
31
31
|
}
|
package/src/hooks/useProgress.ts
CHANGED
|
@@ -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
|
*
|