react-native-nitro-player 0.3.0-alpha.9 → 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 (257) 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/downloadCallbackManager.d.ts +36 -0
  31. package/lib/hooks/downloadCallbackManager.js +108 -0
  32. package/lib/hooks/equalizerCallbackManager.d.ts +37 -0
  33. package/lib/hooks/equalizerCallbackManager.js +109 -0
  34. package/lib/hooks/index.d.ts +16 -0
  35. package/lib/hooks/index.js +10 -0
  36. package/lib/hooks/useActualQueue.d.ts +48 -0
  37. package/lib/hooks/useActualQueue.js +98 -0
  38. package/lib/hooks/useDownloadActions.d.ts +26 -0
  39. package/lib/hooks/useDownloadActions.js +117 -0
  40. package/lib/hooks/useDownloadProgress.d.ts +25 -0
  41. package/lib/hooks/useDownloadProgress.js +79 -0
  42. package/lib/hooks/useDownloadStorage.d.ts +19 -0
  43. package/lib/hooks/useDownloadStorage.js +60 -0
  44. package/lib/hooks/useDownloadedTracks.d.ts +25 -0
  45. package/lib/hooks/useDownloadedTracks.js +69 -0
  46. package/lib/hooks/useEqualizer.d.ts +25 -0
  47. package/lib/hooks/useEqualizer.js +124 -0
  48. package/lib/hooks/useEqualizerPresets.d.ts +22 -0
  49. package/lib/hooks/useEqualizerPresets.js +96 -0
  50. package/lib/hooks/useNowPlaying.js +3 -2
  51. package/lib/hooks/useOnChangeTrack.js +15 -12
  52. package/lib/hooks/useOnPlaybackStateChange.js +16 -13
  53. package/lib/hooks/usePlaylist.d.ts +48 -0
  54. package/lib/hooks/usePlaylist.js +136 -0
  55. package/lib/index.d.ts +6 -0
  56. package/lib/index.js +6 -0
  57. package/lib/specs/DownloadManager.nitro.d.ts +152 -0
  58. package/lib/specs/DownloadManager.nitro.js +1 -0
  59. package/lib/specs/Equalizer.nitro.d.ts +43 -0
  60. package/lib/specs/Equalizer.nitro.js +1 -0
  61. package/lib/specs/TrackPlayer.nitro.d.ts +6 -2
  62. package/lib/types/DownloadTypes.d.ts +110 -0
  63. package/lib/types/DownloadTypes.js +1 -0
  64. package/lib/types/EqualizerTypes.d.ts +52 -0
  65. package/lib/types/EqualizerTypes.js +1 -0
  66. package/lib/types/PlayerQueue.d.ts +4 -0
  67. package/nitro.json +8 -0
  68. package/nitrogen/generated/android/NitroPlayer+autolinking.cmake +10 -1
  69. package/nitrogen/generated/android/NitroPlayerOnLoad.cpp +32 -2
  70. package/nitrogen/generated/android/c++/JCurrentPlayingType.hpp +65 -0
  71. package/nitrogen/generated/android/c++/JDownloadConfig.hpp +92 -0
  72. package/nitrogen/generated/android/c++/JDownloadError.hpp +71 -0
  73. package/nitrogen/generated/android/c++/JDownloadErrorReason.hpp +74 -0
  74. package/nitrogen/generated/android/c++/JDownloadProgress.hpp +79 -0
  75. package/nitrogen/generated/android/c++/JDownloadQueueStatus.hpp +81 -0
  76. package/nitrogen/generated/android/c++/JDownloadState.hpp +71 -0
  77. package/nitrogen/generated/android/c++/JDownloadStorageInfo.hpp +73 -0
  78. package/nitrogen/generated/android/c++/JDownloadTask.hpp +108 -0
  79. package/nitrogen/generated/android/c++/JDownloadedPlaylist.hpp +111 -0
  80. package/nitrogen/generated/android/c++/JDownloadedTrack.hpp +92 -0
  81. package/nitrogen/generated/android/c++/JEqualizerBand.hpp +69 -0
  82. package/nitrogen/generated/android/c++/JEqualizerPreset.hpp +78 -0
  83. package/nitrogen/generated/android/c++/JEqualizerState.hpp +91 -0
  84. package/nitrogen/generated/android/c++/JFunc_void_DownloadProgress.hpp +80 -0
  85. package/nitrogen/generated/android/c++/JFunc_void_DownloadedTrack.hpp +89 -0
  86. package/nitrogen/generated/android/c++/JFunc_void_TrackItem_std__optional_Reason_.hpp +2 -0
  87. package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__std__string__.hpp +81 -0
  88. package/nitrogen/generated/android/c++/JFunc_void_std__string_Playlist_std__optional_QueueOperation_.hpp +2 -0
  89. package/nitrogen/generated/android/c++/JFunc_void_std__string_std__string_DownloadState_std__optional_DownloadError_.hpp +83 -0
  90. package/nitrogen/generated/android/c++/JFunc_void_std__vector_EqualizerBand_.hpp +97 -0
  91. package/nitrogen/generated/android/c++/JFunc_void_std__vector_Playlist__std__optional_QueueOperation_.hpp +2 -0
  92. package/nitrogen/generated/android/c++/JGainRange.hpp +61 -0
  93. package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.cpp +470 -0
  94. package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.hpp +99 -0
  95. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.cpp +204 -0
  96. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.hpp +82 -0
  97. package/nitrogen/generated/android/c++/JHybridPlayerQueueSpec.cpp +2 -0
  98. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.cpp +117 -15
  99. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.hpp +6 -2
  100. package/nitrogen/generated/android/c++/JPlaybackSource.hpp +62 -0
  101. package/nitrogen/generated/android/c++/JPlayerState.hpp +11 -3
  102. package/nitrogen/generated/android/c++/JPlaylist.hpp +2 -0
  103. package/nitrogen/generated/android/c++/JPresetType.hpp +59 -0
  104. package/nitrogen/generated/android/c++/JStorageLocation.hpp +59 -0
  105. package/nitrogen/generated/android/c++/JTrackItem.hpp +9 -3
  106. package/nitrogen/generated/android/c++/JTrackPlayerState.hpp +3 -3
  107. package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
  108. package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
  109. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.cpp +26 -0
  110. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.hpp +74 -0
  111. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.cpp +26 -0
  112. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.hpp +84 -0
  113. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.cpp +26 -0
  114. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.hpp +85 -0
  115. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.cpp +26 -0
  116. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.hpp +80 -0
  117. package/nitrogen/generated/android/c++/JVariant_NullType_Playlist.hpp +2 -0
  118. package/nitrogen/generated/android/c++/JVariant_NullType_TrackItem.hpp +2 -0
  119. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/CurrentPlayingType.kt +23 -0
  120. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadConfig.kt +59 -0
  121. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadError.kt +47 -0
  122. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadErrorReason.kt +26 -0
  123. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadProgress.kt +53 -0
  124. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadQueueStatus.kt +56 -0
  125. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadState.kt +25 -0
  126. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadStorageInfo.kt +50 -0
  127. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadTask.kt +65 -0
  128. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedPlaylist.kt +53 -0
  129. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedTrack.kt +56 -0
  130. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerBand.kt +47 -0
  131. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerPreset.kt +44 -0
  132. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerState.kt +44 -0
  133. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadProgress.kt +80 -0
  134. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadedTrack.kt +80 -0
  135. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__optional_std__variant_nitro__NullType__std__string__.kt +80 -0
  136. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.kt +80 -0
  137. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__vector_EqualizerBand_.kt +80 -0
  138. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/GainRange.kt +41 -0
  139. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridDownloadManagerSpec.kt +210 -0
  140. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridEqualizerSpec.kt +141 -0
  141. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridTrackPlayerSpec.kt +19 -2
  142. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlaybackSource.kt +22 -0
  143. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlayerState.kt +6 -3
  144. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PresetType.kt +21 -0
  145. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/StorageLocation.kt +21 -0
  146. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackItem.kt +7 -3
  147. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackPlayerState.kt +2 -2
  148. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_Double.kt +59 -0
  149. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadError.kt +59 -0
  150. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadTask.kt +59 -0
  151. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedPlaylist.kt +59 -0
  152. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedTrack.kt +59 -0
  153. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.cpp +138 -8
  154. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.hpp +1046 -121
  155. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Umbrella.hpp +66 -0
  156. package/nitrogen/generated/ios/NitroPlayerAutolinking.mm +16 -0
  157. package/nitrogen/generated/ios/NitroPlayerAutolinking.swift +30 -0
  158. package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.cpp +11 -0
  159. package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.hpp +386 -0
  160. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.cpp +11 -0
  161. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.hpp +223 -0
  162. package/nitrogen/generated/ios/c++/HybridPlayerQueueSpecSwift.hpp +1 -0
  163. package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.hpp +46 -6
  164. package/nitrogen/generated/ios/swift/CurrentPlayingType.swift +48 -0
  165. package/nitrogen/generated/ios/swift/DownloadConfig.swift +270 -0
  166. package/nitrogen/generated/ios/swift/DownloadError.swift +69 -0
  167. package/nitrogen/generated/ios/swift/DownloadErrorReason.swift +60 -0
  168. package/nitrogen/generated/ios/swift/DownloadProgress.swift +91 -0
  169. package/nitrogen/generated/ios/swift/DownloadQueueStatus.swift +102 -0
  170. package/nitrogen/generated/ios/swift/DownloadState.swift +56 -0
  171. package/nitrogen/generated/ios/swift/DownloadStorageInfo.swift +80 -0
  172. package/nitrogen/generated/ios/swift/DownloadTask.swift +315 -0
  173. package/nitrogen/generated/ios/swift/DownloadedPlaylist.swift +103 -0
  174. package/nitrogen/generated/ios/swift/DownloadedTrack.swift +147 -0
  175. package/nitrogen/generated/ios/swift/EqualizerBand.swift +69 -0
  176. package/nitrogen/generated/ios/swift/EqualizerPreset.swift +70 -0
  177. package/nitrogen/generated/ios/swift/EqualizerState.swift +115 -0
  178. package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
  179. package/nitrogen/generated/ios/swift/Func_void_DownloadProgress.swift +47 -0
  180. package/nitrogen/generated/ios/swift/Func_void_DownloadStorageInfo.swift +47 -0
  181. package/nitrogen/generated/ios/swift/Func_void_DownloadedTrack.swift +47 -0
  182. package/nitrogen/generated/ios/swift/Func_void_PlayerState.swift +47 -0
  183. package/nitrogen/generated/ios/swift/Func_void_bool.swift +5 -5
  184. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
  185. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__std__string__.swift +66 -0
  186. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  187. package/nitrogen/generated/ios/swift/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.swift +47 -0
  188. package/nitrogen/generated/ios/swift/Func_void_std__vector_EqualizerBand_.swift +47 -0
  189. package/nitrogen/generated/ios/swift/Func_void_std__vector_TrackItem_.swift +47 -0
  190. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +47 -0
  191. package/nitrogen/generated/ios/swift/GainRange.swift +47 -0
  192. package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec.swift +90 -0
  193. package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec_cxx.swift +705 -0
  194. package/nitrogen/generated/ios/swift/HybridEqualizerSpec.swift +73 -0
  195. package/nitrogen/generated/ios/swift/HybridEqualizerSpec_cxx.swift +396 -0
  196. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec.swift +6 -2
  197. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec_cxx.swift +105 -8
  198. package/nitrogen/generated/ios/swift/PlaybackSource.swift +44 -0
  199. package/nitrogen/generated/ios/swift/PlayerState.swift +13 -2
  200. package/nitrogen/generated/ios/swift/PresetType.swift +40 -0
  201. package/nitrogen/generated/ios/swift/StorageLocation.swift +40 -0
  202. package/nitrogen/generated/ios/swift/TrackItem.swift +31 -1
  203. package/nitrogen/generated/ios/swift/TrackPlayerState.swift +4 -4
  204. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +18 -0
  205. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadError.swift +18 -0
  206. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadTask.swift +18 -0
  207. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedPlaylist.swift +18 -0
  208. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedTrack.swift +18 -0
  209. package/nitrogen/generated/shared/c++/CurrentPlayingType.hpp +84 -0
  210. package/nitrogen/generated/shared/c++/DownloadConfig.hpp +108 -0
  211. package/nitrogen/generated/shared/c++/DownloadError.hpp +89 -0
  212. package/nitrogen/generated/shared/c++/DownloadErrorReason.hpp +96 -0
  213. package/nitrogen/generated/shared/c++/DownloadProgress.hpp +97 -0
  214. package/nitrogen/generated/shared/c++/DownloadQueueStatus.hpp +99 -0
  215. package/nitrogen/generated/shared/c++/DownloadState.hpp +92 -0
  216. package/nitrogen/generated/shared/c++/DownloadStorageInfo.hpp +91 -0
  217. package/nitrogen/generated/shared/c++/DownloadTask.hpp +122 -0
  218. package/nitrogen/generated/shared/c++/DownloadedPlaylist.hpp +101 -0
  219. package/nitrogen/generated/shared/c++/DownloadedTrack.hpp +107 -0
  220. package/nitrogen/generated/shared/c++/EqualizerBand.hpp +87 -0
  221. package/nitrogen/generated/shared/c++/EqualizerPreset.hpp +86 -0
  222. package/nitrogen/generated/shared/c++/EqualizerState.hpp +89 -0
  223. package/nitrogen/generated/shared/c++/GainRange.hpp +79 -0
  224. package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.cpp +55 -0
  225. package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.hpp +134 -0
  226. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.cpp +38 -0
  227. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.hpp +95 -0
  228. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.cpp +4 -0
  229. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.hpp +11 -5
  230. package/nitrogen/generated/shared/c++/PlaybackSource.hpp +80 -0
  231. package/nitrogen/generated/shared/c++/PlayerState.hpp +9 -2
  232. package/nitrogen/generated/shared/c++/PresetType.hpp +76 -0
  233. package/nitrogen/generated/shared/c++/StorageLocation.hpp +76 -0
  234. package/nitrogen/generated/shared/c++/TrackItem.hpp +7 -2
  235. package/nitrogen/generated/shared/c++/TrackPlayerState.hpp +5 -5
  236. package/package.json +1 -1
  237. package/src/hooks/downloadCallbackManager.ts +149 -0
  238. package/src/hooks/equalizerCallbackManager.ts +138 -0
  239. package/src/hooks/index.ts +23 -0
  240. package/src/hooks/useActualQueue.ts +116 -0
  241. package/src/hooks/useDownloadActions.ts +179 -0
  242. package/src/hooks/useDownloadProgress.ts +126 -0
  243. package/src/hooks/useDownloadStorage.ts +84 -0
  244. package/src/hooks/useDownloadedTracks.ts +138 -0
  245. package/src/hooks/useEqualizer.ts +173 -0
  246. package/src/hooks/useEqualizerPresets.ts +140 -0
  247. package/src/hooks/useNowPlaying.ts +3 -2
  248. package/src/hooks/useOnChangeTrack.ts +15 -11
  249. package/src/hooks/useOnPlaybackStateChange.ts +19 -15
  250. package/src/hooks/usePlaylist.ts +161 -0
  251. package/src/index.ts +12 -0
  252. package/src/specs/DownloadManager.nitro.ts +203 -0
  253. package/src/specs/Equalizer.nitro.ts +69 -0
  254. package/src/specs/TrackPlayer.nitro.ts +6 -2
  255. package/src/types/DownloadTypes.ts +135 -0
  256. package/src/types/EqualizerTypes.ts +72 -0
  257. package/src/types/PlayerQueue.ts +9 -0
@@ -48,20 +48,24 @@ export function useOnChangeTrack(): TrackChangeResult {
48
48
  useEffect(() => {
49
49
  isMounted.current = true
50
50
 
51
- try {
52
- const playerState = TrackPlayer.getState()
53
- if (isMounted.current) {
54
- setTrack(playerState.currentTrack)
55
- setIsReady(true)
56
- }
57
- } catch (error) {
58
- console.error('[useOnChangeTrack] Failed to get initial state:', error)
59
- if (isMounted.current) {
60
- setTrack(null)
61
- setIsReady(true)
51
+ const initializeTrack = async () => {
52
+ try {
53
+ const playerState = await TrackPlayer.getState()
54
+ if (isMounted.current) {
55
+ setTrack(playerState.currentTrack)
56
+ setIsReady(true)
57
+ }
58
+ } catch (error) {
59
+ console.error('[useOnChangeTrack] Failed to get initial state:', error)
60
+ if (isMounted.current) {
61
+ setTrack(null)
62
+ setIsReady(true)
63
+ }
62
64
  }
63
65
  }
64
66
 
67
+ initializeTrack()
68
+
65
69
  return () => {
66
70
  isMounted.current = false
67
71
  }
@@ -47,24 +47,28 @@ export function useOnPlaybackStateChange(): PlaybackStateResult {
47
47
  useEffect(() => {
48
48
  isMounted.current = true
49
49
 
50
- // Get initial state synchronously
51
- try {
52
- const playerState = TrackPlayer.getState()
53
- if (isMounted.current) {
54
- setState(playerState.currentState)
55
- setIsReady(true)
56
- }
57
- } catch (error) {
58
- console.error(
59
- '[useOnPlaybackStateChange] Failed to get initial state:',
60
- error
61
- )
62
- if (isMounted.current) {
63
- setState('stopped')
64
- setIsReady(true)
50
+ // Get initial state asynchronously
51
+ const initializeState = async () => {
52
+ try {
53
+ const playerState = await TrackPlayer.getState()
54
+ if (isMounted.current) {
55
+ setState(playerState.currentState)
56
+ setIsReady(true)
57
+ }
58
+ } catch (error) {
59
+ console.error(
60
+ '[useOnPlaybackStateChange] Failed to get initial state:',
61
+ error
62
+ )
63
+ if (isMounted.current) {
64
+ setState('stopped')
65
+ setIsReady(true)
66
+ }
65
67
  }
66
68
  }
67
69
 
70
+ initializeState()
71
+
68
72
  return () => {
69
73
  isMounted.current = false
70
74
  }
@@ -0,0 +1,161 @@
1
+ import { useEffect, useState, useRef, useCallback } from 'react'
2
+ import { PlayerQueue } from '../index'
3
+ import { callbackManager } from './callbackManager'
4
+ import type { Playlist, TrackItem } from '../types/PlayerQueue'
5
+
6
+ export interface UsePlaylistResult {
7
+ /** The currently loaded playlist */
8
+ currentPlaylist: Playlist | null
9
+ /** ID of the currently loaded playlist */
10
+ currentPlaylistId: string | null
11
+ /** All available playlists */
12
+ allPlaylists: Playlist[]
13
+ /** All tracks from all playlists (flattened) */
14
+ allTracks: TrackItem[]
15
+ /** Whether the playlists are currently loading */
16
+ isLoading: boolean
17
+ /** Manually refresh playlist data */
18
+ refreshPlaylists: () => void
19
+ }
20
+
21
+ /**
22
+ * Hook to manage playlist state
23
+ *
24
+ * Provides current playlist, all playlists, and all tracks across playlists.
25
+ * Automatically refreshes when:
26
+ * - Component mounts
27
+ * - Track changes (to update currentPlaylistId)
28
+ * - Playlists are modified via PlayerQueue methods
29
+ *
30
+ * Call `refreshPlaylists()` after creating/deleting playlists to update the state.
31
+ *
32
+ * @returns Object containing playlist state and refresh function
33
+ *
34
+ * @example
35
+ * ```tsx
36
+ * function MyComponent() {
37
+ * const { currentPlaylist, allTracks, refreshPlaylists } = usePlaylist();
38
+ *
39
+ * const handleCreatePlaylist = () => {
40
+ * PlayerQueue.createPlaylist('New Playlist');
41
+ * refreshPlaylists(); // Refresh to see the new playlist
42
+ * };
43
+ *
44
+ * return (
45
+ * <View>
46
+ * <Text>{currentPlaylist?.name}</Text>
47
+ * <Text>Total tracks: {allTracks.length}</Text>
48
+ * </View>
49
+ * );
50
+ * }
51
+ * ```
52
+ */
53
+ export function usePlaylist(): UsePlaylistResult {
54
+ const [currentPlaylist, setCurrentPlaylist] = useState<Playlist | null>(null)
55
+ const [currentPlaylistId, setCurrentPlaylistId] = useState<string | null>(
56
+ null
57
+ )
58
+ const [allPlaylists, setAllPlaylists] = useState<Playlist[]>([])
59
+ const [allTracks, setAllTracks] = useState<TrackItem[]>([])
60
+ const [isLoading, setIsLoading] = useState(true)
61
+ const isMounted = useRef(true)
62
+ const hasSubscribed = useRef(false)
63
+
64
+ const refreshPlaylists = useCallback(() => {
65
+ if (!isMounted.current) return
66
+
67
+ try {
68
+ // Get current playlist ID
69
+ const playlistId = PlayerQueue.getCurrentPlaylistId()
70
+ if (!isMounted.current) return
71
+ setCurrentPlaylistId(playlistId)
72
+
73
+ // Get current playlist details
74
+ if (playlistId) {
75
+ const playlist = PlayerQueue.getPlaylist(playlistId)
76
+ if (isMounted.current) {
77
+ setCurrentPlaylist(playlist)
78
+ }
79
+ } else {
80
+ if (isMounted.current) {
81
+ setCurrentPlaylist(null)
82
+ }
83
+ }
84
+
85
+ // Get all playlists
86
+ const playlists = PlayerQueue.getAllPlaylists()
87
+ if (!isMounted.current) return
88
+ setAllPlaylists(playlists)
89
+
90
+ // Get all tracks from all playlists (deduplicated by id)
91
+ const trackMap = new Map<string, TrackItem>()
92
+ playlists.forEach((playlist) => {
93
+ playlist.tracks.forEach((track) => {
94
+ if (!trackMap.has(track.id)) {
95
+ trackMap.set(track.id, track)
96
+ }
97
+ })
98
+ })
99
+ if (isMounted.current) {
100
+ setAllTracks(Array.from(trackMap.values()))
101
+ setIsLoading(false)
102
+ }
103
+ } catch (error) {
104
+ console.error('[usePlaylist] Error refreshing playlists:', error)
105
+ if (isMounted.current) {
106
+ setIsLoading(false)
107
+ }
108
+ }
109
+ }, [])
110
+
111
+ // Initialize and setup mounted ref
112
+ useEffect(() => {
113
+ isMounted.current = true
114
+
115
+ // Initial load
116
+ refreshPlaylists()
117
+
118
+ return () => {
119
+ isMounted.current = false
120
+ }
121
+ }, [refreshPlaylists])
122
+
123
+ // Subscribe to native playlist changes (only once)
124
+ useEffect(() => {
125
+ if (hasSubscribed.current) return
126
+ hasSubscribed.current = true
127
+
128
+ try {
129
+ PlayerQueue.onPlaylistsChanged(() => {
130
+ if (isMounted.current) {
131
+ refreshPlaylists()
132
+ }
133
+ })
134
+ } catch (error) {
135
+ console.error('[usePlaylist] Error setting up playlist listener:', error)
136
+ }
137
+ }, [refreshPlaylists])
138
+
139
+ // Also refresh when track changes (as it might indicate playlist loaded)
140
+ useEffect(() => {
141
+ const unsubscribe = callbackManager.subscribeToTrackChange(() => {
142
+ // Refresh to update currentPlaylistId when track changes
143
+ if (isMounted.current) {
144
+ refreshPlaylists()
145
+ }
146
+ })
147
+
148
+ return () => {
149
+ unsubscribe()
150
+ }
151
+ }, [refreshPlaylists])
152
+
153
+ return {
154
+ currentPlaylist,
155
+ currentPlaylistId,
156
+ allPlaylists,
157
+ allTracks,
158
+ isLoading,
159
+ refreshPlaylists,
160
+ }
161
+ }
package/src/index.ts CHANGED
@@ -9,6 +9,8 @@ import type {
9
9
  import type { AndroidAutoMediaLibrary as AndroidAutoMediaLibraryType } from './specs/AndroidAutoMediaLibrary.nitro'
10
10
  import type { AudioDevices as AudioDevicesType } from './specs/AudioDevices.nitro'
11
11
  import type { AudioRoutePicker as AudioRoutePickerType } from './specs/AudioRoutePicker.nitro'
12
+ import type { DownloadManager as DownloadManagerType } from './specs/DownloadManager.nitro'
13
+ import type { Equalizer as EqualizerType } from './specs/Equalizer.nitro'
12
14
 
13
15
  export const PlayerQueue =
14
16
  NitroModules.createHybridObject<PlayerQueueType>('PlayerQueue')
@@ -35,12 +37,22 @@ export const AudioRoutePicker =
35
37
  ? NitroModules.createHybridObject<AudioRoutePickerType>('AudioRoutePicker')
36
38
  : null
37
39
 
40
+ // Download Manager
41
+ export const DownloadManager =
42
+ NitroModules.createHybridObject<DownloadManagerType>('DownloadManager')
43
+
44
+ // Equalizer
45
+ export const Equalizer =
46
+ NitroModules.createHybridObject<EqualizerType>('Equalizer')
47
+
38
48
  // Export hooks
39
49
  export * from './hooks'
40
50
 
41
51
  // Export types
42
52
  export * from './types/PlayerQueue'
43
53
  export * from './types/AndroidAutoMediaLibrary'
54
+ export * from './types/DownloadTypes'
55
+ export * from './types/EqualizerTypes'
44
56
  export type { TAudioDevice } from './specs/AudioDevices.nitro'
45
57
  export type { RepeatMode } from './specs/TrackPlayer.nitro'
46
58
  // Export utilities
@@ -0,0 +1,203 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules'
2
+ import type { TrackItem } from '../types/PlayerQueue'
3
+ import type {
4
+ DownloadConfig,
5
+ DownloadTask,
6
+ DownloadProgress,
7
+ DownloadedTrack,
8
+ DownloadedPlaylist,
9
+ DownloadState,
10
+ DownloadStorageInfo,
11
+ DownloadQueueStatus,
12
+ DownloadError,
13
+ PlaybackSource,
14
+ } from '../types/DownloadTypes'
15
+
16
+ export interface DownloadManager
17
+ extends HybridObject<{ android: 'kotlin'; ios: 'swift' }> {
18
+ /**
19
+ * Configure the download manager
20
+ */
21
+ configure(config: DownloadConfig): void
22
+
23
+ /**
24
+ * Get current configuration
25
+ */
26
+ getConfig(): DownloadConfig
27
+
28
+ /**
29
+ * Download a single track
30
+ * @returns downloadId for tracking
31
+ */
32
+ downloadTrack(track: TrackItem, playlistId?: string): Promise<string>
33
+
34
+ // =====================================
35
+ // PLAYLIST DOWNLOADS
36
+ // =====================================
37
+
38
+ /**
39
+ * Download an entire playlist
40
+ * @returns downloadId array for each track
41
+ */
42
+ downloadPlaylist(playlistId: string, tracks: TrackItem[]): Promise<string[]>
43
+ /**
44
+ * Pause a download
45
+ */
46
+ pauseDownload(downloadId: string): Promise<void>
47
+
48
+ /**
49
+ * Resume a paused download
50
+ */
51
+ resumeDownload(downloadId: string): Promise<void>
52
+
53
+ /**
54
+ * Cancel a download
55
+ */
56
+ cancelDownload(downloadId: string): Promise<void>
57
+
58
+ /**
59
+ * Retry a failed download
60
+ */
61
+ retryDownload(downloadId: string): Promise<void>
62
+
63
+ /**
64
+ * Pause all downloads
65
+ */
66
+ pauseAllDownloads(): Promise<void>
67
+
68
+ /**
69
+ * Resume all paused downloads
70
+ */
71
+ resumeAllDownloads(): Promise<void>
72
+
73
+ /**
74
+ * Cancel all downloads
75
+ */
76
+ cancelAllDownloads(): Promise<void>
77
+ /**
78
+ * Get download task by ID
79
+ */
80
+ getDownloadTask(downloadId: string): DownloadTask | null
81
+
82
+ /**
83
+ * Get all active download tasks
84
+ */
85
+ getActiveDownloads(): DownloadTask[]
86
+
87
+ /**
88
+ * Get download queue status
89
+ */
90
+ getQueueStatus(): DownloadQueueStatus
91
+
92
+ /**
93
+ * Check if a track is currently downloading
94
+ */
95
+ isDownloading(trackId: string): boolean
96
+
97
+ /**
98
+ * Get download state for a track
99
+ */
100
+ getDownloadState(trackId: string): DownloadState | null
101
+
102
+ /**
103
+ * Check if a track is downloaded
104
+ */
105
+ isTrackDownloaded(trackId: string): boolean
106
+
107
+ /**
108
+ * Check if a playlist is fully downloaded
109
+ */
110
+ isPlaylistDownloaded(playlistId: string): boolean
111
+
112
+ /**
113
+ * Check if a playlist is partially downloaded
114
+ */
115
+ isPlaylistPartiallyDownloaded(playlistId: string): boolean
116
+
117
+ /**
118
+ * Get downloaded track by track ID
119
+ */
120
+ getDownloadedTrack(trackId: string): DownloadedTrack | null
121
+
122
+ /**
123
+ * Get all downloaded tracks
124
+ */
125
+ getAllDownloadedTracks(): DownloadedTrack[]
126
+
127
+ /**
128
+ * Get downloaded playlist by playlist ID
129
+ */
130
+ getDownloadedPlaylist(playlistId: string): DownloadedPlaylist | null
131
+
132
+ /**
133
+ * Get all downloaded playlists
134
+ */
135
+ getAllDownloadedPlaylists(): DownloadedPlaylist[]
136
+
137
+ /**
138
+ * Get local file path for a downloaded track
139
+ */
140
+ getLocalPath(trackId: string): string | null
141
+
142
+ /**
143
+ * Delete a downloaded track
144
+ */
145
+ deleteDownloadedTrack(trackId: string): Promise<void>
146
+
147
+ /**
148
+ * Delete a downloaded playlist (all its tracks)
149
+ */
150
+ deleteDownloadedPlaylist(playlistId: string): Promise<void>
151
+
152
+ /**
153
+ * Delete all downloaded content
154
+ */
155
+ deleteAllDownloads(): Promise<void>
156
+ /**
157
+ * Get storage information
158
+ */
159
+ getStorageInfo(): Promise<DownloadStorageInfo>
160
+
161
+ /**
162
+ * Sync downloads - validates all downloads and removes orphaned records
163
+ * Call this to clean up after manual file deletion
164
+ * @returns number of orphaned records that were cleaned up
165
+ */
166
+ syncDownloads(): number
167
+ /**
168
+ * Set playback source preference
169
+ */
170
+ setPlaybackSourcePreference(preference: PlaybackSource): void
171
+
172
+ /**
173
+ * Get current playback source preference
174
+ */
175
+ getPlaybackSourcePreference(): PlaybackSource
176
+
177
+ /**
178
+ * Get the effective URL for a track (local or network based on preference)
179
+ */
180
+ getEffectiveUrl(track: TrackItem): string
181
+
182
+ /**
183
+ * Called when download progress updates
184
+ */
185
+ onDownloadProgress(callback: (progress: DownloadProgress) => void): void
186
+
187
+ /**
188
+ * Called when download state changes
189
+ */
190
+ onDownloadStateChange(
191
+ callback: (
192
+ downloadId: string,
193
+ trackId: string,
194
+ state: DownloadState,
195
+ error?: DownloadError
196
+ ) => void
197
+ ): void
198
+
199
+ /**
200
+ * Called when a download completes
201
+ */
202
+ onDownloadComplete(callback: (downloadedTrack: DownloadedTrack) => void): void
203
+ }
@@ -0,0 +1,69 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules'
2
+ import type {
3
+ EqualizerBand,
4
+ EqualizerPreset,
5
+ EqualizerState,
6
+ GainRange,
7
+ } from '../types/EqualizerTypes'
8
+
9
+ export interface Equalizer
10
+ extends HybridObject<{ android: 'kotlin'; ios: 'swift' }> {
11
+ // === Enable/Disable ===
12
+ /** Enable or disable the equalizer */
13
+ setEnabled(enabled: boolean): boolean
14
+
15
+ /** Check if equalizer is currently enabled */
16
+ isEnabled(): boolean
17
+
18
+ // === Band Control ===
19
+ /** Get all equalizer bands with current gain values */
20
+ getBands(): EqualizerBand[]
21
+
22
+ /** Set gain for a specific band index (-12 to +12 dB) */
23
+ setBandGain(bandIndex: number, gainDb: number): boolean
24
+
25
+ /** Set gains for all bands at once (array of 5 values) */
26
+ setAllBandGains(gains: number[]): boolean
27
+
28
+ /** Get the valid gain range for bands */
29
+ getBandRange(): GainRange
30
+
31
+ // === Presets ===
32
+ /** Get all available presets (built-in + custom) */
33
+ getPresets(): EqualizerPreset[]
34
+
35
+ /** Get built-in presets only */
36
+ getBuiltInPresets(): EqualizerPreset[]
37
+
38
+ /** Get custom user presets only */
39
+ getCustomPresets(): EqualizerPreset[]
40
+
41
+ /** Apply a preset by name */
42
+ applyPreset(presetName: string): boolean
43
+
44
+ /** Get currently applied preset name (null if custom values) */
45
+ getCurrentPresetName(): string | null
46
+
47
+ /** Save current settings as a custom preset */
48
+ saveCustomPreset(name: string): boolean
49
+
50
+ /** Delete a custom preset by name */
51
+ deleteCustomPreset(name: string): boolean
52
+
53
+ // === State ===
54
+ /** Get complete equalizer state */
55
+ getState(): EqualizerState
56
+
57
+ /** Reset to flat response (all bands at 0 dB) */
58
+ reset(): void
59
+
60
+ // === Events ===
61
+ /** Called when equalizer enabled state changes */
62
+ onEnabledChange(callback: (enabled: boolean) => void): void
63
+
64
+ /** Called when any band gain changes */
65
+ onBandChange(callback: (bands: EqualizerBand[]) => void): void
66
+
67
+ /** Called when preset changes */
68
+ onPresetChange(callback: (presetName: string | null) => void): void
69
+ }
@@ -60,11 +60,15 @@ export interface TrackPlayer
60
60
  extends HybridObject<{ android: 'kotlin'; ios: 'swift' }> {
61
61
  play(): void
62
62
  pause(): void
63
- playSong(songId: string, fromPlaylist?: string): void
63
+ playSong(songId: string, fromPlaylist?: string): Promise<void>
64
64
  skipToNext(): void
65
+ skipToIndex(index: number): Promise<boolean>
65
66
  skipToPrevious(): void
66
67
  seek(position: number): void
67
- getState(): PlayerState
68
+ addToUpNext(trackId: string): Promise<void>
69
+ playNext(trackId: string): Promise<void>
70
+ getActualQueue(): Promise<TrackItem[]>
71
+ getState(): Promise<PlayerState>
68
72
  setRepeatMode(mode: RepeatMode): boolean
69
73
  configure(config: PlayerConfig): void
70
74
  onChangeTrack(callback: (track: TrackItem, reason?: Reason) => void): void
@@ -0,0 +1,135 @@
1
+ import type { TrackItem, Playlist } from './PlayerQueue'
2
+
3
+ /**
4
+ * Storage location options for downloads
5
+ */
6
+ export type StorageLocation = 'private' | 'public'
7
+
8
+ /**
9
+ * Current state of a download task
10
+ */
11
+ export type DownloadState =
12
+ | 'pending'
13
+ | 'downloading'
14
+ | 'paused'
15
+ | 'completed'
16
+ | 'failed'
17
+ | 'cancelled'
18
+
19
+ /**
20
+ * Reason for download failure
21
+ */
22
+ export type DownloadErrorReason =
23
+ | 'network_error'
24
+ | 'storage_full'
25
+ | 'file_not_found'
26
+ | 'permission_denied'
27
+ | 'invalid_url'
28
+ | 'timeout'
29
+ | 'unknown'
30
+
31
+ /**
32
+ * Source preference for playback
33
+ */
34
+ export type PlaybackSource = 'auto' | 'download' | 'network'
35
+
36
+ /**
37
+ * Progress information for a download
38
+ */
39
+ export interface DownloadProgress {
40
+ trackId: string
41
+ downloadId: string
42
+ bytesDownloaded: number
43
+ totalBytes: number
44
+ progress: number // 0.0 to 1.0
45
+ state: DownloadState
46
+ }
47
+
48
+ /**
49
+ * Download error information
50
+ */
51
+ export interface DownloadError {
52
+ code: string
53
+ message: string
54
+ reason: DownloadErrorReason
55
+ isRetryable: boolean
56
+ }
57
+
58
+ /**
59
+ * A downloaded track with local file information
60
+ */
61
+ export interface DownloadedTrack {
62
+ trackId: string
63
+ originalTrack: TrackItem
64
+ localPath: string
65
+ localArtworkPath?: string | null
66
+ downloadedAt: number // Unix timestamp
67
+ fileSize: number // bytes
68
+ storageLocation: StorageLocation
69
+ }
70
+
71
+ /**
72
+ * A playlist with download information
73
+ */
74
+ export interface DownloadedPlaylist {
75
+ playlistId: string
76
+ originalPlaylist: Playlist
77
+ downloadedTracks: DownloadedTrack[]
78
+ totalSize: number // bytes
79
+ downloadedAt: number // Unix timestamp
80
+ isComplete: boolean // All tracks downloaded
81
+ }
82
+
83
+ /**
84
+ * Download task information
85
+ */
86
+ export interface DownloadTask {
87
+ downloadId: string
88
+ trackId: string
89
+ playlistId?: string | null
90
+ state: DownloadState
91
+ progress: DownloadProgress
92
+ createdAt: number // Unix timestamp
93
+ startedAt?: number | null
94
+ completedAt?: number | null
95
+ error?: DownloadError | null
96
+ retryCount: number
97
+ }
98
+
99
+ /**
100
+ * Configuration for the DownloadManager
101
+ */
102
+ export interface DownloadConfig {
103
+ storageLocation?: StorageLocation
104
+ maxConcurrentDownloads?: number
105
+ autoRetry?: boolean
106
+ maxRetryAttempts?: number
107
+ backgroundDownloadsEnabled?: boolean
108
+ downloadArtwork?: boolean
109
+ customDownloadPath?: string | null
110
+ wifiOnlyDownloads?: boolean
111
+ }
112
+
113
+ /**
114
+ * Summary of download storage usage
115
+ */
116
+ export interface DownloadStorageInfo {
117
+ totalDownloadedSize: number // bytes
118
+ trackCount: number
119
+ playlistCount: number
120
+ availableSpace: number // bytes
121
+ totalSpace: number // bytes
122
+ }
123
+
124
+ /**
125
+ * Download queue status
126
+ */
127
+ export interface DownloadQueueStatus {
128
+ pendingCount: number
129
+ activeCount: number
130
+ completedCount: number
131
+ failedCount: number
132
+ totalBytesToDownload: number
133
+ totalBytesDownloaded: number
134
+ overallProgress: number // 0.0 to 1.0
135
+ }