react-native-nitro-player 0.3.0-alpha.8 → 0.4.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 (263) hide show
  1. package/README.md +444 -4
  2. package/android/build.gradle +4 -1
  3. package/android/src/main/AndroidManifest.xml +16 -1
  4. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAndroidAutoMediaLibrary.kt +2 -0
  5. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAudioDevices.kt +8 -0
  6. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridDownloadManager.kt +225 -0
  7. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridEqualizer.kt +105 -0
  8. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridPlayerQueue.kt +6 -6
  9. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridTrackPlayer.kt +37 -12
  10. package/android/src/main/java/com/margelo/nitro/nitroplayer/core/TrackPlayerCore.kt +970 -213
  11. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadDatabase.kt +475 -0
  12. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadFileManager.kt +159 -0
  13. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadManagerCore.kt +489 -0
  14. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadWorker.kt +209 -0
  15. package/android/src/main/java/com/margelo/nitro/nitroplayer/equalizer/EqualizerCore.kt +486 -0
  16. package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaBrowserService.kt +3 -1
  17. package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaSessionManager.kt +14 -6
  18. package/android/src/main/java/com/margelo/nitro/nitroplayer/playlist/PlaylistManager.kt +27 -0
  19. package/ios/HybridDownloadManager.swift +226 -0
  20. package/ios/HybridEqualizer.swift +111 -0
  21. package/ios/HybridTrackPlayer.swift +36 -8
  22. package/ios/core/TrackPlayerCore.swift +998 -276
  23. package/ios/download/DownloadDatabase.swift +493 -0
  24. package/ios/download/DownloadFileManager.swift +241 -0
  25. package/ios/download/DownloadManagerCore.swift +923 -0
  26. package/ios/equalizer/EqualizerCore.swift +685 -0
  27. package/ios/media/MediaSessionManager.swift +40 -28
  28. package/ios/playlist/PlaylistManager.swift +40 -9
  29. package/ios/queue/HybridPlayerQueue.swift +33 -13
  30. package/lib/hooks/callbackManager.d.ts +28 -0
  31. package/lib/hooks/callbackManager.js +76 -0
  32. package/lib/hooks/downloadCallbackManager.d.ts +36 -0
  33. package/lib/hooks/downloadCallbackManager.js +108 -0
  34. package/lib/hooks/equalizerCallbackManager.d.ts +37 -0
  35. package/lib/hooks/equalizerCallbackManager.js +109 -0
  36. package/lib/hooks/index.d.ts +18 -0
  37. package/lib/hooks/index.js +10 -0
  38. package/lib/hooks/useActualQueue.d.ts +48 -0
  39. package/lib/hooks/useActualQueue.js +98 -0
  40. package/lib/hooks/useDownloadActions.d.ts +26 -0
  41. package/lib/hooks/useDownloadActions.js +117 -0
  42. package/lib/hooks/useDownloadProgress.d.ts +25 -0
  43. package/lib/hooks/useDownloadProgress.js +79 -0
  44. package/lib/hooks/useDownloadStorage.d.ts +19 -0
  45. package/lib/hooks/useDownloadStorage.js +60 -0
  46. package/lib/hooks/useDownloadedTracks.d.ts +25 -0
  47. package/lib/hooks/useDownloadedTracks.js +69 -0
  48. package/lib/hooks/useEqualizer.d.ts +25 -0
  49. package/lib/hooks/useEqualizer.js +124 -0
  50. package/lib/hooks/useEqualizerPresets.d.ts +22 -0
  51. package/lib/hooks/useEqualizerPresets.js +96 -0
  52. package/lib/hooks/useNowPlaying.d.ts +2 -2
  53. package/lib/hooks/useNowPlaying.js +42 -33
  54. package/lib/hooks/useOnChangeTrack.d.ts +33 -6
  55. package/lib/hooks/useOnChangeTrack.js +68 -9
  56. package/lib/hooks/useOnPlaybackStateChange.d.ts +32 -6
  57. package/lib/hooks/useOnPlaybackStateChange.js +68 -9
  58. package/lib/hooks/usePlaylist.d.ts +48 -0
  59. package/lib/hooks/usePlaylist.js +136 -0
  60. package/lib/index.d.ts +6 -0
  61. package/lib/index.js +6 -0
  62. package/lib/specs/DownloadManager.nitro.d.ts +152 -0
  63. package/lib/specs/DownloadManager.nitro.js +1 -0
  64. package/lib/specs/Equalizer.nitro.d.ts +43 -0
  65. package/lib/specs/Equalizer.nitro.js +1 -0
  66. package/lib/specs/TrackPlayer.nitro.d.ts +6 -2
  67. package/lib/types/DownloadTypes.d.ts +110 -0
  68. package/lib/types/DownloadTypes.js +1 -0
  69. package/lib/types/EqualizerTypes.d.ts +52 -0
  70. package/lib/types/EqualizerTypes.js +1 -0
  71. package/lib/types/PlayerQueue.d.ts +4 -0
  72. package/nitro.json +8 -0
  73. package/nitrogen/generated/android/NitroPlayer+autolinking.cmake +10 -1
  74. package/nitrogen/generated/android/NitroPlayerOnLoad.cpp +32 -2
  75. package/nitrogen/generated/android/c++/JCurrentPlayingType.hpp +65 -0
  76. package/nitrogen/generated/android/c++/JDownloadConfig.hpp +92 -0
  77. package/nitrogen/generated/android/c++/JDownloadError.hpp +71 -0
  78. package/nitrogen/generated/android/c++/JDownloadErrorReason.hpp +74 -0
  79. package/nitrogen/generated/android/c++/JDownloadProgress.hpp +79 -0
  80. package/nitrogen/generated/android/c++/JDownloadQueueStatus.hpp +81 -0
  81. package/nitrogen/generated/android/c++/JDownloadState.hpp +71 -0
  82. package/nitrogen/generated/android/c++/JDownloadStorageInfo.hpp +73 -0
  83. package/nitrogen/generated/android/c++/JDownloadTask.hpp +108 -0
  84. package/nitrogen/generated/android/c++/JDownloadedPlaylist.hpp +111 -0
  85. package/nitrogen/generated/android/c++/JDownloadedTrack.hpp +92 -0
  86. package/nitrogen/generated/android/c++/JEqualizerBand.hpp +69 -0
  87. package/nitrogen/generated/android/c++/JEqualizerPreset.hpp +78 -0
  88. package/nitrogen/generated/android/c++/JEqualizerState.hpp +91 -0
  89. package/nitrogen/generated/android/c++/JFunc_void_DownloadProgress.hpp +80 -0
  90. package/nitrogen/generated/android/c++/JFunc_void_DownloadedTrack.hpp +89 -0
  91. package/nitrogen/generated/android/c++/JFunc_void_TrackItem_std__optional_Reason_.hpp +2 -0
  92. package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__std__string__.hpp +81 -0
  93. package/nitrogen/generated/android/c++/JFunc_void_std__string_Playlist_std__optional_QueueOperation_.hpp +2 -0
  94. package/nitrogen/generated/android/c++/JFunc_void_std__string_std__string_DownloadState_std__optional_DownloadError_.hpp +83 -0
  95. package/nitrogen/generated/android/c++/JFunc_void_std__vector_EqualizerBand_.hpp +97 -0
  96. package/nitrogen/generated/android/c++/JFunc_void_std__vector_Playlist__std__optional_QueueOperation_.hpp +2 -0
  97. package/nitrogen/generated/android/c++/JGainRange.hpp +61 -0
  98. package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.cpp +470 -0
  99. package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.hpp +99 -0
  100. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.cpp +204 -0
  101. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.hpp +82 -0
  102. package/nitrogen/generated/android/c++/JHybridPlayerQueueSpec.cpp +2 -0
  103. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.cpp +117 -15
  104. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.hpp +6 -2
  105. package/nitrogen/generated/android/c++/JPlaybackSource.hpp +62 -0
  106. package/nitrogen/generated/android/c++/JPlayerState.hpp +11 -3
  107. package/nitrogen/generated/android/c++/JPlaylist.hpp +2 -0
  108. package/nitrogen/generated/android/c++/JPresetType.hpp +59 -0
  109. package/nitrogen/generated/android/c++/JStorageLocation.hpp +59 -0
  110. package/nitrogen/generated/android/c++/JTrackItem.hpp +9 -3
  111. package/nitrogen/generated/android/c++/JTrackPlayerState.hpp +3 -3
  112. package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
  113. package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
  114. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.cpp +26 -0
  115. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.hpp +74 -0
  116. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.cpp +26 -0
  117. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.hpp +84 -0
  118. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.cpp +26 -0
  119. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.hpp +85 -0
  120. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.cpp +26 -0
  121. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.hpp +80 -0
  122. package/nitrogen/generated/android/c++/JVariant_NullType_Playlist.hpp +2 -0
  123. package/nitrogen/generated/android/c++/JVariant_NullType_TrackItem.hpp +2 -0
  124. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/CurrentPlayingType.kt +23 -0
  125. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadConfig.kt +59 -0
  126. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadError.kt +47 -0
  127. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadErrorReason.kt +26 -0
  128. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadProgress.kt +53 -0
  129. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadQueueStatus.kt +56 -0
  130. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadState.kt +25 -0
  131. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadStorageInfo.kt +50 -0
  132. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadTask.kt +65 -0
  133. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedPlaylist.kt +53 -0
  134. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedTrack.kt +56 -0
  135. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerBand.kt +47 -0
  136. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerPreset.kt +44 -0
  137. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerState.kt +44 -0
  138. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadProgress.kt +80 -0
  139. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadedTrack.kt +80 -0
  140. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__optional_std__variant_nitro__NullType__std__string__.kt +80 -0
  141. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.kt +80 -0
  142. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__vector_EqualizerBand_.kt +80 -0
  143. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/GainRange.kt +41 -0
  144. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridDownloadManagerSpec.kt +210 -0
  145. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridEqualizerSpec.kt +141 -0
  146. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridTrackPlayerSpec.kt +19 -2
  147. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlaybackSource.kt +22 -0
  148. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlayerState.kt +6 -3
  149. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PresetType.kt +21 -0
  150. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/StorageLocation.kt +21 -0
  151. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackItem.kt +7 -3
  152. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackPlayerState.kt +2 -2
  153. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_Double.kt +59 -0
  154. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadError.kt +59 -0
  155. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadTask.kt +59 -0
  156. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedPlaylist.kt +59 -0
  157. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedTrack.kt +59 -0
  158. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.cpp +138 -8
  159. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.hpp +1046 -121
  160. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Umbrella.hpp +66 -0
  161. package/nitrogen/generated/ios/NitroPlayerAutolinking.mm +16 -0
  162. package/nitrogen/generated/ios/NitroPlayerAutolinking.swift +30 -0
  163. package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.cpp +11 -0
  164. package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.hpp +386 -0
  165. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.cpp +11 -0
  166. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.hpp +223 -0
  167. package/nitrogen/generated/ios/c++/HybridPlayerQueueSpecSwift.hpp +1 -0
  168. package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.hpp +46 -6
  169. package/nitrogen/generated/ios/swift/CurrentPlayingType.swift +48 -0
  170. package/nitrogen/generated/ios/swift/DownloadConfig.swift +270 -0
  171. package/nitrogen/generated/ios/swift/DownloadError.swift +69 -0
  172. package/nitrogen/generated/ios/swift/DownloadErrorReason.swift +60 -0
  173. package/nitrogen/generated/ios/swift/DownloadProgress.swift +91 -0
  174. package/nitrogen/generated/ios/swift/DownloadQueueStatus.swift +102 -0
  175. package/nitrogen/generated/ios/swift/DownloadState.swift +56 -0
  176. package/nitrogen/generated/ios/swift/DownloadStorageInfo.swift +80 -0
  177. package/nitrogen/generated/ios/swift/DownloadTask.swift +315 -0
  178. package/nitrogen/generated/ios/swift/DownloadedPlaylist.swift +103 -0
  179. package/nitrogen/generated/ios/swift/DownloadedTrack.swift +147 -0
  180. package/nitrogen/generated/ios/swift/EqualizerBand.swift +69 -0
  181. package/nitrogen/generated/ios/swift/EqualizerPreset.swift +70 -0
  182. package/nitrogen/generated/ios/swift/EqualizerState.swift +115 -0
  183. package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
  184. package/nitrogen/generated/ios/swift/Func_void_DownloadProgress.swift +47 -0
  185. package/nitrogen/generated/ios/swift/Func_void_DownloadStorageInfo.swift +47 -0
  186. package/nitrogen/generated/ios/swift/Func_void_DownloadedTrack.swift +47 -0
  187. package/nitrogen/generated/ios/swift/Func_void_PlayerState.swift +47 -0
  188. package/nitrogen/generated/ios/swift/Func_void_bool.swift +5 -5
  189. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
  190. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__std__string__.swift +66 -0
  191. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  192. package/nitrogen/generated/ios/swift/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.swift +47 -0
  193. package/nitrogen/generated/ios/swift/Func_void_std__vector_EqualizerBand_.swift +47 -0
  194. package/nitrogen/generated/ios/swift/Func_void_std__vector_TrackItem_.swift +47 -0
  195. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +47 -0
  196. package/nitrogen/generated/ios/swift/GainRange.swift +47 -0
  197. package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec.swift +90 -0
  198. package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec_cxx.swift +705 -0
  199. package/nitrogen/generated/ios/swift/HybridEqualizerSpec.swift +73 -0
  200. package/nitrogen/generated/ios/swift/HybridEqualizerSpec_cxx.swift +396 -0
  201. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec.swift +6 -2
  202. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec_cxx.swift +105 -8
  203. package/nitrogen/generated/ios/swift/PlaybackSource.swift +44 -0
  204. package/nitrogen/generated/ios/swift/PlayerState.swift +13 -2
  205. package/nitrogen/generated/ios/swift/PresetType.swift +40 -0
  206. package/nitrogen/generated/ios/swift/StorageLocation.swift +40 -0
  207. package/nitrogen/generated/ios/swift/TrackItem.swift +31 -1
  208. package/nitrogen/generated/ios/swift/TrackPlayerState.swift +4 -4
  209. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +18 -0
  210. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadError.swift +18 -0
  211. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadTask.swift +18 -0
  212. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedPlaylist.swift +18 -0
  213. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedTrack.swift +18 -0
  214. package/nitrogen/generated/shared/c++/CurrentPlayingType.hpp +84 -0
  215. package/nitrogen/generated/shared/c++/DownloadConfig.hpp +108 -0
  216. package/nitrogen/generated/shared/c++/DownloadError.hpp +89 -0
  217. package/nitrogen/generated/shared/c++/DownloadErrorReason.hpp +96 -0
  218. package/nitrogen/generated/shared/c++/DownloadProgress.hpp +97 -0
  219. package/nitrogen/generated/shared/c++/DownloadQueueStatus.hpp +99 -0
  220. package/nitrogen/generated/shared/c++/DownloadState.hpp +92 -0
  221. package/nitrogen/generated/shared/c++/DownloadStorageInfo.hpp +91 -0
  222. package/nitrogen/generated/shared/c++/DownloadTask.hpp +122 -0
  223. package/nitrogen/generated/shared/c++/DownloadedPlaylist.hpp +101 -0
  224. package/nitrogen/generated/shared/c++/DownloadedTrack.hpp +107 -0
  225. package/nitrogen/generated/shared/c++/EqualizerBand.hpp +87 -0
  226. package/nitrogen/generated/shared/c++/EqualizerPreset.hpp +86 -0
  227. package/nitrogen/generated/shared/c++/EqualizerState.hpp +89 -0
  228. package/nitrogen/generated/shared/c++/GainRange.hpp +79 -0
  229. package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.cpp +55 -0
  230. package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.hpp +134 -0
  231. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.cpp +38 -0
  232. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.hpp +95 -0
  233. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.cpp +4 -0
  234. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.hpp +11 -5
  235. package/nitrogen/generated/shared/c++/PlaybackSource.hpp +80 -0
  236. package/nitrogen/generated/shared/c++/PlayerState.hpp +9 -2
  237. package/nitrogen/generated/shared/c++/PresetType.hpp +76 -0
  238. package/nitrogen/generated/shared/c++/StorageLocation.hpp +76 -0
  239. package/nitrogen/generated/shared/c++/TrackItem.hpp +7 -2
  240. package/nitrogen/generated/shared/c++/TrackPlayerState.hpp +5 -5
  241. package/package.json +1 -1
  242. package/src/hooks/callbackManager.ts +96 -0
  243. package/src/hooks/downloadCallbackManager.ts +149 -0
  244. package/src/hooks/equalizerCallbackManager.ts +138 -0
  245. package/src/hooks/index.ts +25 -0
  246. package/src/hooks/useActualQueue.ts +116 -0
  247. package/src/hooks/useDownloadActions.ts +179 -0
  248. package/src/hooks/useDownloadProgress.ts +126 -0
  249. package/src/hooks/useDownloadStorage.ts +84 -0
  250. package/src/hooks/useDownloadedTracks.ts +138 -0
  251. package/src/hooks/useEqualizer.ts +173 -0
  252. package/src/hooks/useEqualizerPresets.ts +140 -0
  253. package/src/hooks/useNowPlaying.ts +47 -33
  254. package/src/hooks/useOnChangeTrack.ts +81 -13
  255. package/src/hooks/useOnPlaybackStateChange.ts +87 -13
  256. package/src/hooks/usePlaylist.ts +161 -0
  257. package/src/index.ts +12 -0
  258. package/src/specs/DownloadManager.nitro.ts +203 -0
  259. package/src/specs/Equalizer.nitro.ts +69 -0
  260. package/src/specs/TrackPlayer.nitro.ts +6 -2
  261. package/src/types/DownloadTypes.ts +135 -0
  262. package/src/types/EqualizerTypes.ts +72 -0
  263. package/src/types/PlayerQueue.ts +9 -0
package/README.md CHANGED
@@ -18,6 +18,91 @@ Make sure you have these installed:
18
18
  npm install react-native-nitro-modules
19
19
  ```
20
20
 
21
+ ## API Reference
22
+
23
+
24
+ ### React Hooks
25
+
26
+ | Name | Platform | Description |
27
+ | ----------------------------- | -------- | ------------------------------------------------------------------------------- |
28
+ | `useOnChangeTrack` | Both | Returns current track and change reason. Updates automatically. |
29
+ | `useOnPlaybackStateChange` | Both | Returns current playback state (playing/paused) and change reason. |
30
+ | `useOnPlaybackProgressChange` | Both | Returns real-time playback progress, duration, and seek status. |
31
+ | `useOnSeek` | Both | Returns information about the last seek event (position/duration). |
32
+ | `useNowPlaying` | Both | Returns complete player state (track, state, duration, playlist) in one object. |
33
+ | `useActualQueue` | Both | Returns the efficient playback queue including temporary tracks. |
34
+ | `usePlaylist` | Both | Manages playlist state, providing access to all playlists and tracks. |
35
+ | `useEqualizer` | Both | Controls the 5-band equalizer, including presets and individual band gains. |
36
+ | `useAndroidAutoConnection` | Both | Monitors Android Auto connection status. |
37
+ | `useAudioDevices` | Android | Returns list of available audio output devices. |
38
+ | `useDownloadProgress` | Both | Tracks download progress for tracks. Returns progress map and overall status. |
39
+ | `useDownloadedTracks` | Both | Returns all downloaded tracks and playlists with query helpers. |
40
+
41
+ ### TrackPlayer Methods
42
+
43
+ | Name | Platform | Description |
44
+ | --------------------------- | -------- | ------------------------------------------------------------------- |
45
+ | `play()` | Both | Resumes playback. |
46
+ | `pause()` | Both | Pauses playback. |
47
+ | `playSong(id, playlistId?)` | Both | **Async**. Plays a specific song, optionally from a playlist. |
48
+ | `skipToNext()` | Both | Skips to the next track in the queue. |
49
+ | `skipToPrevious()` | Both | Skips to the previous track. |
50
+ | `seek(position)` | Both | Seeks to a specific time position in seconds. |
51
+ | `setVolume(0-100)` | Both | Sets playback volume (0-100). |
52
+ | `setRepeatMode(mode)` | Both | Sets repeat mode (`off`, `track`, `Playlist`). |
53
+ | `addToUpNext(id)` | Both | **Async**. Adds a track to the "up next" queue (FIFO). |
54
+ | `playNext(id)` | Both | **Async**. Adds a track to the "play next" stack (LIFO). |
55
+ | `getActualQueue()` | Both | **Async**. Gets the full playback queue including temporary tracks. |
56
+ | `getState()` | Both | **Async**. Gets the current player state immediately. |
57
+ | `skipToIndex(index)` | Both | **Async**. Skips to a specific index in the actual queue. |
58
+ | `configure(config)` | Both | Configures player settings (Android Auto, etc.). |
59
+ | `isAndroidAutoConnected()` | Both | Checks if Android Auto is currently connected. |
60
+
61
+ ### PlayerQueue Methods
62
+
63
+ | Name | Platform | Description |
64
+ | --------------------------------------- | -------- | ------------------------------------------------------- |
65
+ | `createPlaylist(name, ...)` | Both | Creates a new playlist. Returns ID. |
66
+ | `deletePlaylist(id)` | Both | Deletes a playlist by ID. |
67
+ | `updatePlaylist(id, ...)` | Both | Updates playlist metadata (name, description, artwork). |
68
+ | `getPlaylist(id)` | Both | Gets a specific playlist object. |
69
+ | `getAllPlaylists()` | Both | Gets all available playlists. |
70
+ | `loadPlaylist(id)` | Both | Loads a playlist for playback. |
71
+ | `getCurrentPlaylistId()` | Both | Gets the ID of the currently playing playlist. |
72
+ | `addTrackToPlaylist(pid, track)` | Both | Adds a track to a playlist. |
73
+ | `addTracksToPlaylist(pid, tracks)` | Both | Adds multiple tracks to a playlist. |
74
+ | `removeTrackFromPlaylist(pid, tid)` | Both | Removes a track from a playlist. |
75
+ | `reorderTrackInPlaylist(pid, tid, idx)` | Both | Moves a track to a new position in the playlist. |
76
+
77
+ ### Platform-Specific APIs
78
+
79
+ | Name | Platform | Description |
80
+ | ---------------------------------------- | -------- | ------------------------------------------------- |
81
+ | `AudioDevices.getAudioDevices()` | Android | Returns list of available audio devices. |
82
+ | `AudioDevices.setAudioDevice(id)` | Android | Sets the active audio output device. |
83
+ | `AudioRoutePicker.showRoutePicker()` | iOS | Opens the native AirPlay/Audio Route picker menu. |
84
+ | `AndroidAutoMediaLibraryHelper.set(...)` | Android | Sets custom folder structure for Android Auto. |
85
+ | `AndroidAutoMediaLibraryHelper.clear()` | Android | Resets Android Auto structure to default. |
86
+
87
+ ### DownloadManager Methods
88
+
89
+ | Name | Platform | Description |
90
+ | -------------------------------------- | -------- | ------------------------------------------------------------- |
91
+ | `configure(config)` | Both | Configures download settings (storage, concurrency, etc.). |
92
+ | `downloadTrack(track, playlistId?)` | Both | **Async**. Downloads a track. Returns download ID. |
93
+ | `downloadPlaylist(playlistId, tracks)` | Both | **Async**. Downloads all tracks in a playlist. |
94
+ | `pauseDownload(downloadId)` | Both | **Async**. Pauses an active download. |
95
+ | `resumeDownload(downloadId)` | Both | **Async**. Resumes a paused download. |
96
+ | `cancelDownload(downloadId)` | Both | **Async**. Cancels a download. |
97
+ | `isTrackDownloaded(trackId)` | Both | Checks if a track is downloaded. |
98
+ | `getAllDownloadedTracks()` | Both | Gets all downloaded tracks. |
99
+ | `deleteDownloadedTrack(trackId)` | Both | **Async**. Deletes a downloaded track. |
100
+ | `getStorageInfo()` | Both | **Async**. Gets download storage usage information. |
101
+ | `setPlaybackSourcePreference(pref)` | Both | Sets playback source: `'auto'`, `'download'`, or `'network'`. |
102
+
103
+ > [!NOTE]
104
+ > See [DOWNLOADS.md](./DOWNLOADS.md) for complete downloads API documentation.
105
+
21
106
  ## Quick Start
22
107
 
23
108
  ### 1. Configure the Player
@@ -49,6 +134,12 @@ const tracks: TrackItem[] = [
49
134
  duration: 180.0, // in seconds
50
135
  url: 'https://example.com/song.mp3',
51
136
  artwork: 'https://example.com/artwork.jpg',
137
+ // Optional custom data (accessible in player state)
138
+ extraPayload: {
139
+ artistId: '123',
140
+ genre: 'Rock',
141
+ isFavorite: true,
142
+ },
52
143
  },
53
144
  ]
54
145
 
@@ -72,7 +163,7 @@ import { TrackPlayer, PlayerQueue } from 'react-native-nitro-player'
72
163
  PlayerQueue.loadPlaylist(playlistId)
73
164
 
74
165
  // Or play a specific song
75
- TrackPlayer.playSong('song-id', playlistId)
166
+ await TrackPlayer.playSong('song-id', playlistId)
76
167
 
77
168
  // Basic controls
78
169
  TrackPlayer.play()
@@ -90,6 +181,178 @@ TrackPlayer.setRepeatMode('track') // Repeat current track
90
181
  TrackPlayer.setVolume(50) // Set volume to 50%
91
182
  TrackPlayer.setVolume(0) // Mute
92
183
  TrackPlayer.setVolume(100) // Maximum volume
184
+
185
+ // Add temporary tracks to queue
186
+ await TrackPlayer.addToUpNext('song-id') // Add to up-next queue (FIFO)
187
+ await TrackPlayer.playNext('song-id') // Add to play-next stack (LIFO)
188
+ ```
189
+
190
+ ### 4. Download for Offline Playback (Optional)
191
+
192
+ ```typescript
193
+ import { DownloadManager } from 'react-native-nitro-player'
194
+
195
+ // Configure downloads
196
+ DownloadManager.configure({
197
+ maxConcurrentDownloads: 3,
198
+ backgroundDownloadsEnabled: true,
199
+ downloadArtwork: true,
200
+ })
201
+
202
+ // Download a track
203
+ const downloadId = await DownloadManager.downloadTrack(track)
204
+
205
+ // Download entire playlist
206
+ const playlist = PlayerQueue.getPlaylist(playlistId)
207
+ await DownloadManager.downloadPlaylist(playlist.id, playlist.tracks)
208
+
209
+ // Set playback to prefer downloaded tracks
210
+ DownloadManager.setPlaybackSourcePreference('auto')
211
+ ```
212
+
213
+ > [!NOTE]
214
+ > See [DOWNLOADS.md](./DOWNLOADS.md) for complete offline downloads documentation.
215
+
216
+ ## Temporary Queue Management
217
+
218
+ The player supports adding temporary tracks to the queue without modifying the original playlist. These tracks are automatically removed after playing.
219
+
220
+ ### `addToUpNext(trackId: string): Promise<void>`
221
+
222
+ Adds a track to the **up-next queue** (FIFO - First In, First Out). Tracks play in the order they were added.
223
+
224
+ **Behavior:**
225
+
226
+ - Track is inserted after the current track and any "play next" tracks
227
+ - Multiple tracks can be added - they play in the order added
228
+ - Track is automatically removed after playing
229
+ - Does not modify the original playlist
230
+
231
+ **Example:**
232
+
233
+ ```typescript
234
+ // Add tracks to up-next queue
235
+ await TrackPlayer.addToUpNext('song-1') // Will play 3rd
236
+ await TrackPlayer.addToUpNext('song-2') // Will play 4th
237
+ await TrackPlayer.addToUpNext('song-3') // Will play 5th
238
+ // Order: [current] → [song-1] → [song-2] → [song-3]
239
+ ```
240
+
241
+ ### `playNext(trackId: string): Promise<void>`
242
+
243
+ Adds a track to the **play-next stack** (LIFO - Last In, First Out). The most recently added track plays first.
244
+
245
+ **Behavior:**
246
+
247
+ - Track is inserted immediately after the current track
248
+ - Multiple tracks can be added - the last added plays first
249
+ - Track is automatically removed after playing
250
+ - Does not modify the original playlist
251
+
252
+ **Example:**
253
+
254
+ ```typescript
255
+ // Add tracks to play-next stack
256
+ await TrackPlayer.playNext('song-1') // Will play 3rd
257
+ await TrackPlayer.playNext('song-2') // Will play 2nd (most recent)
258
+ await TrackPlayer.playNext('song-3') // Will play 1st (most recent)
259
+ // Order: [current] → [song-3] → [song-2] → [song-1]
260
+ ```
261
+
262
+ ### Queue Order
263
+
264
+ The actual playback order is:
265
+
266
+ ```
267
+ [original tracks before current]
268
+ + [CURRENT TRACK]
269
+ + [playNext stack (LIFO)]
270
+ + [upNext queue (FIFO)]
271
+ + [original tracks after current]
272
+ ```
273
+
274
+ ### Clearing Temporary Tracks
275
+
276
+ Temporary tracks are automatically cleared when:
277
+
278
+ - `await TrackPlayer.playSong()` is called
279
+ - `PlayerQueue.loadPlaylist()` is called
280
+ - `TrackPlayer.playFromIndex()` is called
281
+
282
+ ### `skipToIndex(index: number): Promise<boolean>`
283
+
284
+ Skips to a specific index in the **actual queue** (the combined queue with temporary tracks).
285
+
286
+ **Behavior:**
287
+
288
+ - Takes an index into the actual queue structure
289
+ - If the target is a temporary track (playNext or upNext), plays that track
290
+ - If the target is beyond temporary tracks (in the remaining original playlist), clears all temporary tracks and plays from the original playlist
291
+ - Returns `true` if successful, `false` if the index is invalid
292
+
293
+ **Example:**
294
+
295
+ ```typescript
296
+ // Queue: [track1(0), track2(1, current), playNext-A(2), upNext-B(3), track3(4), track4(5)]
297
+
298
+ // Skip to playNext track
299
+ await TrackPlayer.skipToIndex(2) // Plays playNext-A
300
+
301
+ // Skip to original playlist track (clears temporary tracks)
302
+ await TrackPlayer.skipToIndex(4) // Clears temps, plays track3
303
+ ```
304
+
305
+ ### Getting the Actual Queue
306
+
307
+ Use `useActualQueue()` hook to see the complete queue including temporary tracks:
308
+
309
+ ```typescript
310
+ import { useActualQueue } from 'react-native-nitro-player'
311
+
312
+ function QueueView() {
313
+ const { queue, refreshQueue, isLoading } = useActualQueue()
314
+
315
+ return (
316
+ <ScrollView>
317
+ {queue.map((track, index) => (
318
+ <View key={track.id}>
319
+ <Text>{index + 1}. {track.title}</Text>
320
+ </View>
321
+ ))}
322
+ </ScrollView>
323
+ )
324
+ }
325
+ ```
326
+
327
+ **Returns:**
328
+
329
+ - `queue: TrackItem[]` - Complete queue in playback order
330
+ - `refreshQueue: () => void` - Manually refresh the queue
331
+ - `isLoading: boolean` - Whether the queue is currently loading
332
+
333
+ ## CurrentPlayingType
334
+
335
+ The `currentPlayingType` field in `PlayerState` indicates the source of the currently playing track:
336
+
337
+ | Value | Description |
338
+ | -------------- | -------------------------------------------------------- |
339
+ | `'playlist'` | Playing from the original playlist |
340
+ | `'play-next'` | Playing a track added via `playNext()` (LIFO stack) |
341
+ | `'up-next'` | Playing a track added via `addToUpNext()` (FIFO queue) |
342
+ | `'not-playing'`| No track is currently playing |
343
+
344
+ **Example:**
345
+
346
+ ```typescript
347
+ const state = await TrackPlayer.getState()
348
+
349
+ if (state.currentPlayingType === 'play-next') {
350
+ console.log('Playing a play-next track')
351
+ } else if (state.currentPlayingType === 'up-next') {
352
+ console.log('Playing an up-next track')
353
+ } else if (state.currentPlayingType === 'playlist') {
354
+ console.log('Playing from the original playlist')
355
+ }
93
356
  ```
94
357
 
95
358
  ## Core Concepts
@@ -111,6 +374,7 @@ Controls playback. Use it to:
111
374
  - Skip tracks
112
375
  - Control repeat mode
113
376
  - Control volume
377
+ - Add temporary tracks to queue (`addToUpNext`, `playNext`)
114
378
  - Get current player state
115
379
  - Listen to playback events
116
380
 
@@ -183,9 +447,82 @@ Returns the complete current player state (same as `TrackPlayer.getState()`). Th
183
447
  - `currentState: TrackPlayerState` - Current playback state (`'playing'`, `'paused'`, or `'stopped'`)
184
448
  - `currentPlaylistId: string | null` - ID of the currently loaded playlist, or `null` if no playlist is loaded
185
449
  - `currentIndex: number` - Index of the current track in the playlist (-1 if no track is playing)
450
+ - `currentPlayingType: CurrentPlayingType` - Source of the current track (`'playlist'`, `'play-next'`, `'up-next'`, or `'not-playing'`)
186
451
 
187
452
  **Note:** This hook is equivalent to calling `TrackPlayer.getState()` but provides reactive updates. It listens to track changes and playback state changes to update automatically. Also dont rely on progress from this hook
188
453
 
454
+ ### `useActualQueue()`
455
+
456
+ Returns the actual playback queue including temporary tracks (from `addToUpNext` and `playNext`).
457
+
458
+ **Returns:**
459
+
460
+ - `queue: TrackItem[]` - Complete queue in playback order: `[tracks_before_current] + [current] + [playNext_stack] + [upNext_queue] + [remaining_tracks]`
461
+ - `refreshQueue: () => void` - Manually refresh the queue (useful after adding tracks)
462
+ - `isLoading: boolean` - Whether the queue is currently loading
463
+
464
+ **Auto-updates when:**
465
+
466
+ - Track changes
467
+ - Temporary tracks are added (`playNext`/`addToUpNext`)
468
+ - Playback state changes
469
+
470
+ **Example:**
471
+
472
+ ```typescript
473
+ import { useActualQueue } from 'react-native-nitro-player'
474
+
475
+ function QueueView() {
476
+ const { queue, refreshQueue, isLoading } = useActualQueue()
477
+
478
+ const handleAddToUpNext = async (trackId: string) => {
479
+ await TrackPlayer.addToUpNext(trackId)
480
+ // Refresh queue after adding track
481
+ setTimeout(refreshQueue, 100)
482
+ }
483
+
484
+ return (
485
+ <ScrollView>
486
+ {queue.map((track, index) => (
487
+ <View key={track.id}>
488
+ <Text>{index + 1}. {track.title}</Text>
489
+ </View>
490
+ ))}
491
+ </ScrollView>
492
+ )
493
+ }
494
+ ```
495
+
496
+ ### `usePlaylist()`
497
+
498
+ Manages playlist-related state and provides access to all playlists and tracks.
499
+
500
+ **Returns:**
501
+
502
+ - `currentPlaylist: Playlist | null` - The currently loaded playlist
503
+ - `currentPlaylistId: string | null` - ID of the currently loaded playlist
504
+ - `allPlaylists: Playlist[]` - Array of all playlists
505
+ - `allTracks: TrackItem[]` - Array of all tracks from all playlists
506
+ - `isLoading: boolean` - Whether playlists are currently loading
507
+ - `refreshPlaylists: () => void` - Manually refresh playlist data
508
+
509
+ **Example:**
510
+
511
+ ```typescript
512
+ import { usePlaylist } from 'react-native-nitro-player'
513
+
514
+ function PlaylistView() {
515
+ const { allPlaylists, allTracks, refreshPlaylists } = usePlaylist()
516
+
517
+ return (
518
+ <View>
519
+ <Text>Playlists: {allPlaylists.length}</Text>
520
+ <Text>Total Tracks: {allTracks.length}</Text>
521
+ </View>
522
+ )
523
+ }
524
+ ```
525
+
189
526
  ## Audio Device APIs
190
527
 
191
528
  ### `AudioDevices` (Android only)
@@ -210,7 +547,7 @@ import { AudioDevices } from 'react-native-nitro-player'
210
547
 
211
548
  if (AudioDevices) {
212
549
  const devices = AudioDevices.getAudioDevices()
213
- devices.forEach(device => {
550
+ devices.forEach((device) => {
214
551
  console.log(`${device.name} - Active: ${device.isActive}`)
215
552
  })
216
553
  }
@@ -255,6 +592,73 @@ if (AudioRoutePicker) {
255
592
  }
256
593
  ```
257
594
 
595
+
596
+ ## Equalizer
597
+
598
+ The player includes a powerful 5-band equalizer that works on both iOS and Android.
599
+
600
+ ### `useEqualizer()`
601
+
602
+ Returns the current equalizer state and control methods.
603
+
604
+ **Returns:**
605
+
606
+ - `isEnabled: boolean` - Whether the equalizer is currently active
607
+ - `bands: EqualizerBand[]` - Current gain settings for all 5 bands
608
+ - `currentPreset: string | null` - Name of the currently applied preset
609
+ - `setEnabled(enabled: boolean): boolean` - Toggle the equalizer on/off
610
+ - `setBandGain(index: number, gainDb: number): boolean` - Set gain for a specific band (range: -12dB to +12dB)
611
+ - `setAllBandGains(gains: number[]): boolean` - Set all band gains at once
612
+ - `reset(): void` - Reset to flat response
613
+
614
+ **Bands:**
615
+
616
+ The equalizer features 5 bands at the following center frequencies:
617
+ 1. **60 Hz** - Sub-bass/Bass
618
+ 2. **230 Hz** - Bass/Low-mids
619
+ 3. **910 Hz** - Mids
620
+ 4. **3.6 kHz** - Upper-mids/Treble
621
+ 5. **14 kHz** - High treble/Air
622
+
623
+ **Example:**
624
+
625
+ ```typescript
626
+ import { useEqualizer } from 'react-native-nitro-player'
627
+
628
+ function EqualizerControl() {
629
+ const {
630
+ isEnabled,
631
+ setEnabled,
632
+ bands,
633
+ setBandGain,
634
+ reset
635
+ } = useEqualizer()
636
+
637
+ return (
638
+ <View>
639
+ <Switch
640
+ value={isEnabled}
641
+ onValueChange={setEnabled}
642
+ />
643
+
644
+ {bands.map((band) => (
645
+ <View key={band.index}>
646
+ <Text>{band.frequencyLabel}</Text>
647
+ <Slider
648
+ minimumValue={-12}
649
+ maximumValue={12}
650
+ value={band.gainDb}
651
+ onSlidingComplete={(value) => setBandGain(band.index, value)}
652
+ />
653
+ </View>
654
+ ))}
655
+
656
+ <Button title="Reset" onPress={reset} />
657
+ </View>
658
+ )
659
+ }
660
+ ```
661
+
258
662
  ## Repeat Mode
259
663
 
260
664
  Control how tracks repeat during playback.
@@ -457,7 +861,7 @@ TrackPlayer.onPlaybackProgressChange(
457
861
  )
458
862
 
459
863
  // Listen to Android Auto connection changes
460
- TrackPlayer.onAndroidAutoConnectionChange(connected => {
864
+ TrackPlayer.onAndroidAutoConnectionChange((connected) => {
461
865
  console.log('Android Auto:', connected ? 'Connected' : 'Disconnected')
462
866
  })
463
867
  ```
@@ -467,7 +871,7 @@ TrackPlayer.onAndroidAutoConnectionChange(connected => {
467
871
  ```typescript
468
872
  import { TrackPlayer } from 'react-native-nitro-player'
469
873
 
470
- const state = TrackPlayer.getState()
874
+ const state = await TrackPlayer.getState()
471
875
 
472
876
  console.log(state.currentState) // 'playing' | 'paused' | 'stopped'
473
877
  console.log(state.currentPosition) // current position in seconds
@@ -475,6 +879,7 @@ console.log(state.totalDuration) // total duration in seconds
475
879
  console.log(state.currentTrack) // current TrackItem or null
476
880
  console.log(state.currentPlaylistId) // current playlist ID or null
477
881
  console.log(state.currentIndex) // current track index in playlist
882
+ console.log(state.currentPlayingType) // 'playlist' | 'play-next' | 'up-next' | 'not-playing'
478
883
  ```
479
884
 
480
885
  ## Track Item Structure
@@ -490,6 +895,29 @@ interface TrackItem {
490
895
  duration: number // Duration in seconds
491
896
  url: string // Audio file URL
492
897
  artwork?: string | null // Optional artwork URL
898
+ // key-value pairs for arbitrary data
899
+ extraPayload?: {
900
+ [key: string]: string | number | boolean | Record<string, unknown>
901
+ }
902
+ }
903
+ ```
904
+
905
+ ### Custom Track Metadata (extraPayload)
906
+
907
+ ```typescript
908
+ const track = {
909
+ // ... standard fields
910
+ extraPayload: {
911
+ externalId: 'sp-12345',
912
+ rating: 4.5,
913
+ tags: ['chill', 'instrumental']
914
+ }
915
+ }
916
+
917
+ // Accessing it later
918
+ const { track } = useOnChangeTrack()
919
+ if (track?.extraPayload?.rating > 4) {
920
+ console.log('High rated track playing!')
493
921
  }
494
922
  ```
495
923
 
@@ -687,6 +1115,7 @@ AndroidAutoMediaLibraryHelper.set({
687
1115
  - ✅ **CarPlay Support**: Control playback from CarPlay (iOS)
688
1116
  - ✅ **Notification Controls**: Show playback controls in notifications
689
1117
  - ✅ **Progress Tracking**: Real-time playback progress updates
1118
+ - ✅ **Offline Downloads**: Download tracks and playlists for offline playback
690
1119
 
691
1120
  ## TypeScript Support
692
1121
 
@@ -698,6 +1127,7 @@ import type {
698
1127
  Playlist,
699
1128
  PlayerState,
700
1129
  TrackPlayerState,
1130
+ CurrentPlayingType,
701
1131
  QueueOperation,
702
1132
  Reason,
703
1133
  PlayerConfig,
@@ -705,6 +1135,16 @@ import type {
705
1135
  MediaItem,
706
1136
  LayoutType,
707
1137
  MediaType,
1138
+ // Download types
1139
+ DownloadConfig,
1140
+ DownloadProgress,
1141
+ DownloadedTrack,
1142
+ DownloadedPlaylist,
1143
+ DownloadTask,
1144
+ DownloadState,
1145
+ DownloadError,
1146
+ DownloadStorageInfo,
1147
+ PlaybackSource,
708
1148
  } from 'react-native-nitro-player'
709
1149
  ```
710
1150
 
@@ -129,7 +129,7 @@ repositories {
129
129
  }
130
130
 
131
131
 
132
- def media3_version = "1.3.0"
132
+ def media3_version = "1.9.0"
133
133
  dependencies {
134
134
  // For < 0.71, this will be from the local maven repo
135
135
  // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin
@@ -143,5 +143,8 @@ dependencies {
143
143
  implementation "androidx.media3:media3-session:$media3_version"
144
144
  implementation "androidx.media3:media3-common:$media3_version"
145
145
  implementation "androidx.media:media:1.7.0"
146
+
147
+ // WorkManager for background downloads
148
+ implementation "androidx.work:work-runtime-ktx:2.9.0"
146
149
  }
147
150
 
@@ -1,2 +1,17 @@
1
- <manifest xmlns:android="http://schemas.android.com/apk/res/android">
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
+ xmlns:tools="http://schemas.android.com/tools">
3
+ <!-- Permissions for downloads -->
4
+ <uses-permission android:name="android.permission.INTERNET" />
5
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
6
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
7
+
8
+ <application>
9
+ <!-- WorkManager's SystemForegroundService for download notifications -->
10
+ <service
11
+ android:name="androidx.work.impl.foreground.SystemForegroundService"
12
+ android:foregroundServiceType="dataSync"
13
+ android:exported="false"
14
+ tools:node="merge" />
15
+ </application>
2
16
  </manifest>
17
+
@@ -5,6 +5,8 @@ import com.facebook.proguard.annotations.DoNotStrip
5
5
  import com.margelo.nitro.NitroModules
6
6
  import com.margelo.nitro.nitroplayer.core.TrackPlayerCore
7
7
 
8
+ @DoNotStrip
9
+ @Keep
8
10
  class HybridAndroidAutoMediaLibrary : HybridAndroidAutoMediaLibrarySpec() {
9
11
  private val core: TrackPlayerCore
10
12
 
@@ -4,8 +4,12 @@ import android.content.Context
4
4
  import android.media.AudioDeviceInfo
5
5
  import android.media.AudioManager
6
6
  import android.os.Build
7
+ import androidx.annotation.Keep
8
+ import com.facebook.proguard.annotations.DoNotStrip
7
9
  import com.margelo.nitro.NitroModules
8
10
 
11
+ @DoNotStrip
12
+ @Keep
9
13
  class HybridAudioDevices : HybridAudioDevicesSpec() {
10
14
  val applicationContext = NitroModules.applicationContext
11
15
  private val audioManager = applicationContext?.getSystemService(Context.AUDIO_SERVICE) as AudioManager
@@ -30,6 +34,8 @@ class HybridAudioDevices : HybridAudioDevicesSpec() {
30
34
  types
31
35
  }
32
36
 
37
+ @DoNotStrip
38
+ @Keep
33
39
  override fun getAudioDevices(): Array<TAudioDevice> {
34
40
  val devices = audioManager.getDevices(android.media.AudioManager.GET_DEVICES_OUTPUTS)
35
41
  var activeDevice: AudioDeviceInfo? = null
@@ -66,6 +72,8 @@ class HybridAudioDevices : HybridAudioDevicesSpec() {
66
72
  else -> "Type $type"
67
73
  }
68
74
 
75
+ @DoNotStrip
76
+ @Keep
69
77
  override fun setAudioDevice(deviceId: Double): Boolean {
70
78
  val device =
71
79
  audioManager