react-native-nitro-player 0.3.0-alpha.9 → 0.4.1-alpha.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 (262) 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 +944 -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 +996 -288
  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 +18 -0
  31. package/lib/hooks/callbackManager.js +66 -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 +16 -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.js +32 -19
  53. package/lib/hooks/useOnChangeTrack.js +15 -12
  54. package/lib/hooks/useOnPlaybackProgressChange.js +2 -2
  55. package/lib/hooks/useOnPlaybackStateChange.js +16 -13
  56. package/lib/hooks/usePlaylist.d.ts +48 -0
  57. package/lib/hooks/usePlaylist.js +136 -0
  58. package/lib/index.d.ts +6 -0
  59. package/lib/index.js +6 -0
  60. package/lib/specs/DownloadManager.nitro.d.ts +152 -0
  61. package/lib/specs/DownloadManager.nitro.js +1 -0
  62. package/lib/specs/Equalizer.nitro.d.ts +43 -0
  63. package/lib/specs/Equalizer.nitro.js +1 -0
  64. package/lib/specs/TrackPlayer.nitro.d.ts +6 -2
  65. package/lib/types/DownloadTypes.d.ts +110 -0
  66. package/lib/types/DownloadTypes.js +1 -0
  67. package/lib/types/EqualizerTypes.d.ts +52 -0
  68. package/lib/types/EqualizerTypes.js +1 -0
  69. package/lib/types/PlayerQueue.d.ts +4 -0
  70. package/nitro.json +8 -0
  71. package/nitrogen/generated/android/NitroPlayer+autolinking.cmake +10 -1
  72. package/nitrogen/generated/android/NitroPlayerOnLoad.cpp +32 -2
  73. package/nitrogen/generated/android/c++/JCurrentPlayingType.hpp +65 -0
  74. package/nitrogen/generated/android/c++/JDownloadConfig.hpp +92 -0
  75. package/nitrogen/generated/android/c++/JDownloadError.hpp +71 -0
  76. package/nitrogen/generated/android/c++/JDownloadErrorReason.hpp +74 -0
  77. package/nitrogen/generated/android/c++/JDownloadProgress.hpp +79 -0
  78. package/nitrogen/generated/android/c++/JDownloadQueueStatus.hpp +81 -0
  79. package/nitrogen/generated/android/c++/JDownloadState.hpp +71 -0
  80. package/nitrogen/generated/android/c++/JDownloadStorageInfo.hpp +73 -0
  81. package/nitrogen/generated/android/c++/JDownloadTask.hpp +108 -0
  82. package/nitrogen/generated/android/c++/JDownloadedPlaylist.hpp +111 -0
  83. package/nitrogen/generated/android/c++/JDownloadedTrack.hpp +92 -0
  84. package/nitrogen/generated/android/c++/JEqualizerBand.hpp +69 -0
  85. package/nitrogen/generated/android/c++/JEqualizerPreset.hpp +78 -0
  86. package/nitrogen/generated/android/c++/JEqualizerState.hpp +91 -0
  87. package/nitrogen/generated/android/c++/JFunc_void_DownloadProgress.hpp +80 -0
  88. package/nitrogen/generated/android/c++/JFunc_void_DownloadedTrack.hpp +89 -0
  89. package/nitrogen/generated/android/c++/JFunc_void_TrackItem_std__optional_Reason_.hpp +2 -0
  90. package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__std__string__.hpp +81 -0
  91. package/nitrogen/generated/android/c++/JFunc_void_std__string_Playlist_std__optional_QueueOperation_.hpp +2 -0
  92. package/nitrogen/generated/android/c++/JFunc_void_std__string_std__string_DownloadState_std__optional_DownloadError_.hpp +83 -0
  93. package/nitrogen/generated/android/c++/JFunc_void_std__vector_EqualizerBand_.hpp +97 -0
  94. package/nitrogen/generated/android/c++/JFunc_void_std__vector_Playlist__std__optional_QueueOperation_.hpp +2 -0
  95. package/nitrogen/generated/android/c++/JGainRange.hpp +61 -0
  96. package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.cpp +470 -0
  97. package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.hpp +99 -0
  98. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.cpp +204 -0
  99. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.hpp +82 -0
  100. package/nitrogen/generated/android/c++/JHybridPlayerQueueSpec.cpp +2 -0
  101. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.cpp +117 -15
  102. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.hpp +6 -2
  103. package/nitrogen/generated/android/c++/JPlaybackSource.hpp +62 -0
  104. package/nitrogen/generated/android/c++/JPlayerState.hpp +11 -3
  105. package/nitrogen/generated/android/c++/JPlaylist.hpp +2 -0
  106. package/nitrogen/generated/android/c++/JPresetType.hpp +59 -0
  107. package/nitrogen/generated/android/c++/JStorageLocation.hpp +59 -0
  108. package/nitrogen/generated/android/c++/JTrackItem.hpp +9 -3
  109. package/nitrogen/generated/android/c++/JTrackPlayerState.hpp +3 -3
  110. package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
  111. package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
  112. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.cpp +26 -0
  113. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.hpp +74 -0
  114. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.cpp +26 -0
  115. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.hpp +84 -0
  116. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.cpp +26 -0
  117. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.hpp +85 -0
  118. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.cpp +26 -0
  119. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.hpp +80 -0
  120. package/nitrogen/generated/android/c++/JVariant_NullType_Playlist.hpp +2 -0
  121. package/nitrogen/generated/android/c++/JVariant_NullType_TrackItem.hpp +2 -0
  122. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/CurrentPlayingType.kt +23 -0
  123. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadConfig.kt +59 -0
  124. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadError.kt +47 -0
  125. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadErrorReason.kt +26 -0
  126. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadProgress.kt +53 -0
  127. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadQueueStatus.kt +56 -0
  128. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadState.kt +25 -0
  129. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadStorageInfo.kt +50 -0
  130. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadTask.kt +65 -0
  131. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedPlaylist.kt +53 -0
  132. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedTrack.kt +56 -0
  133. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerBand.kt +47 -0
  134. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerPreset.kt +44 -0
  135. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerState.kt +44 -0
  136. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadProgress.kt +80 -0
  137. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadedTrack.kt +80 -0
  138. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__optional_std__variant_nitro__NullType__std__string__.kt +80 -0
  139. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.kt +80 -0
  140. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__vector_EqualizerBand_.kt +80 -0
  141. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/GainRange.kt +41 -0
  142. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridDownloadManagerSpec.kt +210 -0
  143. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridEqualizerSpec.kt +141 -0
  144. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridTrackPlayerSpec.kt +19 -2
  145. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlaybackSource.kt +22 -0
  146. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlayerState.kt +6 -3
  147. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PresetType.kt +21 -0
  148. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/StorageLocation.kt +21 -0
  149. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackItem.kt +7 -3
  150. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackPlayerState.kt +2 -2
  151. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_Double.kt +59 -0
  152. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadError.kt +59 -0
  153. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadTask.kt +59 -0
  154. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedPlaylist.kt +59 -0
  155. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedTrack.kt +59 -0
  156. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.cpp +138 -8
  157. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.hpp +1046 -121
  158. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Umbrella.hpp +66 -0
  159. package/nitrogen/generated/ios/NitroPlayerAutolinking.mm +16 -0
  160. package/nitrogen/generated/ios/NitroPlayerAutolinking.swift +30 -0
  161. package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.cpp +11 -0
  162. package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.hpp +386 -0
  163. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.cpp +11 -0
  164. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.hpp +223 -0
  165. package/nitrogen/generated/ios/c++/HybridPlayerQueueSpecSwift.hpp +1 -0
  166. package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.hpp +46 -6
  167. package/nitrogen/generated/ios/swift/CurrentPlayingType.swift +48 -0
  168. package/nitrogen/generated/ios/swift/DownloadConfig.swift +270 -0
  169. package/nitrogen/generated/ios/swift/DownloadError.swift +69 -0
  170. package/nitrogen/generated/ios/swift/DownloadErrorReason.swift +60 -0
  171. package/nitrogen/generated/ios/swift/DownloadProgress.swift +91 -0
  172. package/nitrogen/generated/ios/swift/DownloadQueueStatus.swift +102 -0
  173. package/nitrogen/generated/ios/swift/DownloadState.swift +56 -0
  174. package/nitrogen/generated/ios/swift/DownloadStorageInfo.swift +80 -0
  175. package/nitrogen/generated/ios/swift/DownloadTask.swift +315 -0
  176. package/nitrogen/generated/ios/swift/DownloadedPlaylist.swift +103 -0
  177. package/nitrogen/generated/ios/swift/DownloadedTrack.swift +147 -0
  178. package/nitrogen/generated/ios/swift/EqualizerBand.swift +69 -0
  179. package/nitrogen/generated/ios/swift/EqualizerPreset.swift +70 -0
  180. package/nitrogen/generated/ios/swift/EqualizerState.swift +115 -0
  181. package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
  182. package/nitrogen/generated/ios/swift/Func_void_DownloadProgress.swift +47 -0
  183. package/nitrogen/generated/ios/swift/Func_void_DownloadStorageInfo.swift +47 -0
  184. package/nitrogen/generated/ios/swift/Func_void_DownloadedTrack.swift +47 -0
  185. package/nitrogen/generated/ios/swift/Func_void_PlayerState.swift +47 -0
  186. package/nitrogen/generated/ios/swift/Func_void_bool.swift +5 -5
  187. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
  188. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__std__string__.swift +66 -0
  189. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  190. package/nitrogen/generated/ios/swift/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.swift +47 -0
  191. package/nitrogen/generated/ios/swift/Func_void_std__vector_EqualizerBand_.swift +47 -0
  192. package/nitrogen/generated/ios/swift/Func_void_std__vector_TrackItem_.swift +47 -0
  193. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +47 -0
  194. package/nitrogen/generated/ios/swift/GainRange.swift +47 -0
  195. package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec.swift +90 -0
  196. package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec_cxx.swift +705 -0
  197. package/nitrogen/generated/ios/swift/HybridEqualizerSpec.swift +73 -0
  198. package/nitrogen/generated/ios/swift/HybridEqualizerSpec_cxx.swift +396 -0
  199. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec.swift +6 -2
  200. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec_cxx.swift +105 -8
  201. package/nitrogen/generated/ios/swift/PlaybackSource.swift +44 -0
  202. package/nitrogen/generated/ios/swift/PlayerState.swift +13 -2
  203. package/nitrogen/generated/ios/swift/PresetType.swift +40 -0
  204. package/nitrogen/generated/ios/swift/StorageLocation.swift +40 -0
  205. package/nitrogen/generated/ios/swift/TrackItem.swift +31 -1
  206. package/nitrogen/generated/ios/swift/TrackPlayerState.swift +4 -4
  207. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +18 -0
  208. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadError.swift +18 -0
  209. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadTask.swift +18 -0
  210. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedPlaylist.swift +18 -0
  211. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedTrack.swift +18 -0
  212. package/nitrogen/generated/shared/c++/CurrentPlayingType.hpp +84 -0
  213. package/nitrogen/generated/shared/c++/DownloadConfig.hpp +108 -0
  214. package/nitrogen/generated/shared/c++/DownloadError.hpp +89 -0
  215. package/nitrogen/generated/shared/c++/DownloadErrorReason.hpp +96 -0
  216. package/nitrogen/generated/shared/c++/DownloadProgress.hpp +97 -0
  217. package/nitrogen/generated/shared/c++/DownloadQueueStatus.hpp +99 -0
  218. package/nitrogen/generated/shared/c++/DownloadState.hpp +92 -0
  219. package/nitrogen/generated/shared/c++/DownloadStorageInfo.hpp +91 -0
  220. package/nitrogen/generated/shared/c++/DownloadTask.hpp +122 -0
  221. package/nitrogen/generated/shared/c++/DownloadedPlaylist.hpp +101 -0
  222. package/nitrogen/generated/shared/c++/DownloadedTrack.hpp +107 -0
  223. package/nitrogen/generated/shared/c++/EqualizerBand.hpp +87 -0
  224. package/nitrogen/generated/shared/c++/EqualizerPreset.hpp +86 -0
  225. package/nitrogen/generated/shared/c++/EqualizerState.hpp +89 -0
  226. package/nitrogen/generated/shared/c++/GainRange.hpp +79 -0
  227. package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.cpp +55 -0
  228. package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.hpp +134 -0
  229. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.cpp +38 -0
  230. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.hpp +95 -0
  231. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.cpp +4 -0
  232. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.hpp +11 -5
  233. package/nitrogen/generated/shared/c++/PlaybackSource.hpp +80 -0
  234. package/nitrogen/generated/shared/c++/PlayerState.hpp +9 -2
  235. package/nitrogen/generated/shared/c++/PresetType.hpp +76 -0
  236. package/nitrogen/generated/shared/c++/StorageLocation.hpp +76 -0
  237. package/nitrogen/generated/shared/c++/TrackItem.hpp +7 -2
  238. package/nitrogen/generated/shared/c++/TrackPlayerState.hpp +5 -5
  239. package/package.json +1 -1
  240. package/src/hooks/callbackManager.ts +87 -0
  241. package/src/hooks/downloadCallbackManager.ts +149 -0
  242. package/src/hooks/equalizerCallbackManager.ts +138 -0
  243. package/src/hooks/index.ts +23 -0
  244. package/src/hooks/useActualQueue.ts +116 -0
  245. package/src/hooks/useDownloadActions.ts +179 -0
  246. package/src/hooks/useDownloadProgress.ts +126 -0
  247. package/src/hooks/useDownloadStorage.ts +84 -0
  248. package/src/hooks/useDownloadedTracks.ts +138 -0
  249. package/src/hooks/useEqualizer.ts +173 -0
  250. package/src/hooks/useEqualizerPresets.ts +140 -0
  251. package/src/hooks/useNowPlaying.ts +33 -20
  252. package/src/hooks/useOnChangeTrack.ts +15 -11
  253. package/src/hooks/useOnPlaybackProgressChange.ts +2 -2
  254. package/src/hooks/useOnPlaybackStateChange.ts +19 -15
  255. package/src/hooks/usePlaylist.ts +161 -0
  256. package/src/index.ts +12 -0
  257. package/src/specs/DownloadManager.nitro.ts +203 -0
  258. package/src/specs/Equalizer.nitro.ts +69 -0
  259. package/src/specs/TrackPlayer.nitro.ts +6 -2
  260. package/src/types/DownloadTypes.ts +135 -0
  261. package/src/types/EqualizerTypes.ts +72 -0
  262. package/src/types/PlayerQueue.ts +9 -0
@@ -0,0 +1,140 @@
1
+ import { useEffect, useState, useCallback, useRef } from 'react'
2
+ import { Equalizer } from '../index'
3
+ import type { EqualizerPreset } from '../types/EqualizerTypes'
4
+ import { equalizerCallbackManager } from './equalizerCallbackManager'
5
+
6
+ export interface UseEqualizerPresetsResult {
7
+ /** All available presets */
8
+ presets: EqualizerPreset[]
9
+ /** Built-in presets only */
10
+ builtInPresets: EqualizerPreset[]
11
+ /** Custom user presets */
12
+ customPresets: EqualizerPreset[]
13
+ /** Apply a preset by name */
14
+ applyPreset: (name: string) => boolean
15
+ /** Save current settings as custom preset */
16
+ saveCustomPreset: (name: string) => boolean
17
+ /** Delete a custom preset */
18
+ deleteCustomPreset: (name: string) => boolean
19
+ /** Currently applied preset name */
20
+ currentPreset: string | null
21
+ /** Whether presets are loading */
22
+ isLoading: boolean
23
+ /** Refresh presets from native */
24
+ refreshPresets: () => void
25
+ }
26
+
27
+ export function useEqualizerPresets(): UseEqualizerPresetsResult {
28
+ const [presets, setPresets] = useState<EqualizerPreset[]>([])
29
+ const [builtInPresets, setBuiltInPresets] = useState<EqualizerPreset[]>([])
30
+ const [customPresets, setCustomPresets] = useState<EqualizerPreset[]>([])
31
+ const [currentPreset, setCurrentPreset] = useState<string | null>(null)
32
+ const [isLoading, setIsLoading] = useState(true)
33
+ const isMounted = useRef(true)
34
+
35
+ const refreshPresets = useCallback(() => {
36
+ try {
37
+ const allPresets = Equalizer.getPresets()
38
+ const builtIn = Equalizer.getBuiltInPresets()
39
+ const custom = Equalizer.getCustomPresets()
40
+ const current = Equalizer.getCurrentPresetName()
41
+
42
+ if (isMounted.current) {
43
+ setPresets(allPresets)
44
+ setBuiltInPresets(builtIn)
45
+ setCustomPresets(custom)
46
+ setCurrentPreset(current)
47
+ }
48
+ } catch (error) {
49
+ console.error('[useEqualizerPresets] Error refreshing presets:', error)
50
+ }
51
+ }, [])
52
+
53
+ // Load initial presets
54
+ useEffect(() => {
55
+ isMounted.current = true
56
+
57
+ refreshPresets()
58
+ setIsLoading(false)
59
+
60
+ return () => {
61
+ isMounted.current = false
62
+ }
63
+ }, [refreshPresets])
64
+
65
+ // Subscribe to preset changes
66
+ useEffect(() => {
67
+ const unsubscribe = equalizerCallbackManager.subscribeToPresetChange(
68
+ (presetName) => {
69
+ if (isMounted.current) {
70
+ setCurrentPreset(presetName)
71
+ }
72
+ }
73
+ )
74
+
75
+ return unsubscribe
76
+ }, [])
77
+
78
+ const applyPreset = useCallback((name: string): boolean => {
79
+ try {
80
+ const success = Equalizer.applyPreset(name)
81
+ if (success) {
82
+ setCurrentPreset(name)
83
+ }
84
+ return success
85
+ } catch (error) {
86
+ console.error('[useEqualizerPresets] Error applying preset:', error)
87
+ return false
88
+ }
89
+ }, [])
90
+
91
+ const saveCustomPreset = useCallback(
92
+ (name: string): boolean => {
93
+ try {
94
+ const success = Equalizer.saveCustomPreset(name)
95
+ if (success) {
96
+ refreshPresets()
97
+ }
98
+ return success
99
+ } catch (error) {
100
+ console.error(
101
+ '[useEqualizerPresets] Error saving custom preset:',
102
+ error
103
+ )
104
+ return false
105
+ }
106
+ },
107
+ [refreshPresets]
108
+ )
109
+
110
+ const deleteCustomPreset = useCallback(
111
+ (name: string): boolean => {
112
+ try {
113
+ const success = Equalizer.deleteCustomPreset(name)
114
+ if (success) {
115
+ refreshPresets()
116
+ }
117
+ return success
118
+ } catch (error) {
119
+ console.error(
120
+ '[useEqualizerPresets] Error deleting custom preset:',
121
+ error
122
+ )
123
+ return false
124
+ }
125
+ },
126
+ [refreshPresets]
127
+ )
128
+
129
+ return {
130
+ presets,
131
+ builtInPresets,
132
+ customPresets,
133
+ applyPreset,
134
+ saveCustomPreset,
135
+ deleteCustomPreset,
136
+ currentPreset,
137
+ isLoading,
138
+ refreshPresets,
139
+ }
140
+ }
@@ -10,6 +10,7 @@ const DEFAULT_STATE: PlayerState = {
10
10
  currentState: 'stopped',
11
11
  currentPlaylistId: null,
12
12
  currentIndex: -1,
13
+ currentPlayingType: 'not-playing',
13
14
  }
14
15
 
15
16
  /**
@@ -50,12 +51,14 @@ export function useNowPlaying(): PlayerState {
50
51
  const [state, setState] = useState<PlayerState>(DEFAULT_STATE)
51
52
  const isMounted = useRef(true)
52
53
 
53
- const updateState = useCallback(() => {
54
+ const fetchFullState = useCallback(async () => {
54
55
  if (!isMounted.current) return
55
56
 
56
57
  try {
57
- const newState = TrackPlayer.getState()
58
- setState(newState)
58
+ const newState = await TrackPlayer.getState()
59
+ if (isMounted.current) {
60
+ setState(newState)
61
+ }
59
62
  } catch (error) {
60
63
  console.error('[useNowPlaying] Error updating player state:', error)
61
64
  }
@@ -64,34 +67,44 @@ export function useNowPlaying(): PlayerState {
64
67
  // Initialize with current state
65
68
  useEffect(() => {
66
69
  isMounted.current = true
67
- updateState()
70
+ fetchFullState()
68
71
 
69
72
  return () => {
70
73
  isMounted.current = false
71
74
  }
72
- }, [updateState])
75
+ }, [fetchFullState])
73
76
 
74
- // Subscribe to track changes
77
+ // Subscribe to track changes — full refresh
75
78
  useEffect(() => {
76
- const unsubscribe = callbackManager.subscribeToTrackChange(() => {
77
- updateState()
79
+ return callbackManager.subscribeToTrackChange(() => {
80
+ fetchFullState()
78
81
  })
82
+ }, [fetchFullState])
79
83
 
80
- return () => {
81
- unsubscribe()
82
- }
83
- }, [updateState])
84
-
85
- // Subscribe to playback state changes
84
+ // Subscribe to playback state changes — full refresh
86
85
  useEffect(() => {
87
- const unsubscribe = callbackManager.subscribeToPlaybackState(() => {
88
- updateState()
86
+ return callbackManager.subscribeToPlaybackState(() => {
87
+ fetchFullState()
89
88
  })
89
+ }, [fetchFullState])
90
90
 
91
- return () => {
92
- unsubscribe()
93
- }
94
- }, [updateState])
91
+ // Subscribe to progress changes — lightweight position/duration update
92
+ useEffect(() => {
93
+ return callbackManager.subscribeToPlaybackProgressChange(
94
+ (currentPosition, totalDuration) => {
95
+ if (!isMounted.current) return
96
+ setState((prev) => ({ ...prev, currentPosition, totalDuration }))
97
+ }
98
+ )
99
+ }, [])
100
+
101
+ // Subscribe to seek events — lightweight position/duration update
102
+ useEffect(() => {
103
+ return callbackManager.subscribeToSeek((currentPosition, totalDuration) => {
104
+ if (!isMounted.current) return
105
+ setState((prev) => ({ ...prev, currentPosition, totalDuration }))
106
+ })
107
+ }, [])
95
108
 
96
109
  return state
97
110
  }
@@ -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
  }
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useState } from 'react'
2
- import { TrackPlayer } from '../index'
2
+ import { callbackManager } from './callbackManager'
3
3
 
4
4
  /**
5
5
  * Hook to get the current playback progress
@@ -17,7 +17,7 @@ export function useOnPlaybackProgressChange(): {
17
17
  )
18
18
 
19
19
  useEffect(() => {
20
- TrackPlayer.onPlaybackProgressChange(
20
+ return callbackManager.subscribeToPlaybackProgressChange(
21
21
  (newPosition, newTotalDuration, newIsManuallySeeked) => {
22
22
  setPosition(newPosition)
23
23
  setTotalDuration(newTotalDuration)
@@ -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