@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.
Files changed (437) hide show
  1. package/LICENSE +201 -21
  2. package/README.md +8 -0
  3. package/android/build.gradle +92 -18
  4. package/android/proguard-rules.txt +0 -3
  5. package/android/src/main/AndroidManifest.xml +10 -13
  6. package/android/src/main/java/com/doublesymmetry/trackplayer/HeadlessJsMediaService.kt +199 -0
  7. package/android/src/main/java/com/doublesymmetry/trackplayer/TrackPlayer.kt +33 -0
  8. package/android/src/main/java/com/doublesymmetry/trackplayer/extensions/AudioPlayerStateExt.kt +19 -0
  9. package/android/src/main/java/com/doublesymmetry/trackplayer/extensions/EnumExtensions.kt +5 -0
  10. package/android/src/main/java/com/doublesymmetry/trackplayer/extensions/NumberExt.kt +13 -0
  11. package/android/src/main/java/com/doublesymmetry/trackplayer/model/MetadataAdapter.kt +227 -0
  12. package/android/src/main/java/com/doublesymmetry/trackplayer/model/NowPlayingMetadata.kt +16 -0
  13. package/android/src/main/java/com/doublesymmetry/trackplayer/model/PlaybackMetadata.kt +203 -0
  14. package/android/src/main/java/com/doublesymmetry/trackplayer/model/State.kt +13 -0
  15. package/android/src/main/java/com/doublesymmetry/trackplayer/model/Track.kt +67 -0
  16. package/android/src/main/java/com/doublesymmetry/trackplayer/model/TrackAudioItem.kt +18 -0
  17. package/android/src/main/java/com/doublesymmetry/trackplayer/model/TrackMetadata.kt +38 -0
  18. package/android/src/main/java/com/doublesymmetry/trackplayer/module/MusicEvents.kt +67 -0
  19. package/android/src/main/java/com/doublesymmetry/trackplayer/module/MusicModule.kt +778 -0
  20. package/android/src/main/java/com/doublesymmetry/trackplayer/service/MusicService.kt +1286 -0
  21. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/AppForegroundTracker.kt +35 -0
  22. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/BundleUtils.kt +147 -0
  23. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/CoilBitmapLoader.kt +65 -0
  24. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/MediaItemBuilder.kt +41 -0
  25. package/android/src/main/java/com/doublesymmetry/trackplayer/utils/RejectionException.kt +11 -0
  26. package/android/src/main/java/com/doublesymmetry/trackplayer/video/TrackPlayerVideoView.kt +42 -0
  27. package/android/src/main/java/com/doublesymmetry/trackplayer/video/TrackPlayerVideoViewManager.kt +18 -0
  28. package/android/src/main/java/com/lovegaoshi/kotlinaudio/event/EventHolder.kt +30 -0
  29. package/android/src/main/java/com/lovegaoshi/kotlinaudio/event/PlayerEventHolder.kt +124 -0
  30. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioContentType.kt +10 -0
  31. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioItem.kt +118 -0
  32. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioItemTransitionReason.kt +33 -0
  33. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioPlayerState.kt +30 -0
  34. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/BufferConfig.kt +8 -0
  35. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/CacheConfig.kt +17 -0
  36. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/Capability.kt +19 -0
  37. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/CustomButton.kt +19 -0
  38. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/FocusChangeData.kt +3 -0
  39. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/MediaSessionCallback.kt +17 -0
  40. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayWhenReadyChangeData.kt +3 -0
  41. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlaybackEndedReason.kt +5 -0
  42. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlaybackError.kt +6 -0
  43. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayerConfig.kt +36 -0
  44. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayerOptions.kt +40 -0
  45. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PositionChangedReason.kt +39 -0
  46. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/RepeatMode.kt +16 -0
  47. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/WakeMode.kt +7 -0
  48. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/AudioPlayer.kt +756 -0
  49. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/ForwardingPlayer.java +1124 -0
  50. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/QueuedAudioPlayer.kt +279 -0
  51. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/APMRenderersFactory.kt +33 -0
  52. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/Buffer.kt +34 -0
  53. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/Cache.kt +27 -0
  54. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/FocusManager.kt +59 -0
  55. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/MediaFactory.kt +130 -0
  56. package/android/src/main/java/com/lovegaoshi/kotlinaudio/processors/TeeListener.kt +171 -0
  57. package/android/src/main/java/com/lovegaoshi/kotlinaudio/service/MusicService.kt +127 -0
  58. package/android/src/main/java/com/lovegaoshi/kotlinaudio/utils/FFT.java +99 -0
  59. package/android/src/main/java/com/lovegaoshi/kotlinaudio/utils/Utils.kt +113 -0
  60. package/android/src/main/res/drawable/baseline_repeat_24.xml +5 -0
  61. package/android/src/main/res/drawable/baseline_repeat_one_24.xml +5 -0
  62. package/android/src/main/res/drawable/forward.xml +5 -0
  63. package/android/src/main/res/drawable/heart_24px.xml +5 -0
  64. package/android/src/main/res/drawable/hearte_24px.xml +5 -0
  65. package/android/src/main/res/drawable/ifl_24px.xml +5 -0
  66. package/android/src/main/res/drawable/rewind.xml +5 -0
  67. package/android/src/main/res/drawable/shuffle_24px.xml +5 -0
  68. package/android/src/main/res/values/strings.xml +5 -0
  69. package/android/src/main/res/xml/automotive_app_desc.xml +3 -0
  70. package/ios/Example/SwiftAudio/Assets.xcassets/22AMI.imageset/22AMillion.jpg +0 -0
  71. package/ios/Example/SwiftAudio/Assets.xcassets/22AMI.imageset/Contents.json +21 -0
  72. package/ios/Example/SwiftAudio/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  73. package/ios/Example/SwiftAudio/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  74. package/ios/Example/SwiftAudio/Assets.xcassets/Contents.json +6 -0
  75. package/ios/Example/SwiftAudio/Assets.xcassets/cover.imageset/Contents.json +21 -0
  76. package/ios/Example/SwiftAudio/Assets.xcassets/cover.imageset/cover.jpg +0 -0
  77. package/ios/Example/SwiftAudio/AudioController.swift +46 -0
  78. package/ios/Example/SwiftAudio/Extensions.swift +22 -0
  79. package/ios/Example/SwiftAudio/PlayerView.swift +172 -0
  80. package/ios/Example/SwiftAudio/PlayerViewModel.swift +120 -0
  81. package/ios/Example/SwiftAudio/Preview Content/Preview Assets.xcassets/Contents.json +6 -0
  82. package/ios/Example/SwiftAudio/QueueView.swift +65 -0
  83. package/ios/{TrackPlayer.xcodeproj/xcuserdata/marco.xcuserdatad/xcschemes/xcschememanagement.plist → Example/SwiftAudio/SwiftAudio.entitlements} +6 -8
  84. package/ios/Example/SwiftAudio/SwiftAudioApp.swift +17 -0
  85. package/ios/Example/SwiftAudio.xcodeproj/project.pbxproj +412 -0
  86. package/ios/{TrackPlayer.xcodeproj → Example/SwiftAudio.xcodeproj}/project.xcworkspace/contents.xcworkspacedata +1 -1
  87. package/ios/RNTrackPlayer/Models/Capabilities.swift +39 -4
  88. package/ios/RNTrackPlayer/Models/MediaURL.swift +12 -6
  89. package/ios/RNTrackPlayer/Models/MetadataAdapter.swift +147 -0
  90. package/ios/RNTrackPlayer/Models/PitchAlgorithms.swift +13 -0
  91. package/ios/RNTrackPlayer/Models/SessionCategories.swift +106 -0
  92. package/ios/RNTrackPlayer/Models/State.swift +26 -0
  93. package/ios/RNTrackPlayer/Models/Track.swift +74 -54
  94. package/ios/RNTrackPlayer/RNTrackPlayer.swift +867 -406
  95. package/ios/RNTrackPlayer/Support/RNTrackPlayer-Bridging-Header.h +1 -0
  96. package/ios/RNTrackPlayer/TrackPlayer.h +14 -0
  97. package/ios/RNTrackPlayer/TrackPlayer.mm +249 -0
  98. package/ios/RNTrackPlayer/Utils/EventType.swift +45 -0
  99. package/ios/RNTrackPlayer/Utils/Metadata.swift +60 -0
  100. package/ios/RNTrackPlayer/Video/RNTrackPlayerVideoView.swift +83 -0
  101. package/ios/RNTrackPlayer/Video/RNTrackPlayerVideoViewManager.m +5 -0
  102. package/ios/RNTrackPlayer/Video/RNTrackPlayerVideoViewManager.swift +17 -0
  103. package/ios/SwiftAudioEx/Package.swift +20 -0
  104. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapper.swift +531 -0
  105. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperDelegate.swift +27 -0
  106. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperProtocol.swift +69 -0
  107. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperState.swift +43 -0
  108. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioItem.swift +158 -0
  109. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioPlayer.swift +459 -0
  110. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioPlayerError.swift +26 -0
  111. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioSessionController/AudioSession.swift +33 -0
  112. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioSessionController/AudioSessionController.swift +135 -0
  113. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioTap.swift +96 -0
  114. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Event.swift +155 -0
  115. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/MediaItemProperty.swift +95 -0
  116. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoCenter.swift +17 -0
  117. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoController.swift +73 -0
  118. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoControllerProtocol.swift +26 -0
  119. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoKeyValue.swift +14 -0
  120. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoProperty.swift +234 -0
  121. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerItemNotificationObserver.swift +102 -0
  122. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerItemObserver.swift +136 -0
  123. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerObserver.swift +120 -0
  124. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerTimeObserver.swift +112 -0
  125. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/QueueManager.swift +356 -0
  126. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/QueuedAudioPlayer.swift +236 -0
  127. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RemoteCommandController/RemoteCommand.swift +170 -0
  128. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RemoteCommandController/RemoteCommandController.swift +206 -0
  129. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RepeatMode.swift +15 -0
  130. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/TimeEventFrequency.swift +26 -0
  131. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Utils/DispatchQueueType.swift +18 -0
  132. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/WaveformAudioTap.swift +159 -0
  133. package/lib/specs/NativeTrackPlayer.d.ts +134 -0
  134. package/lib/specs/NativeTrackPlayer.js +4 -0
  135. package/lib/src/TrackPlayerModule.web.d.ts +2 -0
  136. package/lib/src/TrackPlayerModule.web.js +2 -0
  137. package/lib/src/VideoView.d.ts +16 -0
  138. package/lib/src/VideoView.js +25 -0
  139. package/lib/src/constants/AndroidAudioContentType.d.ts +35 -0
  140. package/lib/src/constants/AndroidAudioContentType.js +36 -0
  141. package/lib/src/constants/AndroidAutoContentStyle.d.ts +10 -0
  142. package/lib/src/constants/AndroidAutoContentStyle.js +11 -0
  143. package/lib/src/constants/AppKilledPlaybackBehavior.d.ts +17 -0
  144. package/lib/src/constants/AppKilledPlaybackBehavior.js +18 -0
  145. package/lib/src/constants/Capability.d.ts +17 -0
  146. package/lib/src/constants/Capability.js +19 -0
  147. package/lib/src/constants/Event.d.ts +172 -0
  148. package/lib/src/constants/Event.js +173 -0
  149. package/lib/src/constants/IOSCategory.d.ts +36 -0
  150. package/lib/src/constants/IOSCategory.js +37 -0
  151. package/lib/src/constants/IOSCategoryMode.d.ts +47 -0
  152. package/lib/src/constants/IOSCategoryMode.js +48 -0
  153. package/lib/src/constants/IOSCategoryOptions.d.ts +44 -0
  154. package/lib/src/constants/IOSCategoryOptions.js +45 -0
  155. package/lib/src/constants/MediaItemPlayable.d.ts +4 -0
  156. package/lib/src/constants/MediaItemPlayable.js +5 -0
  157. package/lib/src/constants/PitchAlgorithm.d.ts +14 -0
  158. package/lib/src/constants/PitchAlgorithm.js +16 -0
  159. package/lib/src/constants/RatingType.d.ts +8 -0
  160. package/lib/src/constants/RatingType.js +10 -0
  161. package/lib/src/constants/RepeatMode.d.ts +8 -0
  162. package/lib/src/constants/RepeatMode.js +10 -0
  163. package/lib/src/constants/State.d.ts +34 -0
  164. package/lib/src/constants/State.js +35 -0
  165. package/lib/src/constants/TrackType.d.ts +6 -0
  166. package/lib/src/constants/TrackType.js +7 -0
  167. package/lib/src/constants/index.d.ts +14 -0
  168. package/lib/src/constants/index.js +14 -0
  169. package/lib/src/hooks/index.d.ts +6 -0
  170. package/lib/src/hooks/index.js +6 -0
  171. package/lib/src/hooks/useActiveTrack.d.ts +2 -0
  172. package/lib/src/hooks/useActiveTrack.js +28 -0
  173. package/lib/src/hooks/useAppIsInBackground.d.ts +1 -0
  174. package/lib/src/hooks/useAppIsInBackground.js +16 -0
  175. package/lib/src/hooks/useIsPlaying.d.ts +35 -0
  176. package/lib/src/hooks/useIsPlaying.js +50 -0
  177. package/lib/src/hooks/usePlayWhenReady.d.ts +1 -0
  178. package/lib/src/hooks/usePlayWhenReady.js +27 -0
  179. package/lib/src/hooks/usePlaybackState.d.ts +10 -0
  180. package/lib/src/hooks/usePlaybackState.js +35 -0
  181. package/lib/src/hooks/useProgress.d.ts +7 -0
  182. package/lib/src/hooks/useProgress.js +55 -0
  183. package/lib/src/hooks/useTrackPlayerEvents.d.ts +8 -0
  184. package/lib/src/hooks/useTrackPlayerEvents.js +30 -0
  185. package/lib/src/index.d.ts +6 -0
  186. package/lib/src/index.js +6 -0
  187. package/lib/src/interfaces/AndroidAutoBrowseTree.d.ts +5 -0
  188. package/lib/src/interfaces/AndroidAutoBrowseTree.js +1 -0
  189. package/lib/src/interfaces/AndroidOptions.d.ts +41 -0
  190. package/lib/src/interfaces/AndroidOptions.js +1 -0
  191. package/lib/src/interfaces/CustomButtons.d.ts +5 -0
  192. package/lib/src/interfaces/CustomButtons.js +1 -0
  193. package/lib/src/interfaces/FeedbackOptions.d.ts +6 -0
  194. package/lib/src/interfaces/FeedbackOptions.js +1 -0
  195. package/lib/src/interfaces/MediaItem.d.ts +18 -0
  196. package/lib/src/interfaces/MediaItem.js +1 -0
  197. package/lib/src/interfaces/MetadataOptions.d.ts +3 -0
  198. package/lib/src/interfaces/MetadataOptions.js +1 -0
  199. package/lib/src/interfaces/NowPlayingMetadata.d.ts +4 -0
  200. package/lib/src/interfaces/NowPlayingMetadata.js +1 -0
  201. package/lib/src/interfaces/PlaybackState.d.ts +8 -0
  202. package/lib/src/interfaces/PlaybackState.js +1 -0
  203. package/lib/src/interfaces/PlayerOptions.d.ts +132 -0
  204. package/lib/src/interfaces/PlayerOptions.js +1 -0
  205. package/lib/src/interfaces/Progress.d.ts +15 -0
  206. package/lib/src/interfaces/Progress.js +1 -0
  207. package/lib/src/interfaces/ResourceObject.d.ts +1 -0
  208. package/lib/src/interfaces/ResourceObject.js +1 -0
  209. package/lib/src/interfaces/ServiceHandler.d.ts +1 -0
  210. package/lib/src/interfaces/ServiceHandler.js +1 -0
  211. package/lib/src/interfaces/Track.d.ts +21 -0
  212. package/lib/src/interfaces/Track.js +1 -0
  213. package/lib/src/interfaces/TrackMetadataBase.d.ts +28 -0
  214. package/lib/src/interfaces/TrackMetadataBase.js +1 -0
  215. package/lib/src/interfaces/UpdateOptions.d.ts +52 -0
  216. package/lib/src/interfaces/UpdateOptions.js +1 -0
  217. package/lib/src/interfaces/events/AudioMetadataReceivedEvent.d.ts +33 -0
  218. package/lib/src/interfaces/events/AudioMetadataReceivedEvent.js +1 -0
  219. package/lib/src/interfaces/events/ControllerConnectedEvent.d.ts +8 -0
  220. package/lib/src/interfaces/events/ControllerConnectedEvent.js +1 -0
  221. package/lib/src/interfaces/events/EventPayloadByEvent.d.ts +77 -0
  222. package/lib/src/interfaces/events/EventPayloadByEvent.js +1 -0
  223. package/lib/src/interfaces/events/FFTUpdateEvent.d.ts +7 -0
  224. package/lib/src/interfaces/events/FFTUpdateEvent.js +1 -0
  225. package/lib/src/interfaces/events/PlaybackActiveTrackChangedEvent.d.ts +24 -0
  226. package/lib/src/interfaces/events/PlaybackActiveTrackChangedEvent.js +1 -0
  227. package/lib/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.d.ts +4 -0
  228. package/lib/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.js +1 -0
  229. package/lib/src/interfaces/events/PlaybackErrorEvent.d.ts +6 -0
  230. package/lib/src/interfaces/events/PlaybackErrorEvent.js +1 -0
  231. package/lib/src/interfaces/events/PlaybackMetadataReceivedEvent.d.ts +16 -0
  232. package/lib/src/interfaces/events/PlaybackMetadataReceivedEvent.js +1 -0
  233. package/lib/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.d.ts +4 -0
  234. package/lib/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.js +1 -0
  235. package/lib/src/interfaces/events/PlaybackProgressUpdatedEvent.d.ts +4 -0
  236. package/lib/src/interfaces/events/PlaybackProgressUpdatedEvent.js +1 -0
  237. package/lib/src/interfaces/events/PlaybackQueueEndedEvent.d.ts +9 -0
  238. package/lib/src/interfaces/events/PlaybackQueueEndedEvent.js +1 -0
  239. package/lib/src/interfaces/events/PlaybackResumeEvent.d.ts +3 -0
  240. package/lib/src/interfaces/events/PlaybackResumeEvent.js +1 -0
  241. package/lib/src/interfaces/events/PlaybackTrackChangedEvent.d.ts +11 -0
  242. package/lib/src/interfaces/events/PlaybackTrackChangedEvent.js +1 -0
  243. package/lib/src/interfaces/events/PlayerErrorEvent.d.ts +6 -0
  244. package/lib/src/interfaces/events/PlayerErrorEvent.js +1 -0
  245. package/lib/src/interfaces/events/RemoteBrowseEvent.d.ts +4 -0
  246. package/lib/src/interfaces/events/RemoteBrowseEvent.js +1 -0
  247. package/lib/src/interfaces/events/RemoteCustomActionEvent.d.ts +7 -0
  248. package/lib/src/interfaces/events/RemoteCustomActionEvent.js +1 -0
  249. package/lib/src/interfaces/events/RemoteDuckEvent.d.ts +13 -0
  250. package/lib/src/interfaces/events/RemoteDuckEvent.js +1 -0
  251. package/lib/src/interfaces/events/RemoteJumpBackwardEvent.d.ts +7 -0
  252. package/lib/src/interfaces/events/RemoteJumpBackwardEvent.js +1 -0
  253. package/lib/src/interfaces/events/RemoteJumpForwardEvent.d.ts +7 -0
  254. package/lib/src/interfaces/events/RemoteJumpForwardEvent.js +1 -0
  255. package/lib/src/interfaces/events/RemotePlayIdEvent.d.ts +4 -0
  256. package/lib/src/interfaces/events/RemotePlayIdEvent.js +1 -0
  257. package/lib/src/interfaces/events/RemotePlaySearchEvent.d.ts +9 -0
  258. package/lib/src/interfaces/events/RemotePlaySearchEvent.js +1 -0
  259. package/lib/src/interfaces/events/RemoteSearchEvent.d.ts +3 -0
  260. package/lib/src/interfaces/events/RemoteSearchEvent.js +1 -0
  261. package/lib/src/interfaces/events/RemoteSeekEvent.d.ts +4 -0
  262. package/lib/src/interfaces/events/RemoteSeekEvent.js +1 -0
  263. package/lib/src/interfaces/events/RemoteSetRatingEvent.d.ts +4 -0
  264. package/lib/src/interfaces/events/RemoteSetRatingEvent.js +1 -0
  265. package/lib/src/interfaces/events/RemoteSkipEvent.d.ts +3 -0
  266. package/lib/src/interfaces/events/RemoteSkipEvent.js +1 -0
  267. package/lib/src/interfaces/events/index.d.ts +20 -0
  268. package/lib/src/interfaces/events/index.js +20 -0
  269. package/lib/src/interfaces/index.d.ts +15 -0
  270. package/lib/src/interfaces/index.js +15 -0
  271. package/lib/src/resolveAssetSource.d.ts +2 -0
  272. package/lib/src/resolveAssetSource.js +3 -0
  273. package/lib/src/resolveAssetSource.web.d.ts +2 -0
  274. package/lib/src/resolveAssetSource.web.js +8 -0
  275. package/lib/src/trackPlayer.d.ts +371 -0
  276. package/lib/src/trackPlayer.js +627 -0
  277. package/lib/web/TrackPlayer/Player.d.ts +40 -0
  278. package/lib/web/TrackPlayer/Player.js +188 -0
  279. package/lib/web/TrackPlayer/PlaylistPlayer.d.ts +31 -0
  280. package/lib/web/TrackPlayer/PlaylistPlayer.js +181 -0
  281. package/lib/web/TrackPlayer/RepeatMode.d.ts +5 -0
  282. package/lib/web/TrackPlayer/RepeatMode.js +6 -0
  283. package/lib/web/TrackPlayer/SetupNotCalledError.d.ts +3 -0
  284. package/lib/web/TrackPlayer/SetupNotCalledError.js +5 -0
  285. package/lib/web/TrackPlayer/index.d.ts +3 -0
  286. package/lib/web/TrackPlayer/index.js +3 -0
  287. package/lib/web/TrackPlayerModule.d.ts +63 -0
  288. package/lib/web/TrackPlayerModule.js +153 -0
  289. package/lib/web/index.d.ts +3 -0
  290. package/lib/web/index.js +3 -0
  291. package/package.json +85 -6
  292. package/react-native-track-player.podspec +13 -13
  293. package/specs/NativeTrackPlayer.ts +153 -0
  294. package/src/TrackPlayerModule.web.ts +2 -0
  295. package/src/VideoView.tsx +51 -0
  296. package/src/constants/AndroidAudioContentType.ts +35 -0
  297. package/src/constants/AndroidAutoContentStyle.ts +10 -0
  298. package/src/constants/AppKilledPlaybackBehavior.ts +19 -0
  299. package/src/constants/Capability.ts +19 -0
  300. package/src/constants/Event.ts +173 -0
  301. package/src/constants/IOSCategory.ts +36 -0
  302. package/src/constants/IOSCategoryMode.ts +47 -0
  303. package/src/constants/IOSCategoryOptions.ts +44 -0
  304. package/src/constants/MediaItemPlayable.ts +4 -0
  305. package/src/constants/PitchAlgorithm.ts +16 -0
  306. package/src/constants/RatingType.ts +10 -0
  307. package/src/constants/RepeatMode.ts +10 -0
  308. package/src/constants/State.ts +34 -0
  309. package/src/constants/TrackType.ts +6 -0
  310. package/src/constants/index.ts +14 -0
  311. package/src/hooks/index.ts +6 -0
  312. package/src/hooks/useActiveTrack.ts +36 -0
  313. package/src/hooks/useAppIsInBackground.ts +20 -0
  314. package/src/hooks/useIsPlaying.ts +56 -0
  315. package/src/hooks/usePlayWhenReady.ts +37 -0
  316. package/src/hooks/usePlaybackState.ts +45 -0
  317. package/src/hooks/useProgress.ts +64 -0
  318. package/src/hooks/useTrackPlayerEvents.ts +48 -0
  319. package/src/index.ts +8 -0
  320. package/src/interfaces/AndroidAutoBrowseTree.ts +6 -0
  321. package/src/interfaces/AndroidOptions.ts +48 -0
  322. package/src/interfaces/CustomButtons.ts +6 -0
  323. package/src/interfaces/FeedbackOptions.ts +7 -0
  324. package/src/interfaces/MediaItem.ts +19 -0
  325. package/src/interfaces/MetadataOptions.ts +4 -0
  326. package/src/interfaces/NowPlayingMetadata.ts +5 -0
  327. package/src/interfaces/PlaybackState.ts +11 -0
  328. package/src/interfaces/PlayerOptions.ts +138 -0
  329. package/src/interfaces/Progress.ts +15 -0
  330. package/src/interfaces/ResourceObject.ts +1 -0
  331. package/src/interfaces/ServiceHandler.ts +1 -0
  332. package/src/interfaces/Track.ts +23 -0
  333. package/src/interfaces/TrackMetadataBase.ts +29 -0
  334. package/src/interfaces/UpdateOptions.ts +59 -0
  335. package/src/interfaces/events/AudioMetadataReceivedEvent.ts +37 -0
  336. package/src/interfaces/events/ControllerConnectedEvent.ts +9 -0
  337. package/src/interfaces/events/EventPayloadByEvent.ts +80 -0
  338. package/src/interfaces/events/FFTUpdateEvent.ts +9 -0
  339. package/src/interfaces/events/PlaybackActiveTrackChangedEvent.ts +29 -0
  340. package/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.ts +4 -0
  341. package/src/interfaces/events/PlaybackErrorEvent.ts +6 -0
  342. package/src/interfaces/events/PlaybackMetadataReceivedEvent.ts +16 -0
  343. package/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.ts +4 -0
  344. package/src/interfaces/events/PlaybackProgressUpdatedEvent.ts +5 -0
  345. package/src/interfaces/events/PlaybackQueueEndedEvent.ts +9 -0
  346. package/src/interfaces/events/PlaybackResumeEvent.ts +5 -0
  347. package/src/interfaces/events/PlaybackTrackChangedEvent.ts +11 -0
  348. package/src/interfaces/events/PlayerErrorEvent.ts +6 -0
  349. package/src/interfaces/events/RemoteBrowseEvent.ts +4 -0
  350. package/src/interfaces/events/RemoteCustomActionEvent.ts +7 -0
  351. package/src/interfaces/events/RemoteDuckEvent.ts +13 -0
  352. package/src/interfaces/events/RemoteJumpBackwardEvent.ts +7 -0
  353. package/src/interfaces/events/RemoteJumpForwardEvent.ts +7 -0
  354. package/src/interfaces/events/RemotePlayIdEvent.ts +4 -0
  355. package/src/interfaces/events/RemotePlaySearchEvent.ts +21 -0
  356. package/src/interfaces/events/RemoteSearchEvent.ts +3 -0
  357. package/src/interfaces/events/RemoteSeekEvent.ts +4 -0
  358. package/src/interfaces/events/RemoteSetRatingEvent.ts +5 -0
  359. package/src/interfaces/events/RemoteSkipEvent.ts +3 -0
  360. package/src/interfaces/events/index.ts +20 -0
  361. package/src/interfaces/index.ts +15 -0
  362. package/src/resolveAssetSource.ts +3 -0
  363. package/src/resolveAssetSource.web.ts +10 -0
  364. package/src/trackPlayer.ts +806 -0
  365. package/web/TrackPlayer/Player.ts +201 -0
  366. package/web/TrackPlayer/PlaylistPlayer.ts +215 -0
  367. package/web/TrackPlayer/RepeatMode.ts +6 -0
  368. package/web/TrackPlayer/SetupNotCalledError.ts +5 -0
  369. package/web/TrackPlayer/index.ts +3 -0
  370. package/web/TrackPlayerModule.ts +181 -0
  371. package/web/index.ts +4 -0
  372. package/CHANGELOG.md +0 -75
  373. package/android/react-native-music-control.iml +0 -139
  374. package/android/react-native-track-player.iml +0 -151
  375. package/android/src/main/java/com/guichaguri/trackplayer/TrackPlayer.java +0 -28
  376. package/android/src/main/java/com/guichaguri/trackplayer/module/MusicEvents.java +0 -55
  377. package/android/src/main/java/com/guichaguri/trackplayer/module/MusicModule.java +0 -298
  378. package/android/src/main/java/com/guichaguri/trackplayer/service/HeadlessJsMediaService.java +0 -174
  379. package/android/src/main/java/com/guichaguri/trackplayer/service/MusicBinder.java +0 -47
  380. package/android/src/main/java/com/guichaguri/trackplayer/service/MusicManager.java +0 -383
  381. package/android/src/main/java/com/guichaguri/trackplayer/service/MusicService.java +0 -271
  382. package/android/src/main/java/com/guichaguri/trackplayer/service/Utils.java +0 -243
  383. package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/ButtonEvents.java +0 -148
  384. package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/MetadataManager.java +0 -379
  385. package/android/src/main/java/com/guichaguri/trackplayer/service/models/Track.java +0 -141
  386. package/android/src/main/java/com/guichaguri/trackplayer/service/models/TrackType.java +0 -35
  387. package/android/src/main/res/drawable-hdpi/ic_forward.png +0 -0
  388. package/android/src/main/res/drawable-hdpi/ic_logo.png +0 -0
  389. package/android/src/main/res/drawable-hdpi/ic_next.png +0 -0
  390. package/android/src/main/res/drawable-hdpi/ic_pause.png +0 -0
  391. package/android/src/main/res/drawable-hdpi/ic_play.png +0 -0
  392. package/android/src/main/res/drawable-hdpi/ic_previous.png +0 -0
  393. package/android/src/main/res/drawable-hdpi/ic_rewind.png +0 -0
  394. package/android/src/main/res/drawable-hdpi/ic_stop.png +0 -0
  395. package/android/src/main/res/drawable-mdpi/ic_forward.png +0 -0
  396. package/android/src/main/res/drawable-mdpi/ic_logo.png +0 -0
  397. package/android/src/main/res/drawable-mdpi/ic_next.png +0 -0
  398. package/android/src/main/res/drawable-mdpi/ic_pause.png +0 -0
  399. package/android/src/main/res/drawable-mdpi/ic_play.png +0 -0
  400. package/android/src/main/res/drawable-mdpi/ic_previous.png +0 -0
  401. package/android/src/main/res/drawable-mdpi/ic_rewind.png +0 -0
  402. package/android/src/main/res/drawable-mdpi/ic_stop.png +0 -0
  403. package/android/src/main/res/drawable-xhdpi/ic_forward.png +0 -0
  404. package/android/src/main/res/drawable-xhdpi/ic_logo.png +0 -0
  405. package/android/src/main/res/drawable-xhdpi/ic_next.png +0 -0
  406. package/android/src/main/res/drawable-xhdpi/ic_pause.png +0 -0
  407. package/android/src/main/res/drawable-xhdpi/ic_play.png +0 -0
  408. package/android/src/main/res/drawable-xhdpi/ic_previous.png +0 -0
  409. package/android/src/main/res/drawable-xhdpi/ic_rewind.png +0 -0
  410. package/android/src/main/res/drawable-xhdpi/ic_stop.png +0 -0
  411. package/android/src/main/res/drawable-xxhdpi/ic_forward.png +0 -0
  412. package/android/src/main/res/drawable-xxhdpi/ic_logo.png +0 -0
  413. package/android/src/main/res/drawable-xxhdpi/ic_next.png +0 -0
  414. package/android/src/main/res/drawable-xxhdpi/ic_pause.png +0 -0
  415. package/android/src/main/res/drawable-xxhdpi/ic_play.png +0 -0
  416. package/android/src/main/res/drawable-xxhdpi/ic_previous.png +0 -0
  417. package/android/src/main/res/drawable-xxhdpi/ic_rewind.png +0 -0
  418. package/android/src/main/res/drawable-xxhdpi/ic_stop.png +0 -0
  419. package/android/src/main/res/drawable-xxxhdpi/ic_forward.png +0 -0
  420. package/android/src/main/res/drawable-xxxhdpi/ic_logo.png +0 -0
  421. package/android/src/main/res/drawable-xxxhdpi/ic_next.png +0 -0
  422. package/android/src/main/res/drawable-xxxhdpi/ic_pause.png +0 -0
  423. package/android/src/main/res/drawable-xxxhdpi/ic_play.png +0 -0
  424. package/android/src/main/res/drawable-xxxhdpi/ic_previous.png +0 -0
  425. package/android/src/main/res/drawable-xxxhdpi/ic_rewind.png +0 -0
  426. package/android/src/main/res/drawable-xxxhdpi/ic_stop.png +0 -0
  427. package/index.d.ts +0 -174
  428. package/index.js +0 -4
  429. package/ios/RNTrackPlayer/RNTrackPlayerBridge.h +0 -12
  430. package/ios/RNTrackPlayer/RNTrackPlayerBridge.m +0 -29
  431. package/ios/TrackPlayer.xcodeproj/project.pbxproj +0 -495
  432. package/ios/TrackPlayer.xcodeproj/project.xcworkspace/xcuserdata/marco.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  433. package/lib/ProgressComponent.js +0 -70
  434. package/lib/eventTypes.js +0 -28
  435. package/lib/hooks.js +0 -160
  436. package/lib/index.js +0 -177
  437. /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,5 @@
1
+ export declare enum RepeatMode {
2
+ Off = "REPEAT_OFF",
3
+ Track = "REPEAT_TRACK",
4
+ Playlist = "REPEAT_PLAYLIST"
5
+ }
@@ -0,0 +1,6 @@
1
+ export var RepeatMode;
2
+ (function (RepeatMode) {
3
+ RepeatMode["Off"] = "REPEAT_OFF";
4
+ RepeatMode["Track"] = "REPEAT_TRACK";
5
+ RepeatMode["Playlist"] = "REPEAT_PLAYLIST";
6
+ })(RepeatMode || (RepeatMode = {}));
@@ -0,0 +1,3 @@
1
+ export declare class SetupNotCalledError extends Error {
2
+ constructor();
3
+ }
@@ -0,0 +1,5 @@
1
+ export class SetupNotCalledError extends Error {
2
+ constructor() {
3
+ super('You must call `setupPlayer` prior to interacting with the player.');
4
+ }
5
+ }
@@ -0,0 +1,3 @@
1
+ export * from './Player';
2
+ export * from './PlaylistPlayer';
3
+ export * from './RepeatMode';
@@ -0,0 +1,3 @@
1
+ export * from './Player';
2
+ export * from './PlaylistPlayer';
3
+ export * from './RepeatMode';
@@ -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
+ ;
@@ -0,0 +1,3 @@
1
+ import { TrackPlayerModule } from './TrackPlayerModule';
2
+ declare const module: TrackPlayerModule;
3
+ export default module;
@@ -0,0 +1,3 @@
1
+ import { TrackPlayerModule } from './TrackPlayerModule';
2
+ const module = new TrackPlayerModule();
3
+ export default module;