@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,5 @@
1
+ package com.doublesymmetry.trackplayer.extensions
2
+
3
+ inline fun <reified T : Enum<T>, V> ((T) -> V).find(value: V): T? {
4
+ return enumValues<T>().firstOrNull { this(it) == value }
5
+ }
@@ -0,0 +1,13 @@
1
+ package com.doublesymmetry.trackplayer.extensions
2
+
3
+ class NumberExt {
4
+ companion object {
5
+ fun Number.toSeconds(): Double {
6
+ return this.toDouble() / 1000
7
+ }
8
+
9
+ fun Number.toMilliseconds(): Long {
10
+ return (this.toDouble() * 1000).toLong()
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,227 @@
1
+ package com.doublesymmetry.trackplayer.model
2
+
3
+ import android.os.Bundle
4
+ import androidx.annotation.OptIn
5
+ import androidx.media3.common.Metadata
6
+ import androidx.media3.common.MediaMetadata
7
+ import androidx.media3.common.util.UnstableApi
8
+ import androidx.media3.extractor.metadata.vorbis.VorbisComment
9
+ import androidx.media3.extractor.metadata.icy.IcyHeaders
10
+ import androidx.media3.extractor.metadata.icy.IcyInfo
11
+ import androidx.media3.extractor.metadata.id3.ChapterFrame
12
+ import androidx.media3.extractor.metadata.id3.TextInformationFrame
13
+ import androidx.media3.extractor.metadata.id3.UrlLinkFrame
14
+ import androidx.media3.container.MdtaMetadataEntry
15
+ import timber.log.Timber
16
+
17
+ sealed class MetadataAdapter {
18
+ companion object {
19
+ @OptIn(UnstableApi::class)
20
+ fun fromMetadata(metadata: Metadata): List<Bundle> {
21
+ val group = mutableListOf<Bundle>()
22
+
23
+ (0 until metadata.length()).forEach { i ->
24
+ group.add(Bundle().apply {
25
+ val rawEntries = mutableListOf<Bundle>()
26
+
27
+ when (val entry = metadata[i]) {
28
+ is ChapterFrame -> {
29
+ Timber.d("ChapterFrame: ${entry.id}")
30
+ }
31
+ is TextInformationFrame -> {
32
+ val rawEntry = Bundle()
33
+
34
+ when (entry.id.uppercase()) {
35
+ "TIT2", "TT2" -> {
36
+ putString("title", entry.values[0])
37
+ rawEntry.putString("commonKey", "title")
38
+ }
39
+ "TALB", "TOAL", "TAL" -> {
40
+ putString("albumName", entry.values[0])
41
+ rawEntry.putString("commonKey", "albumName")
42
+ }
43
+ "TOPE", "TPE1", "TP1" -> {
44
+ putString("artist", entry.values[0])
45
+ rawEntry.putString("commonKey", "artist")
46
+ }
47
+ "TDRC", "TOR" -> {
48
+ putString("creationDate", entry.values[0])
49
+ rawEntry.putString("commonKey", "creationDate")
50
+ }
51
+ "TCON", "TCO" -> {
52
+ putString("genre", entry.values[0])
53
+ rawEntry.putString("commonKey", "genre")
54
+ }
55
+ }
56
+
57
+ rawEntry.putString("key", entry.id.uppercase())
58
+ rawEntry.putString("keySpace", "org.id3")
59
+ rawEntry.putString("value", entry.values[0])
60
+ rawEntry.putString("time", "-1")
61
+ rawEntries.add(rawEntry)
62
+ }
63
+
64
+ is UrlLinkFrame -> {
65
+ rawEntries.add(Bundle().apply {
66
+ putString("value", entry.url)
67
+ putString("key", entry.id.uppercase())
68
+ putString("keySpace", "org.id3")
69
+ putString("time", "-1")
70
+ })
71
+ }
72
+
73
+ is IcyHeaders -> {
74
+ putString("title", entry.name)
75
+ putString("genre", entry.genre)
76
+
77
+ rawEntries.add(Bundle().apply {
78
+ putString("value", entry.name)
79
+ putString("commonKey", "title")
80
+ putString("key", "StreamTitle")
81
+ putString("keySpace", "icy")
82
+ putString("time", "-1")
83
+ })
84
+
85
+ rawEntries.add(Bundle().apply {
86
+ putString("value", entry.url)
87
+ putString("key", "StreamURL")
88
+ putString("keySpace", "icy")
89
+ putString("time", "-1")
90
+ })
91
+
92
+ rawEntries.add(Bundle().apply {
93
+ putString("value", entry.genre)
94
+ putString("commonKey", "genre")
95
+ putString("key", "StreamGenre")
96
+ putString("keySpace", "icy")
97
+ putString("time", "-1")
98
+ })
99
+ }
100
+
101
+ is IcyInfo -> {
102
+ putString("title", entry.title)
103
+
104
+ rawEntries.add(Bundle().apply {
105
+ putString("value", entry.url)
106
+ putString("key", "StreamURL")
107
+ putString("keySpace", "icy")
108
+ putString("time", "-1")
109
+ })
110
+
111
+ rawEntries.add(Bundle().apply {
112
+ putString("value", entry.title)
113
+ putString("commonKey", "title")
114
+ putString("key", "StreamTitle")
115
+ putString("keySpace", "icy")
116
+ putString("time", "-1")
117
+ })
118
+ }
119
+
120
+ is VorbisComment -> {
121
+ val rawEntry = Bundle()
122
+
123
+ when (entry.key) {
124
+ "TITLE" -> {
125
+ putString("title", entry.value)
126
+ rawEntry.putString("commonKey", "title")
127
+ }
128
+ "ARTIST" -> {
129
+ putString("artist", entry.value)
130
+ rawEntry.putString("commonKey", "artist")
131
+ }
132
+ "ALBUM" -> {
133
+ putString("albumName", entry.value)
134
+ rawEntry.putString("commonKey", "albumName")
135
+ }
136
+ "DATE" -> {
137
+ putString("creationDate", entry.value)
138
+ rawEntry.putString("commonKey", "creationDate")
139
+ }
140
+ "GENRE" -> {
141
+ putString("genre", entry.value)
142
+ rawEntry.putString("commonKey", "genre")
143
+ }
144
+ "URL" -> {
145
+ putString("url", entry.value)
146
+ }
147
+ }
148
+
149
+ rawEntry.putString("key", entry.key)
150
+ rawEntry.putString("keySpace", "org.vorbis")
151
+ rawEntry.putString("value", entry.value)
152
+ rawEntry.putString("time", "-1")
153
+ rawEntries.add(rawEntry)
154
+ }
155
+
156
+ is MdtaMetadataEntry -> {
157
+ val rawEntry = Bundle()
158
+ when (entry.key) {
159
+ "com.apple.quicktime.title" -> {
160
+ putString("title", entry.value.toString())
161
+ rawEntry.putString("commonKey", "title")
162
+ }
163
+ "com.apple.quicktime.artist" -> {
164
+ putString("artist", entry.value.toString())
165
+ rawEntry.putString("commonKey", "artist")
166
+ }
167
+ "com.apple.quicktime.album" -> {
168
+ putString("albumName", entry.value.toString())
169
+ rawEntry.putString("commonKey", "albumName")
170
+ }
171
+ "com.apple.quicktime.creationdate" -> {
172
+ putString("creationDate", entry.value.toString())
173
+ rawEntry.putString("commonKey", "creationDate")
174
+ }
175
+ "com.apple.quicktime.genre" -> {
176
+ putString("genre", entry.value.toString())
177
+ rawEntry.putString("commonKey", "genre")
178
+ }
179
+ }
180
+
181
+ rawEntry.putString("key", entry.key.substringAfterLast("."))
182
+ rawEntry.putString("keySpace", "com.apple.quicktime")
183
+ rawEntry.putString("value", entry.value.toString())
184
+ rawEntry.putString("time", "-1")
185
+ rawEntries.add(rawEntry)
186
+ }
187
+ }
188
+
189
+ putParcelableArray("raw", rawEntries.toTypedArray())
190
+ })
191
+ }
192
+
193
+ return group
194
+ }
195
+
196
+ fun fromMediaMetadata(metadata: MediaMetadata): Bundle {
197
+ return Bundle().apply {
198
+ metadata.title?.let { putString("title", it.toString()) }
199
+ metadata.artist?.let { putString("artist", it.toString()) }
200
+ metadata.albumTitle?.let { putString("albumName", it.toString()) }
201
+ metadata.subtitle?.let { putString("subtitle", it.toString()) }
202
+ metadata.description?.let { putString("description", it.toString()) }
203
+ metadata.artworkUri?.let { putString("artworkUri", it.toString()) }
204
+ metadata.trackNumber?.let { putInt("trackNumber", it) }
205
+ metadata.composer?.let { putString("composer", it.toString()) }
206
+ metadata.conductor?.let { putString("conductor", it.toString()) }
207
+ metadata.genre?.let { putString("genre", it.toString()) }
208
+ metadata.compilation?.let { putString("compilation", it.toString()) }
209
+ metadata.station?.let { putString("station", it.toString()) }
210
+ metadata.mediaType?.let { putInt("mediaType", it) }
211
+
212
+ // This is how SwiftAudioEx outputs it in the metadata dictionary
213
+ (metadata.recordingDay to metadata.recordingMonth).let { (day, month) ->
214
+ // if both are not null, combine them into a single string
215
+ if (day != null && month != null) {
216
+ putString("creationDate", "${String.format("%02d", day)}${String.format("%02d", month)}")
217
+ } else if (day != null) {
218
+ putString("creationDate", String.format("%02d", day))
219
+ } else if (month != null) {
220
+ putString("creationDate", String.format("%02d", month))
221
+ }
222
+ }
223
+ metadata.recordingYear?.let { putString("creationYear", it.toString()) }
224
+ }
225
+ }
226
+ }
227
+ }
@@ -0,0 +1,16 @@
1
+ package com.doublesymmetry.trackplayer.model
2
+
3
+ import android.content.Context
4
+ import android.os.Bundle
5
+
6
+ class NowPlayingMetadata(context: Context, bundle: Bundle?, ratingType: Int) : TrackMetadata() {
7
+ var elapsedTime = 0.0
8
+ override fun setMetadata(context: Context, bundle: Bundle?, ratingType: Int) {
9
+ super.setMetadata(context, bundle, ratingType)
10
+ elapsedTime = bundle!!.getDouble("elapsedTime", 0.0)
11
+ }
12
+
13
+ init {
14
+ setMetadata(context, bundle, ratingType)
15
+ }
16
+ }
@@ -0,0 +1,203 @@
1
+ package com.doublesymmetry.trackplayer.model
2
+
3
+ import androidx.annotation.OptIn
4
+ import androidx.media3.common.Metadata
5
+ import androidx.media3.common.util.UnstableApi
6
+ import androidx.media3.extractor.metadata.vorbis.VorbisComment
7
+ import androidx.media3.extractor.metadata.icy.IcyHeaders
8
+ import androidx.media3.extractor.metadata.icy.IcyInfo
9
+ import androidx.media3.extractor.metadata.id3.TextInformationFrame
10
+ import androidx.media3.extractor.metadata.id3.UrlLinkFrame
11
+ import androidx.media3.container.MdtaMetadataEntry
12
+
13
+ @OptIn(UnstableApi::class)
14
+ data class PlaybackMetadata(
15
+ val source: String,
16
+ var title: String? = null,
17
+ var url: String? = null,
18
+ var artist: String? = null,
19
+ var album: String? = null,
20
+ var date: String? = null,
21
+ var genre: String? = null
22
+ ) {
23
+ companion object {
24
+ /**
25
+ * ID3 Metadata (MP3)
26
+ * https://en.wikipedia.org/wiki/ID3
27
+ */
28
+ fun fromId3Metadata(metadata: Metadata): PlaybackMetadata? {
29
+ var handled = false
30
+
31
+ var title: String? = null
32
+ var url: String? = null
33
+ var artist: String? = null
34
+ var album: String? = null
35
+ var date: String? = null
36
+ var genre: String? = null
37
+
38
+ (0 until metadata.length()).forEach { i ->
39
+ when (val entry = metadata[i]) {
40
+ is TextInformationFrame -> {
41
+ when (entry.id.uppercase()) {
42
+ "TIT2", "TT2" -> {
43
+ handled = true
44
+ title = entry.values[0]
45
+ }
46
+ "TALB", "TOAL", "TAL" -> {
47
+ handled = true
48
+ album = entry.values[0]
49
+ }
50
+ "TOPE", "TPE1", "TP1" -> {
51
+ handled = true
52
+ artist = entry.values[0]
53
+ }
54
+ "TDRC", "TOR" -> {
55
+ handled = true
56
+ date = entry.values[0]
57
+ }
58
+ "TCON", "TCO" -> {
59
+ handled = true
60
+ genre = entry.values[0]
61
+ }
62
+
63
+ }
64
+ }
65
+ is UrlLinkFrame -> {
66
+ when (entry.id.uppercase()) {
67
+ "WOAS", "WOAF", "WOAR", "WAR" -> {
68
+ handled = true
69
+ url = entry.url
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }
75
+
76
+
77
+ return if (handled) PlaybackMetadata("id3", title, url, artist, album, date, genre) else null
78
+ }
79
+
80
+ /**
81
+ * Shoutcast / Icecast metadata (ICY protocol)
82
+ * https://cast.readme.io/docs/icy
83
+ */
84
+ fun fromIcy(metadata: Metadata): PlaybackMetadata? {
85
+ for (i in 0 until metadata.length()) {
86
+ when (val entry = metadata[i]) {
87
+ is IcyHeaders -> {
88
+ return PlaybackMetadata("icy-headers", title = entry.name, url = entry.url, genre = entry.genre)
89
+ }
90
+ is IcyInfo -> {
91
+ val artist: String?
92
+ val title: String?
93
+ val index =
94
+ if (entry.title == null) -1 else entry.title!!.indexOf(" - ")
95
+ if (index != -1) {
96
+ artist = entry.title!!.substring(0, index)
97
+ title = entry.title!!.substring(index + 3)
98
+ } else {
99
+ artist = null
100
+ title = entry.title
101
+ }
102
+
103
+ return PlaybackMetadata("icy", title = title, url = entry.url, artist = artist)
104
+ }
105
+ }
106
+ }
107
+
108
+ return null
109
+ }
110
+
111
+ /**
112
+ * Vorbis Comments (Vorbis, FLAC, Opus, Speex, Theora)
113
+ * https://xiph.org/vorbis/doc/v-comment.html
114
+ */
115
+ fun fromVorbisComment(metadata: Metadata): PlaybackMetadata? {
116
+ var handled = false
117
+
118
+ var title: String? = null
119
+ var url: String? = null
120
+ var artist: String? = null
121
+ var album: String? = null
122
+ var date: String? = null
123
+ var genre: String? = null
124
+
125
+ for (i in 0 until metadata.length()) {
126
+ val entry = metadata[i]
127
+ if (entry is VorbisComment) {
128
+ when (entry.key) {
129
+ "TITLE" -> {
130
+ handled = true
131
+ title = entry.value
132
+ }
133
+ "ARTIST" -> {
134
+ handled = true
135
+ artist = entry.value
136
+ }
137
+ "ALBUM" -> {
138
+ handled = true
139
+ album = entry.value
140
+ }
141
+ "DATE" -> {
142
+ handled = true
143
+ date = entry.value
144
+ }
145
+ "GENRE" -> {
146
+ handled = true
147
+ genre = entry.value
148
+ }
149
+ "URL" -> {
150
+ handled = true
151
+ url = entry.value
152
+ }
153
+ }
154
+ }
155
+ }
156
+ return if (handled) PlaybackMetadata("vorbis-comment", title, url, artist, album, date, genre) else null
157
+ }
158
+
159
+ /**
160
+ * QuickTime MDTA metadata (mov, qt)
161
+ * https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/Metadata/Metadata.html
162
+ */
163
+ fun fromQuickTime(metadata: Metadata): PlaybackMetadata? {
164
+ var handled = false
165
+
166
+ var title: String? = null
167
+ var artist: String? = null
168
+ var album: String? = null
169
+ var date: String? = null
170
+ var genre: String? = null
171
+
172
+ for (i in 0 until metadata.length()) {
173
+ val entry = metadata[i]
174
+ if (entry is MdtaMetadataEntry) {
175
+ when (entry.key) {
176
+ "com.apple.quicktime.title" -> {
177
+ handled = true
178
+ title = entry.value.toString()
179
+ }
180
+ "com.apple.quicktime.artist" -> {
181
+ handled = true
182
+ artist = entry.value.toString()
183
+ }
184
+ "com.apple.quicktime.album" -> {
185
+ handled = true
186
+ album = entry.value.toString()
187
+ }
188
+ "com.apple.quicktime.creationdate" -> {
189
+ handled = true
190
+ date = entry.value.toString()
191
+ }
192
+ "com.apple.quicktime.genre" -> {
193
+ handled = true
194
+ genre = entry.value.toString()
195
+ }
196
+ }
197
+ }
198
+ }
199
+
200
+ return if (handled) PlaybackMetadata("quicktime", title = title, artist = artist, album = album, date = date, genre = genre) else null
201
+ }
202
+ }
203
+ }
@@ -0,0 +1,13 @@
1
+ package com.doublesymmetry.trackplayer.model
2
+
3
+ enum class State(val state: String) {
4
+ Buffering("buffering"),
5
+ None("none"),
6
+ Ready("ready"),
7
+ Paused("paused"),
8
+ Stopped("stopped"),
9
+ Playing("playing"),
10
+ Loading("loading"),
11
+ Error("error"),
12
+ Ended("ended"),
13
+ }
@@ -0,0 +1,67 @@
1
+ package com.doublesymmetry.trackplayer.model
2
+
3
+ import android.content.ContentResolver
4
+ import android.content.Context
5
+ import android.net.Uri
6
+ import android.os.Bundle
7
+ import androidx.annotation.OptIn
8
+ import androidx.media3.common.util.UnstableApi
9
+ import com.lovegaoshi.kotlinaudio.models.AudioItemOptions
10
+ import com.lovegaoshi.kotlinaudio.models.MediaType
11
+ import com.doublesymmetry.trackplayer.utils.BundleUtils
12
+
13
+ /**
14
+ * @author Milen Pivchev @mpivchev
15
+ */
16
+ @OptIn(UnstableApi::class)
17
+ class Track
18
+ (context: Context, bundle: Bundle, ratingType: Int) : TrackMetadata() {
19
+ var uri: Uri? = null
20
+ var resourceId: Int?
21
+ var type = MediaType.DEFAULT
22
+ var contentType: String?
23
+ var userAgent: String?
24
+ var originalItem: Bundle?
25
+ var headers: HashMap<String, String>? = null
26
+ val queueId: Long
27
+
28
+ override fun setMetadata(context: Context, bundle: Bundle?, ratingType: Int) {
29
+ super.setMetadata(context, bundle, ratingType)
30
+ if (originalItem != null && originalItem != bundle) originalItem!!.putAll(bundle)
31
+ }
32
+
33
+ fun toAudioItem(): TrackAudioItem {
34
+ return TrackAudioItem(this, type, uri.toString(), artist, title, album, artwork.toString(), duration,
35
+ AudioItemOptions(headers, userAgent, resourceId), mediaId)
36
+ }
37
+
38
+ init {
39
+ resourceId = BundleUtils.getRawResourceId(context, bundle, "url")
40
+ uri = if (resourceId == 0) {
41
+ resourceId = null
42
+ BundleUtils.getUri(context, bundle, "url")
43
+ } else {
44
+ // RawResourceDataSource.buildRawResourceUri(resourceId!!)
45
+ Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE).path(resourceId!!.toString()).build()
46
+ }
47
+ val trackType = bundle.getString("type", "default")
48
+ for (t in MediaType.entries) {
49
+ if (t.name.equals(trackType, ignoreCase = true)) {
50
+ type = t
51
+ break
52
+ }
53
+ }
54
+ contentType = bundle.getString("contentType")
55
+ userAgent = bundle.getString("userAgent")
56
+ val httpHeaders = bundle.getBundle("headers")
57
+ if (httpHeaders != null) {
58
+ headers = HashMap()
59
+ for (header in httpHeaders.keySet()) {
60
+ headers!![header] = httpHeaders.getString(header)!!
61
+ }
62
+ }
63
+ setMetadata(context, bundle, ratingType)
64
+ queueId = System.currentTimeMillis()
65
+ originalItem = bundle
66
+ }
67
+ }
@@ -0,0 +1,18 @@
1
+ package com.doublesymmetry.trackplayer.model
2
+
3
+ import com.lovegaoshi.kotlinaudio.models.AudioItem
4
+ import com.lovegaoshi.kotlinaudio.models.AudioItemOptions
5
+ import com.lovegaoshi.kotlinaudio.models.MediaType
6
+
7
+ data class TrackAudioItem(
8
+ val track: Track,
9
+ override val type: MediaType,
10
+ override var audioUrl: String,
11
+ override var artist: String? = null,
12
+ override var title: String? = null,
13
+ override var albumTitle: String? = null,
14
+ override val artwork: String? = null,
15
+ override val duration: Long? = null,
16
+ override val options: AudioItemOptions? = null,
17
+ override val mediaId: String? = null
18
+ ): AudioItem
@@ -0,0 +1,38 @@
1
+ package com.doublesymmetry.trackplayer.model
2
+
3
+ import android.content.Context
4
+ import android.net.Uri
5
+ import android.os.Bundle
6
+ import androidx.media3.common.Rating
7
+ import com.doublesymmetry.trackplayer.extensions.NumberExt.Companion.toMilliseconds
8
+ import com.doublesymmetry.trackplayer.utils.BundleUtils
9
+
10
+ abstract class TrackMetadata {
11
+ var artwork: Uri? = null
12
+ var title: String? = null
13
+ var artist: String? = null
14
+ var album: String? = null
15
+ var date: String? = null
16
+ var genre: String? = null
17
+ var duration: Long? = null
18
+ var rating: Rating? = null
19
+ var mediaId: String? = null
20
+
21
+ open fun setMetadata(context: Context, bundle: Bundle?, ratingType: Int) {
22
+ artwork = BundleUtils.getUri(context, bundle, "artwork")
23
+ title = bundle!!.getString("title")
24
+ artist = bundle.getString("artist")
25
+ album = bundle.getString("album")
26
+ date = bundle.getString("date")
27
+ genre = bundle.getString("genre")
28
+ mediaId = bundle.getString("mediaId")
29
+
30
+ duration = if (bundle.containsKey("duration")) {
31
+ bundle.getDouble("duration").toMilliseconds()
32
+ } else {
33
+ null
34
+ }
35
+
36
+ rating = BundleUtils.getRating(bundle, "rating", ratingType)
37
+ }
38
+ }
@@ -0,0 +1,67 @@
1
+ package com.doublesymmetry.trackplayer.module
2
+
3
+ import android.content.BroadcastReceiver
4
+ import android.content.Context
5
+ import android.content.Intent
6
+ import com.facebook.react.bridge.Arguments
7
+ import com.facebook.react.bridge.ReactContext
8
+ import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter
9
+
10
+ /**
11
+ * @author Milen Pivchev @mpivchev
12
+ */
13
+ class MusicEvents(private val reactContext: ReactContext) : BroadcastReceiver() {
14
+ override fun onReceive(context: Context, intent: Intent) {
15
+ val event = intent.getStringExtra("event")
16
+ val data = intent.getBundleExtra("data")
17
+ val map = if (data != null) Arguments.fromBundle(data) else null
18
+ reactContext.emitDeviceEvent(event!!, map)
19
+ }
20
+
21
+ companion object {
22
+ // Media Control Events
23
+ const val BUTTON_PLAY = "remote-play"
24
+ const val BUTTON_PLAY_PAUSE = "remote-play-pause"
25
+ const val BUTTON_PLAY_FROM_ID = "remote-play-id"
26
+ const val BUTTON_PLAY_FROM_SEARCH = "remote-play-search"
27
+ const val BUTTON_SEARCH = "remote-search"
28
+ const val BUTTON_PAUSE = "remote-pause"
29
+ const val BUTTON_STOP = "remote-stop"
30
+ const val BUTTON_SKIP = "remote-skip"
31
+ const val BUTTON_SKIP_NEXT = "remote-next"
32
+ const val BUTTON_SKIP_PREVIOUS = "remote-previous"
33
+ const val BUTTON_SEEK_TO = "remote-seek"
34
+ const val BUTTON_SET_RATING = "remote-set-rating"
35
+ const val BUTTON_JUMP_FORWARD = "remote-jump-forward"
36
+ const val BUTTON_JUMP_BACKWARD = "remote-jump-backward"
37
+ const val BUTTON_DUCK = "remote-duck"
38
+ const val BUTTON_BROWSE = "remote-browse"
39
+ const val BUTTON_CUSTOM_ACTION = "remote-custom-action"
40
+
41
+ // Playback Events
42
+ const val PLAYBACK_PLAY_WHEN_READY_CHANGED = "playback-play-when-ready-changed"
43
+ const val PLAYBACK_STATE = "playback-state"
44
+ const val PLAYBACK_TRACK_CHANGED = "playback-track-changed"
45
+ const val PLAYBACK_ACTIVE_TRACK_CHANGED = "playback-active-track-changed"
46
+ const val PLAYBACK_QUEUE_ENDED = "playback-queue-ended"
47
+ const val PLAYBACK_METADATA = "playback-metadata-received"
48
+ const val PLAYBACK_PROGRESS_UPDATED = "playback-progress-updated"
49
+ const val PLAYBACK_ERROR = "playback-error"
50
+ const val PLAYBACK_ANIMATED_VOLUME_CHANGED = "playback-animated-volume-changed"
51
+ const val PLAYBACK_RESUME = "playback-resume-android"
52
+ const val FFT_UPDATED = "fft-updated"
53
+
54
+ // Metadata Events
55
+ const val METADATA_CHAPTER_RECEIVED = "metadata-chapter-received"
56
+ const val METADATA_TIMED_RECEIVED = "metadata-timed-received"
57
+ const val METADATA_COMMON_RECEIVED = "metadata-common-received"
58
+ const val METADATA_PAYLOAD_KEY = "metadata"
59
+
60
+ // Other
61
+ const val PLAYER_ERROR = "player-error"
62
+ const val CONNECTOR_CONNECTED = "android-controller-connected"
63
+ const val CONNECTOR_DISCONNECTED = "android-controller-disconnected"
64
+
65
+ const val EVENT_INTENT = "com.doublesymmetry.trackplayer.event"
66
+ }
67
+ }