react-native-mp3-player 1.0.0

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 (328) hide show
  1. package/LICENSE +205 -0
  2. package/README.md +88 -0
  3. package/android/build.gradle +114 -0
  4. package/android/proguard-rules.txt +0 -0
  5. package/android/src/main/AndroidManifest.xml +27 -0
  6. package/android/src/main/java/com/doublesymmetry/trackplayer/HeadlessJsMediaService.kt +199 -0
  7. package/android/src/main/java/com/doublesymmetry/trackplayer/TrackPlayer.kt +30 -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 +65 -0
  19. package/android/src/main/java/com/doublesymmetry/trackplayer/module/MusicModule.kt +775 -0
  20. package/android/src/main/java/com/doublesymmetry/trackplayer/service/MusicService.kt +1251 -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 +64 -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/lovegaoshi/kotlinaudio/event/EventHolder.kt +30 -0
  27. package/android/src/main/java/com/lovegaoshi/kotlinaudio/event/PlayerEventHolder.kt +124 -0
  28. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioContentType.kt +10 -0
  29. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioItem.kt +133 -0
  30. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioItemTransitionReason.kt +33 -0
  31. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/AudioPlayerState.kt +30 -0
  32. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/BufferConfig.kt +8 -0
  33. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/CacheConfig.kt +17 -0
  34. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/Capability.kt +19 -0
  35. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/CustomButton.kt +19 -0
  36. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/FocusChangeData.kt +3 -0
  37. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/MediaSessionCallback.kt +17 -0
  38. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayWhenReadyChangeData.kt +3 -0
  39. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlaybackEndedReason.kt +5 -0
  40. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlaybackError.kt +6 -0
  41. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayerConfig.kt +36 -0
  42. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PlayerOptions.kt +39 -0
  43. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/PositionChangedReason.kt +39 -0
  44. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/RepeatMode.kt +16 -0
  45. package/android/src/main/java/com/lovegaoshi/kotlinaudio/models/WakeMode.kt +7 -0
  46. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/AudioPlayer.kt +689 -0
  47. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/ForwardingPlayer.java +1124 -0
  48. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/QueuedAudioPlayer.kt +295 -0
  49. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/Buffer.kt +34 -0
  50. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/Cache.kt +47 -0
  51. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/FocusManager.kt +59 -0
  52. package/android/src/main/java/com/lovegaoshi/kotlinaudio/player/components/MediaFactory.kt +165 -0
  53. package/android/src/main/java/com/lovegaoshi/kotlinaudio/service/MusicService.kt +127 -0
  54. package/android/src/main/java/com/lovegaoshi/kotlinaudio/utils/Utils.kt +113 -0
  55. package/android/src/main/res/drawable/baseline_repeat_24.xml +5 -0
  56. package/android/src/main/res/drawable/baseline_repeat_one_24.xml +5 -0
  57. package/android/src/main/res/drawable/forward.xml +5 -0
  58. package/android/src/main/res/drawable/heart_24px.xml +5 -0
  59. package/android/src/main/res/drawable/hearte_24px.xml +5 -0
  60. package/android/src/main/res/drawable/ifl_24px.xml +5 -0
  61. package/android/src/main/res/drawable/rewind.xml +5 -0
  62. package/android/src/main/res/drawable/shuffle_24px.xml +5 -0
  63. package/android/src/main/res/values/strings.xml +5 -0
  64. package/android/src/main/res/xml/automotive_app_desc.xml +3 -0
  65. package/ios/Example/SwiftAudio/Assets.xcassets/22AMI.imageset/22AMillion.jpg +0 -0
  66. package/ios/Example/SwiftAudio/Assets.xcassets/22AMI.imageset/Contents.json +21 -0
  67. package/ios/Example/SwiftAudio/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  68. package/ios/Example/SwiftAudio/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  69. package/ios/Example/SwiftAudio/Assets.xcassets/Contents.json +6 -0
  70. package/ios/Example/SwiftAudio/Assets.xcassets/cover.imageset/Contents.json +21 -0
  71. package/ios/Example/SwiftAudio/Assets.xcassets/cover.imageset/cover.jpg +0 -0
  72. package/ios/Example/SwiftAudio/AudioController.swift +46 -0
  73. package/ios/Example/SwiftAudio/Extensions.swift +22 -0
  74. package/ios/Example/SwiftAudio/PlayerView.swift +172 -0
  75. package/ios/Example/SwiftAudio/PlayerViewModel.swift +120 -0
  76. package/ios/Example/SwiftAudio/Preview Content/Preview Assets.xcassets/Contents.json +6 -0
  77. package/ios/Example/SwiftAudio/QueueView.swift +65 -0
  78. package/ios/Example/SwiftAudio/SwiftAudio.entitlements +12 -0
  79. package/ios/Example/SwiftAudio/SwiftAudioApp.swift +17 -0
  80. package/ios/Example/SwiftAudio.xcodeproj/project.pbxproj +412 -0
  81. package/ios/Example/SwiftAudio.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  82. package/ios/Example/SwiftAudio.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  83. package/ios/RNTrackPlayer/Models/Capabilities.swift +52 -0
  84. package/ios/RNTrackPlayer/Models/MediaURL.swift +38 -0
  85. package/ios/RNTrackPlayer/Models/MetadataAdapter.swift +147 -0
  86. package/ios/RNTrackPlayer/Models/PitchAlgorithms.swift +13 -0
  87. package/ios/RNTrackPlayer/Models/SessionCategories.swift +106 -0
  88. package/ios/RNTrackPlayer/Models/State.swift +26 -0
  89. package/ios/RNTrackPlayer/Models/Track.swift +140 -0
  90. package/ios/RNTrackPlayer/RNTrackPlayer.swift +941 -0
  91. package/ios/RNTrackPlayer/Support/RNTrackPlayer-Bridging-Header.h +7 -0
  92. package/ios/RNTrackPlayer/TrackPlayer.h +14 -0
  93. package/ios/RNTrackPlayer/TrackPlayer.mm +246 -0
  94. package/ios/RNTrackPlayer/Utils/EventType.swift +44 -0
  95. package/ios/RNTrackPlayer/Utils/Metadata.swift +60 -0
  96. package/ios/SwiftAudioEx/Package.swift +20 -0
  97. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapper.swift +521 -0
  98. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperDelegate.swift +27 -0
  99. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperProtocol.swift +69 -0
  100. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AVPlayerWrapper/AVPlayerWrapperState.swift +43 -0
  101. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioItem.swift +158 -0
  102. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioPlayer.swift +459 -0
  103. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioPlayerError.swift +26 -0
  104. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioSessionController/AudioSession.swift +33 -0
  105. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioSessionController/AudioSessionController.swift +135 -0
  106. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/AudioTap.swift +99 -0
  107. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Event.swift +155 -0
  108. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/MediaItemProperty.swift +95 -0
  109. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoCenter.swift +17 -0
  110. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoController.swift +73 -0
  111. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoControllerProtocol.swift +26 -0
  112. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoKeyValue.swift +14 -0
  113. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/NowPlayingInfoController/NowPlayingInfoProperty.swift +234 -0
  114. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerItemNotificationObserver.swift +102 -0
  115. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerItemObserver.swift +136 -0
  116. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerObserver.swift +120 -0
  117. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Observer/AVPlayerTimeObserver.swift +112 -0
  118. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/QueueManager.swift +356 -0
  119. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/QueuedAudioPlayer.swift +236 -0
  120. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RemoteCommandController/RemoteCommand.swift +170 -0
  121. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RemoteCommandController/RemoteCommandController.swift +206 -0
  122. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/RepeatMode.swift +15 -0
  123. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/TimeEventFrequency.swift +26 -0
  124. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/Utils/DispatchQueueType.swift +18 -0
  125. package/ios/SwiftAudioEx/Sources/SwiftAudioEx/WaveformAudioTap.swift +159 -0
  126. package/lib/specs/NativeTrackPlayer.d.ts +129 -0
  127. package/lib/specs/NativeTrackPlayer.js +4 -0
  128. package/lib/src/constants/AndroidAudioContentType.d.ts +35 -0
  129. package/lib/src/constants/AndroidAudioContentType.js +36 -0
  130. package/lib/src/constants/AndroidAutoContentStyle.d.ts +10 -0
  131. package/lib/src/constants/AndroidAutoContentStyle.js +11 -0
  132. package/lib/src/constants/AppKilledPlaybackBehavior.d.ts +17 -0
  133. package/lib/src/constants/AppKilledPlaybackBehavior.js +18 -0
  134. package/lib/src/constants/Capability.d.ts +17 -0
  135. package/lib/src/constants/Capability.js +19 -0
  136. package/lib/src/constants/Event.d.ts +163 -0
  137. package/lib/src/constants/Event.js +164 -0
  138. package/lib/src/constants/IOSCategory.d.ts +36 -0
  139. package/lib/src/constants/IOSCategory.js +37 -0
  140. package/lib/src/constants/IOSCategoryMode.d.ts +47 -0
  141. package/lib/src/constants/IOSCategoryMode.js +48 -0
  142. package/lib/src/constants/IOSCategoryOptions.d.ts +44 -0
  143. package/lib/src/constants/IOSCategoryOptions.js +45 -0
  144. package/lib/src/constants/MediaItemPlayable.d.ts +4 -0
  145. package/lib/src/constants/MediaItemPlayable.js +5 -0
  146. package/lib/src/constants/PitchAlgorithm.d.ts +14 -0
  147. package/lib/src/constants/PitchAlgorithm.js +16 -0
  148. package/lib/src/constants/RatingType.d.ts +8 -0
  149. package/lib/src/constants/RatingType.js +10 -0
  150. package/lib/src/constants/RepeatMode.d.ts +8 -0
  151. package/lib/src/constants/RepeatMode.js +10 -0
  152. package/lib/src/constants/State.d.ts +34 -0
  153. package/lib/src/constants/State.js +35 -0
  154. package/lib/src/constants/TrackType.d.ts +6 -0
  155. package/lib/src/constants/TrackType.js +7 -0
  156. package/lib/src/constants/index.d.ts +14 -0
  157. package/lib/src/constants/index.js +14 -0
  158. package/lib/src/hooks/index.d.ts +6 -0
  159. package/lib/src/hooks/index.js +6 -0
  160. package/lib/src/hooks/useActiveTrack.d.ts +2 -0
  161. package/lib/src/hooks/useActiveTrack.js +28 -0
  162. package/lib/src/hooks/useAppIsInBackground.d.ts +1 -0
  163. package/lib/src/hooks/useAppIsInBackground.js +16 -0
  164. package/lib/src/hooks/useIsPlaying.d.ts +35 -0
  165. package/lib/src/hooks/useIsPlaying.js +50 -0
  166. package/lib/src/hooks/usePlayWhenReady.d.ts +1 -0
  167. package/lib/src/hooks/usePlayWhenReady.js +27 -0
  168. package/lib/src/hooks/usePlaybackState.d.ts +10 -0
  169. package/lib/src/hooks/usePlaybackState.js +35 -0
  170. package/lib/src/hooks/useProgress.d.ts +7 -0
  171. package/lib/src/hooks/useProgress.js +55 -0
  172. package/lib/src/hooks/useTrackPlayerEvents.d.ts +8 -0
  173. package/lib/src/hooks/useTrackPlayerEvents.js +30 -0
  174. package/lib/src/index.d.ts +5 -0
  175. package/lib/src/index.js +5 -0
  176. package/lib/src/interfaces/AndroidAutoBrowseTree.d.ts +5 -0
  177. package/lib/src/interfaces/AndroidAutoBrowseTree.js +1 -0
  178. package/lib/src/interfaces/AndroidOptions.d.ts +41 -0
  179. package/lib/src/interfaces/AndroidOptions.js +1 -0
  180. package/lib/src/interfaces/CustomButtons.d.ts +5 -0
  181. package/lib/src/interfaces/CustomButtons.js +1 -0
  182. package/lib/src/interfaces/FeedbackOptions.d.ts +6 -0
  183. package/lib/src/interfaces/FeedbackOptions.js +1 -0
  184. package/lib/src/interfaces/MediaItem.d.ts +18 -0
  185. package/lib/src/interfaces/MediaItem.js +1 -0
  186. package/lib/src/interfaces/MetadataOptions.d.ts +3 -0
  187. package/lib/src/interfaces/MetadataOptions.js +1 -0
  188. package/lib/src/interfaces/NowPlayingMetadata.d.ts +4 -0
  189. package/lib/src/interfaces/NowPlayingMetadata.js +1 -0
  190. package/lib/src/interfaces/PlaybackState.d.ts +8 -0
  191. package/lib/src/interfaces/PlaybackState.js +1 -0
  192. package/lib/src/interfaces/PlayerOptions.d.ts +127 -0
  193. package/lib/src/interfaces/PlayerOptions.js +1 -0
  194. package/lib/src/interfaces/Progress.d.ts +15 -0
  195. package/lib/src/interfaces/Progress.js +1 -0
  196. package/lib/src/interfaces/ResourceObject.d.ts +1 -0
  197. package/lib/src/interfaces/ResourceObject.js +1 -0
  198. package/lib/src/interfaces/ServiceHandler.d.ts +1 -0
  199. package/lib/src/interfaces/ServiceHandler.js +1 -0
  200. package/lib/src/interfaces/Track.d.ts +21 -0
  201. package/lib/src/interfaces/Track.js +1 -0
  202. package/lib/src/interfaces/TrackMetadataBase.d.ts +28 -0
  203. package/lib/src/interfaces/TrackMetadataBase.js +1 -0
  204. package/lib/src/interfaces/UpdateOptions.d.ts +52 -0
  205. package/lib/src/interfaces/UpdateOptions.js +1 -0
  206. package/lib/src/interfaces/events/AudioMetadataReceivedEvent.d.ts +33 -0
  207. package/lib/src/interfaces/events/AudioMetadataReceivedEvent.js +1 -0
  208. package/lib/src/interfaces/events/ControllerConnectedEvent.d.ts +8 -0
  209. package/lib/src/interfaces/events/ControllerConnectedEvent.js +1 -0
  210. package/lib/src/interfaces/events/EventPayloadByEvent.d.ts +73 -0
  211. package/lib/src/interfaces/events/EventPayloadByEvent.js +1 -0
  212. package/lib/src/interfaces/events/PlaybackActiveTrackChangedEvent.d.ts +24 -0
  213. package/lib/src/interfaces/events/PlaybackActiveTrackChangedEvent.js +1 -0
  214. package/lib/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.d.ts +4 -0
  215. package/lib/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.js +1 -0
  216. package/lib/src/interfaces/events/PlaybackErrorEvent.d.ts +6 -0
  217. package/lib/src/interfaces/events/PlaybackErrorEvent.js +1 -0
  218. package/lib/src/interfaces/events/PlaybackMetadataReceivedEvent.d.ts +16 -0
  219. package/lib/src/interfaces/events/PlaybackMetadataReceivedEvent.js +1 -0
  220. package/lib/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.d.ts +4 -0
  221. package/lib/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.js +1 -0
  222. package/lib/src/interfaces/events/PlaybackProgressUpdatedEvent.d.ts +4 -0
  223. package/lib/src/interfaces/events/PlaybackProgressUpdatedEvent.js +1 -0
  224. package/lib/src/interfaces/events/PlaybackQueueEndedEvent.d.ts +9 -0
  225. package/lib/src/interfaces/events/PlaybackQueueEndedEvent.js +1 -0
  226. package/lib/src/interfaces/events/PlaybackResumeEvent.d.ts +3 -0
  227. package/lib/src/interfaces/events/PlaybackResumeEvent.js +1 -0
  228. package/lib/src/interfaces/events/PlaybackTrackChangedEvent.d.ts +11 -0
  229. package/lib/src/interfaces/events/PlaybackTrackChangedEvent.js +1 -0
  230. package/lib/src/interfaces/events/PlayerErrorEvent.d.ts +6 -0
  231. package/lib/src/interfaces/events/PlayerErrorEvent.js +1 -0
  232. package/lib/src/interfaces/events/RemoteBrowseEvent.d.ts +4 -0
  233. package/lib/src/interfaces/events/RemoteBrowseEvent.js +1 -0
  234. package/lib/src/interfaces/events/RemoteCustomActionEvent.d.ts +7 -0
  235. package/lib/src/interfaces/events/RemoteCustomActionEvent.js +1 -0
  236. package/lib/src/interfaces/events/RemoteDuckEvent.d.ts +13 -0
  237. package/lib/src/interfaces/events/RemoteDuckEvent.js +1 -0
  238. package/lib/src/interfaces/events/RemoteJumpBackwardEvent.d.ts +8 -0
  239. package/lib/src/interfaces/events/RemoteJumpBackwardEvent.js +1 -0
  240. package/lib/src/interfaces/events/RemoteJumpForwardEvent.d.ts +8 -0
  241. package/lib/src/interfaces/events/RemoteJumpForwardEvent.js +1 -0
  242. package/lib/src/interfaces/events/RemotePlayIdEvent.d.ts +4 -0
  243. package/lib/src/interfaces/events/RemotePlayIdEvent.js +1 -0
  244. package/lib/src/interfaces/events/RemotePlaySearchEvent.d.ts +9 -0
  245. package/lib/src/interfaces/events/RemotePlaySearchEvent.js +1 -0
  246. package/lib/src/interfaces/events/RemoteSeekEvent.d.ts +4 -0
  247. package/lib/src/interfaces/events/RemoteSeekEvent.js +1 -0
  248. package/lib/src/interfaces/events/RemoteSetRatingEvent.d.ts +4 -0
  249. package/lib/src/interfaces/events/RemoteSetRatingEvent.js +1 -0
  250. package/lib/src/interfaces/events/RemoteSkipEvent.d.ts +3 -0
  251. package/lib/src/interfaces/events/RemoteSkipEvent.js +1 -0
  252. package/lib/src/interfaces/events/index.d.ts +18 -0
  253. package/lib/src/interfaces/events/index.js +18 -0
  254. package/lib/src/interfaces/index.d.ts +15 -0
  255. package/lib/src/interfaces/index.js +15 -0
  256. package/lib/src/resolveAssetSource.d.ts +2 -0
  257. package/lib/src/resolveAssetSource.js +3 -0
  258. package/lib/src/trackPlayer.d.ts +347 -0
  259. package/lib/src/trackPlayer.js +592 -0
  260. package/package.json +94 -0
  261. package/react-native-mp3-player.podspec +22 -0
  262. package/specs/NativeTrackPlayer.ts +148 -0
  263. package/src/constants/AndroidAudioContentType.ts +35 -0
  264. package/src/constants/AndroidAutoContentStyle.ts +10 -0
  265. package/src/constants/AppKilledPlaybackBehavior.ts +19 -0
  266. package/src/constants/Capability.ts +19 -0
  267. package/src/constants/Event.ts +164 -0
  268. package/src/constants/IOSCategory.ts +36 -0
  269. package/src/constants/IOSCategoryMode.ts +47 -0
  270. package/src/constants/IOSCategoryOptions.ts +44 -0
  271. package/src/constants/MediaItemPlayable.ts +4 -0
  272. package/src/constants/PitchAlgorithm.ts +16 -0
  273. package/src/constants/RatingType.ts +10 -0
  274. package/src/constants/RepeatMode.ts +10 -0
  275. package/src/constants/State.ts +34 -0
  276. package/src/constants/TrackType.ts +6 -0
  277. package/src/constants/index.ts +14 -0
  278. package/src/hooks/index.ts +6 -0
  279. package/src/hooks/useActiveTrack.ts +36 -0
  280. package/src/hooks/useAppIsInBackground.ts +20 -0
  281. package/src/hooks/useIsPlaying.ts +56 -0
  282. package/src/hooks/usePlayWhenReady.ts +37 -0
  283. package/src/hooks/usePlaybackState.ts +45 -0
  284. package/src/hooks/useProgress.ts +64 -0
  285. package/src/hooks/useTrackPlayerEvents.ts +48 -0
  286. package/src/index.ts +7 -0
  287. package/src/interfaces/AndroidAutoBrowseTree.ts +6 -0
  288. package/src/interfaces/AndroidOptions.ts +48 -0
  289. package/src/interfaces/CustomButtons.ts +6 -0
  290. package/src/interfaces/FeedbackOptions.ts +7 -0
  291. package/src/interfaces/MediaItem.ts +19 -0
  292. package/src/interfaces/MetadataOptions.ts +4 -0
  293. package/src/interfaces/NowPlayingMetadata.ts +5 -0
  294. package/src/interfaces/PlaybackState.ts +11 -0
  295. package/src/interfaces/PlayerOptions.ts +133 -0
  296. package/src/interfaces/Progress.ts +15 -0
  297. package/src/interfaces/ResourceObject.ts +1 -0
  298. package/src/interfaces/ServiceHandler.ts +1 -0
  299. package/src/interfaces/Track.ts +23 -0
  300. package/src/interfaces/TrackMetadataBase.ts +29 -0
  301. package/src/interfaces/UpdateOptions.ts +59 -0
  302. package/src/interfaces/events/AudioMetadataReceivedEvent.ts +37 -0
  303. package/src/interfaces/events/ControllerConnectedEvent.ts +9 -0
  304. package/src/interfaces/events/EventPayloadByEvent.ts +76 -0
  305. package/src/interfaces/events/PlaybackActiveTrackChangedEvent.ts +29 -0
  306. package/src/interfaces/events/PlaybackAnimatedVolumeChangedEvent.ts +4 -0
  307. package/src/interfaces/events/PlaybackErrorEvent.ts +6 -0
  308. package/src/interfaces/events/PlaybackMetadataReceivedEvent.ts +16 -0
  309. package/src/interfaces/events/PlaybackPlayWhenReadyChangedEvent.ts +4 -0
  310. package/src/interfaces/events/PlaybackProgressUpdatedEvent.ts +5 -0
  311. package/src/interfaces/events/PlaybackQueueEndedEvent.ts +9 -0
  312. package/src/interfaces/events/PlaybackResumeEvent.ts +5 -0
  313. package/src/interfaces/events/PlaybackTrackChangedEvent.ts +11 -0
  314. package/src/interfaces/events/PlayerErrorEvent.ts +6 -0
  315. package/src/interfaces/events/RemoteBrowseEvent.ts +4 -0
  316. package/src/interfaces/events/RemoteCustomActionEvent.ts +7 -0
  317. package/src/interfaces/events/RemoteDuckEvent.ts +13 -0
  318. package/src/interfaces/events/RemoteJumpBackwardEvent.ts +8 -0
  319. package/src/interfaces/events/RemoteJumpForwardEvent.ts +8 -0
  320. package/src/interfaces/events/RemotePlayIdEvent.ts +4 -0
  321. package/src/interfaces/events/RemotePlaySearchEvent.ts +21 -0
  322. package/src/interfaces/events/RemoteSeekEvent.ts +4 -0
  323. package/src/interfaces/events/RemoteSetRatingEvent.ts +5 -0
  324. package/src/interfaces/events/RemoteSkipEvent.ts +3 -0
  325. package/src/interfaces/events/index.ts +18 -0
  326. package/src/interfaces/index.ts +15 -0
  327. package/src/resolveAssetSource.ts +3 -0
  328. package/src/trackPlayer.ts +768 -0
@@ -0,0 +1,19 @@
1
+ package com.doublesymmetry.trackplayer.extensions
2
+
3
+ import com.lovegaoshi.kotlinaudio.models.AudioPlayerState
4
+ import com.doublesymmetry.trackplayer.model.State
5
+
6
+ val AudioPlayerState.asLibState: State
7
+ get() {
8
+ return when(this) {
9
+ AudioPlayerState.LOADING -> State.Loading
10
+ AudioPlayerState.READY -> State.Ready
11
+ AudioPlayerState.BUFFERING -> State.Buffering
12
+ AudioPlayerState.PAUSED -> State.Paused
13
+ AudioPlayerState.PLAYING -> State.Playing
14
+ AudioPlayerState.IDLE -> State.None
15
+ AudioPlayerState.ENDED -> State.Ended
16
+ AudioPlayerState.ERROR -> State.Error
17
+ AudioPlayerState.STOPPED -> State.Stopped
18
+ }
19
+ }
@@ -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
+ }