@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,35 @@
1
+ package com.doublesymmetry.trackplayer.utils
2
+
3
+ import androidx.lifecycle.DefaultLifecycleObserver
4
+ import androidx.lifecycle.LifecycleOwner
5
+ import androidx.lifecycle.ProcessLifecycleOwner
6
+ import com.facebook.react.bridge.UiThreadUtil
7
+
8
+ object AppForegroundTracker {
9
+ private var activityCount = 0
10
+
11
+ val foregrounded: Boolean
12
+ get() = activityCount > 0
13
+
14
+ val backgrounded: Boolean
15
+ get() = activityCount <= 0
16
+
17
+ fun start() {
18
+ UiThreadUtil.runOnUiThread {
19
+ ProcessLifecycleOwner.get().lifecycle.addObserver(Observer)
20
+ }
21
+ }
22
+
23
+ object Observer : DefaultLifecycleObserver {
24
+
25
+ override fun onResume(owner: LifecycleOwner) {
26
+ super.onResume(owner)
27
+ activityCount++
28
+ }
29
+
30
+ override fun onPause(owner: LifecycleOwner) {
31
+ super.onPause(owner)
32
+ activityCount--
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,147 @@
1
+ package com.doublesymmetry.trackplayer.utils
2
+
3
+ import android.content.ContentResolver
4
+ import android.content.Context
5
+ import android.net.Uri
6
+ import android.os.Bundle
7
+ import android.support.v4.media.RatingCompat
8
+ import androidx.media3.common.HeartRating
9
+ import androidx.media3.common.PercentageRating
10
+ import androidx.media3.common.Rating
11
+ import androidx.media3.common.StarRating
12
+ import androidx.media3.common.ThumbRating
13
+ import com.doublesymmetry.trackplayer.R
14
+ import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper
15
+
16
+ /**
17
+ * @author Milen Pivchev @mpivchev
18
+ */
19
+ object BundleUtils {
20
+ fun getUri(context: Context, data: Bundle?, key: String?): Uri? {
21
+ if (!data!!.containsKey(key)) return null
22
+ val obj = data[key]
23
+ if (obj is String) {
24
+ // Remote or Local Uri
25
+ if (obj.trim { it <= ' ' }.isEmpty()) throw RuntimeException("$key: The URL cannot be empty")
26
+ return Uri.parse(obj as String?)
27
+ } else if (obj is Bundle) {
28
+ // require/import
29
+ val uri = obj.getString("uri")
30
+ val helper = ResourceDrawableIdHelper.instance
31
+ val id = helper.getResourceDrawableId(context, uri)
32
+ return if (id > 0) {
33
+ // In production, we can obtain the resource uri
34
+ val res = context.resources
35
+ Uri.Builder()
36
+ .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
37
+ .authority(res.getResourcePackageName(id))
38
+ .appendPath(res.getResourceTypeName(id))
39
+ .appendPath(res.getResourceEntryName(id))
40
+ .build()
41
+ } else {
42
+ // During development, the resources might come directly from the metro server
43
+ Uri.parse(uri)
44
+ }
45
+ }
46
+ return null
47
+ }
48
+
49
+ fun getRawResourceId(context: Context, data: Bundle, key: String?): Int {
50
+ if (!data.containsKey(key)) return 0
51
+ val obj = data[key] as? Bundle ?: return 0
52
+ var name = obj.getString("uri")
53
+ if (name.isNullOrEmpty()) return 0
54
+ name = name.lowercase().replace("-", "_")
55
+ return try {
56
+ name.toInt()
57
+ } catch (ex: NumberFormatException) {
58
+ context.resources.getIdentifier(name, "raw", context.packageName)
59
+ }
60
+ }
61
+
62
+ private fun getIcon(context: Context, options: Bundle, propertyName: String, defaultIcon: Int): Int {
63
+ if (!options.containsKey(propertyName)) return defaultIcon
64
+
65
+ val bundle = options.getBundle(propertyName) ?: return defaultIcon
66
+
67
+ val helper = ResourceDrawableIdHelper.getInstance()
68
+ val icon = helper.getResourceDrawableId(context, bundle.getString("uri"))
69
+ return if (icon == 0) defaultIcon else icon
70
+ }
71
+
72
+ fun getCustomIcon(context: Context, options: Bundle, propertyName: String, defaultIcon: Int): Int {
73
+ when (getIntOrNull(options, propertyName)) {
74
+ 0 -> return R.drawable.hearte_24px
75
+ 1 -> return R.drawable.heart_24px
76
+ 2 -> return R.drawable.baseline_repeat_24
77
+ 3 -> return R.drawable.baseline_repeat_one_24
78
+ 4 -> return R.drawable.shuffle_24px
79
+ 5 -> return R.drawable.ifl_24px
80
+ }
81
+ return getIcon(context, options, propertyName, defaultIcon)
82
+ }
83
+
84
+ fun getIconOrNull(context: Context, options: Bundle, propertyName: String): Int? {
85
+ if (!options.containsKey(propertyName)) return null
86
+
87
+ val bundle = options.getBundle(propertyName) ?: return null
88
+
89
+ val helper = ResourceDrawableIdHelper.instance
90
+ val icon = helper.getResourceDrawableId(context, bundle.getString("uri"))
91
+ return if (icon == 0) null else icon
92
+ }
93
+
94
+ fun getRating(data: Bundle?, key: String?, ratingType: Int): Rating? {
95
+ return if (!data!!.containsKey(key) || ratingType == RatingCompat.RATING_NONE) {
96
+ null
97
+ } else if (ratingType == RatingCompat.RATING_HEART) {
98
+ HeartRating(data.getBoolean(key, true))
99
+ } else if (ratingType == RatingCompat.RATING_THUMB_UP_DOWN) {
100
+ ThumbRating(data.getBoolean(key, true))
101
+ } else if (ratingType == RatingCompat.RATING_PERCENTAGE) {
102
+ PercentageRating(data.getFloat(key, 0f))
103
+ } else {
104
+ StarRating(5, data.getFloat(key, 0f))
105
+ }
106
+ }
107
+
108
+ fun setRating(data: Bundle, key: String?, rating: RatingCompat) {
109
+ if (!rating.isRated) return
110
+ val ratingType = rating.ratingStyle
111
+ when (ratingType) {
112
+ RatingCompat.RATING_HEART -> {
113
+ data.putBoolean(key, rating.hasHeart())
114
+ }
115
+ RatingCompat.RATING_THUMB_UP_DOWN -> {
116
+ data.putBoolean(key, rating.isThumbUp)
117
+ }
118
+ RatingCompat.RATING_PERCENTAGE -> {
119
+ data.putDouble(key, rating.percentRating.toDouble())
120
+ }
121
+ else -> {
122
+ data.putDouble(key, rating.starRating.toDouble())
123
+ }
124
+ }
125
+ }
126
+
127
+ fun getInt(data: Bundle?, key: String?, defaultValue: Int): Int {
128
+ val value = data!![key]
129
+ return if (value is Number) {
130
+ value.toInt()
131
+ } else defaultValue
132
+ }
133
+
134
+ fun getIntOrNull(data: Bundle?, key: String?): Int? {
135
+ val value = data!![key]
136
+ return if (value is Number) {
137
+ value.toInt()
138
+ } else null
139
+ }
140
+
141
+ fun getDoubleOrNull(data: Bundle?, key: String?): Double? {
142
+ val value = data!![key]
143
+ return if (value is Number) {
144
+ value.toDouble()
145
+ } else null
146
+ }
147
+ }
@@ -0,0 +1,65 @@
1
+ package com.doublesymmetry.trackplayer.utils
2
+
3
+ import android.content.Context
4
+ import android.graphics.Bitmap
5
+ import android.graphics.BitmapFactory
6
+ import android.graphics.drawable.BitmapDrawable
7
+ import android.net.Uri
8
+ import android.os.Build
9
+ import androidx.media3.common.util.BitmapLoader
10
+ import androidx.media3.common.util.Util.isBitmapFactorySupportedMimeType
11
+ import androidx.media3.common.util.UnstableApi
12
+ import coil.ImageLoader
13
+ import coil.request.ImageRequest
14
+ import com.lovegaoshi.kotlinaudio.utils.getEmbeddedBitmap
15
+ import com.google.common.util.concurrent.ListenableFuture
16
+ import jp.wasabeef.transformers.coil.CropSquareTransformation
17
+ import kotlinx.coroutines.MainScope
18
+ import kotlinx.coroutines.guava.future
19
+ import java.io.IOException
20
+ import javax.inject.Inject
21
+
22
+ // https://github.com/androidx/media/issues/121
23
+
24
+ @UnstableApi
25
+ class CoilBitmapLoader @Inject constructor(
26
+ private val context: Context,
27
+ private val cropSquare: Boolean = false,
28
+ ) : BitmapLoader {
29
+
30
+ private val scope = MainScope()
31
+ private val imageLoader = ImageLoader(context)
32
+
33
+ override fun supportsMimeType(mimeType: String): Boolean {
34
+ return isBitmapFactorySupportedMimeType(mimeType)
35
+ }
36
+
37
+ override fun decodeBitmap(data: ByteArray): ListenableFuture<Bitmap> {
38
+ val bitmap = BitmapFactory.decodeByteArray(data, /* offset= */0, data.size)
39
+ return scope.future {
40
+ bitmap ?: throw IOException("Unable to decode bitmap")
41
+ }
42
+ }
43
+
44
+ override fun loadBitmap(uri: Uri): ListenableFuture<Bitmap> = scope.future {
45
+ val bitmap: Bitmap?
46
+ val parsedUri = uri.toString()
47
+ if (parsedUri.startsWith("file://")) {
48
+ bitmap = getEmbeddedBitmap(parsedUri.substring(7))
49
+ } else {
50
+ var imgrequest = ImageRequest.Builder(context)
51
+ .data(uri)
52
+ .allowHardware(false)
53
+ // HACK: header implementation should be done via parsed data from uri
54
+
55
+ if (Build.MANUFACTURER == "samsung" || cropSquare) {
56
+ imgrequest = imgrequest.transformations(CropSquareTransformation())
57
+ }
58
+ val response = imageLoader.execute(imgrequest.build())
59
+ bitmap = (response.drawable as? BitmapDrawable)?.bitmap
60
+
61
+ }
62
+ bitmap ?: Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565)
63
+
64
+ }
65
+ }
@@ -0,0 +1,41 @@
1
+ package com.doublesymmetry.trackplayer.utils
2
+
3
+ import android.net.Uri
4
+ import android.os.Bundle
5
+ import androidx.media3.common.MediaItem
6
+ import androidx.media3.common.MediaMetadata
7
+
8
+ fun buildMediaItem(
9
+ title: String? = null,
10
+ subtitle: String? = null,
11
+ mediaId: String,
12
+ isPlayable: Boolean,
13
+ subtitleConfigurations: List<MediaItem.SubtitleConfiguration> = mutableListOf(),
14
+ album: String? = null,
15
+ artist: String? = null,
16
+ genre: String? = null,
17
+ sourceUri: Uri? = null,
18
+ imageUri: Uri? = null,
19
+ extras: Bundle? = null
20
+ ): MediaItem {
21
+ val metadata =
22
+ MediaMetadata.Builder()
23
+ .setAlbumTitle(album)
24
+ .setTitle(title)
25
+ .setSubtitle(subtitle)
26
+ .setArtist(artist)
27
+ .setGenre(genre)
28
+ .setIsBrowsable(!isPlayable)
29
+ .setIsPlayable(isPlayable)
30
+ .setArtworkUri(imageUri)
31
+ .setMediaType(if (isPlayable) MediaMetadata.MEDIA_TYPE_MUSIC else MediaMetadata.MEDIA_TYPE_FOLDER_MIXED)
32
+ .setExtras(extras)
33
+ .build()
34
+
35
+ return MediaItem.Builder()
36
+ .setMediaId(mediaId)
37
+ .setSubtitleConfigurations(subtitleConfigurations)
38
+ .setMediaMetadata(metadata)
39
+ .setUri(sourceUri)
40
+ .build()
41
+ }
@@ -0,0 +1,11 @@
1
+ package com.doublesymmetry.trackplayer.utils
2
+
3
+ import com.facebook.react.bridge.Promise
4
+
5
+ /**
6
+ * @author Jonathan Puckey @puckey
7
+ */
8
+ data class RejectionException(
9
+ override val message: String,
10
+ val code : String
11
+ ) : Exception(message)
@@ -0,0 +1,42 @@
1
+ package com.doublesymmetry.trackplayer.video
2
+
3
+ import android.content.Context
4
+ import android.widget.FrameLayout
5
+ import androidx.media3.ui.PlayerView
6
+ import androidx.media3.ui.AspectRatioFrameLayout
7
+ import com.doublesymmetry.trackplayer.service.MusicService
8
+
9
+ /**
10
+ * A simple wrapper that surfaces the ExoPlayer instance managed by RN Track Player
11
+ * inside a Media3 [PlayerView] so that React Native can render the video track.
12
+ */
13
+ class TrackPlayerVideoView(context: Context) : FrameLayout(context) {
14
+ private val playerView: PlayerView = PlayerView(context).apply {
15
+ useController = false
16
+ layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
17
+ }
18
+
19
+ init {
20
+ addView(playerView)
21
+ }
22
+
23
+ override fun onAttachedToWindow() {
24
+ super.onAttachedToWindow()
25
+ // Get the ExoPlayer instance from the running MusicService if available
26
+ playerView.player = MusicService.instance?.audioPlayer?.exoPlayer
27
+ }
28
+
29
+ override fun onDetachedFromWindow() {
30
+ playerView.player = null
31
+ super.onDetachedFromWindow()
32
+ }
33
+
34
+ fun setResizeMode(mode: String?) {
35
+ when (mode) {
36
+ "cover" -> playerView.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_ZOOM
37
+ "stretch" -> playerView.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FILL
38
+ "none" -> playerView.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIXED_WIDTH
39
+ else -> playerView.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT // contain default
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,18 @@
1
+ package com.doublesymmetry.trackplayer.video
2
+
3
+ import com.facebook.react.uimanager.SimpleViewManager
4
+ import com.facebook.react.uimanager.ThemedReactContext
5
+ import com.facebook.react.uimanager.annotations.ReactProp
6
+
7
+ class TrackPlayerVideoViewManager : SimpleViewManager<TrackPlayerVideoView>() {
8
+ override fun getName() = "RNTrackPlayerVideoView"
9
+
10
+ override fun createViewInstance(reactContext: ThemedReactContext): TrackPlayerVideoView {
11
+ return TrackPlayerVideoView(reactContext)
12
+ }
13
+
14
+ @ReactProp(name = "resizeMode")
15
+ fun setResizeMode(view: TrackPlayerVideoView, mode: String?) {
16
+ view.setResizeMode(mode)
17
+ }
18
+ }
@@ -0,0 +1,30 @@
1
+ package com.lovegaoshi.kotlinaudio.event
2
+
3
+ class EventHolder internal constructor(private val playerEventHolder: PlayerEventHolder) {
4
+ val audioItemTransition
5
+ get() = playerEventHolder.audioItemTransition
6
+
7
+ val onAudioFocusChanged
8
+ get() = playerEventHolder.onAudioFocusChanged
9
+
10
+ val onCommonMetadata
11
+ get() = playerEventHolder.onCommonMetadata
12
+
13
+ val onTimedMetadata
14
+ get() = playerEventHolder.onTimedMetadata
15
+
16
+ val onPlayerActionTriggeredExternally
17
+ get() = playerEventHolder.onPlayerActionTriggeredExternally
18
+
19
+ val playbackEnd
20
+ get() = playerEventHolder.playbackEnd
21
+
22
+ val playWhenReadyChange
23
+ get() = playerEventHolder.playWhenReadyChange
24
+
25
+ val stateChange
26
+ get() = playerEventHolder.stateChange
27
+
28
+ val playbackError
29
+ get() = playerEventHolder.playbackError
30
+ }
@@ -0,0 +1,124 @@
1
+ package com.lovegaoshi.kotlinaudio.event
2
+
3
+ import androidx.annotation.OptIn
4
+ import androidx.media3.common.MediaMetadata
5
+ import androidx.media3.common.Metadata
6
+ import androidx.media3.common.util.UnstableApi
7
+ import com.lovegaoshi.kotlinaudio.models.*
8
+ import kotlinx.coroutines.MainScope
9
+ import kotlinx.coroutines.flow.MutableSharedFlow
10
+ import kotlinx.coroutines.flow.asSharedFlow
11
+ import kotlinx.coroutines.launch
12
+
13
+ class PlayerEventHolder {
14
+ private val coroutineScope = MainScope()
15
+
16
+ private var _stateChange = MutableSharedFlow<AudioPlayerState>(1)
17
+ var stateChange = _stateChange.asSharedFlow()
18
+
19
+ private var _playbackEnd = MutableSharedFlow<PlaybackEndedReason?>(1)
20
+ var playbackEnd = _playbackEnd.asSharedFlow()
21
+
22
+ private var _playbackError = MutableSharedFlow<PlaybackError>(1)
23
+ var playbackError = _playbackError.asSharedFlow()
24
+
25
+ private var _playWhenReadyChange = MutableSharedFlow<PlayWhenReadyChangeData>(1)
26
+ /**
27
+ * Use these events to track when [com.lovegaoshi.kotlinaudio.players.BaseAudioPlayer.playWhenReady]
28
+ * changes.
29
+ */
30
+ var playWhenReadyChange = _playWhenReadyChange.asSharedFlow()
31
+
32
+ private var _audioItemTransition = MutableSharedFlow<AudioItemTransitionReason?>(1)
33
+
34
+ /**
35
+ * Use these events to track when and why an [AudioItem] transitions to another.
36
+ *
37
+ * Examples of an audio transition include changes to [AudioItem] queue, an [AudioItem] on repeat, skipping an [AudioItem], or simply when the [AudioItem] has finished.
38
+ */
39
+ var audioItemTransition = _audioItemTransition.asSharedFlow()
40
+
41
+ private var _positionChanged = MutableSharedFlow<PositionChangedReason?>(1)
42
+ var positionChanged = _positionChanged.asSharedFlow()
43
+
44
+ private var _onAudioFocusChanged = MutableSharedFlow<FocusChangeData>(1)
45
+ var onAudioFocusChanged = _onAudioFocusChanged.asSharedFlow()
46
+
47
+ private var _onCommonMetadata = MutableSharedFlow<MediaMetadata>(1)
48
+ var onCommonMetadata = _onCommonMetadata.asSharedFlow()
49
+
50
+ private var _onTimedMetadata = MutableSharedFlow<Metadata>(1)
51
+ var onTimedMetadata = _onTimedMetadata.asSharedFlow()
52
+
53
+ private var _onPlayerActionTriggeredExternally = MutableSharedFlow<MediaSessionCallback>()
54
+
55
+ /**
56
+ * Use these events to track whenever a player action has been triggered from an outside source.
57
+ *
58
+ * The sources can be: media buttons on headphones, Android Wear, Android Auto, Google Assistant, media notification, etc.
59
+ *
60
+ * For this observable to send events, set [interceptPlayerActionsTriggeredExternally][com.lovegaoshi.kotlinaudio.models.PlayerConfig.interceptPlayerActionsTriggeredExternally] to true.
61
+ */
62
+ var onPlayerActionTriggeredExternally = _onPlayerActionTriggeredExternally.asSharedFlow()
63
+
64
+ internal fun updateAudioPlayerState(state: AudioPlayerState) {
65
+ coroutineScope.launch {
66
+ _stateChange.emit(state)
67
+ }
68
+ }
69
+
70
+ internal fun updatePlaybackEndedReason(reason: PlaybackEndedReason) {
71
+ coroutineScope.launch {
72
+ _playbackEnd.emit(reason)
73
+ }
74
+ }
75
+
76
+ internal fun updatePlayWhenReadyChange(playWhenReadyChange: PlayWhenReadyChangeData) {
77
+ coroutineScope.launch {
78
+ _playWhenReadyChange.emit(playWhenReadyChange)
79
+ }
80
+ }
81
+
82
+ internal fun updateAudioItemTransition(reason: AudioItemTransitionReason) {
83
+ coroutineScope.launch {
84
+ _audioItemTransition.emit(reason)
85
+ }
86
+ }
87
+
88
+ internal fun updatePositionChangedReason(reason: PositionChangedReason) {
89
+ coroutineScope.launch {
90
+ _positionChanged.emit(reason)
91
+ }
92
+ }
93
+
94
+ internal fun updateOnAudioFocusChanged(isPaused: Boolean, isPermanent: Boolean) {
95
+ coroutineScope.launch {
96
+ _onAudioFocusChanged.emit(FocusChangeData(isPaused, isPermanent))
97
+ }
98
+ }
99
+
100
+ internal fun updateOnCommonMetadata(metadata: MediaMetadata) {
101
+ coroutineScope.launch {
102
+ _onCommonMetadata.emit(metadata)
103
+ }
104
+ }
105
+
106
+ @OptIn(UnstableApi::class)
107
+ internal fun updateOnTimedMetadata(metadata: Metadata) {
108
+ coroutineScope.launch {
109
+ _onTimedMetadata.emit(metadata)
110
+ }
111
+ }
112
+
113
+ internal fun updatePlaybackError(error: PlaybackError) {
114
+ coroutineScope.launch {
115
+ _playbackError.emit(error)
116
+ }
117
+ }
118
+
119
+ internal fun updateOnPlayerActionTriggeredExternally(callback: MediaSessionCallback) {
120
+ coroutineScope.launch {
121
+ _onPlayerActionTriggeredExternally.emit(callback)
122
+ }
123
+ }
124
+ }
@@ -0,0 +1,10 @@
1
+ package com.lovegaoshi.kotlinaudio.models
2
+
3
+ enum class AudioContentType {
4
+ MUSIC,
5
+ SPEECH,
6
+ SONIFICATION,
7
+ MOVIE,
8
+ UNKNOWN
9
+ }
10
+
@@ -0,0 +1,118 @@
1
+ package com.lovegaoshi.kotlinaudio.models
2
+
3
+ import android.content.Context
4
+ import android.graphics.Bitmap
5
+ import android.os.Bundle
6
+ import androidx.core.net.toUri
7
+ import androidx.media3.common.MediaItem
8
+ import androidx.media3.common.MediaMetadata
9
+ import com.lovegaoshi.kotlinaudio.utils.getEmbeddedBitmapArray
10
+ import com.lovegaoshi.kotlinaudio.utils.saveMediaCoverToPng
11
+ import java.util.UUID
12
+
13
+
14
+ data class DefaultAudioItem(
15
+ override var audioUrl: String,
16
+
17
+ /**
18
+ * Set to [MediaType.DEFAULT] by default.
19
+ */
20
+ override val type: MediaType = MediaType.DEFAULT,
21
+
22
+ override var artist: String? = null,
23
+ override var title: String? = null,
24
+ override var albumTitle: String? = null,
25
+ override var artwork: String? = null,
26
+ override val duration: Long? = null,
27
+ override val options: AudioItemOptions? = null,
28
+ override val mediaId: String? = null,
29
+ ) : AudioItem
30
+
31
+ class AudioItemHolder(
32
+ var audioItem: AudioItem
33
+ ) {
34
+ var artworkBitmap: Bitmap? = null
35
+ }
36
+
37
+ interface AudioItem {
38
+ var audioUrl: String
39
+ val type: MediaType
40
+ var artist: String?
41
+ var title: String?
42
+ var albumTitle: String?
43
+ val artwork: String?
44
+ val duration: Long?
45
+ val options: AudioItemOptions?
46
+ val mediaId: String?
47
+ }
48
+
49
+ data class AudioItemOptions(
50
+ val headers: HashMap<String, String>? = null,
51
+ val userAgent: String? = null,
52
+ val resourceId: Int? = null
53
+ )
54
+
55
+ enum class MediaType(val value: String) {
56
+ /**
57
+ * The default media type. Should be used for streams over HTTP or files
58
+ */
59
+ DEFAULT("default"),
60
+
61
+ /**
62
+ * The DASH media type for adaptive streams. Should be used with DASH manifests.
63
+ */
64
+ DASH("dash"),
65
+
66
+ /**
67
+ * The HLS media type for adaptive streams. Should be used with HLS playlists.
68
+ */
69
+ HLS("hls"),
70
+
71
+ /**
72
+ * The SmoothStreaming media type for adaptive streams. Should be used with SmoothStreaming manifests.
73
+ */
74
+ SMOOTH_STREAMING("smoothstreaming");
75
+ }
76
+
77
+
78
+
79
+ fun audioItem2MediaItem(audioItem: AudioItem, context: Context? = null): MediaItem {
80
+ return MediaItem.Builder()
81
+ .setMediaId(audioItem.mediaId ?: UUID.randomUUID().toString())
82
+ .setUri(audioItem.audioUrl)
83
+ .setMediaMetadata(
84
+ MediaMetadata.Builder()
85
+ .setTitle(audioItem.title)
86
+ .setArtist(audioItem.artist)
87
+ .setArtworkUri((
88
+ if (context != null && audioItem.audioUrl.startsWith("file://")) {
89
+ saveMediaCoverToPng(
90
+ audioItem.audioUrl,
91
+ context.contentResolver,
92
+ audioItem.mediaId ?: audioItem.audioUrl
93
+ )
94
+ ?: audioItem.artwork
95
+ }
96
+ else audioItem.artwork)?.toUri())
97
+ .setArtworkData(if (audioItem.audioUrl.startsWith("file://")) getEmbeddedBitmapArray(
98
+ audioItem.audioUrl.substring(7)) else null, MediaMetadata.PICTURE_TYPE_MEDIA)
99
+ .setExtras(Bundle().apply {
100
+ audioItem.options?.headers?.let {
101
+ putSerializable("headers", audioItem.options!!.headers)
102
+ }
103
+ audioItem.options?.userAgent?.let {
104
+ putString("user-agent", it)
105
+ }
106
+ audioItem.options?.resourceId?.let {
107
+ putInt("resource-id", it)
108
+ }
109
+ putString("type", audioItem.type.toString())
110
+ putString("uri", audioItem.audioUrl)
111
+ }).build())
112
+ .setTag(audioItem)
113
+ .build()
114
+ }
115
+
116
+ fun mediaItem2AudioItem(item: MediaItem?): AudioItem? {
117
+ return item?.localConfiguration?.tag as AudioItem?
118
+ }
@@ -0,0 +1,33 @@
1
+ package com.lovegaoshi.kotlinaudio.models
2
+
3
+ /**
4
+ * Use these events to track when and why an [AudioItem] transitions to another.
5
+ * Examples of an audio transition include changes to [AudioItem] queue, an [AudioItem] on repeat, skipping an [AudioItem], or simply when the [AudioItem] has finished.
6
+ */
7
+ sealed class AudioItemTransitionReason(val oldPosition: Long) {
8
+ /**
9
+ * Playback has automatically transitioned to the next [AudioItem].
10
+ *
11
+ * This reason also indicates a transition caused by another player.
12
+ */
13
+ class AUTO(oldPosition: Long) : AudioItemTransitionReason(oldPosition)
14
+
15
+ /**
16
+ * A seek to another [AudioItem] has occurred. Usually triggered when calling
17
+ * [QueuedAudioPlayer.next][com.lovegaoshi.kotlinaudio.players.QueuedAudioPlayer.next]
18
+ * or [QueuedAudioPlayer.previous][com.lovegaoshi.kotlinaudio.players.QueuedAudioPlayer.previous].
19
+ */
20
+ class SEEK_TO_ANOTHER_AUDIO_ITEM(oldPosition: Long) : AudioItemTransitionReason(oldPosition)
21
+
22
+ /**
23
+ * The [AudioItem] has been repeated.
24
+ */
25
+ class REPEAT(oldPosition: Long) : AudioItemTransitionReason(oldPosition)
26
+
27
+ /**
28
+ * The current [AudioItem] has changed because of a change in the queue. This can either be if
29
+ * the [AudioItem] previously being played has been removed, or when the queue becomes non-empty
30
+ * after being empty.
31
+ */
32
+ class QUEUE_CHANGED(oldPosition: Long) : AudioItemTransitionReason(oldPosition)
33
+ }