react-native-track-player
react-native-track-player copied to clipboard
feat: now playing metadata changed hook and event
Summary
Resolves https://github.com/doublesymmetry/react-native-track-player/issues/2158.
Added nowPlayingMetadata hook, getNowPlayingMetadata getter and NowPlayingMetadataChanged event.
Reflect these changes in updateMetadataForTrack (when it's the active track) and clearNowPlayingMetadata for time before deprecation.
useActiveTrack() stays intact, as David suggested in issue, I've done changes as per his recommendations, implementing new event, getter and hook, independently of useActiveTrack.
- Users had no way of obtaining now playing metadata before, for metadata rendering purposes
activeTrackevent, getter and hook do not provide now playing metadata information - if users would ever change metadata of track that is currently playing, there would be no update to it- With radio streams, when rendering now playing metadata artist, title and artwork... Radio screen metadata UI can be updated once
MetadataTimedReceivedevent is emitted. But, if user would unmount the screen and then come back to it, now playing metadata is not accessible, until newMetadataTimedReceivedevent is emitted - when song on the radio stream changes
How it works
- Every time
updateNowPlayingMetadata, orupdateMetadataForTrack, if it's active track, is called, new metadata is saved into private var insideMusicService/RNTrackPlayerandNowPlayingMetadataChangedevent is emitted.clearNowPlayingMetadatareflects these changes accordingly, until it'll be deprecated as announced getNowPlayingMetadatareturns that variable's value, last stored metadatauseNowPlayingMetadatafetches that variable's value on mount, saves it into state. Every timeNowPlayingMetadataChangedis emitted, it updates the internal state with new metadata. Hook returns metadataNowPlayingMetadataChangedis subscribable, event returnsmetadataobject
Testing
- Tested in Example app, using iPhone 13 mini (iOS 17.2) and Google Pixel 3 (Android 12)
- Tested in my app containing podcast RSS feeds and radio streams, using iPhone 13 mini (iOS 17.2) and Google Pixel 3 (Android 12)
Screenshots
Note that artwork gets updated randomly, and because notification metadata and our nowPlayingMetadata update at at different time, they're not the same.
| Now playing metadata updated on "Update Notification Metadata Randomly" action | Now playing metadata updated on "Update Current Track Metadata Randomly" action | ||
| iOS | |||
| Android | |||
| Now playing metadata updated for each track via PlaybackService | ||||||||
| iOS | ||||||||
| Android | ||||||||
Note
@dcvz
I've just noticed that notification metadata is "patched", instead of replaced.
E.g., if we update now playing metadata, or metadata for active track, it'll keep old metadata values for any undefined values in object we're updating with.
I'm not sure if this should be the case, I'd expect users to be able to override notification data completely.
nowPlayingMetadata is replaced completely with new values, even if they're undefined.
Thanks for taking the time @tomislav-arambasic ! As you saw there's been some conversation on the other thread around options and possibilities.
I'll review this PR later this week!
Sorry for the delay here! I'm hoping to go through this soon
This PR is stale because it has been open 90 days with no activity. Remove stale label or comment or this will be closed in 7 days.
This PR was closed because it has been stalled for 7 days with no activity.
@dcvz Not rushing anything, I've just noticed it got auto-closed and I thought you might be interested in feature :)