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,179 @@
1
+ import { useCallback, useState } from 'react'
2
+ import { DownloadManager } from '../index'
3
+ import type { DownloadConfig, PlaybackSource } from '../types/DownloadTypes'
4
+ import type { TrackItem } from '../types/PlayerQueue'
5
+
6
+ export interface UseDownloadActionsResult {
7
+ // Download actions
8
+ downloadTrack: (track: TrackItem, playlistId?: string) => Promise<string>
9
+ downloadPlaylist: (
10
+ playlistId: string,
11
+ tracks: TrackItem[]
12
+ ) => Promise<string[]>
13
+
14
+ // Control actions
15
+ pauseDownload: (downloadId: string) => Promise<void>
16
+ resumeDownload: (downloadId: string) => Promise<void>
17
+ cancelDownload: (downloadId: string) => Promise<void>
18
+ retryDownload: (downloadId: string) => Promise<void>
19
+
20
+ // Bulk control
21
+ pauseAll: () => Promise<void>
22
+ resumeAll: () => Promise<void>
23
+ cancelAll: () => Promise<void>
24
+
25
+ // Delete actions
26
+ deleteTrack: (trackId: string) => Promise<void>
27
+ deletePlaylist: (playlistId: string) => Promise<void>
28
+ deleteAll: () => Promise<void>
29
+
30
+ // Configuration
31
+ configure: (config: DownloadConfig) => void
32
+ setPlaybackSourcePreference: (preference: PlaybackSource) => void
33
+ getPlaybackSourcePreference: () => PlaybackSource
34
+
35
+ // Loading states
36
+ isDownloading: boolean
37
+ isDeleting: boolean
38
+ error: Error | null
39
+ }
40
+
41
+ /**
42
+ * Hook for download actions (download, pause, resume, cancel, delete)
43
+ */
44
+ export function useDownloadActions(): UseDownloadActionsResult {
45
+ const [isDownloading, setIsDownloading] = useState(false)
46
+ const [isDeleting, setIsDeleting] = useState(false)
47
+ const [error, setError] = useState<Error | null>(null)
48
+
49
+ const downloadTrack = useCallback(
50
+ async (track: TrackItem, playlistId?: string) => {
51
+ setIsDownloading(true)
52
+ setError(null)
53
+ try {
54
+ const downloadId = await DownloadManager.downloadTrack(
55
+ track,
56
+ playlistId
57
+ )
58
+ return downloadId
59
+ } catch (e) {
60
+ setError(e as Error)
61
+ throw e
62
+ } finally {
63
+ setIsDownloading(false)
64
+ }
65
+ },
66
+ []
67
+ )
68
+
69
+ const downloadPlaylist = useCallback(
70
+ async (playlistId: string, tracks: TrackItem[]) => {
71
+ setIsDownloading(true)
72
+ setError(null)
73
+ try {
74
+ const downloadIds = await DownloadManager.downloadPlaylist(
75
+ playlistId,
76
+ tracks
77
+ )
78
+ return downloadIds
79
+ } catch (e) {
80
+ setError(e as Error)
81
+ throw e
82
+ } finally {
83
+ setIsDownloading(false)
84
+ }
85
+ },
86
+ []
87
+ )
88
+
89
+ const pauseDownload = useCallback(async (downloadId: string) => {
90
+ await DownloadManager.pauseDownload(downloadId)
91
+ }, [])
92
+
93
+ const resumeDownload = useCallback(async (downloadId: string) => {
94
+ await DownloadManager.resumeDownload(downloadId)
95
+ }, [])
96
+
97
+ const cancelDownload = useCallback(async (downloadId: string) => {
98
+ await DownloadManager.cancelDownload(downloadId)
99
+ }, [])
100
+
101
+ const retryDownload = useCallback(async (downloadId: string) => {
102
+ await DownloadManager.retryDownload(downloadId)
103
+ }, [])
104
+
105
+ const pauseAll = useCallback(async () => {
106
+ await DownloadManager.pauseAllDownloads()
107
+ }, [])
108
+
109
+ const resumeAll = useCallback(async () => {
110
+ await DownloadManager.resumeAllDownloads()
111
+ }, [])
112
+
113
+ const cancelAll = useCallback(async () => {
114
+ await DownloadManager.cancelAllDownloads()
115
+ }, [])
116
+
117
+ const deleteTrack = useCallback(async (trackId: string) => {
118
+ setIsDeleting(true)
119
+ try {
120
+ await DownloadManager.deleteDownloadedTrack(trackId)
121
+ } finally {
122
+ setIsDeleting(false)
123
+ }
124
+ }, [])
125
+
126
+ const deletePlaylist = useCallback(async (playlistId: string) => {
127
+ setIsDeleting(true)
128
+ try {
129
+ await DownloadManager.deleteDownloadedPlaylist(playlistId)
130
+ } finally {
131
+ setIsDeleting(false)
132
+ }
133
+ }, [])
134
+
135
+ const deleteAll = useCallback(async () => {
136
+ setIsDeleting(true)
137
+ try {
138
+ await DownloadManager.deleteAllDownloads()
139
+ } finally {
140
+ setIsDeleting(false)
141
+ }
142
+ }, [])
143
+
144
+ const configure = useCallback((config: DownloadConfig) => {
145
+ DownloadManager.configure(config)
146
+ }, [])
147
+
148
+ const setPlaybackSourcePreference = useCallback(
149
+ (preference: PlaybackSource) => {
150
+ DownloadManager.setPlaybackSourcePreference(preference)
151
+ },
152
+ []
153
+ )
154
+
155
+ const getPlaybackSourcePreference = useCallback(() => {
156
+ return DownloadManager.getPlaybackSourcePreference()
157
+ }, [])
158
+
159
+ return {
160
+ downloadTrack,
161
+ downloadPlaylist,
162
+ pauseDownload,
163
+ resumeDownload,
164
+ cancelDownload,
165
+ retryDownload,
166
+ pauseAll,
167
+ resumeAll,
168
+ cancelAll,
169
+ deleteTrack,
170
+ deletePlaylist,
171
+ deleteAll,
172
+ configure,
173
+ setPlaybackSourcePreference,
174
+ getPlaybackSourcePreference,
175
+ isDownloading,
176
+ isDeleting,
177
+ error,
178
+ }
179
+ }
@@ -0,0 +1,126 @@
1
+ import { useEffect, useState, useRef, useCallback } from 'react'
2
+ import { DownloadManager } from '../index'
3
+ import { downloadCallbackManager } from './downloadCallbackManager'
4
+ import type { DownloadProgress } from '../types/DownloadTypes'
5
+
6
+ export interface UseDownloadProgressOptions {
7
+ /** Track specific track ID(s) */
8
+ trackIds?: string[]
9
+ /** Track specific download ID(s) */
10
+ downloadIds?: string[]
11
+ /** Only track active downloads */
12
+ activeOnly?: boolean
13
+ }
14
+
15
+ export interface UseDownloadProgressResult {
16
+ /** Map of trackId to DownloadProgress */
17
+ progressMap: Map<string, DownloadProgress>
18
+ /** Array of all tracked progress */
19
+ progressList: DownloadProgress[]
20
+ /** Overall progress for tracked downloads (0-1) */
21
+ overallProgress: number
22
+ /** Whether any download is in progress */
23
+ isDownloading: boolean
24
+ /** Get progress for a specific track */
25
+ getProgress: (trackId: string) => DownloadProgress | undefined
26
+ }
27
+
28
+ /**
29
+ * Hook for tracking download progress
30
+ */
31
+ export function useDownloadProgress(
32
+ options: UseDownloadProgressOptions = {}
33
+ ): UseDownloadProgressResult {
34
+ const { trackIds, downloadIds, activeOnly = false } = options
35
+ const [progressMap, setProgressMap] = useState<Map<string, DownloadProgress>>(
36
+ new Map()
37
+ )
38
+ const isMounted = useRef(true)
39
+
40
+ const shouldTrack = useCallback(
41
+ (progress: DownloadProgress): boolean => {
42
+ if (
43
+ trackIds &&
44
+ trackIds.length > 0 &&
45
+ !trackIds.includes(progress.trackId)
46
+ ) {
47
+ return false
48
+ }
49
+ if (
50
+ downloadIds &&
51
+ downloadIds.length > 0 &&
52
+ !downloadIds.includes(progress.downloadId)
53
+ ) {
54
+ return false
55
+ }
56
+ if (activeOnly && progress.state !== 'downloading') {
57
+ return false
58
+ }
59
+ return true
60
+ },
61
+ [trackIds, downloadIds, activeOnly]
62
+ )
63
+
64
+ useEffect(() => {
65
+ isMounted.current = true
66
+
67
+ // Initialize with current active downloads
68
+ try {
69
+ const activeDownloads = DownloadManager.getActiveDownloads()
70
+ const initialMap = new Map<string, DownloadProgress>()
71
+ activeDownloads.forEach((task) => {
72
+ if (shouldTrack(task.progress)) {
73
+ initialMap.set(task.trackId, task.progress)
74
+ }
75
+ })
76
+ setProgressMap(initialMap)
77
+ } catch (error) {
78
+ console.error('[useDownloadProgress] Error initializing:', error)
79
+ }
80
+
81
+ const unsubscribe = downloadCallbackManager.subscribeToProgress(
82
+ (progress) => {
83
+ if (!isMounted.current) return
84
+ if (!shouldTrack(progress)) return
85
+
86
+ setProgressMap((prev) => {
87
+ const next = new Map(prev)
88
+ if (
89
+ progress.state === 'completed' ||
90
+ progress.state === 'cancelled'
91
+ ) {
92
+ next.delete(progress.trackId)
93
+ } else {
94
+ next.set(progress.trackId, progress)
95
+ }
96
+ return next
97
+ })
98
+ }
99
+ )
100
+
101
+ return () => {
102
+ isMounted.current = false
103
+ unsubscribe()
104
+ }
105
+ }, [shouldTrack])
106
+
107
+ const progressList = Array.from(progressMap.values())
108
+ const overallProgress =
109
+ progressList.length > 0
110
+ ? progressList.reduce((sum, p) => sum + p.progress, 0) /
111
+ progressList.length
112
+ : 0
113
+ const isDownloading = progressList.some((p) => p.state === 'downloading')
114
+ const getProgress = useCallback(
115
+ (trackId: string) => progressMap.get(trackId),
116
+ [progressMap]
117
+ )
118
+
119
+ return {
120
+ progressMap,
121
+ progressList,
122
+ overallProgress,
123
+ isDownloading,
124
+ getProgress,
125
+ }
126
+ }
@@ -0,0 +1,84 @@
1
+ import { useEffect, useState, useRef, useCallback } from 'react'
2
+ import { DownloadManager } from '../index'
3
+ import type { DownloadStorageInfo } from '../types/DownloadTypes'
4
+
5
+ export interface UseDownloadStorageResult {
6
+ /** Storage information */
7
+ storageInfo: DownloadStorageInfo | null
8
+ /** Loading state */
9
+ isLoading: boolean
10
+ /** Refresh storage info */
11
+ refresh: () => Promise<void>
12
+ /** Formatted total downloaded size (e.g., "2.5 GB") */
13
+ formattedSize: string
14
+ /** Formatted available space (e.g., "10.2 GB") */
15
+ formattedAvailable: string
16
+ /** Usage percentage (0-100) */
17
+ usagePercentage: number
18
+ }
19
+
20
+ /**
21
+ * Formats bytes into a human-readable string
22
+ */
23
+ function formatBytes(bytes: number): string {
24
+ if (bytes === 0) return '0 B'
25
+ const k = 1024
26
+ const sizes = ['B', 'KB', 'MB', 'GB', 'TB']
27
+ const i = Math.floor(Math.log(bytes) / Math.log(k))
28
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
29
+ }
30
+
31
+ /**
32
+ * Hook for accessing download storage information
33
+ */
34
+ export function useDownloadStorage(): UseDownloadStorageResult {
35
+ const [storageInfo, setStorageInfo] = useState<DownloadStorageInfo | null>(
36
+ null
37
+ )
38
+ const [isLoading, setIsLoading] = useState(true)
39
+ const isMounted = useRef(true)
40
+
41
+ const refresh = useCallback(async () => {
42
+ try {
43
+ const info = await DownloadManager.getStorageInfo()
44
+ if (isMounted.current) {
45
+ setStorageInfo(info)
46
+ setIsLoading(false)
47
+ }
48
+ } catch (error) {
49
+ console.error('[useDownloadStorage] Error:', error)
50
+ if (isMounted.current) {
51
+ setIsLoading(false)
52
+ }
53
+ }
54
+ }, [])
55
+
56
+ useEffect(() => {
57
+ isMounted.current = true
58
+ refresh()
59
+ return () => {
60
+ isMounted.current = false
61
+ }
62
+ }, [refresh])
63
+
64
+ const formattedSize = storageInfo
65
+ ? formatBytes(storageInfo.totalDownloadedSize)
66
+ : '0 B'
67
+
68
+ const formattedAvailable = storageInfo
69
+ ? formatBytes(storageInfo.availableSpace)
70
+ : '0 B'
71
+
72
+ const usagePercentage = storageInfo
73
+ ? (storageInfo.totalDownloadedSize / storageInfo.totalSpace) * 100
74
+ : 0
75
+
76
+ return {
77
+ storageInfo,
78
+ isLoading,
79
+ refresh,
80
+ formattedSize,
81
+ formattedAvailable,
82
+ usagePercentage,
83
+ }
84
+ }
@@ -0,0 +1,138 @@
1
+ import { useEffect, useState, useRef, useCallback, useMemo } from 'react'
2
+ import { DownloadManager } from '../index'
3
+ import { downloadCallbackManager } from './downloadCallbackManager'
4
+ import type {
5
+ DownloadedTrack,
6
+ DownloadedPlaylist,
7
+ } from '../types/DownloadTypes'
8
+
9
+ export interface UseDownloadedTracksResult {
10
+ /** All downloaded tracks */
11
+ downloadedTracks: DownloadedTrack[]
12
+ /** All downloaded playlists */
13
+ downloadedPlaylists: DownloadedPlaylist[]
14
+ /** Check if a track is downloaded */
15
+ isTrackDownloaded: (trackId: string) => boolean
16
+ /** Check if a playlist is fully downloaded */
17
+ isPlaylistDownloaded: (playlistId: string) => boolean
18
+ /** Check if a playlist is partially downloaded */
19
+ isPlaylistPartiallyDownloaded: (playlistId: string) => boolean
20
+ /** Get downloaded track info */
21
+ getDownloadedTrack: (trackId: string) => DownloadedTrack | undefined
22
+ /** Get downloaded playlist info */
23
+ getDownloadedPlaylist: (playlistId: string) => DownloadedPlaylist | undefined
24
+ /** Refresh downloaded content list */
25
+ refresh: () => void
26
+ /** Loading state */
27
+ isLoading: boolean
28
+ }
29
+
30
+ /**
31
+ * Hook for accessing downloaded tracks and playlists
32
+ */
33
+ export function useDownloadedTracks(): UseDownloadedTracksResult {
34
+ const [downloadedTracks, setDownloadedTracks] = useState<DownloadedTrack[]>(
35
+ []
36
+ )
37
+ const [downloadedPlaylists, setDownloadedPlaylists] = useState<
38
+ DownloadedPlaylist[]
39
+ >([])
40
+ const [isLoading, setIsLoading] = useState(true)
41
+ const isMounted = useRef(true)
42
+
43
+ const refresh = useCallback(() => {
44
+ if (!isMounted.current) return
45
+
46
+ try {
47
+ const tracks = DownloadManager.getAllDownloadedTracks()
48
+ const playlists = DownloadManager.getAllDownloadedPlaylists()
49
+
50
+ if (isMounted.current) {
51
+ setDownloadedTracks(tracks)
52
+ setDownloadedPlaylists(playlists)
53
+ setIsLoading(false)
54
+ }
55
+ } catch (error) {
56
+ console.error('[useDownloadedTracks] Error refreshing:', error)
57
+ if (isMounted.current) {
58
+ setIsLoading(false)
59
+ }
60
+ }
61
+ }, [])
62
+
63
+ useEffect(() => {
64
+ isMounted.current = true
65
+ refresh()
66
+
67
+ const unsubscribeComplete = downloadCallbackManager.subscribeToComplete(
68
+ () => {
69
+ refresh()
70
+ }
71
+ )
72
+
73
+ const unsubscribeStateChange =
74
+ downloadCallbackManager.subscribeToStateChange(
75
+ (_downloadId, _trackId, state) => {
76
+ if (state === 'completed') {
77
+ refresh()
78
+ }
79
+ }
80
+ )
81
+
82
+ return () => {
83
+ isMounted.current = false
84
+ unsubscribeComplete()
85
+ unsubscribeStateChange()
86
+ }
87
+ }, [refresh])
88
+
89
+ const trackMap = useMemo(
90
+ () => new Map(downloadedTracks.map((t) => [t.trackId, t])),
91
+ [downloadedTracks]
92
+ )
93
+
94
+ const playlistMap = useMemo(
95
+ () => new Map(downloadedPlaylists.map((p) => [p.playlistId, p])),
96
+ [downloadedPlaylists]
97
+ )
98
+
99
+ const isTrackDownloaded = useCallback(
100
+ (trackId: string) => trackMap.has(trackId),
101
+ [trackMap]
102
+ )
103
+
104
+ const isPlaylistDownloaded = useCallback(
105
+ (playlistId: string) => {
106
+ const p = playlistMap.get(playlistId)
107
+ return p ? p.isComplete : false
108
+ },
109
+ [playlistMap]
110
+ )
111
+
112
+ const isPlaylistPartiallyDownloaded = useCallback(
113
+ (playlistId: string) => playlistMap.has(playlistId),
114
+ [playlistMap]
115
+ )
116
+
117
+ const getDownloadedTrack = useCallback(
118
+ (trackId: string) => trackMap.get(trackId),
119
+ [trackMap]
120
+ )
121
+
122
+ const getDownloadedPlaylist = useCallback(
123
+ (playlistId: string) => playlistMap.get(playlistId),
124
+ [playlistMap]
125
+ )
126
+
127
+ return {
128
+ downloadedTracks,
129
+ downloadedPlaylists,
130
+ isTrackDownloaded,
131
+ isPlaylistDownloaded,
132
+ isPlaylistPartiallyDownloaded,
133
+ getDownloadedTrack,
134
+ getDownloadedPlaylist,
135
+ refresh,
136
+ isLoading,
137
+ }
138
+ }
@@ -0,0 +1,173 @@
1
+ import { useEffect, useState, useCallback, useRef } from 'react'
2
+ import { Equalizer } from '../index'
3
+ import type { EqualizerBand } from '../types/EqualizerTypes'
4
+ import { equalizerCallbackManager } from './equalizerCallbackManager'
5
+
6
+ export interface UseEqualizerResult {
7
+ /** Whether the equalizer is enabled */
8
+ isEnabled: boolean
9
+ /** Current band settings */
10
+ bands: EqualizerBand[]
11
+ /** Currently applied preset name */
12
+ currentPreset: string | null
13
+ /** Toggle equalizer on/off */
14
+ setEnabled: (enabled: boolean) => boolean
15
+ /** Set gain for a specific band */
16
+ setBandGain: (bandIndex: number, gainDb: number) => boolean
17
+ /** Set all band gains at once */
18
+ setAllBandGains: (gains: number[]) => boolean
19
+ /** Reset to flat response */
20
+ reset: () => void
21
+ /** Whether equalizer is loading */
22
+ isLoading: boolean
23
+ /** Gain range (min/max in dB) */
24
+ gainRange: { min: number; max: number }
25
+ }
26
+
27
+ const DEFAULT_BANDS: EqualizerBand[] = [
28
+ { index: 0, centerFrequency: 60, gainDb: 0, frequencyLabel: '60 Hz' },
29
+ { index: 1, centerFrequency: 230, gainDb: 0, frequencyLabel: '230 Hz' },
30
+ { index: 2, centerFrequency: 910, gainDb: 0, frequencyLabel: '910 Hz' },
31
+ { index: 3, centerFrequency: 3600, gainDb: 0, frequencyLabel: '3.6 kHz' },
32
+ { index: 4, centerFrequency: 14000, gainDb: 0, frequencyLabel: '14 kHz' },
33
+ ]
34
+
35
+ export function useEqualizer(): UseEqualizerResult {
36
+ const [isEnabled, setIsEnabledState] = useState(false)
37
+ const [bands, setBands] = useState<EqualizerBand[]>(DEFAULT_BANDS)
38
+ const [currentPreset, setCurrentPreset] = useState<string | null>(null)
39
+ const [isLoading, setIsLoading] = useState(true)
40
+ const [gainRange, setGainRange] = useState({ min: -12, max: 12 })
41
+ const isMounted = useRef(true)
42
+
43
+ // Load initial state
44
+ useEffect(() => {
45
+ isMounted.current = true
46
+
47
+ const loadState = async () => {
48
+ try {
49
+ const state = Equalizer.getState()
50
+ if (isMounted.current) {
51
+ setIsEnabledState(state.enabled)
52
+ setBands(state.bands)
53
+ setCurrentPreset(state.currentPreset)
54
+
55
+ const range = Equalizer.getBandRange()
56
+ setGainRange({ min: range.min, max: range.max })
57
+
58
+ setIsLoading(false)
59
+ }
60
+ } catch (error) {
61
+ console.error('[useEqualizer] Error loading state:', error)
62
+ if (isMounted.current) {
63
+ setIsLoading(false)
64
+ }
65
+ }
66
+ }
67
+
68
+ loadState()
69
+
70
+ return () => {
71
+ isMounted.current = false
72
+ }
73
+ }, [])
74
+
75
+ // Subscribe to enabled changes
76
+ useEffect(() => {
77
+ const unsubscribe = equalizerCallbackManager.subscribeToEnabledChange(
78
+ (enabled) => {
79
+ if (isMounted.current) {
80
+ setIsEnabledState(enabled)
81
+ }
82
+ }
83
+ )
84
+
85
+ return unsubscribe
86
+ }, [])
87
+
88
+ // Subscribe to band changes
89
+ useEffect(() => {
90
+ const unsubscribe = equalizerCallbackManager.subscribeToBandChange(
91
+ (newBands) => {
92
+ if (isMounted.current) {
93
+ setBands(newBands)
94
+ }
95
+ }
96
+ )
97
+
98
+ return unsubscribe
99
+ }, [])
100
+
101
+ // Subscribe to preset changes
102
+ useEffect(() => {
103
+ const unsubscribe = equalizerCallbackManager.subscribeToPresetChange(
104
+ (presetName) => {
105
+ if (isMounted.current) {
106
+ setCurrentPreset(presetName)
107
+ }
108
+ }
109
+ )
110
+
111
+ return unsubscribe
112
+ }, [])
113
+
114
+ const setEnabled = useCallback((enabled: boolean): boolean => {
115
+ try {
116
+ return Equalizer.setEnabled(enabled)
117
+ } catch (error) {
118
+ console.error('[useEqualizer] Error setting enabled:', error)
119
+ return false
120
+ }
121
+ }, [])
122
+
123
+ const setBandGain = useCallback(
124
+ (bandIndex: number, gainDb: number): boolean => {
125
+ // Optimistic update
126
+ setBands((prevBands) =>
127
+ prevBands.map((b) => (b.index === bandIndex ? { ...b, gainDb } : b))
128
+ )
129
+ try {
130
+ return Equalizer.setBandGain(bandIndex, gainDb)
131
+ } catch (error) {
132
+ console.error('[useEqualizer] Error setting band gain:', error)
133
+ return false
134
+ }
135
+ },
136
+ []
137
+ )
138
+
139
+ const setAllBandGains = useCallback((gains: number[]): boolean => {
140
+ // Optimistic update
141
+ setBands((prevBands) =>
142
+ prevBands.map((b, i) => ({ ...b, gainDb: gains[i] ?? b.gainDb }))
143
+ )
144
+ try {
145
+ return Equalizer.setAllBandGains(gains)
146
+ } catch (error) {
147
+ console.error('[useEqualizer] Error setting all band gains:', error)
148
+ return false
149
+ }
150
+ }, [])
151
+
152
+ const reset = useCallback(() => {
153
+ // Optimistic update
154
+ setBands((prevBands) => prevBands.map((b) => ({ ...b, gainDb: 0 })))
155
+ try {
156
+ Equalizer.reset()
157
+ } catch (error) {
158
+ console.error('[useEqualizer] Error resetting equalizer:', error)
159
+ }
160
+ }, [])
161
+
162
+ return {
163
+ isEnabled,
164
+ bands,
165
+ currentPreset,
166
+ setEnabled,
167
+ setBandGain,
168
+ setAllBandGains,
169
+ reset,
170
+ isLoading,
171
+ gainRange,
172
+ }
173
+ }