@javascriptcommon/react-native-track-player 1.2.9 → 4.1.4
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/LICENSE +201 -21
- package/README.md +8 -0
- package/android/build.gradle +92 -18
- package/android/proguard-rules.txt +0 -3
- package/android/src/main/AndroidManifest.xml +10 -13
- package/android/src/main/java/com/doublesymmetry/trackplayer/HeadlessJsMediaService.kt +199 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/TrackPlayer.kt +33 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/extensions/AudioPlayerStateExt.kt +19 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/extensions/EnumExtensions.kt +5 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/extensions/NumberExt.kt +13 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/MetadataAdapter.kt +227 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/NowPlayingMetadata.kt +16 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/PlaybackMetadata.kt +203 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/State.kt +13 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/Track.kt +67 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/TrackAudioItem.kt +18 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/TrackMetadata.kt +38 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/module/MusicEvents.kt +67 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/module/MusicModule.kt +778 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/service/MusicService.kt +1286 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/utils/AppForegroundTracker.kt +35 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/utils/BundleUtils.kt +147 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/utils/CoilBitmapLoader.kt +65 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/utils/MediaItemBuilder.kt +41 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/utils/RejectionException.kt +11 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/video/TrackPlayerVideoView.kt +42 -0
- package/android/src/main/java/com/doublesymmetry/trackplayer/video/TrackPlayerVideoViewManager.kt +18 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/event/EventHolder.kt +30 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/event/PlayerEventHolder.kt +124 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioContentType.kt +10 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioItem.kt +118 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioItemTransitionReason.kt +33 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioPlayerState.kt +30 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/BufferConfig.kt +8 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/CacheConfig.kt +17 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/Capability.kt +19 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/CustomButton.kt +19 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/FocusChangeData.kt +3 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/MediaSessionCallback.kt +17 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayWhenReadyChangeData.kt +3 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlaybackEndedReason.kt +5 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlaybackError.kt +6 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayerConfig.kt +36 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayerOptions.kt +40 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PositionChangedReason.kt +39 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/RepeatMode.kt +16 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/WakeMode.kt +7 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/AudioPlayer.kt +756 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/ForwardingPlayer.java +1124 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/QueuedAudioPlayer.kt +279 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/APMRenderersFactory.kt +33 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/Buffer.kt +34 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/Cache.kt +27 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/FocusManager.kt +59 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/MediaFactory.kt +130 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/processors/TeeListener.kt +171 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/service/MusicService.kt +127 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/utils/FFT.java +99 -0
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/utils/Utils.kt +113 -0
- package/android/src/main/res/drawable/baseline_repeat_24.xml +5 -0
- package/android/src/main/res/drawable/baseline_repeat_one_24.xml +5 -0
- package/android/src/main/res/drawable/forward.xml +5 -0
- package/android/src/main/res/drawable/heart_24px.xml +5 -0
- package/android/src/main/res/drawable/hearte_24px.xml +5 -0
- package/android/src/main/res/drawable/ifl_24px.xml +5 -0
- package/android/src/main/res/drawable/rewind.xml +5 -0
- package/android/src/main/res/drawable/shuffle_24px.xml +5 -0
- package/android/src/main/res/values/strings.xml +5 -0
- package/android/src/main/res/xml/automotive_app_desc.xml +3 -0
- package/ios/Example/SwiftAudio/Assets.xcassets/22AMI.imageset/22AMillion.jpg +0 -0
- package/ios/Example/SwiftAudio/Assets.xcassets/22AMI.imageset/Contents.json +21 -0
- package/ios/Example/SwiftAudio/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
- package/ios/Example/SwiftAudio/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
- package/ios/Example/SwiftAudio/Assets.xcassets/Contents.json +6 -0
- package/ios/Example/SwiftAudio/Assets.xcassets/cover.imageset/Contents.json +21 -0
- package/ios/Example/SwiftAudio/Assets.xcassets/cover.imageset/cover.jpg +0 -0
- package/ios/Example/SwiftAudio/AudioController.swift +46 -0
- package/ios/Example/SwiftAudio/Extensions.swift +22 -0
- package/ios/Example/SwiftAudio/PlayerView.swift +172 -0
- package/ios/Example/SwiftAudio/PlayerViewModel.swift +120 -0
- package/ios/Example/SwiftAudio/Preview Content/Preview Assets.xcassets/Contents.json +6 -0
- package/ios/Example/SwiftAudio/QueueView.swift +65 -0
- package/ios/{TrackPlayer.xcodeproj/xcuserdata/marco.xcuserdatad/xcschemes/xcschememanagement.plist → Example/SwiftAudio/SwiftAudio.entitlements} +6 -8
- package/ios/Example/SwiftAudio/SwiftAudioApp.swift +17 -0
- package/ios/Example/SwiftAudio.xcodeproj/project.pbxproj +412 -0
- package/ios/{TrackPlayer.xcodeproj → Example/SwiftAudio.xcodeproj}/project.xcworkspace/contents.xcworkspacedata +1 -1
- package/ios/RNTrackPlayer/Models/Capabilities.swift +39 -4
- package/ios/RNTrackPlayer/Models/MediaURL.swift +12 -6
- package/ios/RNTrackPlayer/Models/MetadataAdapter.swift +147 -0
- package/ios/RNTrackPlayer/Models/PitchAlgorithms.swift +13 -0
- package/ios/RNTrackPlayer/Models/SessionCategories.swift +106 -0
- package/ios/RNTrackPlayer/Models/State.swift +26 -0
- package/ios/RNTrackPlayer/Models/Track.swift +74 -54
- package/ios/RNTrackPlayer/RNTrackPlayer.swift +867 -406
- package/ios/RNTrackPlayer/Support/RNTrackPlayer-Bridging-Header.h +1 -0
- package/ios/RNTrackPlayer/TrackPlayer.h +14 -0
- package/ios/RNTrackPlayer/TrackPlayer.mm +249 -0
- package/ios/RNTrackPlayer/Utils/EventType.swift +45 -0
- package/ios/RNTrackPlayer/Utils/Metadata.swift +60 -0
- package/ios/RNTrackPlayer/Video/RNTrackPlayerVideoView.swift +83 -0
- package/ios/RNTrackPlayer/Video/RNTrackPlayerVideoViewManager.m +5 -0
- package/ios/RNTrackPlayer/Video/RNTrackPlayerVideoViewManager.swift +17 -0
- package/ios/SwiftAudioEx/Package.swift +20 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapper.swift +531 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperDelegate.swift +27 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperProtocol.swift +69 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperState.swift +43 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioItem.swift +158 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioPlayer.swift +459 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioPlayerError.swift +26 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioSessionController/AudioSession.swift +33 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioSessionController/AudioSessionController.swift +135 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioTap.swift +96 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Event.swift +155 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/MediaItemProperty.swift +95 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoCenter.swift +17 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoController.swift +73 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoControllerProtocol.swift +26 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoKeyValue.swift +14 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoProperty.swift +234 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerItemNotificationObserver.swift +102 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerItemObserver.swift +136 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerObserver.swift +120 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerTimeObserver.swift +112 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/QueueManager.swift +356 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/QueuedAudioPlayer.swift +236 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RemoteCommandController/RemoteCommand.swift +170 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RemoteCommandController/RemoteCommandController.swift +206 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RepeatMode.swift +15 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/TimeEventFrequency.swift +26 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Utils/DispatchQueueType.swift +18 -0
- package/ios/SwiftAudioEx/Sources/SwiftAudioEx/WaveformAudioTap.swift +159 -0
- package/lib/specs/NativeTrackPlayer.d.ts +134 -0
- package/lib/specs/NativeTrackPlayer.js +4 -0
- package/lib/src/TrackPlayerModule.web.d.ts +2 -0
- package/lib/src/TrackPlayerModule.web.js +2 -0
- package/lib/src/VideoView.d.ts +16 -0
- package/lib/src/VideoView.js +25 -0
- package/lib/src/constants/AndroidAudioContentType.d.ts +35 -0
- package/lib/src/constants/AndroidAudioContentType.js +36 -0
- package/lib/src/constants/AndroidAutoContentStyle.d.ts +10 -0
- package/lib/src/constants/AndroidAutoContentStyle.js +11 -0
- package/lib/src/constants/AppKilledPlaybackBehavior.d.ts +17 -0
- package/lib/src/constants/AppKilledPlaybackBehavior.js +18 -0
- package/lib/src/constants/Capability.d.ts +17 -0
- package/lib/src/constants/Capability.js +19 -0
- package/lib/src/constants/Event.d.ts +172 -0
- package/lib/src/constants/Event.js +173 -0
- package/lib/src/constants/IOSCategory.d.ts +36 -0
- package/lib/src/constants/IOSCategory.js +37 -0
- package/lib/src/constants/IOSCategoryMode.d.ts +47 -0
- package/lib/src/constants/IOSCategoryMode.js +48 -0
- package/lib/src/constants/IOSCategoryOptions.d.ts +44 -0
- package/lib/src/constants/IOSCategoryOptions.js +45 -0
- package/lib/src/constants/MediaItemPlayable.d.ts +4 -0
- package/lib/src/constants/MediaItemPlayable.js +5 -0
- package/lib/src/constants/PitchAlgorithm.d.ts +14 -0
- package/lib/src/constants/PitchAlgorithm.js +16 -0
- package/lib/src/constants/RatingType.d.ts +8 -0
- package/lib/src/constants/RatingType.js +10 -0
- package/lib/src/constants/RepeatMode.d.ts +8 -0
- package/lib/src/constants/RepeatMode.js +10 -0
- package/lib/src/constants/State.d.ts +34 -0
- package/lib/src/constants/State.js +35 -0
- package/lib/src/constants/TrackType.d.ts +6 -0
- package/lib/src/constants/TrackType.js +7 -0
- package/lib/src/constants/index.d.ts +14 -0
- package/lib/src/constants/index.js +14 -0
- package/lib/src/hooks/index.d.ts +6 -0
- package/lib/src/hooks/index.js +6 -0
- package/lib/src/hooks/useActiveTrack.d.ts +2 -0
- package/lib/src/hooks/useActiveTrack.js +28 -0
- package/lib/src/hooks/useAppIsInBackground.d.ts +1 -0
- package/lib/src/hooks/useAppIsInBackground.js +16 -0
- package/lib/src/hooks/useIsPlaying.d.ts +35 -0
- package/lib/src/hooks/useIsPlaying.js +50 -0
- package/lib/src/hooks/usePlayWhenReady.d.ts +1 -0
- package/lib/src/hooks/usePlayWhenReady.js +27 -0
- package/lib/src/hooks/usePlaybackState.d.ts +10 -0
- package/lib/src/hooks/usePlaybackState.js +35 -0
- package/lib/src/hooks/useProgress.d.ts +7 -0
- package/lib/src/hooks/useProgress.js +55 -0
- package/lib/src/hooks/useTrackPlayerEvents.d.ts +8 -0
- package/lib/src/hooks/useTrackPlayerEvents.js +30 -0
- package/lib/src/index.d.ts +6 -0
- package/lib/src/index.js +6 -0
- package/lib/src/interfaces/AndroidAutoBrowseTree.d.ts +5 -0
- package/lib/src/interfaces/AndroidAutoBrowseTree.js +1 -0
- package/lib/src/interfaces/AndroidOptions.d.ts +41 -0
- package/lib/src/interfaces/AndroidOptions.js +1 -0
- package/lib/src/interfaces/CustomButtons.d.ts +5 -0
- package/lib/src/interfaces/CustomButtons.js +1 -0
- package/lib/src/interfaces/FeedbackOptions.d.ts +6 -0
- package/lib/src/interfaces/FeedbackOptions.js +1 -0
- package/lib/src/interfaces/MediaItem.d.ts +18 -0
- package/lib/src/interfaces/MediaItem.js +1 -0
- package/lib/src/interfaces/MetadataOptions.d.ts +3 -0
- package/lib/src/interfaces/MetadataOptions.js +1 -0
- package/lib/src/interfaces/NowPlayingMetadata.d.ts +4 -0
- package/lib/src/interfaces/NowPlayingMetadata.js +1 -0
- package/lib/src/interfaces/PlaybackState.d.ts +8 -0
- package/lib/src/interfaces/PlaybackState.js +1 -0
- package/lib/src/interfaces/PlayerOptions.d.ts +132 -0
- package/lib/src/interfaces/PlayerOptions.js +1 -0
- package/lib/src/interfaces/Progress.d.ts +15 -0
- package/lib/src/interfaces/Progress.js +1 -0
- package/lib/src/interfaces/ResourceObject.d.ts +1 -0
- package/lib/src/interfaces/ResourceObject.js +1 -0
- package/lib/src/interfaces/ServiceHandler.d.ts +1 -0
- package/lib/src/interfaces/ServiceHandler.js +1 -0
- package/lib/src/interfaces/Track.d.ts +21 -0
- package/lib/src/interfaces/Track.js +1 -0
- package/lib/src/interfaces/TrackMetadataBase.d.ts +28 -0
- package/lib/src/interfaces/TrackMetadataBase.js +1 -0
- package/lib/src/interfaces/UpdateOptions.d.ts +52 -0
- package/lib/src/interfaces/UpdateOptions.js +1 -0
- package/lib/src/interfaces/events/AudioMetadataReceivedEvent.d.ts +33 -0
- package/lib/src/interfaces/events/AudioMetadataReceivedEvent.js +1 -0
- package/lib/src/interfaces/events/ControllerConnectedEvent.d.ts +8 -0
- package/lib/src/interfaces/events/ControllerConnectedEvent.js +1 -0
- package/lib/src/interfaces/events/EventPayloadByEvent.d.ts +77 -0
- package/lib/src/interfaces/events/EventPayloadByEvent.js +1 -0
- package/lib/src/interfaces/events/FFTUpdateEvent.d.ts +7 -0
- package/lib/src/interfaces/events/FFTUpdateEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackActiveTrackChangedEvent.d.ts +24 -0
- package/lib/src/interfaces/events/PlaybackActiveTrackChangedEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.d.ts +4 -0
- package/lib/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackErrorEvent.d.ts +6 -0
- package/lib/src/interfaces/events/PlaybackErrorEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackMetadataReceivedEvent.d.ts +16 -0
- package/lib/src/interfaces/events/PlaybackMetadataReceivedEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.d.ts +4 -0
- package/lib/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackProgressUpdatedEvent.d.ts +4 -0
- package/lib/src/interfaces/events/PlaybackProgressUpdatedEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackQueueEndedEvent.d.ts +9 -0
- package/lib/src/interfaces/events/PlaybackQueueEndedEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackResumeEvent.d.ts +3 -0
- package/lib/src/interfaces/events/PlaybackResumeEvent.js +1 -0
- package/lib/src/interfaces/events/PlaybackTrackChangedEvent.d.ts +11 -0
- package/lib/src/interfaces/events/PlaybackTrackChangedEvent.js +1 -0
- package/lib/src/interfaces/events/PlayerErrorEvent.d.ts +6 -0
- package/lib/src/interfaces/events/PlayerErrorEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteBrowseEvent.d.ts +4 -0
- package/lib/src/interfaces/events/RemoteBrowseEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteCustomActionEvent.d.ts +7 -0
- package/lib/src/interfaces/events/RemoteCustomActionEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteDuckEvent.d.ts +13 -0
- package/lib/src/interfaces/events/RemoteDuckEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteJumpBackwardEvent.d.ts +7 -0
- package/lib/src/interfaces/events/RemoteJumpBackwardEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteJumpForwardEvent.d.ts +7 -0
- package/lib/src/interfaces/events/RemoteJumpForwardEvent.js +1 -0
- package/lib/src/interfaces/events/RemotePlayIdEvent.d.ts +4 -0
- package/lib/src/interfaces/events/RemotePlayIdEvent.js +1 -0
- package/lib/src/interfaces/events/RemotePlaySearchEvent.d.ts +9 -0
- package/lib/src/interfaces/events/RemotePlaySearchEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteSearchEvent.d.ts +3 -0
- package/lib/src/interfaces/events/RemoteSearchEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteSeekEvent.d.ts +4 -0
- package/lib/src/interfaces/events/RemoteSeekEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteSetRatingEvent.d.ts +4 -0
- package/lib/src/interfaces/events/RemoteSetRatingEvent.js +1 -0
- package/lib/src/interfaces/events/RemoteSkipEvent.d.ts +3 -0
- package/lib/src/interfaces/events/RemoteSkipEvent.js +1 -0
- package/lib/src/interfaces/events/index.d.ts +20 -0
- package/lib/src/interfaces/events/index.js +20 -0
- package/lib/src/interfaces/index.d.ts +15 -0
- package/lib/src/interfaces/index.js +15 -0
- package/lib/src/resolveAssetSource.d.ts +2 -0
- package/lib/src/resolveAssetSource.js +3 -0
- package/lib/src/resolveAssetSource.web.d.ts +2 -0
- package/lib/src/resolveAssetSource.web.js +8 -0
- package/lib/src/trackPlayer.d.ts +371 -0
- package/lib/src/trackPlayer.js +627 -0
- package/lib/web/TrackPlayer/Player.d.ts +40 -0
- package/lib/web/TrackPlayer/Player.js +188 -0
- package/lib/web/TrackPlayer/PlaylistPlayer.d.ts +31 -0
- package/lib/web/TrackPlayer/PlaylistPlayer.js +181 -0
- package/lib/web/TrackPlayer/RepeatMode.d.ts +5 -0
- package/lib/web/TrackPlayer/RepeatMode.js +6 -0
- package/lib/web/TrackPlayer/SetupNotCalledError.d.ts +3 -0
- package/lib/web/TrackPlayer/SetupNotCalledError.js +5 -0
- package/lib/web/TrackPlayer/index.d.ts +3 -0
- package/lib/web/TrackPlayer/index.js +3 -0
- package/lib/web/TrackPlayerModule.d.ts +63 -0
- package/lib/web/TrackPlayerModule.js +153 -0
- package/lib/web/index.d.ts +3 -0
- package/lib/web/index.js +3 -0
- package/package.json +85 -6
- package/react-native-track-player.podspec +13 -13
- package/specs/NativeTrackPlayer.ts +153 -0
- package/src/TrackPlayerModule.web.ts +2 -0
- package/src/VideoView.tsx +51 -0
- package/src/constants/AndroidAudioContentType.ts +35 -0
- package/src/constants/AndroidAutoContentStyle.ts +10 -0
- package/src/constants/AppKilledPlaybackBehavior.ts +19 -0
- package/src/constants/Capability.ts +19 -0
- package/src/constants/Event.ts +173 -0
- package/src/constants/IOSCategory.ts +36 -0
- package/src/constants/IOSCategoryMode.ts +47 -0
- package/src/constants/IOSCategoryOptions.ts +44 -0
- package/src/constants/MediaItemPlayable.ts +4 -0
- package/src/constants/PitchAlgorithm.ts +16 -0
- package/src/constants/RatingType.ts +10 -0
- package/src/constants/RepeatMode.ts +10 -0
- package/src/constants/State.ts +34 -0
- package/src/constants/TrackType.ts +6 -0
- package/src/constants/index.ts +14 -0
- package/src/hooks/index.ts +6 -0
- package/src/hooks/useActiveTrack.ts +36 -0
- package/src/hooks/useAppIsInBackground.ts +20 -0
- package/src/hooks/useIsPlaying.ts +56 -0
- package/src/hooks/usePlayWhenReady.ts +37 -0
- package/src/hooks/usePlaybackState.ts +45 -0
- package/src/hooks/useProgress.ts +64 -0
- package/src/hooks/useTrackPlayerEvents.ts +48 -0
- package/src/index.ts +8 -0
- package/src/interfaces/AndroidAutoBrowseTree.ts +6 -0
- package/src/interfaces/AndroidOptions.ts +48 -0
- package/src/interfaces/CustomButtons.ts +6 -0
- package/src/interfaces/FeedbackOptions.ts +7 -0
- package/src/interfaces/MediaItem.ts +19 -0
- package/src/interfaces/MetadataOptions.ts +4 -0
- package/src/interfaces/NowPlayingMetadata.ts +5 -0
- package/src/interfaces/PlaybackState.ts +11 -0
- package/src/interfaces/PlayerOptions.ts +138 -0
- package/src/interfaces/Progress.ts +15 -0
- package/src/interfaces/ResourceObject.ts +1 -0
- package/src/interfaces/ServiceHandler.ts +1 -0
- package/src/interfaces/Track.ts +23 -0
- package/src/interfaces/TrackMetadataBase.ts +29 -0
- package/src/interfaces/UpdateOptions.ts +59 -0
- package/src/interfaces/events/AudioMetadataReceivedEvent.ts +37 -0
- package/src/interfaces/events/ControllerConnectedEvent.ts +9 -0
- package/src/interfaces/events/EventPayloadByEvent.ts +80 -0
- package/src/interfaces/events/FFTUpdateEvent.ts +9 -0
- package/src/interfaces/events/PlaybackActiveTrackChangedEvent.ts +29 -0
- package/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.ts +4 -0
- package/src/interfaces/events/PlaybackErrorEvent.ts +6 -0
- package/src/interfaces/events/PlaybackMetadataReceivedEvent.ts +16 -0
- package/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.ts +4 -0
- package/src/interfaces/events/PlaybackProgressUpdatedEvent.ts +5 -0
- package/src/interfaces/events/PlaybackQueueEndedEvent.ts +9 -0
- package/src/interfaces/events/PlaybackResumeEvent.ts +5 -0
- package/src/interfaces/events/PlaybackTrackChangedEvent.ts +11 -0
- package/src/interfaces/events/PlayerErrorEvent.ts +6 -0
- package/src/interfaces/events/RemoteBrowseEvent.ts +4 -0
- package/src/interfaces/events/RemoteCustomActionEvent.ts +7 -0
- package/src/interfaces/events/RemoteDuckEvent.ts +13 -0
- package/src/interfaces/events/RemoteJumpBackwardEvent.ts +7 -0
- package/src/interfaces/events/RemoteJumpForwardEvent.ts +7 -0
- package/src/interfaces/events/RemotePlayIdEvent.ts +4 -0
- package/src/interfaces/events/RemotePlaySearchEvent.ts +21 -0
- package/src/interfaces/events/RemoteSearchEvent.ts +3 -0
- package/src/interfaces/events/RemoteSeekEvent.ts +4 -0
- package/src/interfaces/events/RemoteSetRatingEvent.ts +5 -0
- package/src/interfaces/events/RemoteSkipEvent.ts +3 -0
- package/src/interfaces/events/index.ts +20 -0
- package/src/interfaces/index.ts +15 -0
- package/src/resolveAssetSource.ts +3 -0
- package/src/resolveAssetSource.web.ts +10 -0
- package/src/trackPlayer.ts +806 -0
- package/web/TrackPlayer/Player.ts +201 -0
- package/web/TrackPlayer/PlaylistPlayer.ts +215 -0
- package/web/TrackPlayer/RepeatMode.ts +6 -0
- package/web/TrackPlayer/SetupNotCalledError.ts +5 -0
- package/web/TrackPlayer/index.ts +3 -0
- package/web/TrackPlayerModule.ts +181 -0
- package/web/index.ts +4 -0
- package/CHANGELOG.md +0 -75
- package/android/react-native-music-control.iml +0 -139
- package/android/react-native-track-player.iml +0 -151
- package/android/src/main/java/com/guichaguri/trackplayer/TrackPlayer.java +0 -28
- package/android/src/main/java/com/guichaguri/trackplayer/module/MusicEvents.java +0 -55
- package/android/src/main/java/com/guichaguri/trackplayer/module/MusicModule.java +0 -298
- package/android/src/main/java/com/guichaguri/trackplayer/service/HeadlessJsMediaService.java +0 -174
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicBinder.java +0 -47
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicManager.java +0 -383
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicService.java +0 -271
- package/android/src/main/java/com/guichaguri/trackplayer/service/Utils.java +0 -243
- package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/ButtonEvents.java +0 -148
- package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/MetadataManager.java +0 -379
- package/android/src/main/java/com/guichaguri/trackplayer/service/models/Track.java +0 -141
- package/android/src/main/java/com/guichaguri/trackplayer/service/models/TrackType.java +0 -35
- package/android/src/main/res/drawable-hdpi/ic_forward.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_logo.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_next.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_pause.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_play.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_previous.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_rewind.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_stop.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_forward.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_logo.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_next.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_pause.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_play.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_previous.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_rewind.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_stop.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_forward.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_logo.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_next.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_pause.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_play.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_previous.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_rewind.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_stop.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_forward.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_logo.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_next.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_pause.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_play.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_previous.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_rewind.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_stop.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_forward.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_logo.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_next.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_pause.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_play.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_previous.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_rewind.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_stop.png +0 -0
- package/index.d.ts +0 -174
- package/index.js +0 -4
- package/ios/RNTrackPlayer/RNTrackPlayerBridge.h +0 -12
- package/ios/RNTrackPlayer/RNTrackPlayerBridge.m +0 -29
- package/ios/TrackPlayer.xcodeproj/project.pbxproj +0 -495
- package/ios/TrackPlayer.xcodeproj/project.xcworkspace/xcuserdata/marco.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/lib/ProgressComponent.js +0 -70
- package/lib/eventTypes.js +0 -28
- package/lib/hooks.js +0 -160
- package/lib/index.js +0 -177
- /package/ios/{TrackPlayer.xcodeproj → Example/SwiftAudio.xcodeproj}/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { State } from '../../src/constants/State';
|
|
2
|
+
import type { Track, Progress, PlaybackState } from '../../src/interfaces';
|
|
3
|
+
import { SetupNotCalledError } from './SetupNotCalledError';
|
|
4
|
+
|
|
5
|
+
export class Player {
|
|
6
|
+
protected hasInitialized: boolean = false;
|
|
7
|
+
protected element?: HTMLMediaElement;
|
|
8
|
+
protected player?: shaka.Player;
|
|
9
|
+
protected _current?: Track = undefined;
|
|
10
|
+
protected _playWhenReady: boolean = false;
|
|
11
|
+
protected _state: PlaybackState = { state: State.None };
|
|
12
|
+
|
|
13
|
+
// current getter/setter
|
|
14
|
+
public get current(): Track | undefined {
|
|
15
|
+
return this._current;
|
|
16
|
+
}
|
|
17
|
+
public set current(cur: Track | undefined) {
|
|
18
|
+
this._current = cur;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// state getter/setter
|
|
22
|
+
public get state(): PlaybackState {
|
|
23
|
+
return this._state;
|
|
24
|
+
}
|
|
25
|
+
public set state(newState: PlaybackState) {
|
|
26
|
+
this._state = newState;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// playWhenReady getter/setter
|
|
30
|
+
public get playWhenReady(): boolean {
|
|
31
|
+
return this._playWhenReady;
|
|
32
|
+
}
|
|
33
|
+
public set playWhenReady(pwr: boolean) {
|
|
34
|
+
this._playWhenReady = pwr;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async setupPlayer() {
|
|
38
|
+
// shaka only runs in a browser
|
|
39
|
+
if (typeof window === 'undefined') return;
|
|
40
|
+
if (this.hasInitialized === true) {
|
|
41
|
+
// TODO: double check the structure of this error message
|
|
42
|
+
throw { code: 'player_already_initialized', message: 'The player has already been initialized via setupPlayer.' };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// @ts-ignore
|
|
46
|
+
const shaka = (await import('shaka-player/dist/shaka-player.ui')).default;
|
|
47
|
+
// Install built-in polyfills to patch browser incompatibilities.
|
|
48
|
+
shaka.polyfill.installAll();
|
|
49
|
+
// Check to see if the browser supports the basic APIs Shaka needs.
|
|
50
|
+
if (!shaka.Player.isBrowserSupported()) {
|
|
51
|
+
// This browser does not have the minimum set of APIs we need.
|
|
52
|
+
this.state = {
|
|
53
|
+
state: State.Error,
|
|
54
|
+
error: {
|
|
55
|
+
code: 'not_supported',
|
|
56
|
+
message: 'Browser not supported.',
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
throw new Error('Browser not supported.');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// build dom element and attach shaka-player
|
|
63
|
+
this.element = document.createElement('audio');
|
|
64
|
+
this.element.setAttribute('id', 'react-native-track-player');
|
|
65
|
+
this.player = new shaka.Player();
|
|
66
|
+
this.player?.attach(this.element);
|
|
67
|
+
|
|
68
|
+
// Listen for relevant events events.
|
|
69
|
+
this.player!.addEventListener('error', (error: any) => {
|
|
70
|
+
// Extract the shaka.util.Error object from the event.
|
|
71
|
+
this.onError(error.detail);
|
|
72
|
+
});
|
|
73
|
+
this.element.addEventListener('ended', this.onStateUpdate.bind(this, State.Ended));
|
|
74
|
+
this.element.addEventListener('playing', this.onStateUpdate.bind(this, State.Playing));
|
|
75
|
+
this.element.addEventListener('pause', this.onStateUpdate.bind(this, State.Paused));
|
|
76
|
+
this.player!.addEventListener('loading', this.onStateUpdate.bind(this, State.Loading));
|
|
77
|
+
this.player!.addEventListener('loaded', this.onStateUpdate.bind(this, State.Ready));
|
|
78
|
+
this.player!.addEventListener('buffering', ({ buffering }: any) => {
|
|
79
|
+
if (buffering === true) {
|
|
80
|
+
this.onStateUpdate(State.Buffering);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// Attach player to the window to make it easy to access in the JS console.
|
|
85
|
+
// @ts-ignore
|
|
86
|
+
window.rntp = this.player;
|
|
87
|
+
this.hasInitialized = true;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* event handlers
|
|
92
|
+
*/
|
|
93
|
+
protected onStateUpdate(state: Exclude<State, State.Error>) {
|
|
94
|
+
this.state = { state };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
protected onError(error: any) {
|
|
98
|
+
// unload the current track to allow for clean playback on other
|
|
99
|
+
this.player?.unload();
|
|
100
|
+
this.state = {
|
|
101
|
+
state: State.Error,
|
|
102
|
+
error: {
|
|
103
|
+
code: error.code.toString(),
|
|
104
|
+
message: error.message,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// Log the error.
|
|
109
|
+
console.debug('Error code', error.code, 'object', error);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* player control
|
|
114
|
+
*/
|
|
115
|
+
public async load(track: Track) {
|
|
116
|
+
if (!this.player) throw new SetupNotCalledError();
|
|
117
|
+
await this.player.load(track.url as string);
|
|
118
|
+
this.current = track;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
public async retry() {
|
|
122
|
+
if (!this.player) throw new SetupNotCalledError();
|
|
123
|
+
this.player.retryStreaming();
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
public async stop() {
|
|
127
|
+
if (!this.player) throw new SetupNotCalledError();
|
|
128
|
+
this.current = undefined;
|
|
129
|
+
await this.player.unload()
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
public play() {
|
|
133
|
+
if (!this.element) throw new SetupNotCalledError();
|
|
134
|
+
this.playWhenReady = true;
|
|
135
|
+
return this.element.play()
|
|
136
|
+
.catch(err => {
|
|
137
|
+
console.error(err);
|
|
138
|
+
})
|
|
139
|
+
;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
public pause() {
|
|
143
|
+
if (!this.element) throw new SetupNotCalledError();
|
|
144
|
+
this.playWhenReady = false;
|
|
145
|
+
return this.element.pause();
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
public setRate(rate: number) {
|
|
149
|
+
if (!this.element) throw new SetupNotCalledError();
|
|
150
|
+
return this.element.playbackRate = rate;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
public getRate() {
|
|
154
|
+
if (!this.element) throw new SetupNotCalledError();
|
|
155
|
+
return this.element.playbackRate;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
public seekBy(offset: number) {
|
|
159
|
+
if (!this.element) throw new SetupNotCalledError();
|
|
160
|
+
this.element.currentTime += offset;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
public seekTo(seconds: number) {
|
|
164
|
+
if (!this.element) throw new SetupNotCalledError();
|
|
165
|
+
this.element.currentTime = seconds;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
public setVolume(volume: number) {
|
|
169
|
+
if (!this.element) throw new SetupNotCalledError();
|
|
170
|
+
this.element.volume = volume;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
public getVolume() {
|
|
174
|
+
if (!this.element) throw new SetupNotCalledError();
|
|
175
|
+
return this.element.volume;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
public getDuration() {
|
|
179
|
+
if (!this.element) throw new SetupNotCalledError();
|
|
180
|
+
return this.element.duration
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
public getPosition() {
|
|
184
|
+
if (!this.element) throw new SetupNotCalledError();
|
|
185
|
+
return this.element.currentTime
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
public getProgress(): Progress {
|
|
189
|
+
if (!this.element) throw new SetupNotCalledError();
|
|
190
|
+
return {
|
|
191
|
+
position: this.element.currentTime,
|
|
192
|
+
duration: this.element.duration || 0,
|
|
193
|
+
buffered: 0, // TODO: this.element.buffered.end,
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
public getBufferedPosition() {
|
|
198
|
+
if (!this.element) throw new SetupNotCalledError();
|
|
199
|
+
return this.element.buffered.end;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { Player } from './Player';
|
|
2
|
+
|
|
3
|
+
import type { Track } from '../../src/interfaces';
|
|
4
|
+
import {RepeatMode} from './RepeatMode';
|
|
5
|
+
import { State } from '../../src';
|
|
6
|
+
|
|
7
|
+
export class PlaylistPlayer extends Player {
|
|
8
|
+
// TODO: use immer to make the `playlist` immutable
|
|
9
|
+
protected playlist: Track[] = [];
|
|
10
|
+
protected lastIndex?: number;
|
|
11
|
+
protected _currentIndex?: number;
|
|
12
|
+
protected repeatMode: RepeatMode = RepeatMode.Off;
|
|
13
|
+
|
|
14
|
+
protected async onStateUpdate(state: Exclude<State, State.Error>) {
|
|
15
|
+
super.onStateUpdate(state);
|
|
16
|
+
|
|
17
|
+
if (state === State.Ended) {
|
|
18
|
+
await this.onTrackEnded();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
protected async onTrackEnded() {
|
|
23
|
+
switch (this.repeatMode) {
|
|
24
|
+
case RepeatMode.Track:
|
|
25
|
+
if (this.currentIndex !== undefined) {
|
|
26
|
+
await this.goToIndex(this.currentIndex);
|
|
27
|
+
}
|
|
28
|
+
break;
|
|
29
|
+
case RepeatMode.Playlist:
|
|
30
|
+
if (this.currentIndex === this.playlist.length - 1) {
|
|
31
|
+
await this.goToIndex(0);
|
|
32
|
+
} else {
|
|
33
|
+
await this.skipToNext();
|
|
34
|
+
}
|
|
35
|
+
break;
|
|
36
|
+
default:
|
|
37
|
+
try {
|
|
38
|
+
await this.skipToNext();
|
|
39
|
+
} catch (err) {
|
|
40
|
+
if ((err as Error).message !== 'playlist_exhausted') {
|
|
41
|
+
throw err;
|
|
42
|
+
}
|
|
43
|
+
this.onPlaylistEnded();
|
|
44
|
+
}
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
50
|
+
protected onPlaylistEnded() {}
|
|
51
|
+
|
|
52
|
+
protected get currentIndex() {
|
|
53
|
+
return this._currentIndex;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
protected set currentIndex(current: number | undefined) {
|
|
57
|
+
this.lastIndex = this.currentIndex;
|
|
58
|
+
this._currentIndex = current;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
protected async goToIndex(index: number, initialPosition?: number) {
|
|
62
|
+
const track = this.playlist[index];
|
|
63
|
+
|
|
64
|
+
if (!track) {
|
|
65
|
+
throw new Error('playlist_exhausted');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (this.currentIndex !== index) {
|
|
69
|
+
this.currentIndex = index;
|
|
70
|
+
await this.load(track);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (initialPosition) {
|
|
74
|
+
this.seekTo(initialPosition);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (this.playWhenReady) {
|
|
78
|
+
await this.play();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public async add(tracks: Track[], insertBeforeIndex?: number) {
|
|
83
|
+
if (insertBeforeIndex !== -1 && insertBeforeIndex !== undefined) {
|
|
84
|
+
this.playlist.splice(insertBeforeIndex, 0, ...tracks);
|
|
85
|
+
} else {
|
|
86
|
+
this.playlist.push(...tracks);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (this.currentIndex === undefined) {
|
|
90
|
+
await this.goToIndex(0);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
public async skip(index: number, initialPosition?: number) {
|
|
95
|
+
const track = this.playlist[index];
|
|
96
|
+
|
|
97
|
+
if (track === undefined) {
|
|
98
|
+
throw new Error('index out of bounds');
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
await this.goToIndex(index, initialPosition);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
public async skipToNext(initialPosition?: number) {
|
|
105
|
+
if (this.currentIndex === undefined) return;
|
|
106
|
+
|
|
107
|
+
const index = this.currentIndex + 1;
|
|
108
|
+
await this.goToIndex(index, initialPosition);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
public async skipToPrevious(initialPosition?: number) {
|
|
112
|
+
if (this.currentIndex === undefined) return;
|
|
113
|
+
|
|
114
|
+
const index = this.currentIndex - 1;
|
|
115
|
+
await this.goToIndex(index, initialPosition);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public getTrack(index: number): Track | null {
|
|
119
|
+
const track = this.playlist[index];
|
|
120
|
+
return track || null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
public setRepeatMode(mode: RepeatMode) {
|
|
124
|
+
this.repeatMode = mode;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
public getRepeatMode() {
|
|
128
|
+
return this.repeatMode;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
public async remove(indexes: number[]) {
|
|
132
|
+
const idxMap = indexes.reduce<Record<number, boolean>>((acc, elem) => {
|
|
133
|
+
acc[elem] = true
|
|
134
|
+
return acc;
|
|
135
|
+
}, {});
|
|
136
|
+
let isCurrentRemoved = false;
|
|
137
|
+
this.playlist = this.playlist.filter((_track, idx) => {
|
|
138
|
+
const keep = !idxMap[idx]
|
|
139
|
+
|
|
140
|
+
if (!keep && idx === this.currentIndex) {
|
|
141
|
+
isCurrentRemoved = true;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return keep;
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
if (this.currentIndex === undefined) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const hasItems = this.playlist.length > 0;
|
|
152
|
+
if (isCurrentRemoved && hasItems) {
|
|
153
|
+
await this.goToIndex(this.currentIndex % this.playlist.length);
|
|
154
|
+
} else if (isCurrentRemoved) {
|
|
155
|
+
await this.stop();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
public async stop() {
|
|
160
|
+
await super.stop();
|
|
161
|
+
this.currentIndex = undefined;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
public async reset() {
|
|
165
|
+
await this.stop();
|
|
166
|
+
this.playlist = [];
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
public async removeUpcomingTracks() {
|
|
170
|
+
if (this.currentIndex === undefined) return;
|
|
171
|
+
this.playlist = this.playlist.slice(0, this.currentIndex + 1);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
public async move(fromIndex: number, toIndex: number): Promise<void> {
|
|
175
|
+
if (!this.playlist[fromIndex]) {
|
|
176
|
+
throw new Error('index out of bounds');
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (this.currentIndex === fromIndex) {
|
|
180
|
+
throw new Error('you cannot move the currently playing track');
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (this.currentIndex === toIndex) {
|
|
184
|
+
throw new Error('you cannot replace the currently playing track');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// calculate `currentIndex` after move
|
|
188
|
+
let shift: number | undefined = undefined;
|
|
189
|
+
if (this.currentIndex) {
|
|
190
|
+
if (fromIndex < this.currentIndex && toIndex > this.currentIndex) {
|
|
191
|
+
shift = -1;
|
|
192
|
+
} else if (fromIndex > this.currentIndex && toIndex < this.currentIndex) {
|
|
193
|
+
shift = + 1;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// move the track
|
|
198
|
+
const fromItem = this.playlist[fromIndex];
|
|
199
|
+
this.playlist.splice(fromIndex, 1);
|
|
200
|
+
this.playlist.splice(toIndex, 0, fromItem);
|
|
201
|
+
|
|
202
|
+
if (this.currentIndex && shift) {
|
|
203
|
+
this.currentIndex = this.currentIndex + shift
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// TODO
|
|
208
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
209
|
+
public updateMetadataForTrack(index: number, metadata: Partial<Track>) {}
|
|
210
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
211
|
+
public clearNowPlayingMetadata() {}
|
|
212
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
213
|
+
public updateNowPlayingMetadata(metadata: Partial<Track>) {}
|
|
214
|
+
|
|
215
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { DeviceEventEmitter } from 'react-native';
|
|
2
|
+
|
|
3
|
+
import { Event, PlaybackState, State } from '../src';
|
|
4
|
+
import type { Track, UpdateOptions } from '../src';
|
|
5
|
+
import { PlaylistPlayer, RepeatMode } from './TrackPlayer';
|
|
6
|
+
import { SetupNotCalledError } from './TrackPlayer/SetupNotCalledError';
|
|
7
|
+
|
|
8
|
+
export class TrackPlayerModule extends PlaylistPlayer {
|
|
9
|
+
protected emitter = DeviceEventEmitter;
|
|
10
|
+
protected progressUpdateEventInterval: any;
|
|
11
|
+
|
|
12
|
+
// Capabilities
|
|
13
|
+
public readonly CAPABILITY_PLAY = 'CAPABILITY_PLAY';
|
|
14
|
+
public readonly CAPABILITY_PLAY_FROM_ID = 'CAPABILITY_PLAY_FROM_ID';
|
|
15
|
+
public readonly CAPABILITY_PLAY_FROM_SEARCH = 'CAPABILITY_PLAY_FROM_SEARCH';
|
|
16
|
+
public readonly CAPABILITY_PAUSE = 'CAPABILITY_PAUSE';
|
|
17
|
+
public readonly CAPABILITY_STOP = 'CAPABILITY_STOP';
|
|
18
|
+
public readonly CAPABILITY_SEEK_TO = 'CAPABILITY_SEEK_TO';
|
|
19
|
+
public readonly CAPABILITY_SKIP = 'CAPABILITY_SKIP';
|
|
20
|
+
public readonly CAPABILITY_SKIP_TO_NEXT = 'CAPABILITY_SKIP_TO_NEXT';
|
|
21
|
+
public readonly CAPABILITY_SKIP_TO_PREVIOUS = 'CAPABILITY_SKIP_TO_PREVIOUS';
|
|
22
|
+
public readonly CAPABILITY_JUMP_FORWARD = 'CAPABILITY_JUMP_FORWARD';
|
|
23
|
+
public readonly CAPABILITY_JUMP_BACKWARD = 'CAPABILITY_JUMP_BACKWARD';
|
|
24
|
+
public readonly CAPABILITY_SET_RATING = 'CAPABILITY_SET_RATING';
|
|
25
|
+
public readonly CAPABILITY_LIKE = 'CAPABILITY_LIKE';
|
|
26
|
+
public readonly CAPABILITY_DISLIKE = 'CAPABILITY_DISLIKE';
|
|
27
|
+
public readonly CAPABILITY_BOOKMARK = 'CAPABILITY_BOOKMARK';
|
|
28
|
+
|
|
29
|
+
// States
|
|
30
|
+
public readonly STATE_NONE = 'STATE_NONE';
|
|
31
|
+
public readonly STATE_READY = 'STATE_READY';
|
|
32
|
+
public readonly STATE_PLAYING = 'STATE_PLAYING';
|
|
33
|
+
public readonly STATE_PAUSED = 'STATE_PAUSED';
|
|
34
|
+
public readonly STATE_STOPPED = 'STATE_STOPPED';
|
|
35
|
+
public readonly STATE_BUFFERING = 'STATE_BUFFERING';
|
|
36
|
+
public readonly STATE_CONNECTING = 'STATE_CONNECTING';
|
|
37
|
+
|
|
38
|
+
// Rating Types
|
|
39
|
+
public readonly RATING_HEART = 'RATING_HEART';
|
|
40
|
+
public readonly RATING_THUMBS_UP_DOWN = 'RATING_THUMBS_UP_DOWN';
|
|
41
|
+
public readonly RATING_3_STARS = 'RATING_3_STARS';
|
|
42
|
+
public readonly RATING_4_STARS = 'RATING_4_STARS';
|
|
43
|
+
public readonly RATING_5_STARS = 'RATING_5_STARS';
|
|
44
|
+
public readonly RATING_PERCENTAGE = 'RATING_PERCENTAGE';
|
|
45
|
+
|
|
46
|
+
// Repeat Modes
|
|
47
|
+
public readonly REPEAT_OFF = RepeatMode.Off;
|
|
48
|
+
public readonly REPEAT_TRACK = RepeatMode.Track;
|
|
49
|
+
public readonly REPEAT_QUEUE = RepeatMode.Playlist;
|
|
50
|
+
|
|
51
|
+
// Pitch Algorithms
|
|
52
|
+
public readonly PITCH_ALGORITHM_LINEAR = 'PITCH_ALGORITHM_LINEAR';
|
|
53
|
+
public readonly PITCH_ALGORITHM_MUSIC = 'PITCH_ALGORITHM_MUSIC';
|
|
54
|
+
public readonly PITCH_ALGORITHM_VOICE = 'PITCH_ALGORITHM_VOICE';
|
|
55
|
+
|
|
56
|
+
// observe and emit state changes
|
|
57
|
+
public get state(): PlaybackState {
|
|
58
|
+
return super.state;
|
|
59
|
+
}
|
|
60
|
+
public set state(newState: PlaybackState) {
|
|
61
|
+
super.state = newState;
|
|
62
|
+
this.emitter.emit(Event.PlaybackState, newState);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public async updateOptions(options: UpdateOptions) {
|
|
66
|
+
this.setupProgressUpdates(options.progressUpdateEventInterval);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
protected setupProgressUpdates(interval?: number) {
|
|
70
|
+
// clear and reset interval
|
|
71
|
+
this.clearUpdateEventInterval();
|
|
72
|
+
if (interval) {
|
|
73
|
+
this.clearUpdateEventInterval()
|
|
74
|
+
this.progressUpdateEventInterval = setInterval(
|
|
75
|
+
async () => {
|
|
76
|
+
if (this.state.state === State.Playing) {
|
|
77
|
+
const progress = await this.getProgress()
|
|
78
|
+
this.emitter.emit(Event.PlaybackProgressUpdated, {
|
|
79
|
+
...progress,
|
|
80
|
+
track: this.currentIndex,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
interval * 1000,
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
protected clearUpdateEventInterval() {
|
|
90
|
+
if (this.progressUpdateEventInterval) {
|
|
91
|
+
clearInterval(this.progressUpdateEventInterval);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
protected async onTrackEnded() {
|
|
96
|
+
const position = this.element!.currentTime;
|
|
97
|
+
await super.onTrackEnded();
|
|
98
|
+
|
|
99
|
+
this.emitter.emit(Event.PlaybackTrackChanged, {
|
|
100
|
+
track: this.lastIndex,
|
|
101
|
+
position,
|
|
102
|
+
nextTrack: this.currentIndex,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
protected async onPlaylistEnded() {
|
|
107
|
+
await super.onPlaylistEnded();
|
|
108
|
+
this.emitter.emit(Event.PlaybackQueueEnded, {
|
|
109
|
+
track: this.currentIndex,
|
|
110
|
+
position: this.element!.currentTime,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public get playWhenReady(): boolean {
|
|
115
|
+
return super.playWhenReady;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public set playWhenReady(pwr: boolean) {
|
|
119
|
+
const didChange = pwr !== this._playWhenReady;
|
|
120
|
+
super.playWhenReady = pwr;
|
|
121
|
+
|
|
122
|
+
if (didChange) {
|
|
123
|
+
this.emitter.emit(Event.PlaybackPlayWhenReadyChanged, { playWhenReady: this._playWhenReady });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
public getPlayWhenReady(): boolean {
|
|
128
|
+
return this.playWhenReady;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
public setPlayWhenReady(pwr: boolean): boolean {
|
|
132
|
+
this.playWhenReady = pwr;
|
|
133
|
+
return this.playWhenReady;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
public async load(track: Track) {
|
|
137
|
+
if (!this.element) throw new SetupNotCalledError();
|
|
138
|
+
const lastTrack = this.current;
|
|
139
|
+
const lastPosition = this.element.currentTime;
|
|
140
|
+
await super.load(track);
|
|
141
|
+
|
|
142
|
+
this.emitter.emit(Event.PlaybackActiveTrackChanged, {
|
|
143
|
+
lastTrack,
|
|
144
|
+
lastPosition,
|
|
145
|
+
lastIndex: this.lastIndex,
|
|
146
|
+
index: this.currentIndex,
|
|
147
|
+
track,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
public getQueue(): Track[] {
|
|
152
|
+
return this.playlist;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
public async setQueue(queue: Track[]) {
|
|
156
|
+
await this.stop();
|
|
157
|
+
this.playlist = queue;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
public getActiveTrack(): Track | undefined {
|
|
161
|
+
return this.current;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
public getActiveTrackIndex(): number | undefined {
|
|
165
|
+
// per the existing spec, this should throw if setup hasn't been called
|
|
166
|
+
if (!this.element || !this.player) throw new SetupNotCalledError();
|
|
167
|
+
return this.currentIndex;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* @deprecated
|
|
172
|
+
* @returns State
|
|
173
|
+
*/
|
|
174
|
+
public getState(): State {
|
|
175
|
+
return this.state.state;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
public getPlaybackState(): PlaybackState {
|
|
179
|
+
return this.state;
|
|
180
|
+
}
|
|
181
|
+
};
|
package/web/index.ts
ADDED
package/CHANGELOG.md
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
## [0.10.5](https://github.com/tanguyantoine/react-native-music-control/compare/v0.10.4...v0.10.5) (2019-07-10)
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
### Bug Fixes
|
|
5
|
-
|
|
6
|
-
* **android:** error can't find symbol Notification ([b572320](https://github.com/tanguyantoine/react-native-music-control/commit/b572320))
|
|
7
|
-
* **android:** migrate support libraries to androidx ([260f720](https://github.com/tanguyantoine/react-native-music-control/commit/260f720)), closes [#280](https://github.com/tanguyantoine/react-native-music-control/issues/280)
|
|
8
|
-
* **package.json:** remove unused rnpm object to fix warning in RN 0.60 ([fc48d40](https://github.com/tanguyantoine/react-native-music-control/commit/fc48d40))
|
|
9
|
-
* bump version ([9e6991a](https://github.com/tanguyantoine/react-native-music-control/commit/9e6991a))
|
|
10
|
-
* bump version ([3fccd12](https://github.com/tanguyantoine/react-native-music-control/commit/3fccd12))
|
|
11
|
-
|
|
12
|
-
## [0.10.4](https://github.com/tanguyantoine/react-native-music-control/compare/v0.10.3...v0.10.4) (2019-05-24)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
### Bug Fixes
|
|
16
|
-
|
|
17
|
-
* Illegal null AudioFocusRequest exception ([#261](https://github.com/tanguyantoine/react-native-music-control/issues/261)) ([351a1ab](https://github.com/tanguyantoine/react-native-music-control/commit/351a1ab)), closes [#260](https://github.com/tanguyantoine/react-native-music-control/issues/260)
|
|
18
|
-
|
|
19
|
-
## [0.10.3](https://github.com/tanguyantoine/react-native-music-control/compare/v0.10.2...v0.10.3) (2019-05-23)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
### Bug Fixes
|
|
23
|
-
|
|
24
|
-
* move variables around and trigger deploy ([6703bf7](https://github.com/tanguyantoine/react-native-music-control/commit/6703bf7))
|
|
25
|
-
|
|
26
|
-
## [0.10.2](https://github.com/tanguyantoine/react-native-music-control/compare/v0.10.1...v0.10.2) (2019-04-26)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
### Bug Fixes
|
|
30
|
-
|
|
31
|
-
* **ios:** call beginReceivingRemoteControlEvents ([442b77b](https://github.com/tanguyantoine/react-native-music-control/commit/442b77b))
|
|
32
|
-
* **ios:** update playback state using :setPlaybackState in iOS 11+ ([b2b1acc](https://github.com/tanguyantoine/react-native-music-control/commit/b2b1acc)), closes [#242](https://github.com/tanguyantoine/react-native-music-control/issues/242)
|
|
33
|
-
|
|
34
|
-
## [0.10.1](https://github.com/tanguyantoine/react-native-music-control/compare/v0.10.0...v0.10.1) (2019-04-26)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
### Bug Fixes
|
|
38
|
-
|
|
39
|
-
* do no skip prepack script ([51a2532](https://github.com/tanguyantoine/react-native-music-control/commit/51a2532))
|
|
40
|
-
|
|
41
|
-
# [0.10.0](https://github.com/tanguyantoine/react-native-music-control/compare/v0.9.9...v0.10.0) (2019-04-25)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
### Features
|
|
45
|
-
|
|
46
|
-
* Android interuption ([#240](https://github.com/tanguyantoine/react-native-music-control/issues/240)) ([7c5fe92](https://github.com/tanguyantoine/react-native-music-control/commit/7c5fe92))
|
|
47
|
-
|
|
48
|
-
## [0.9.9](https://github.com/tanguyantoine/react-native-music-control/compare/v0.9.8...v0.9.9) (2019-02-09)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
### Bug Fixes
|
|
52
|
-
|
|
53
|
-
* bump version ([c0c7754](https://github.com/tanguyantoine/react-native-music-control/commit/c0c7754))
|
|
54
|
-
|
|
55
|
-
## [0.9.8](https://github.com/tanguyantoine/react-native-music-control/compare/v0.9.7...v0.9.8) (2019-02-01)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
### Bug Fixes
|
|
59
|
-
|
|
60
|
-
* controls not showing on Android lock screen ([#227](https://github.com/tanguyantoine/react-native-music-control/issues/227)) ([51a6fc2](https://github.com/tanguyantoine/react-native-music-control/commit/51a6fc2))
|
|
61
|
-
* remove extra pause event related to app suspension in IOS10+ ([6ee2a86](https://github.com/tanguyantoine/react-native-music-control/commit/6ee2a86))
|
|
62
|
-
|
|
63
|
-
## [0.9.7](https://github.com/tanguyantoine/react-native-music-control/compare/v0.9.6...v0.9.7) (2019-01-11)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
### Bug Fixes
|
|
67
|
-
|
|
68
|
-
* stopForeground service ([36b1922](https://github.com/tanguyantoine/react-native-music-control/commit/36b1922))
|
|
69
|
-
|
|
70
|
-
## [0.9.6](https://github.com/tanguyantoine/react-native-music-control/compare/v0.9.5...v0.9.6) (2019-01-05)
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
### Bug Fixes
|
|
74
|
-
|
|
75
|
-
* release ([6efc1ad](https://github.com/tanguyantoine/react-native-music-control/commit/6efc1ad))
|