react-native-nitro-player 0.3.0-alpha.8 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/README.md +444 -4
  2. package/android/build.gradle +4 -1
  3. package/android/src/main/AndroidManifest.xml +16 -1
  4. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAndroidAutoMediaLibrary.kt +2 -0
  5. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAudioDevices.kt +8 -0
  6. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridDownloadManager.kt +225 -0
  7. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridEqualizer.kt +105 -0
  8. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridPlayerQueue.kt +6 -6
  9. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridTrackPlayer.kt +37 -12
  10. package/android/src/main/java/com/margelo/nitro/nitroplayer/core/TrackPlayerCore.kt +970 -213
  11. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadDatabase.kt +475 -0
  12. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadFileManager.kt +159 -0
  13. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadManagerCore.kt +489 -0
  14. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadWorker.kt +209 -0
  15. package/android/src/main/java/com/margelo/nitro/nitroplayer/equalizer/EqualizerCore.kt +486 -0
  16. package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaBrowserService.kt +3 -1
  17. package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaSessionManager.kt +14 -6
  18. package/android/src/main/java/com/margelo/nitro/nitroplayer/playlist/PlaylistManager.kt +27 -0
  19. package/ios/HybridDownloadManager.swift +226 -0
  20. package/ios/HybridEqualizer.swift +111 -0
  21. package/ios/HybridTrackPlayer.swift +36 -8
  22. package/ios/core/TrackPlayerCore.swift +998 -276
  23. package/ios/download/DownloadDatabase.swift +493 -0
  24. package/ios/download/DownloadFileManager.swift +241 -0
  25. package/ios/download/DownloadManagerCore.swift +923 -0
  26. package/ios/equalizer/EqualizerCore.swift +685 -0
  27. package/ios/media/MediaSessionManager.swift +40 -28
  28. package/ios/playlist/PlaylistManager.swift +40 -9
  29. package/ios/queue/HybridPlayerQueue.swift +33 -13
  30. package/lib/hooks/callbackManager.d.ts +28 -0
  31. package/lib/hooks/callbackManager.js +76 -0
  32. package/lib/hooks/downloadCallbackManager.d.ts +36 -0
  33. package/lib/hooks/downloadCallbackManager.js +108 -0
  34. package/lib/hooks/equalizerCallbackManager.d.ts +37 -0
  35. package/lib/hooks/equalizerCallbackManager.js +109 -0
  36. package/lib/hooks/index.d.ts +18 -0
  37. package/lib/hooks/index.js +10 -0
  38. package/lib/hooks/useActualQueue.d.ts +48 -0
  39. package/lib/hooks/useActualQueue.js +98 -0
  40. package/lib/hooks/useDownloadActions.d.ts +26 -0
  41. package/lib/hooks/useDownloadActions.js +117 -0
  42. package/lib/hooks/useDownloadProgress.d.ts +25 -0
  43. package/lib/hooks/useDownloadProgress.js +79 -0
  44. package/lib/hooks/useDownloadStorage.d.ts +19 -0
  45. package/lib/hooks/useDownloadStorage.js +60 -0
  46. package/lib/hooks/useDownloadedTracks.d.ts +25 -0
  47. package/lib/hooks/useDownloadedTracks.js +69 -0
  48. package/lib/hooks/useEqualizer.d.ts +25 -0
  49. package/lib/hooks/useEqualizer.js +124 -0
  50. package/lib/hooks/useEqualizerPresets.d.ts +22 -0
  51. package/lib/hooks/useEqualizerPresets.js +96 -0
  52. package/lib/hooks/useNowPlaying.d.ts +2 -2
  53. package/lib/hooks/useNowPlaying.js +42 -33
  54. package/lib/hooks/useOnChangeTrack.d.ts +33 -6
  55. package/lib/hooks/useOnChangeTrack.js +68 -9
  56. package/lib/hooks/useOnPlaybackStateChange.d.ts +32 -6
  57. package/lib/hooks/useOnPlaybackStateChange.js +68 -9
  58. package/lib/hooks/usePlaylist.d.ts +48 -0
  59. package/lib/hooks/usePlaylist.js +136 -0
  60. package/lib/index.d.ts +6 -0
  61. package/lib/index.js +6 -0
  62. package/lib/specs/DownloadManager.nitro.d.ts +152 -0
  63. package/lib/specs/DownloadManager.nitro.js +1 -0
  64. package/lib/specs/Equalizer.nitro.d.ts +43 -0
  65. package/lib/specs/Equalizer.nitro.js +1 -0
  66. package/lib/specs/TrackPlayer.nitro.d.ts +6 -2
  67. package/lib/types/DownloadTypes.d.ts +110 -0
  68. package/lib/types/DownloadTypes.js +1 -0
  69. package/lib/types/EqualizerTypes.d.ts +52 -0
  70. package/lib/types/EqualizerTypes.js +1 -0
  71. package/lib/types/PlayerQueue.d.ts +4 -0
  72. package/nitro.json +8 -0
  73. package/nitrogen/generated/android/NitroPlayer+autolinking.cmake +10 -1
  74. package/nitrogen/generated/android/NitroPlayerOnLoad.cpp +32 -2
  75. package/nitrogen/generated/android/c++/JCurrentPlayingType.hpp +65 -0
  76. package/nitrogen/generated/android/c++/JDownloadConfig.hpp +92 -0
  77. package/nitrogen/generated/android/c++/JDownloadError.hpp +71 -0
  78. package/nitrogen/generated/android/c++/JDownloadErrorReason.hpp +74 -0
  79. package/nitrogen/generated/android/c++/JDownloadProgress.hpp +79 -0
  80. package/nitrogen/generated/android/c++/JDownloadQueueStatus.hpp +81 -0
  81. package/nitrogen/generated/android/c++/JDownloadState.hpp +71 -0
  82. package/nitrogen/generated/android/c++/JDownloadStorageInfo.hpp +73 -0
  83. package/nitrogen/generated/android/c++/JDownloadTask.hpp +108 -0
  84. package/nitrogen/generated/android/c++/JDownloadedPlaylist.hpp +111 -0
  85. package/nitrogen/generated/android/c++/JDownloadedTrack.hpp +92 -0
  86. package/nitrogen/generated/android/c++/JEqualizerBand.hpp +69 -0
  87. package/nitrogen/generated/android/c++/JEqualizerPreset.hpp +78 -0
  88. package/nitrogen/generated/android/c++/JEqualizerState.hpp +91 -0
  89. package/nitrogen/generated/android/c++/JFunc_void_DownloadProgress.hpp +80 -0
  90. package/nitrogen/generated/android/c++/JFunc_void_DownloadedTrack.hpp +89 -0
  91. package/nitrogen/generated/android/c++/JFunc_void_TrackItem_std__optional_Reason_.hpp +2 -0
  92. package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__std__string__.hpp +81 -0
  93. package/nitrogen/generated/android/c++/JFunc_void_std__string_Playlist_std__optional_QueueOperation_.hpp +2 -0
  94. package/nitrogen/generated/android/c++/JFunc_void_std__string_std__string_DownloadState_std__optional_DownloadError_.hpp +83 -0
  95. package/nitrogen/generated/android/c++/JFunc_void_std__vector_EqualizerBand_.hpp +97 -0
  96. package/nitrogen/generated/android/c++/JFunc_void_std__vector_Playlist__std__optional_QueueOperation_.hpp +2 -0
  97. package/nitrogen/generated/android/c++/JGainRange.hpp +61 -0
  98. package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.cpp +470 -0
  99. package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.hpp +99 -0
  100. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.cpp +204 -0
  101. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.hpp +82 -0
  102. package/nitrogen/generated/android/c++/JHybridPlayerQueueSpec.cpp +2 -0
  103. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.cpp +117 -15
  104. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.hpp +6 -2
  105. package/nitrogen/generated/android/c++/JPlaybackSource.hpp +62 -0
  106. package/nitrogen/generated/android/c++/JPlayerState.hpp +11 -3
  107. package/nitrogen/generated/android/c++/JPlaylist.hpp +2 -0
  108. package/nitrogen/generated/android/c++/JPresetType.hpp +59 -0
  109. package/nitrogen/generated/android/c++/JStorageLocation.hpp +59 -0
  110. package/nitrogen/generated/android/c++/JTrackItem.hpp +9 -3
  111. package/nitrogen/generated/android/c++/JTrackPlayerState.hpp +3 -3
  112. package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
  113. package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
  114. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.cpp +26 -0
  115. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.hpp +74 -0
  116. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.cpp +26 -0
  117. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.hpp +84 -0
  118. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.cpp +26 -0
  119. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.hpp +85 -0
  120. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.cpp +26 -0
  121. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.hpp +80 -0
  122. package/nitrogen/generated/android/c++/JVariant_NullType_Playlist.hpp +2 -0
  123. package/nitrogen/generated/android/c++/JVariant_NullType_TrackItem.hpp +2 -0
  124. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/CurrentPlayingType.kt +23 -0
  125. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadConfig.kt +59 -0
  126. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadError.kt +47 -0
  127. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadErrorReason.kt +26 -0
  128. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadProgress.kt +53 -0
  129. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadQueueStatus.kt +56 -0
  130. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadState.kt +25 -0
  131. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadStorageInfo.kt +50 -0
  132. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadTask.kt +65 -0
  133. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedPlaylist.kt +53 -0
  134. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedTrack.kt +56 -0
  135. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerBand.kt +47 -0
  136. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerPreset.kt +44 -0
  137. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerState.kt +44 -0
  138. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadProgress.kt +80 -0
  139. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadedTrack.kt +80 -0
  140. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__optional_std__variant_nitro__NullType__std__string__.kt +80 -0
  141. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.kt +80 -0
  142. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__vector_EqualizerBand_.kt +80 -0
  143. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/GainRange.kt +41 -0
  144. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridDownloadManagerSpec.kt +210 -0
  145. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridEqualizerSpec.kt +141 -0
  146. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridTrackPlayerSpec.kt +19 -2
  147. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlaybackSource.kt +22 -0
  148. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlayerState.kt +6 -3
  149. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PresetType.kt +21 -0
  150. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/StorageLocation.kt +21 -0
  151. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackItem.kt +7 -3
  152. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackPlayerState.kt +2 -2
  153. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_Double.kt +59 -0
  154. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadError.kt +59 -0
  155. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadTask.kt +59 -0
  156. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedPlaylist.kt +59 -0
  157. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedTrack.kt +59 -0
  158. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.cpp +138 -8
  159. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.hpp +1046 -121
  160. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Umbrella.hpp +66 -0
  161. package/nitrogen/generated/ios/NitroPlayerAutolinking.mm +16 -0
  162. package/nitrogen/generated/ios/NitroPlayerAutolinking.swift +30 -0
  163. package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.cpp +11 -0
  164. package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.hpp +386 -0
  165. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.cpp +11 -0
  166. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.hpp +223 -0
  167. package/nitrogen/generated/ios/c++/HybridPlayerQueueSpecSwift.hpp +1 -0
  168. package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.hpp +46 -6
  169. package/nitrogen/generated/ios/swift/CurrentPlayingType.swift +48 -0
  170. package/nitrogen/generated/ios/swift/DownloadConfig.swift +270 -0
  171. package/nitrogen/generated/ios/swift/DownloadError.swift +69 -0
  172. package/nitrogen/generated/ios/swift/DownloadErrorReason.swift +60 -0
  173. package/nitrogen/generated/ios/swift/DownloadProgress.swift +91 -0
  174. package/nitrogen/generated/ios/swift/DownloadQueueStatus.swift +102 -0
  175. package/nitrogen/generated/ios/swift/DownloadState.swift +56 -0
  176. package/nitrogen/generated/ios/swift/DownloadStorageInfo.swift +80 -0
  177. package/nitrogen/generated/ios/swift/DownloadTask.swift +315 -0
  178. package/nitrogen/generated/ios/swift/DownloadedPlaylist.swift +103 -0
  179. package/nitrogen/generated/ios/swift/DownloadedTrack.swift +147 -0
  180. package/nitrogen/generated/ios/swift/EqualizerBand.swift +69 -0
  181. package/nitrogen/generated/ios/swift/EqualizerPreset.swift +70 -0
  182. package/nitrogen/generated/ios/swift/EqualizerState.swift +115 -0
  183. package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
  184. package/nitrogen/generated/ios/swift/Func_void_DownloadProgress.swift +47 -0
  185. package/nitrogen/generated/ios/swift/Func_void_DownloadStorageInfo.swift +47 -0
  186. package/nitrogen/generated/ios/swift/Func_void_DownloadedTrack.swift +47 -0
  187. package/nitrogen/generated/ios/swift/Func_void_PlayerState.swift +47 -0
  188. package/nitrogen/generated/ios/swift/Func_void_bool.swift +5 -5
  189. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
  190. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__std__string__.swift +66 -0
  191. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  192. package/nitrogen/generated/ios/swift/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.swift +47 -0
  193. package/nitrogen/generated/ios/swift/Func_void_std__vector_EqualizerBand_.swift +47 -0
  194. package/nitrogen/generated/ios/swift/Func_void_std__vector_TrackItem_.swift +47 -0
  195. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +47 -0
  196. package/nitrogen/generated/ios/swift/GainRange.swift +47 -0
  197. package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec.swift +90 -0
  198. package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec_cxx.swift +705 -0
  199. package/nitrogen/generated/ios/swift/HybridEqualizerSpec.swift +73 -0
  200. package/nitrogen/generated/ios/swift/HybridEqualizerSpec_cxx.swift +396 -0
  201. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec.swift +6 -2
  202. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec_cxx.swift +105 -8
  203. package/nitrogen/generated/ios/swift/PlaybackSource.swift +44 -0
  204. package/nitrogen/generated/ios/swift/PlayerState.swift +13 -2
  205. package/nitrogen/generated/ios/swift/PresetType.swift +40 -0
  206. package/nitrogen/generated/ios/swift/StorageLocation.swift +40 -0
  207. package/nitrogen/generated/ios/swift/TrackItem.swift +31 -1
  208. package/nitrogen/generated/ios/swift/TrackPlayerState.swift +4 -4
  209. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +18 -0
  210. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadError.swift +18 -0
  211. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadTask.swift +18 -0
  212. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedPlaylist.swift +18 -0
  213. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedTrack.swift +18 -0
  214. package/nitrogen/generated/shared/c++/CurrentPlayingType.hpp +84 -0
  215. package/nitrogen/generated/shared/c++/DownloadConfig.hpp +108 -0
  216. package/nitrogen/generated/shared/c++/DownloadError.hpp +89 -0
  217. package/nitrogen/generated/shared/c++/DownloadErrorReason.hpp +96 -0
  218. package/nitrogen/generated/shared/c++/DownloadProgress.hpp +97 -0
  219. package/nitrogen/generated/shared/c++/DownloadQueueStatus.hpp +99 -0
  220. package/nitrogen/generated/shared/c++/DownloadState.hpp +92 -0
  221. package/nitrogen/generated/shared/c++/DownloadStorageInfo.hpp +91 -0
  222. package/nitrogen/generated/shared/c++/DownloadTask.hpp +122 -0
  223. package/nitrogen/generated/shared/c++/DownloadedPlaylist.hpp +101 -0
  224. package/nitrogen/generated/shared/c++/DownloadedTrack.hpp +107 -0
  225. package/nitrogen/generated/shared/c++/EqualizerBand.hpp +87 -0
  226. package/nitrogen/generated/shared/c++/EqualizerPreset.hpp +86 -0
  227. package/nitrogen/generated/shared/c++/EqualizerState.hpp +89 -0
  228. package/nitrogen/generated/shared/c++/GainRange.hpp +79 -0
  229. package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.cpp +55 -0
  230. package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.hpp +134 -0
  231. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.cpp +38 -0
  232. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.hpp +95 -0
  233. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.cpp +4 -0
  234. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.hpp +11 -5
  235. package/nitrogen/generated/shared/c++/PlaybackSource.hpp +80 -0
  236. package/nitrogen/generated/shared/c++/PlayerState.hpp +9 -2
  237. package/nitrogen/generated/shared/c++/PresetType.hpp +76 -0
  238. package/nitrogen/generated/shared/c++/StorageLocation.hpp +76 -0
  239. package/nitrogen/generated/shared/c++/TrackItem.hpp +7 -2
  240. package/nitrogen/generated/shared/c++/TrackPlayerState.hpp +5 -5
  241. package/package.json +1 -1
  242. package/src/hooks/callbackManager.ts +96 -0
  243. package/src/hooks/downloadCallbackManager.ts +149 -0
  244. package/src/hooks/equalizerCallbackManager.ts +138 -0
  245. package/src/hooks/index.ts +25 -0
  246. package/src/hooks/useActualQueue.ts +116 -0
  247. package/src/hooks/useDownloadActions.ts +179 -0
  248. package/src/hooks/useDownloadProgress.ts +126 -0
  249. package/src/hooks/useDownloadStorage.ts +84 -0
  250. package/src/hooks/useDownloadedTracks.ts +138 -0
  251. package/src/hooks/useEqualizer.ts +173 -0
  252. package/src/hooks/useEqualizerPresets.ts +140 -0
  253. package/src/hooks/useNowPlaying.ts +47 -33
  254. package/src/hooks/useOnChangeTrack.ts +81 -13
  255. package/src/hooks/useOnPlaybackStateChange.ts +87 -13
  256. package/src/hooks/usePlaylist.ts +161 -0
  257. package/src/index.ts +12 -0
  258. package/src/specs/DownloadManager.nitro.ts +203 -0
  259. package/src/specs/Equalizer.nitro.ts +69 -0
  260. package/src/specs/TrackPlayer.nitro.ts +6 -2
  261. package/src/types/DownloadTypes.ts +135 -0
  262. package/src/types/EqualizerTypes.ts +72 -0
  263. package/src/types/PlayerQueue.ts +9 -0
@@ -1,7 +1,25 @@
1
1
  export { useOnChangeTrack } from './useOnChangeTrack';
2
+ export type { TrackChangeResult } from './useOnChangeTrack';
2
3
  export { useOnPlaybackStateChange } from './useOnPlaybackStateChange';
4
+ export type { PlaybackStateResult } from './useOnPlaybackStateChange';
3
5
  export { useOnSeek } from './useOnSeek';
4
6
  export { useOnPlaybackProgressChange } from './useOnPlaybackProgressChange';
5
7
  export { useAndroidAutoConnection } from './useAndroidAutoConnection';
6
8
  export { useAudioDevices } from './useAudioDevices';
7
9
  export { useNowPlaying } from './useNowPlaying';
10
+ export { usePlaylist } from './usePlaylist';
11
+ export type { UsePlaylistResult } from './usePlaylist';
12
+ export { useActualQueue } from './useActualQueue';
13
+ export type { UseActualQueueResult } from './useActualQueue';
14
+ export { useDownloadProgress } from './useDownloadProgress';
15
+ export type { UseDownloadProgressOptions, UseDownloadProgressResult, } from './useDownloadProgress';
16
+ export { useDownloadedTracks } from './useDownloadedTracks';
17
+ export type { UseDownloadedTracksResult } from './useDownloadedTracks';
18
+ export { useDownloadActions } from './useDownloadActions';
19
+ export type { UseDownloadActionsResult } from './useDownloadActions';
20
+ export { useDownloadStorage } from './useDownloadStorage';
21
+ export type { UseDownloadStorageResult } from './useDownloadStorage';
22
+ export { useEqualizer } from './useEqualizer';
23
+ export type { UseEqualizerResult } from './useEqualizer';
24
+ export { useEqualizerPresets } from './useEqualizerPresets';
25
+ export type { UseEqualizerPresetsResult } from './useEqualizerPresets';
@@ -5,3 +5,13 @@ export { useOnPlaybackProgressChange } from './useOnPlaybackProgressChange';
5
5
  export { useAndroidAutoConnection } from './useAndroidAutoConnection';
6
6
  export { useAudioDevices } from './useAudioDevices';
7
7
  export { useNowPlaying } from './useNowPlaying';
8
+ export { usePlaylist } from './usePlaylist';
9
+ export { useActualQueue } from './useActualQueue';
10
+ // Download hooks
11
+ export { useDownloadProgress } from './useDownloadProgress';
12
+ export { useDownloadedTracks } from './useDownloadedTracks';
13
+ export { useDownloadActions } from './useDownloadActions';
14
+ export { useDownloadStorage } from './useDownloadStorage';
15
+ // Equalizer hooks
16
+ export { useEqualizer } from './useEqualizer';
17
+ export { useEqualizerPresets } from './useEqualizerPresets';
@@ -0,0 +1,48 @@
1
+ import type { TrackItem } from '../types/PlayerQueue';
2
+ export interface UseActualQueueResult {
3
+ /** The current queue in playback order */
4
+ queue: TrackItem[];
5
+ /** Manually refresh the queue */
6
+ refreshQueue: () => void;
7
+ /** Whether the queue is currently loading */
8
+ isLoading: boolean;
9
+ }
10
+ /**
11
+ * Hook to get the actual playback queue including temporary tracks
12
+ *
13
+ * Returns the complete queue in playback order:
14
+ * [tracks_before_current] + [current] + [playNext_stack] + [upNext_queue] + [remaining_tracks]
15
+ *
16
+ * Auto-updates when:
17
+ * - Track changes
18
+ * - Playback state changes
19
+ *
20
+ * Call `refreshQueue()` after adding tracks via `playNext()` or `addToUpNext()`
21
+ * to immediately see the updated queue.
22
+ *
23
+ * @returns Object containing queue array, refresh function, and loading state
24
+ *
25
+ * @example
26
+ * ```tsx
27
+ * function QueueView() {
28
+ * const { queue, refreshQueue, isLoading } = useActualQueue();
29
+ *
30
+ * const handleAddToUpNext = (trackId: string) => {
31
+ * TrackPlayer.addToUpNext(trackId);
32
+ * // Refresh queue after adding track
33
+ * setTimeout(refreshQueue, 100);
34
+ * };
35
+ *
36
+ * return (
37
+ * <ScrollView>
38
+ * {queue.map((track, index) => (
39
+ * <Text key={track.id}>
40
+ * {index + 1}. {track.title}
41
+ * </Text>
42
+ * ))}
43
+ * </ScrollView>
44
+ * );
45
+ * }
46
+ * ```
47
+ */
48
+ export declare function useActualQueue(): UseActualQueueResult;
@@ -0,0 +1,98 @@
1
+ import { useEffect, useState, useRef, useCallback } from 'react';
2
+ import { TrackPlayer } from '../index';
3
+ import { callbackManager } from './callbackManager';
4
+ /**
5
+ * Hook to get the actual playback queue including temporary tracks
6
+ *
7
+ * Returns the complete queue in playback order:
8
+ * [tracks_before_current] + [current] + [playNext_stack] + [upNext_queue] + [remaining_tracks]
9
+ *
10
+ * Auto-updates when:
11
+ * - Track changes
12
+ * - Playback state changes
13
+ *
14
+ * Call `refreshQueue()` after adding tracks via `playNext()` or `addToUpNext()`
15
+ * to immediately see the updated queue.
16
+ *
17
+ * @returns Object containing queue array, refresh function, and loading state
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * function QueueView() {
22
+ * const { queue, refreshQueue, isLoading } = useActualQueue();
23
+ *
24
+ * const handleAddToUpNext = (trackId: string) => {
25
+ * TrackPlayer.addToUpNext(trackId);
26
+ * // Refresh queue after adding track
27
+ * setTimeout(refreshQueue, 100);
28
+ * };
29
+ *
30
+ * return (
31
+ * <ScrollView>
32
+ * {queue.map((track, index) => (
33
+ * <Text key={track.id}>
34
+ * {index + 1}. {track.title}
35
+ * </Text>
36
+ * ))}
37
+ * </ScrollView>
38
+ * );
39
+ * }
40
+ * ```
41
+ */
42
+ export function useActualQueue() {
43
+ const [queue, setQueue] = useState([]);
44
+ const [isLoading, setIsLoading] = useState(true);
45
+ const isMounted = useRef(true);
46
+ const updateQueue = useCallback(async () => {
47
+ if (!isMounted.current)
48
+ return;
49
+ try {
50
+ const actualQueue = await TrackPlayer.getActualQueue();
51
+ if (isMounted.current) {
52
+ setQueue(actualQueue);
53
+ setIsLoading(false);
54
+ }
55
+ }
56
+ catch (error) {
57
+ console.error('[useActualQueue] Error getting queue:', error);
58
+ if (isMounted.current) {
59
+ setQueue([]);
60
+ setIsLoading(false);
61
+ }
62
+ }
63
+ }, []);
64
+ const refreshQueue = useCallback(() => {
65
+ if (!isMounted.current)
66
+ return;
67
+ setIsLoading(true);
68
+ updateQueue();
69
+ }, [updateQueue]);
70
+ // Initialize queue
71
+ useEffect(() => {
72
+ isMounted.current = true;
73
+ updateQueue();
74
+ return () => {
75
+ isMounted.current = false;
76
+ };
77
+ }, [updateQueue]);
78
+ // Update queue on track changes (with slight delay to ensure native side has updated)
79
+ useEffect(() => {
80
+ const unsubscribe = callbackManager.subscribeToTrackChange(() => {
81
+ // Small delay to ensure native queue is updated
82
+ setTimeout(updateQueue, 50);
83
+ });
84
+ return () => {
85
+ unsubscribe();
86
+ };
87
+ }, [updateQueue]);
88
+ // Update queue on playback state changes
89
+ useEffect(() => {
90
+ const unsubscribe = callbackManager.subscribeToPlaybackState(() => {
91
+ updateQueue();
92
+ });
93
+ return () => {
94
+ unsubscribe();
95
+ };
96
+ }, [updateQueue]);
97
+ return { queue, refreshQueue, isLoading };
98
+ }
@@ -0,0 +1,26 @@
1
+ import type { DownloadConfig, PlaybackSource } from '../types/DownloadTypes';
2
+ import type { TrackItem } from '../types/PlayerQueue';
3
+ export interface UseDownloadActionsResult {
4
+ downloadTrack: (track: TrackItem, playlistId?: string) => Promise<string>;
5
+ downloadPlaylist: (playlistId: string, tracks: TrackItem[]) => Promise<string[]>;
6
+ pauseDownload: (downloadId: string) => Promise<void>;
7
+ resumeDownload: (downloadId: string) => Promise<void>;
8
+ cancelDownload: (downloadId: string) => Promise<void>;
9
+ retryDownload: (downloadId: string) => Promise<void>;
10
+ pauseAll: () => Promise<void>;
11
+ resumeAll: () => Promise<void>;
12
+ cancelAll: () => Promise<void>;
13
+ deleteTrack: (trackId: string) => Promise<void>;
14
+ deletePlaylist: (playlistId: string) => Promise<void>;
15
+ deleteAll: () => Promise<void>;
16
+ configure: (config: DownloadConfig) => void;
17
+ setPlaybackSourcePreference: (preference: PlaybackSource) => void;
18
+ getPlaybackSourcePreference: () => PlaybackSource;
19
+ isDownloading: boolean;
20
+ isDeleting: boolean;
21
+ error: Error | null;
22
+ }
23
+ /**
24
+ * Hook for download actions (download, pause, resume, cancel, delete)
25
+ */
26
+ export declare function useDownloadActions(): UseDownloadActionsResult;
@@ -0,0 +1,117 @@
1
+ import { useCallback, useState } from 'react';
2
+ import { DownloadManager } from '../index';
3
+ /**
4
+ * Hook for download actions (download, pause, resume, cancel, delete)
5
+ */
6
+ export function useDownloadActions() {
7
+ const [isDownloading, setIsDownloading] = useState(false);
8
+ const [isDeleting, setIsDeleting] = useState(false);
9
+ const [error, setError] = useState(null);
10
+ const downloadTrack = useCallback(async (track, playlistId) => {
11
+ setIsDownloading(true);
12
+ setError(null);
13
+ try {
14
+ const downloadId = await DownloadManager.downloadTrack(track, playlistId);
15
+ return downloadId;
16
+ }
17
+ catch (e) {
18
+ setError(e);
19
+ throw e;
20
+ }
21
+ finally {
22
+ setIsDownloading(false);
23
+ }
24
+ }, []);
25
+ const downloadPlaylist = useCallback(async (playlistId, tracks) => {
26
+ setIsDownloading(true);
27
+ setError(null);
28
+ try {
29
+ const downloadIds = await DownloadManager.downloadPlaylist(playlistId, tracks);
30
+ return downloadIds;
31
+ }
32
+ catch (e) {
33
+ setError(e);
34
+ throw e;
35
+ }
36
+ finally {
37
+ setIsDownloading(false);
38
+ }
39
+ }, []);
40
+ const pauseDownload = useCallback(async (downloadId) => {
41
+ await DownloadManager.pauseDownload(downloadId);
42
+ }, []);
43
+ const resumeDownload = useCallback(async (downloadId) => {
44
+ await DownloadManager.resumeDownload(downloadId);
45
+ }, []);
46
+ const cancelDownload = useCallback(async (downloadId) => {
47
+ await DownloadManager.cancelDownload(downloadId);
48
+ }, []);
49
+ const retryDownload = useCallback(async (downloadId) => {
50
+ await DownloadManager.retryDownload(downloadId);
51
+ }, []);
52
+ const pauseAll = useCallback(async () => {
53
+ await DownloadManager.pauseAllDownloads();
54
+ }, []);
55
+ const resumeAll = useCallback(async () => {
56
+ await DownloadManager.resumeAllDownloads();
57
+ }, []);
58
+ const cancelAll = useCallback(async () => {
59
+ await DownloadManager.cancelAllDownloads();
60
+ }, []);
61
+ const deleteTrack = useCallback(async (trackId) => {
62
+ setIsDeleting(true);
63
+ try {
64
+ await DownloadManager.deleteDownloadedTrack(trackId);
65
+ }
66
+ finally {
67
+ setIsDeleting(false);
68
+ }
69
+ }, []);
70
+ const deletePlaylist = useCallback(async (playlistId) => {
71
+ setIsDeleting(true);
72
+ try {
73
+ await DownloadManager.deleteDownloadedPlaylist(playlistId);
74
+ }
75
+ finally {
76
+ setIsDeleting(false);
77
+ }
78
+ }, []);
79
+ const deleteAll = useCallback(async () => {
80
+ setIsDeleting(true);
81
+ try {
82
+ await DownloadManager.deleteAllDownloads();
83
+ }
84
+ finally {
85
+ setIsDeleting(false);
86
+ }
87
+ }, []);
88
+ const configure = useCallback((config) => {
89
+ DownloadManager.configure(config);
90
+ }, []);
91
+ const setPlaybackSourcePreference = useCallback((preference) => {
92
+ DownloadManager.setPlaybackSourcePreference(preference);
93
+ }, []);
94
+ const getPlaybackSourcePreference = useCallback(() => {
95
+ return DownloadManager.getPlaybackSourcePreference();
96
+ }, []);
97
+ return {
98
+ downloadTrack,
99
+ downloadPlaylist,
100
+ pauseDownload,
101
+ resumeDownload,
102
+ cancelDownload,
103
+ retryDownload,
104
+ pauseAll,
105
+ resumeAll,
106
+ cancelAll,
107
+ deleteTrack,
108
+ deletePlaylist,
109
+ deleteAll,
110
+ configure,
111
+ setPlaybackSourcePreference,
112
+ getPlaybackSourcePreference,
113
+ isDownloading,
114
+ isDeleting,
115
+ error,
116
+ };
117
+ }
@@ -0,0 +1,25 @@
1
+ import type { DownloadProgress } from '../types/DownloadTypes';
2
+ export interface UseDownloadProgressOptions {
3
+ /** Track specific track ID(s) */
4
+ trackIds?: string[];
5
+ /** Track specific download ID(s) */
6
+ downloadIds?: string[];
7
+ /** Only track active downloads */
8
+ activeOnly?: boolean;
9
+ }
10
+ export interface UseDownloadProgressResult {
11
+ /** Map of trackId to DownloadProgress */
12
+ progressMap: Map<string, DownloadProgress>;
13
+ /** Array of all tracked progress */
14
+ progressList: DownloadProgress[];
15
+ /** Overall progress for tracked downloads (0-1) */
16
+ overallProgress: number;
17
+ /** Whether any download is in progress */
18
+ isDownloading: boolean;
19
+ /** Get progress for a specific track */
20
+ getProgress: (trackId: string) => DownloadProgress | undefined;
21
+ }
22
+ /**
23
+ * Hook for tracking download progress
24
+ */
25
+ export declare function useDownloadProgress(options?: UseDownloadProgressOptions): UseDownloadProgressResult;
@@ -0,0 +1,79 @@
1
+ import { useEffect, useState, useRef, useCallback } from 'react';
2
+ import { DownloadManager } from '../index';
3
+ import { downloadCallbackManager } from './downloadCallbackManager';
4
+ /**
5
+ * Hook for tracking download progress
6
+ */
7
+ export function useDownloadProgress(options = {}) {
8
+ const { trackIds, downloadIds, activeOnly = false } = options;
9
+ const [progressMap, setProgressMap] = useState(new Map());
10
+ const isMounted = useRef(true);
11
+ const shouldTrack = useCallback((progress) => {
12
+ if (trackIds &&
13
+ trackIds.length > 0 &&
14
+ !trackIds.includes(progress.trackId)) {
15
+ return false;
16
+ }
17
+ if (downloadIds &&
18
+ downloadIds.length > 0 &&
19
+ !downloadIds.includes(progress.downloadId)) {
20
+ return false;
21
+ }
22
+ if (activeOnly && progress.state !== 'downloading') {
23
+ return false;
24
+ }
25
+ return true;
26
+ }, [trackIds, downloadIds, activeOnly]);
27
+ useEffect(() => {
28
+ isMounted.current = true;
29
+ // Initialize with current active downloads
30
+ try {
31
+ const activeDownloads = DownloadManager.getActiveDownloads();
32
+ const initialMap = new Map();
33
+ activeDownloads.forEach((task) => {
34
+ if (shouldTrack(task.progress)) {
35
+ initialMap.set(task.trackId, task.progress);
36
+ }
37
+ });
38
+ setProgressMap(initialMap);
39
+ }
40
+ catch (error) {
41
+ console.error('[useDownloadProgress] Error initializing:', error);
42
+ }
43
+ const unsubscribe = downloadCallbackManager.subscribeToProgress((progress) => {
44
+ if (!isMounted.current)
45
+ return;
46
+ if (!shouldTrack(progress))
47
+ return;
48
+ setProgressMap((prev) => {
49
+ const next = new Map(prev);
50
+ if (progress.state === 'completed' ||
51
+ progress.state === 'cancelled') {
52
+ next.delete(progress.trackId);
53
+ }
54
+ else {
55
+ next.set(progress.trackId, progress);
56
+ }
57
+ return next;
58
+ });
59
+ });
60
+ return () => {
61
+ isMounted.current = false;
62
+ unsubscribe();
63
+ };
64
+ }, [shouldTrack]);
65
+ const progressList = Array.from(progressMap.values());
66
+ const overallProgress = progressList.length > 0
67
+ ? progressList.reduce((sum, p) => sum + p.progress, 0) /
68
+ progressList.length
69
+ : 0;
70
+ const isDownloading = progressList.some((p) => p.state === 'downloading');
71
+ const getProgress = useCallback((trackId) => progressMap.get(trackId), [progressMap]);
72
+ return {
73
+ progressMap,
74
+ progressList,
75
+ overallProgress,
76
+ isDownloading,
77
+ getProgress,
78
+ };
79
+ }
@@ -0,0 +1,19 @@
1
+ import type { DownloadStorageInfo } from '../types/DownloadTypes';
2
+ export interface UseDownloadStorageResult {
3
+ /** Storage information */
4
+ storageInfo: DownloadStorageInfo | null;
5
+ /** Loading state */
6
+ isLoading: boolean;
7
+ /** Refresh storage info */
8
+ refresh: () => Promise<void>;
9
+ /** Formatted total downloaded size (e.g., "2.5 GB") */
10
+ formattedSize: string;
11
+ /** Formatted available space (e.g., "10.2 GB") */
12
+ formattedAvailable: string;
13
+ /** Usage percentage (0-100) */
14
+ usagePercentage: number;
15
+ }
16
+ /**
17
+ * Hook for accessing download storage information
18
+ */
19
+ export declare function useDownloadStorage(): UseDownloadStorageResult;
@@ -0,0 +1,60 @@
1
+ import { useEffect, useState, useRef, useCallback } from 'react';
2
+ import { DownloadManager } from '../index';
3
+ /**
4
+ * Formats bytes into a human-readable string
5
+ */
6
+ function formatBytes(bytes) {
7
+ if (bytes === 0)
8
+ return '0 B';
9
+ const k = 1024;
10
+ const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
11
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
12
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
13
+ }
14
+ /**
15
+ * Hook for accessing download storage information
16
+ */
17
+ export function useDownloadStorage() {
18
+ const [storageInfo, setStorageInfo] = useState(null);
19
+ const [isLoading, setIsLoading] = useState(true);
20
+ const isMounted = useRef(true);
21
+ const refresh = useCallback(async () => {
22
+ try {
23
+ const info = await DownloadManager.getStorageInfo();
24
+ if (isMounted.current) {
25
+ setStorageInfo(info);
26
+ setIsLoading(false);
27
+ }
28
+ }
29
+ catch (error) {
30
+ console.error('[useDownloadStorage] Error:', error);
31
+ if (isMounted.current) {
32
+ setIsLoading(false);
33
+ }
34
+ }
35
+ }, []);
36
+ useEffect(() => {
37
+ isMounted.current = true;
38
+ refresh();
39
+ return () => {
40
+ isMounted.current = false;
41
+ };
42
+ }, [refresh]);
43
+ const formattedSize = storageInfo
44
+ ? formatBytes(storageInfo.totalDownloadedSize)
45
+ : '0 B';
46
+ const formattedAvailable = storageInfo
47
+ ? formatBytes(storageInfo.availableSpace)
48
+ : '0 B';
49
+ const usagePercentage = storageInfo
50
+ ? (storageInfo.totalDownloadedSize / storageInfo.totalSpace) * 100
51
+ : 0;
52
+ return {
53
+ storageInfo,
54
+ isLoading,
55
+ refresh,
56
+ formattedSize,
57
+ formattedAvailable,
58
+ usagePercentage,
59
+ };
60
+ }
@@ -0,0 +1,25 @@
1
+ import type { DownloadedTrack, DownloadedPlaylist } from '../types/DownloadTypes';
2
+ export interface UseDownloadedTracksResult {
3
+ /** All downloaded tracks */
4
+ downloadedTracks: DownloadedTrack[];
5
+ /** All downloaded playlists */
6
+ downloadedPlaylists: DownloadedPlaylist[];
7
+ /** Check if a track is downloaded */
8
+ isTrackDownloaded: (trackId: string) => boolean;
9
+ /** Check if a playlist is fully downloaded */
10
+ isPlaylistDownloaded: (playlistId: string) => boolean;
11
+ /** Check if a playlist is partially downloaded */
12
+ isPlaylistPartiallyDownloaded: (playlistId: string) => boolean;
13
+ /** Get downloaded track info */
14
+ getDownloadedTrack: (trackId: string) => DownloadedTrack | undefined;
15
+ /** Get downloaded playlist info */
16
+ getDownloadedPlaylist: (playlistId: string) => DownloadedPlaylist | undefined;
17
+ /** Refresh downloaded content list */
18
+ refresh: () => void;
19
+ /** Loading state */
20
+ isLoading: boolean;
21
+ }
22
+ /**
23
+ * Hook for accessing downloaded tracks and playlists
24
+ */
25
+ export declare function useDownloadedTracks(): UseDownloadedTracksResult;
@@ -0,0 +1,69 @@
1
+ import { useEffect, useState, useRef, useCallback, useMemo } from 'react';
2
+ import { DownloadManager } from '../index';
3
+ import { downloadCallbackManager } from './downloadCallbackManager';
4
+ /**
5
+ * Hook for accessing downloaded tracks and playlists
6
+ */
7
+ export function useDownloadedTracks() {
8
+ const [downloadedTracks, setDownloadedTracks] = useState([]);
9
+ const [downloadedPlaylists, setDownloadedPlaylists] = useState([]);
10
+ const [isLoading, setIsLoading] = useState(true);
11
+ const isMounted = useRef(true);
12
+ const refresh = useCallback(() => {
13
+ if (!isMounted.current)
14
+ return;
15
+ try {
16
+ const tracks = DownloadManager.getAllDownloadedTracks();
17
+ const playlists = DownloadManager.getAllDownloadedPlaylists();
18
+ if (isMounted.current) {
19
+ setDownloadedTracks(tracks);
20
+ setDownloadedPlaylists(playlists);
21
+ setIsLoading(false);
22
+ }
23
+ }
24
+ catch (error) {
25
+ console.error('[useDownloadedTracks] Error refreshing:', error);
26
+ if (isMounted.current) {
27
+ setIsLoading(false);
28
+ }
29
+ }
30
+ }, []);
31
+ useEffect(() => {
32
+ isMounted.current = true;
33
+ refresh();
34
+ const unsubscribeComplete = downloadCallbackManager.subscribeToComplete(() => {
35
+ refresh();
36
+ });
37
+ const unsubscribeStateChange = downloadCallbackManager.subscribeToStateChange((_downloadId, _trackId, state) => {
38
+ if (state === 'completed') {
39
+ refresh();
40
+ }
41
+ });
42
+ return () => {
43
+ isMounted.current = false;
44
+ unsubscribeComplete();
45
+ unsubscribeStateChange();
46
+ };
47
+ }, [refresh]);
48
+ const trackMap = useMemo(() => new Map(downloadedTracks.map((t) => [t.trackId, t])), [downloadedTracks]);
49
+ const playlistMap = useMemo(() => new Map(downloadedPlaylists.map((p) => [p.playlistId, p])), [downloadedPlaylists]);
50
+ const isTrackDownloaded = useCallback((trackId) => trackMap.has(trackId), [trackMap]);
51
+ const isPlaylistDownloaded = useCallback((playlistId) => {
52
+ const p = playlistMap.get(playlistId);
53
+ return p ? p.isComplete : false;
54
+ }, [playlistMap]);
55
+ const isPlaylistPartiallyDownloaded = useCallback((playlistId) => playlistMap.has(playlistId), [playlistMap]);
56
+ const getDownloadedTrack = useCallback((trackId) => trackMap.get(trackId), [trackMap]);
57
+ const getDownloadedPlaylist = useCallback((playlistId) => playlistMap.get(playlistId), [playlistMap]);
58
+ return {
59
+ downloadedTracks,
60
+ downloadedPlaylists,
61
+ isTrackDownloaded,
62
+ isPlaylistDownloaded,
63
+ isPlaylistPartiallyDownloaded,
64
+ getDownloadedTrack,
65
+ getDownloadedPlaylist,
66
+ refresh,
67
+ isLoading,
68
+ };
69
+ }
@@ -0,0 +1,25 @@
1
+ import type { EqualizerBand } from '../types/EqualizerTypes';
2
+ export interface UseEqualizerResult {
3
+ /** Whether the equalizer is enabled */
4
+ isEnabled: boolean;
5
+ /** Current band settings */
6
+ bands: EqualizerBand[];
7
+ /** Currently applied preset name */
8
+ currentPreset: string | null;
9
+ /** Toggle equalizer on/off */
10
+ setEnabled: (enabled: boolean) => boolean;
11
+ /** Set gain for a specific band */
12
+ setBandGain: (bandIndex: number, gainDb: number) => boolean;
13
+ /** Set all band gains at once */
14
+ setAllBandGains: (gains: number[]) => boolean;
15
+ /** Reset to flat response */
16
+ reset: () => void;
17
+ /** Whether equalizer is loading */
18
+ isLoading: boolean;
19
+ /** Gain range (min/max in dB) */
20
+ gainRange: {
21
+ min: number;
22
+ max: number;
23
+ };
24
+ }
25
+ export declare function useEqualizer(): UseEqualizerResult;