@javascriptcommon/react-native-track-player 1.2.23 → 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 +80 -63
- package/android/proguard-rules.txt +0 -3
- package/android/src/main/AndroidManifest.xml +10 -11
- 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/{guichaguri → doublesymmetry}/trackplayer/extensions/AudioPlayerStateExt.kt +3 -3
- 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/{guichaguri → doublesymmetry}/trackplayer/model/MetadataAdapter.kt +20 -17
- package/android/src/main/java/com/doublesymmetry/trackplayer/model/NowPlayingMetadata.kt +16 -0
- package/android/src/main/java/com/{guichaguri/trackplayer/kotlinaudio/models → doublesymmetry/trackplayer/model}/PlaybackMetadata.kt +31 -28
- package/android/src/main/java/com/{guichaguri → doublesymmetry}/trackplayer/model/State.kt +1 -1
- 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/{guichaguri → doublesymmetry}/trackplayer/module/MusicEvents.kt +10 -9
- 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/{guichaguri/trackplayer/service → doublesymmetry/trackplayer/utils}/BundleUtils.kt +50 -20
- 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/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/event/EventHolder.kt +7 -7
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/event/PlayerEventHolder.kt +22 -9
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/AudioContentType.kt +1 -1
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioItem.kt +118 -0
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/AudioItemTransitionReason.kt +3 -3
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/AudioPlayerState.kt +2 -2
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/BufferConfig.kt +1 -1
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/CacheConfig.kt +1 -1
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/Capability.kt +1 -1
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/CustomButton.kt +19 -0
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/FocusChangeData.kt +1 -1
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/MediaSessionCallback.kt +1 -1
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlayWhenReadyChangeData.kt +1 -3
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlaybackEndedReason.kt +1 -1
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlaybackError.kt +1 -1
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PlayerConfig.kt +8 -5
- package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayerOptions.kt +40 -0
- package/android/src/main/java/com/{guichaguri/trackplayer → lovegaoshi}/kotlinaudio/models/PositionChangedReason.kt +1 -1
- 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/{guichaguri/trackplayer/kotlinaudio/players → lovegaoshi/kotlinaudio/player}/QueuedAudioPlayer.kt +68 -58
- 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 +3 -4
- 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/ic_home-playstore.png +0 -0
- package/android/src/main/ic_repeat-playstore.png +0 -0
- package/android/src/main/ic_repeat_50-playstore.png +0 -0
- package/android/src/main/ic_shuffle-playstore.png +0 -0
- package/android/src/main/ic_shuffle_50-playstore.png +0 -0
- package/android/src/main/ic_shuffle_sm-playstore.png +0 -0
- package/android/src/main/ic_stop-playstore.png +0 -0
- package/android/src/main/ic_test-playstore.png +0 -0
- package/android/src/main/java/com/guichaguri/trackplayer/HeadlessJsMediaService.java +0 -225
- package/android/src/main/java/com/guichaguri/trackplayer/TrackPlayer.kt +0 -25
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/event/NotificationEventHolder.kt +0 -20
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AAMediaSessionCallback.kt +0 -10
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AudioItem.kt +0 -66
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationConfig.kt +0 -43
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationMetadata.kt +0 -8
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationState.kt +0 -8
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlayerOptions.kt +0 -9
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/QueuedPlayerOptions.kt +0 -49
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/notification/NotificationManager.kt +0 -678
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/AudioPlayer.kt +0 -10
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/BaseAudioPlayer.kt +0 -864
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/components/MediaSourceExt.kt +0 -35
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/components/PlayerCache.kt +0 -26
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/utils/Utils.kt +0 -12
- package/android/src/main/java/com/guichaguri/trackplayer/model/Track.kt +0 -120
- package/android/src/main/java/com/guichaguri/trackplayer/model/TrackAudioItem.kt +0 -19
- package/android/src/main/java/com/guichaguri/trackplayer/model/TrackType.kt +0 -11
- package/android/src/main/java/com/guichaguri/trackplayer/module/AutoConnectionDetector.kt +0 -151
- package/android/src/main/java/com/guichaguri/trackplayer/module/MusicModule.kt +0 -1177
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicBinder.kt +0 -31
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicManager.kt +0 -347
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicService.kt +0 -1254
- package/android/src/main/java/com/guichaguri/trackplayer/service/Utils.kt +0 -228
- package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/ButtonEvents.kt +0 -141
- package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/MetadataManager.kt +0 -396
- package/android/src/main/res/drawable-hdpi/ic_forward.png +0 -0
- package/android/src/main/res/drawable-hdpi/ic_home.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_home.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_home.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_home.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_home.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/android/src/main/res/mipmap-hdpi/ic_arrow_down_circle_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_clock_now_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_close_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_heart_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_heart_outlined_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_repeat_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_repeat_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_shuffle_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_shuffle_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_arrow_down_circle_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_clock_now_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_close_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_heart_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_heart_outlined_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_repeat_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_repeat_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_shuffle_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_shuffle_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_arrow_down_circle_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_clock_now_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_close_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_heart_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_heart_outlined_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_repeat_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_repeat_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_shuffle_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_shuffle_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_arrow_down_circle_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_clock_now_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_close_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_heart_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_heart_outlined_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_repeat_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_repeat_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_shuffle_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_shuffle_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_arrow_down_circle_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_clock_now_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_close_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_heart_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_heart_outlined_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_repeat_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_repeat_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_shuffle_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_shuffle_on_foreground.png +0 -0
- package/android/src/main/res/raw/silent_5_seconds.mp3 +0 -0
- package/android/src/main/res/strings.xml +0 -6
- package/index.d.ts +0 -235
- 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 -178
- /package/ios/{TrackPlayer.xcodeproj → Example/SwiftAudio.xcodeproj}/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { State } from '../../src/constants/State';
|
|
2
|
+
import { SetupNotCalledError } from './SetupNotCalledError';
|
|
3
|
+
export class Player {
|
|
4
|
+
hasInitialized = false;
|
|
5
|
+
element;
|
|
6
|
+
player;
|
|
7
|
+
_current = undefined;
|
|
8
|
+
_playWhenReady = false;
|
|
9
|
+
_state = { state: State.None };
|
|
10
|
+
// current getter/setter
|
|
11
|
+
get current() {
|
|
12
|
+
return this._current;
|
|
13
|
+
}
|
|
14
|
+
set current(cur) {
|
|
15
|
+
this._current = cur;
|
|
16
|
+
}
|
|
17
|
+
// state getter/setter
|
|
18
|
+
get state() {
|
|
19
|
+
return this._state;
|
|
20
|
+
}
|
|
21
|
+
set state(newState) {
|
|
22
|
+
this._state = newState;
|
|
23
|
+
}
|
|
24
|
+
// playWhenReady getter/setter
|
|
25
|
+
get playWhenReady() {
|
|
26
|
+
return this._playWhenReady;
|
|
27
|
+
}
|
|
28
|
+
set playWhenReady(pwr) {
|
|
29
|
+
this._playWhenReady = pwr;
|
|
30
|
+
}
|
|
31
|
+
async setupPlayer() {
|
|
32
|
+
// shaka only runs in a browser
|
|
33
|
+
if (typeof window === 'undefined')
|
|
34
|
+
return;
|
|
35
|
+
if (this.hasInitialized === true) {
|
|
36
|
+
// TODO: double check the structure of this error message
|
|
37
|
+
throw { code: 'player_already_initialized', message: 'The player has already been initialized via setupPlayer.' };
|
|
38
|
+
}
|
|
39
|
+
// @ts-ignore
|
|
40
|
+
const shaka = (await import('shaka-player/dist/shaka-player.ui')).default;
|
|
41
|
+
// Install built-in polyfills to patch browser incompatibilities.
|
|
42
|
+
shaka.polyfill.installAll();
|
|
43
|
+
// Check to see if the browser supports the basic APIs Shaka needs.
|
|
44
|
+
if (!shaka.Player.isBrowserSupported()) {
|
|
45
|
+
// This browser does not have the minimum set of APIs we need.
|
|
46
|
+
this.state = {
|
|
47
|
+
state: State.Error,
|
|
48
|
+
error: {
|
|
49
|
+
code: 'not_supported',
|
|
50
|
+
message: 'Browser not supported.',
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
throw new Error('Browser not supported.');
|
|
54
|
+
}
|
|
55
|
+
// build dom element and attach shaka-player
|
|
56
|
+
this.element = document.createElement('audio');
|
|
57
|
+
this.element.setAttribute('id', 'react-native-track-player');
|
|
58
|
+
this.player = new shaka.Player();
|
|
59
|
+
this.player?.attach(this.element);
|
|
60
|
+
// Listen for relevant events events.
|
|
61
|
+
this.player.addEventListener('error', (error) => {
|
|
62
|
+
// Extract the shaka.util.Error object from the event.
|
|
63
|
+
this.onError(error.detail);
|
|
64
|
+
});
|
|
65
|
+
this.element.addEventListener('ended', this.onStateUpdate.bind(this, State.Ended));
|
|
66
|
+
this.element.addEventListener('playing', this.onStateUpdate.bind(this, State.Playing));
|
|
67
|
+
this.element.addEventListener('pause', this.onStateUpdate.bind(this, State.Paused));
|
|
68
|
+
this.player.addEventListener('loading', this.onStateUpdate.bind(this, State.Loading));
|
|
69
|
+
this.player.addEventListener('loaded', this.onStateUpdate.bind(this, State.Ready));
|
|
70
|
+
this.player.addEventListener('buffering', ({ buffering }) => {
|
|
71
|
+
if (buffering === true) {
|
|
72
|
+
this.onStateUpdate(State.Buffering);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
// Attach player to the window to make it easy to access in the JS console.
|
|
76
|
+
// @ts-ignore
|
|
77
|
+
window.rntp = this.player;
|
|
78
|
+
this.hasInitialized = true;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* event handlers
|
|
82
|
+
*/
|
|
83
|
+
onStateUpdate(state) {
|
|
84
|
+
this.state = { state };
|
|
85
|
+
}
|
|
86
|
+
onError(error) {
|
|
87
|
+
// unload the current track to allow for clean playback on other
|
|
88
|
+
this.player?.unload();
|
|
89
|
+
this.state = {
|
|
90
|
+
state: State.Error,
|
|
91
|
+
error: {
|
|
92
|
+
code: error.code.toString(),
|
|
93
|
+
message: error.message,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
// Log the error.
|
|
97
|
+
console.debug('Error code', error.code, 'object', error);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* player control
|
|
101
|
+
*/
|
|
102
|
+
async load(track) {
|
|
103
|
+
if (!this.player)
|
|
104
|
+
throw new SetupNotCalledError();
|
|
105
|
+
await this.player.load(track.url);
|
|
106
|
+
this.current = track;
|
|
107
|
+
}
|
|
108
|
+
async retry() {
|
|
109
|
+
if (!this.player)
|
|
110
|
+
throw new SetupNotCalledError();
|
|
111
|
+
this.player.retryStreaming();
|
|
112
|
+
}
|
|
113
|
+
async stop() {
|
|
114
|
+
if (!this.player)
|
|
115
|
+
throw new SetupNotCalledError();
|
|
116
|
+
this.current = undefined;
|
|
117
|
+
await this.player.unload();
|
|
118
|
+
}
|
|
119
|
+
play() {
|
|
120
|
+
if (!this.element)
|
|
121
|
+
throw new SetupNotCalledError();
|
|
122
|
+
this.playWhenReady = true;
|
|
123
|
+
return this.element.play()
|
|
124
|
+
.catch(err => {
|
|
125
|
+
console.error(err);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
pause() {
|
|
129
|
+
if (!this.element)
|
|
130
|
+
throw new SetupNotCalledError();
|
|
131
|
+
this.playWhenReady = false;
|
|
132
|
+
return this.element.pause();
|
|
133
|
+
}
|
|
134
|
+
setRate(rate) {
|
|
135
|
+
if (!this.element)
|
|
136
|
+
throw new SetupNotCalledError();
|
|
137
|
+
return this.element.playbackRate = rate;
|
|
138
|
+
}
|
|
139
|
+
getRate() {
|
|
140
|
+
if (!this.element)
|
|
141
|
+
throw new SetupNotCalledError();
|
|
142
|
+
return this.element.playbackRate;
|
|
143
|
+
}
|
|
144
|
+
seekBy(offset) {
|
|
145
|
+
if (!this.element)
|
|
146
|
+
throw new SetupNotCalledError();
|
|
147
|
+
this.element.currentTime += offset;
|
|
148
|
+
}
|
|
149
|
+
seekTo(seconds) {
|
|
150
|
+
if (!this.element)
|
|
151
|
+
throw new SetupNotCalledError();
|
|
152
|
+
this.element.currentTime = seconds;
|
|
153
|
+
}
|
|
154
|
+
setVolume(volume) {
|
|
155
|
+
if (!this.element)
|
|
156
|
+
throw new SetupNotCalledError();
|
|
157
|
+
this.element.volume = volume;
|
|
158
|
+
}
|
|
159
|
+
getVolume() {
|
|
160
|
+
if (!this.element)
|
|
161
|
+
throw new SetupNotCalledError();
|
|
162
|
+
return this.element.volume;
|
|
163
|
+
}
|
|
164
|
+
getDuration() {
|
|
165
|
+
if (!this.element)
|
|
166
|
+
throw new SetupNotCalledError();
|
|
167
|
+
return this.element.duration;
|
|
168
|
+
}
|
|
169
|
+
getPosition() {
|
|
170
|
+
if (!this.element)
|
|
171
|
+
throw new SetupNotCalledError();
|
|
172
|
+
return this.element.currentTime;
|
|
173
|
+
}
|
|
174
|
+
getProgress() {
|
|
175
|
+
if (!this.element)
|
|
176
|
+
throw new SetupNotCalledError();
|
|
177
|
+
return {
|
|
178
|
+
position: this.element.currentTime,
|
|
179
|
+
duration: this.element.duration || 0,
|
|
180
|
+
buffered: 0, // TODO: this.element.buffered.end,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
getBufferedPosition() {
|
|
184
|
+
if (!this.element)
|
|
185
|
+
throw new SetupNotCalledError();
|
|
186
|
+
return this.element.buffered.end;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Player } from './Player';
|
|
2
|
+
import type { Track } from '../../src/interfaces';
|
|
3
|
+
import { RepeatMode } from './RepeatMode';
|
|
4
|
+
import { State } from '../../src';
|
|
5
|
+
export declare class PlaylistPlayer extends Player {
|
|
6
|
+
protected playlist: Track[];
|
|
7
|
+
protected lastIndex?: number;
|
|
8
|
+
protected _currentIndex?: number;
|
|
9
|
+
protected repeatMode: RepeatMode;
|
|
10
|
+
protected onStateUpdate(state: Exclude<State, State.Error>): Promise<void>;
|
|
11
|
+
protected onTrackEnded(): Promise<void>;
|
|
12
|
+
protected onPlaylistEnded(): void;
|
|
13
|
+
protected get currentIndex(): number | undefined;
|
|
14
|
+
protected set currentIndex(current: number | undefined);
|
|
15
|
+
protected goToIndex(index: number, initialPosition?: number): Promise<void>;
|
|
16
|
+
add(tracks: Track[], insertBeforeIndex?: number): Promise<void>;
|
|
17
|
+
skip(index: number, initialPosition?: number): Promise<void>;
|
|
18
|
+
skipToNext(initialPosition?: number): Promise<void>;
|
|
19
|
+
skipToPrevious(initialPosition?: number): Promise<void>;
|
|
20
|
+
getTrack(index: number): Track | null;
|
|
21
|
+
setRepeatMode(mode: RepeatMode): void;
|
|
22
|
+
getRepeatMode(): RepeatMode;
|
|
23
|
+
remove(indexes: number[]): Promise<void>;
|
|
24
|
+
stop(): Promise<void>;
|
|
25
|
+
reset(): Promise<void>;
|
|
26
|
+
removeUpcomingTracks(): Promise<void>;
|
|
27
|
+
move(fromIndex: number, toIndex: number): Promise<void>;
|
|
28
|
+
updateMetadataForTrack(index: number, metadata: Partial<Track>): void;
|
|
29
|
+
clearNowPlayingMetadata(): void;
|
|
30
|
+
updateNowPlayingMetadata(metadata: Partial<Track>): void;
|
|
31
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { Player } from './Player';
|
|
2
|
+
import { RepeatMode } from './RepeatMode';
|
|
3
|
+
import { State } from '../../src';
|
|
4
|
+
export class PlaylistPlayer extends Player {
|
|
5
|
+
// TODO: use immer to make the `playlist` immutable
|
|
6
|
+
playlist = [];
|
|
7
|
+
lastIndex;
|
|
8
|
+
_currentIndex;
|
|
9
|
+
repeatMode = RepeatMode.Off;
|
|
10
|
+
async onStateUpdate(state) {
|
|
11
|
+
super.onStateUpdate(state);
|
|
12
|
+
if (state === State.Ended) {
|
|
13
|
+
await this.onTrackEnded();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async onTrackEnded() {
|
|
17
|
+
switch (this.repeatMode) {
|
|
18
|
+
case RepeatMode.Track:
|
|
19
|
+
if (this.currentIndex !== undefined) {
|
|
20
|
+
await this.goToIndex(this.currentIndex);
|
|
21
|
+
}
|
|
22
|
+
break;
|
|
23
|
+
case RepeatMode.Playlist:
|
|
24
|
+
if (this.currentIndex === this.playlist.length - 1) {
|
|
25
|
+
await this.goToIndex(0);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
await this.skipToNext();
|
|
29
|
+
}
|
|
30
|
+
break;
|
|
31
|
+
default:
|
|
32
|
+
try {
|
|
33
|
+
await this.skipToNext();
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
if (err.message !== 'playlist_exhausted') {
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
this.onPlaylistEnded();
|
|
40
|
+
}
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
45
|
+
onPlaylistEnded() { }
|
|
46
|
+
get currentIndex() {
|
|
47
|
+
return this._currentIndex;
|
|
48
|
+
}
|
|
49
|
+
set currentIndex(current) {
|
|
50
|
+
this.lastIndex = this.currentIndex;
|
|
51
|
+
this._currentIndex = current;
|
|
52
|
+
}
|
|
53
|
+
async goToIndex(index, initialPosition) {
|
|
54
|
+
const track = this.playlist[index];
|
|
55
|
+
if (!track) {
|
|
56
|
+
throw new Error('playlist_exhausted');
|
|
57
|
+
}
|
|
58
|
+
if (this.currentIndex !== index) {
|
|
59
|
+
this.currentIndex = index;
|
|
60
|
+
await this.load(track);
|
|
61
|
+
}
|
|
62
|
+
if (initialPosition) {
|
|
63
|
+
this.seekTo(initialPosition);
|
|
64
|
+
}
|
|
65
|
+
if (this.playWhenReady) {
|
|
66
|
+
await this.play();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async add(tracks, insertBeforeIndex) {
|
|
70
|
+
if (insertBeforeIndex !== -1 && insertBeforeIndex !== undefined) {
|
|
71
|
+
this.playlist.splice(insertBeforeIndex, 0, ...tracks);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
this.playlist.push(...tracks);
|
|
75
|
+
}
|
|
76
|
+
if (this.currentIndex === undefined) {
|
|
77
|
+
await this.goToIndex(0);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async skip(index, initialPosition) {
|
|
81
|
+
const track = this.playlist[index];
|
|
82
|
+
if (track === undefined) {
|
|
83
|
+
throw new Error('index out of bounds');
|
|
84
|
+
}
|
|
85
|
+
await this.goToIndex(index, initialPosition);
|
|
86
|
+
}
|
|
87
|
+
async skipToNext(initialPosition) {
|
|
88
|
+
if (this.currentIndex === undefined)
|
|
89
|
+
return;
|
|
90
|
+
const index = this.currentIndex + 1;
|
|
91
|
+
await this.goToIndex(index, initialPosition);
|
|
92
|
+
}
|
|
93
|
+
async skipToPrevious(initialPosition) {
|
|
94
|
+
if (this.currentIndex === undefined)
|
|
95
|
+
return;
|
|
96
|
+
const index = this.currentIndex - 1;
|
|
97
|
+
await this.goToIndex(index, initialPosition);
|
|
98
|
+
}
|
|
99
|
+
getTrack(index) {
|
|
100
|
+
const track = this.playlist[index];
|
|
101
|
+
return track || null;
|
|
102
|
+
}
|
|
103
|
+
setRepeatMode(mode) {
|
|
104
|
+
this.repeatMode = mode;
|
|
105
|
+
}
|
|
106
|
+
getRepeatMode() {
|
|
107
|
+
return this.repeatMode;
|
|
108
|
+
}
|
|
109
|
+
async remove(indexes) {
|
|
110
|
+
const idxMap = indexes.reduce((acc, elem) => {
|
|
111
|
+
acc[elem] = true;
|
|
112
|
+
return acc;
|
|
113
|
+
}, {});
|
|
114
|
+
let isCurrentRemoved = false;
|
|
115
|
+
this.playlist = this.playlist.filter((_track, idx) => {
|
|
116
|
+
const keep = !idxMap[idx];
|
|
117
|
+
if (!keep && idx === this.currentIndex) {
|
|
118
|
+
isCurrentRemoved = true;
|
|
119
|
+
}
|
|
120
|
+
return keep;
|
|
121
|
+
});
|
|
122
|
+
if (this.currentIndex === undefined) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const hasItems = this.playlist.length > 0;
|
|
126
|
+
if (isCurrentRemoved && hasItems) {
|
|
127
|
+
await this.goToIndex(this.currentIndex % this.playlist.length);
|
|
128
|
+
}
|
|
129
|
+
else if (isCurrentRemoved) {
|
|
130
|
+
await this.stop();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async stop() {
|
|
134
|
+
await super.stop();
|
|
135
|
+
this.currentIndex = undefined;
|
|
136
|
+
}
|
|
137
|
+
async reset() {
|
|
138
|
+
await this.stop();
|
|
139
|
+
this.playlist = [];
|
|
140
|
+
}
|
|
141
|
+
async removeUpcomingTracks() {
|
|
142
|
+
if (this.currentIndex === undefined)
|
|
143
|
+
return;
|
|
144
|
+
this.playlist = this.playlist.slice(0, this.currentIndex + 1);
|
|
145
|
+
}
|
|
146
|
+
async move(fromIndex, toIndex) {
|
|
147
|
+
if (!this.playlist[fromIndex]) {
|
|
148
|
+
throw new Error('index out of bounds');
|
|
149
|
+
}
|
|
150
|
+
if (this.currentIndex === fromIndex) {
|
|
151
|
+
throw new Error('you cannot move the currently playing track');
|
|
152
|
+
}
|
|
153
|
+
if (this.currentIndex === toIndex) {
|
|
154
|
+
throw new Error('you cannot replace the currently playing track');
|
|
155
|
+
}
|
|
156
|
+
// calculate `currentIndex` after move
|
|
157
|
+
let shift = undefined;
|
|
158
|
+
if (this.currentIndex) {
|
|
159
|
+
if (fromIndex < this.currentIndex && toIndex > this.currentIndex) {
|
|
160
|
+
shift = -1;
|
|
161
|
+
}
|
|
162
|
+
else if (fromIndex > this.currentIndex && toIndex < this.currentIndex) {
|
|
163
|
+
shift = +1;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// move the track
|
|
167
|
+
const fromItem = this.playlist[fromIndex];
|
|
168
|
+
this.playlist.splice(fromIndex, 1);
|
|
169
|
+
this.playlist.splice(toIndex, 0, fromItem);
|
|
170
|
+
if (this.currentIndex && shift) {
|
|
171
|
+
this.currentIndex = this.currentIndex + shift;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// TODO
|
|
175
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
176
|
+
updateMetadataForTrack(index, metadata) { }
|
|
177
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
178
|
+
clearNowPlayingMetadata() { }
|
|
179
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
180
|
+
updateNowPlayingMetadata(metadata) { }
|
|
181
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { PlaybackState, State } from '../src';
|
|
2
|
+
import type { Track, UpdateOptions } from '../src';
|
|
3
|
+
import { PlaylistPlayer, RepeatMode } from './TrackPlayer';
|
|
4
|
+
export declare class TrackPlayerModule extends PlaylistPlayer {
|
|
5
|
+
protected emitter: import("react-native").DeviceEventEmitterStatic;
|
|
6
|
+
protected progressUpdateEventInterval: any;
|
|
7
|
+
readonly CAPABILITY_PLAY = "CAPABILITY_PLAY";
|
|
8
|
+
readonly CAPABILITY_PLAY_FROM_ID = "CAPABILITY_PLAY_FROM_ID";
|
|
9
|
+
readonly CAPABILITY_PLAY_FROM_SEARCH = "CAPABILITY_PLAY_FROM_SEARCH";
|
|
10
|
+
readonly CAPABILITY_PAUSE = "CAPABILITY_PAUSE";
|
|
11
|
+
readonly CAPABILITY_STOP = "CAPABILITY_STOP";
|
|
12
|
+
readonly CAPABILITY_SEEK_TO = "CAPABILITY_SEEK_TO";
|
|
13
|
+
readonly CAPABILITY_SKIP = "CAPABILITY_SKIP";
|
|
14
|
+
readonly CAPABILITY_SKIP_TO_NEXT = "CAPABILITY_SKIP_TO_NEXT";
|
|
15
|
+
readonly CAPABILITY_SKIP_TO_PREVIOUS = "CAPABILITY_SKIP_TO_PREVIOUS";
|
|
16
|
+
readonly CAPABILITY_JUMP_FORWARD = "CAPABILITY_JUMP_FORWARD";
|
|
17
|
+
readonly CAPABILITY_JUMP_BACKWARD = "CAPABILITY_JUMP_BACKWARD";
|
|
18
|
+
readonly CAPABILITY_SET_RATING = "CAPABILITY_SET_RATING";
|
|
19
|
+
readonly CAPABILITY_LIKE = "CAPABILITY_LIKE";
|
|
20
|
+
readonly CAPABILITY_DISLIKE = "CAPABILITY_DISLIKE";
|
|
21
|
+
readonly CAPABILITY_BOOKMARK = "CAPABILITY_BOOKMARK";
|
|
22
|
+
readonly STATE_NONE = "STATE_NONE";
|
|
23
|
+
readonly STATE_READY = "STATE_READY";
|
|
24
|
+
readonly STATE_PLAYING = "STATE_PLAYING";
|
|
25
|
+
readonly STATE_PAUSED = "STATE_PAUSED";
|
|
26
|
+
readonly STATE_STOPPED = "STATE_STOPPED";
|
|
27
|
+
readonly STATE_BUFFERING = "STATE_BUFFERING";
|
|
28
|
+
readonly STATE_CONNECTING = "STATE_CONNECTING";
|
|
29
|
+
readonly RATING_HEART = "RATING_HEART";
|
|
30
|
+
readonly RATING_THUMBS_UP_DOWN = "RATING_THUMBS_UP_DOWN";
|
|
31
|
+
readonly RATING_3_STARS = "RATING_3_STARS";
|
|
32
|
+
readonly RATING_4_STARS = "RATING_4_STARS";
|
|
33
|
+
readonly RATING_5_STARS = "RATING_5_STARS";
|
|
34
|
+
readonly RATING_PERCENTAGE = "RATING_PERCENTAGE";
|
|
35
|
+
readonly REPEAT_OFF = RepeatMode.Off;
|
|
36
|
+
readonly REPEAT_TRACK = RepeatMode.Track;
|
|
37
|
+
readonly REPEAT_QUEUE = RepeatMode.Playlist;
|
|
38
|
+
readonly PITCH_ALGORITHM_LINEAR = "PITCH_ALGORITHM_LINEAR";
|
|
39
|
+
readonly PITCH_ALGORITHM_MUSIC = "PITCH_ALGORITHM_MUSIC";
|
|
40
|
+
readonly PITCH_ALGORITHM_VOICE = "PITCH_ALGORITHM_VOICE";
|
|
41
|
+
get state(): PlaybackState;
|
|
42
|
+
set state(newState: PlaybackState);
|
|
43
|
+
updateOptions(options: UpdateOptions): Promise<void>;
|
|
44
|
+
protected setupProgressUpdates(interval?: number): void;
|
|
45
|
+
protected clearUpdateEventInterval(): void;
|
|
46
|
+
protected onTrackEnded(): Promise<void>;
|
|
47
|
+
protected onPlaylistEnded(): Promise<void>;
|
|
48
|
+
get playWhenReady(): boolean;
|
|
49
|
+
set playWhenReady(pwr: boolean);
|
|
50
|
+
getPlayWhenReady(): boolean;
|
|
51
|
+
setPlayWhenReady(pwr: boolean): boolean;
|
|
52
|
+
load(track: Track): Promise<void>;
|
|
53
|
+
getQueue(): Track[];
|
|
54
|
+
setQueue(queue: Track[]): Promise<void>;
|
|
55
|
+
getActiveTrack(): Track | undefined;
|
|
56
|
+
getActiveTrackIndex(): number | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* @deprecated
|
|
59
|
+
* @returns State
|
|
60
|
+
*/
|
|
61
|
+
getState(): State;
|
|
62
|
+
getPlaybackState(): PlaybackState;
|
|
63
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { DeviceEventEmitter } from 'react-native';
|
|
2
|
+
import { Event, State } from '../src';
|
|
3
|
+
import { PlaylistPlayer, RepeatMode } from './TrackPlayer';
|
|
4
|
+
import { SetupNotCalledError } from './TrackPlayer/SetupNotCalledError';
|
|
5
|
+
export class TrackPlayerModule extends PlaylistPlayer {
|
|
6
|
+
emitter = DeviceEventEmitter;
|
|
7
|
+
progressUpdateEventInterval;
|
|
8
|
+
// Capabilities
|
|
9
|
+
CAPABILITY_PLAY = 'CAPABILITY_PLAY';
|
|
10
|
+
CAPABILITY_PLAY_FROM_ID = 'CAPABILITY_PLAY_FROM_ID';
|
|
11
|
+
CAPABILITY_PLAY_FROM_SEARCH = 'CAPABILITY_PLAY_FROM_SEARCH';
|
|
12
|
+
CAPABILITY_PAUSE = 'CAPABILITY_PAUSE';
|
|
13
|
+
CAPABILITY_STOP = 'CAPABILITY_STOP';
|
|
14
|
+
CAPABILITY_SEEK_TO = 'CAPABILITY_SEEK_TO';
|
|
15
|
+
CAPABILITY_SKIP = 'CAPABILITY_SKIP';
|
|
16
|
+
CAPABILITY_SKIP_TO_NEXT = 'CAPABILITY_SKIP_TO_NEXT';
|
|
17
|
+
CAPABILITY_SKIP_TO_PREVIOUS = 'CAPABILITY_SKIP_TO_PREVIOUS';
|
|
18
|
+
CAPABILITY_JUMP_FORWARD = 'CAPABILITY_JUMP_FORWARD';
|
|
19
|
+
CAPABILITY_JUMP_BACKWARD = 'CAPABILITY_JUMP_BACKWARD';
|
|
20
|
+
CAPABILITY_SET_RATING = 'CAPABILITY_SET_RATING';
|
|
21
|
+
CAPABILITY_LIKE = 'CAPABILITY_LIKE';
|
|
22
|
+
CAPABILITY_DISLIKE = 'CAPABILITY_DISLIKE';
|
|
23
|
+
CAPABILITY_BOOKMARK = 'CAPABILITY_BOOKMARK';
|
|
24
|
+
// States
|
|
25
|
+
STATE_NONE = 'STATE_NONE';
|
|
26
|
+
STATE_READY = 'STATE_READY';
|
|
27
|
+
STATE_PLAYING = 'STATE_PLAYING';
|
|
28
|
+
STATE_PAUSED = 'STATE_PAUSED';
|
|
29
|
+
STATE_STOPPED = 'STATE_STOPPED';
|
|
30
|
+
STATE_BUFFERING = 'STATE_BUFFERING';
|
|
31
|
+
STATE_CONNECTING = 'STATE_CONNECTING';
|
|
32
|
+
// Rating Types
|
|
33
|
+
RATING_HEART = 'RATING_HEART';
|
|
34
|
+
RATING_THUMBS_UP_DOWN = 'RATING_THUMBS_UP_DOWN';
|
|
35
|
+
RATING_3_STARS = 'RATING_3_STARS';
|
|
36
|
+
RATING_4_STARS = 'RATING_4_STARS';
|
|
37
|
+
RATING_5_STARS = 'RATING_5_STARS';
|
|
38
|
+
RATING_PERCENTAGE = 'RATING_PERCENTAGE';
|
|
39
|
+
// Repeat Modes
|
|
40
|
+
REPEAT_OFF = RepeatMode.Off;
|
|
41
|
+
REPEAT_TRACK = RepeatMode.Track;
|
|
42
|
+
REPEAT_QUEUE = RepeatMode.Playlist;
|
|
43
|
+
// Pitch Algorithms
|
|
44
|
+
PITCH_ALGORITHM_LINEAR = 'PITCH_ALGORITHM_LINEAR';
|
|
45
|
+
PITCH_ALGORITHM_MUSIC = 'PITCH_ALGORITHM_MUSIC';
|
|
46
|
+
PITCH_ALGORITHM_VOICE = 'PITCH_ALGORITHM_VOICE';
|
|
47
|
+
// observe and emit state changes
|
|
48
|
+
get state() {
|
|
49
|
+
return super.state;
|
|
50
|
+
}
|
|
51
|
+
set state(newState) {
|
|
52
|
+
super.state = newState;
|
|
53
|
+
this.emitter.emit(Event.PlaybackState, newState);
|
|
54
|
+
}
|
|
55
|
+
async updateOptions(options) {
|
|
56
|
+
this.setupProgressUpdates(options.progressUpdateEventInterval);
|
|
57
|
+
}
|
|
58
|
+
setupProgressUpdates(interval) {
|
|
59
|
+
// clear and reset interval
|
|
60
|
+
this.clearUpdateEventInterval();
|
|
61
|
+
if (interval) {
|
|
62
|
+
this.clearUpdateEventInterval();
|
|
63
|
+
this.progressUpdateEventInterval = setInterval(async () => {
|
|
64
|
+
if (this.state.state === State.Playing) {
|
|
65
|
+
const progress = await this.getProgress();
|
|
66
|
+
this.emitter.emit(Event.PlaybackProgressUpdated, {
|
|
67
|
+
...progress,
|
|
68
|
+
track: this.currentIndex,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}, interval * 1000);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
clearUpdateEventInterval() {
|
|
75
|
+
if (this.progressUpdateEventInterval) {
|
|
76
|
+
clearInterval(this.progressUpdateEventInterval);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async onTrackEnded() {
|
|
80
|
+
const position = this.element.currentTime;
|
|
81
|
+
await super.onTrackEnded();
|
|
82
|
+
this.emitter.emit(Event.PlaybackTrackChanged, {
|
|
83
|
+
track: this.lastIndex,
|
|
84
|
+
position,
|
|
85
|
+
nextTrack: this.currentIndex,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async onPlaylistEnded() {
|
|
89
|
+
await super.onPlaylistEnded();
|
|
90
|
+
this.emitter.emit(Event.PlaybackQueueEnded, {
|
|
91
|
+
track: this.currentIndex,
|
|
92
|
+
position: this.element.currentTime,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
get playWhenReady() {
|
|
96
|
+
return super.playWhenReady;
|
|
97
|
+
}
|
|
98
|
+
set playWhenReady(pwr) {
|
|
99
|
+
const didChange = pwr !== this._playWhenReady;
|
|
100
|
+
super.playWhenReady = pwr;
|
|
101
|
+
if (didChange) {
|
|
102
|
+
this.emitter.emit(Event.PlaybackPlayWhenReadyChanged, { playWhenReady: this._playWhenReady });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
getPlayWhenReady() {
|
|
106
|
+
return this.playWhenReady;
|
|
107
|
+
}
|
|
108
|
+
setPlayWhenReady(pwr) {
|
|
109
|
+
this.playWhenReady = pwr;
|
|
110
|
+
return this.playWhenReady;
|
|
111
|
+
}
|
|
112
|
+
async load(track) {
|
|
113
|
+
if (!this.element)
|
|
114
|
+
throw new SetupNotCalledError();
|
|
115
|
+
const lastTrack = this.current;
|
|
116
|
+
const lastPosition = this.element.currentTime;
|
|
117
|
+
await super.load(track);
|
|
118
|
+
this.emitter.emit(Event.PlaybackActiveTrackChanged, {
|
|
119
|
+
lastTrack,
|
|
120
|
+
lastPosition,
|
|
121
|
+
lastIndex: this.lastIndex,
|
|
122
|
+
index: this.currentIndex,
|
|
123
|
+
track,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
getQueue() {
|
|
127
|
+
return this.playlist;
|
|
128
|
+
}
|
|
129
|
+
async setQueue(queue) {
|
|
130
|
+
await this.stop();
|
|
131
|
+
this.playlist = queue;
|
|
132
|
+
}
|
|
133
|
+
getActiveTrack() {
|
|
134
|
+
return this.current;
|
|
135
|
+
}
|
|
136
|
+
getActiveTrackIndex() {
|
|
137
|
+
// per the existing spec, this should throw if setup hasn't been called
|
|
138
|
+
if (!this.element || !this.player)
|
|
139
|
+
throw new SetupNotCalledError();
|
|
140
|
+
return this.currentIndex;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* @deprecated
|
|
144
|
+
* @returns State
|
|
145
|
+
*/
|
|
146
|
+
getState() {
|
|
147
|
+
return this.state.state;
|
|
148
|
+
}
|
|
149
|
+
getPlaybackState() {
|
|
150
|
+
return this.state;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
;
|
package/lib/web/index.js
ADDED