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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/README.md +444 -4
  2. package/android/build.gradle +4 -1
  3. package/android/src/main/AndroidManifest.xml +16 -1
  4. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAndroidAutoMediaLibrary.kt +2 -0
  5. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAudioDevices.kt +8 -0
  6. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridDownloadManager.kt +225 -0
  7. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridEqualizer.kt +105 -0
  8. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridPlayerQueue.kt +6 -6
  9. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridTrackPlayer.kt +37 -12
  10. package/android/src/main/java/com/margelo/nitro/nitroplayer/core/TrackPlayerCore.kt +970 -213
  11. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadDatabase.kt +475 -0
  12. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadFileManager.kt +159 -0
  13. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadManagerCore.kt +489 -0
  14. package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadWorker.kt +209 -0
  15. package/android/src/main/java/com/margelo/nitro/nitroplayer/equalizer/EqualizerCore.kt +486 -0
  16. package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaBrowserService.kt +3 -1
  17. package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaSessionManager.kt +14 -6
  18. package/android/src/main/java/com/margelo/nitro/nitroplayer/playlist/PlaylistManager.kt +27 -0
  19. package/ios/HybridDownloadManager.swift +226 -0
  20. package/ios/HybridEqualizer.swift +111 -0
  21. package/ios/HybridTrackPlayer.swift +36 -8
  22. package/ios/core/TrackPlayerCore.swift +998 -276
  23. package/ios/download/DownloadDatabase.swift +493 -0
  24. package/ios/download/DownloadFileManager.swift +241 -0
  25. package/ios/download/DownloadManagerCore.swift +923 -0
  26. package/ios/equalizer/EqualizerCore.swift +685 -0
  27. package/ios/media/MediaSessionManager.swift +40 -28
  28. package/ios/playlist/PlaylistManager.swift +40 -9
  29. package/ios/queue/HybridPlayerQueue.swift +33 -13
  30. package/lib/hooks/downloadCallbackManager.d.ts +36 -0
  31. package/lib/hooks/downloadCallbackManager.js +108 -0
  32. package/lib/hooks/equalizerCallbackManager.d.ts +37 -0
  33. package/lib/hooks/equalizerCallbackManager.js +109 -0
  34. package/lib/hooks/index.d.ts +16 -0
  35. package/lib/hooks/index.js +10 -0
  36. package/lib/hooks/useActualQueue.d.ts +48 -0
  37. package/lib/hooks/useActualQueue.js +98 -0
  38. package/lib/hooks/useDownloadActions.d.ts +26 -0
  39. package/lib/hooks/useDownloadActions.js +117 -0
  40. package/lib/hooks/useDownloadProgress.d.ts +25 -0
  41. package/lib/hooks/useDownloadProgress.js +79 -0
  42. package/lib/hooks/useDownloadStorage.d.ts +19 -0
  43. package/lib/hooks/useDownloadStorage.js +60 -0
  44. package/lib/hooks/useDownloadedTracks.d.ts +25 -0
  45. package/lib/hooks/useDownloadedTracks.js +69 -0
  46. package/lib/hooks/useEqualizer.d.ts +25 -0
  47. package/lib/hooks/useEqualizer.js +124 -0
  48. package/lib/hooks/useEqualizerPresets.d.ts +22 -0
  49. package/lib/hooks/useEqualizerPresets.js +96 -0
  50. package/lib/hooks/useNowPlaying.js +3 -2
  51. package/lib/hooks/useOnChangeTrack.js +15 -12
  52. package/lib/hooks/useOnPlaybackStateChange.js +16 -13
  53. package/lib/hooks/usePlaylist.d.ts +48 -0
  54. package/lib/hooks/usePlaylist.js +136 -0
  55. package/lib/index.d.ts +6 -0
  56. package/lib/index.js +6 -0
  57. package/lib/specs/DownloadManager.nitro.d.ts +152 -0
  58. package/lib/specs/DownloadManager.nitro.js +1 -0
  59. package/lib/specs/Equalizer.nitro.d.ts +43 -0
  60. package/lib/specs/Equalizer.nitro.js +1 -0
  61. package/lib/specs/TrackPlayer.nitro.d.ts +6 -2
  62. package/lib/types/DownloadTypes.d.ts +110 -0
  63. package/lib/types/DownloadTypes.js +1 -0
  64. package/lib/types/EqualizerTypes.d.ts +52 -0
  65. package/lib/types/EqualizerTypes.js +1 -0
  66. package/lib/types/PlayerQueue.d.ts +4 -0
  67. package/nitro.json +8 -0
  68. package/nitrogen/generated/android/NitroPlayer+autolinking.cmake +10 -1
  69. package/nitrogen/generated/android/NitroPlayerOnLoad.cpp +32 -2
  70. package/nitrogen/generated/android/c++/JCurrentPlayingType.hpp +65 -0
  71. package/nitrogen/generated/android/c++/JDownloadConfig.hpp +92 -0
  72. package/nitrogen/generated/android/c++/JDownloadError.hpp +71 -0
  73. package/nitrogen/generated/android/c++/JDownloadErrorReason.hpp +74 -0
  74. package/nitrogen/generated/android/c++/JDownloadProgress.hpp +79 -0
  75. package/nitrogen/generated/android/c++/JDownloadQueueStatus.hpp +81 -0
  76. package/nitrogen/generated/android/c++/JDownloadState.hpp +71 -0
  77. package/nitrogen/generated/android/c++/JDownloadStorageInfo.hpp +73 -0
  78. package/nitrogen/generated/android/c++/JDownloadTask.hpp +108 -0
  79. package/nitrogen/generated/android/c++/JDownloadedPlaylist.hpp +111 -0
  80. package/nitrogen/generated/android/c++/JDownloadedTrack.hpp +92 -0
  81. package/nitrogen/generated/android/c++/JEqualizerBand.hpp +69 -0
  82. package/nitrogen/generated/android/c++/JEqualizerPreset.hpp +78 -0
  83. package/nitrogen/generated/android/c++/JEqualizerState.hpp +91 -0
  84. package/nitrogen/generated/android/c++/JFunc_void_DownloadProgress.hpp +80 -0
  85. package/nitrogen/generated/android/c++/JFunc_void_DownloadedTrack.hpp +89 -0
  86. package/nitrogen/generated/android/c++/JFunc_void_TrackItem_std__optional_Reason_.hpp +2 -0
  87. package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__std__string__.hpp +81 -0
  88. package/nitrogen/generated/android/c++/JFunc_void_std__string_Playlist_std__optional_QueueOperation_.hpp +2 -0
  89. package/nitrogen/generated/android/c++/JFunc_void_std__string_std__string_DownloadState_std__optional_DownloadError_.hpp +83 -0
  90. package/nitrogen/generated/android/c++/JFunc_void_std__vector_EqualizerBand_.hpp +97 -0
  91. package/nitrogen/generated/android/c++/JFunc_void_std__vector_Playlist__std__optional_QueueOperation_.hpp +2 -0
  92. package/nitrogen/generated/android/c++/JGainRange.hpp +61 -0
  93. package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.cpp +470 -0
  94. package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.hpp +99 -0
  95. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.cpp +204 -0
  96. package/nitrogen/generated/android/c++/JHybridEqualizerSpec.hpp +82 -0
  97. package/nitrogen/generated/android/c++/JHybridPlayerQueueSpec.cpp +2 -0
  98. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.cpp +117 -15
  99. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.hpp +6 -2
  100. package/nitrogen/generated/android/c++/JPlaybackSource.hpp +62 -0
  101. package/nitrogen/generated/android/c++/JPlayerState.hpp +11 -3
  102. package/nitrogen/generated/android/c++/JPlaylist.hpp +2 -0
  103. package/nitrogen/generated/android/c++/JPresetType.hpp +59 -0
  104. package/nitrogen/generated/android/c++/JStorageLocation.hpp +59 -0
  105. package/nitrogen/generated/android/c++/JTrackItem.hpp +9 -3
  106. package/nitrogen/generated/android/c++/JTrackPlayerState.hpp +3 -3
  107. package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
  108. package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
  109. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.cpp +26 -0
  110. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.hpp +74 -0
  111. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.cpp +26 -0
  112. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.hpp +84 -0
  113. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.cpp +26 -0
  114. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.hpp +85 -0
  115. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.cpp +26 -0
  116. package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.hpp +80 -0
  117. package/nitrogen/generated/android/c++/JVariant_NullType_Playlist.hpp +2 -0
  118. package/nitrogen/generated/android/c++/JVariant_NullType_TrackItem.hpp +2 -0
  119. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/CurrentPlayingType.kt +23 -0
  120. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadConfig.kt +59 -0
  121. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadError.kt +47 -0
  122. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadErrorReason.kt +26 -0
  123. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadProgress.kt +53 -0
  124. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadQueueStatus.kt +56 -0
  125. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadState.kt +25 -0
  126. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadStorageInfo.kt +50 -0
  127. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadTask.kt +65 -0
  128. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedPlaylist.kt +53 -0
  129. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedTrack.kt +56 -0
  130. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerBand.kt +47 -0
  131. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerPreset.kt +44 -0
  132. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerState.kt +44 -0
  133. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadProgress.kt +80 -0
  134. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadedTrack.kt +80 -0
  135. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__optional_std__variant_nitro__NullType__std__string__.kt +80 -0
  136. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.kt +80 -0
  137. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__vector_EqualizerBand_.kt +80 -0
  138. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/GainRange.kt +41 -0
  139. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridDownloadManagerSpec.kt +210 -0
  140. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridEqualizerSpec.kt +141 -0
  141. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridTrackPlayerSpec.kt +19 -2
  142. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlaybackSource.kt +22 -0
  143. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlayerState.kt +6 -3
  144. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PresetType.kt +21 -0
  145. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/StorageLocation.kt +21 -0
  146. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackItem.kt +7 -3
  147. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackPlayerState.kt +2 -2
  148. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_Double.kt +59 -0
  149. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadError.kt +59 -0
  150. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadTask.kt +59 -0
  151. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedPlaylist.kt +59 -0
  152. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedTrack.kt +59 -0
  153. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.cpp +138 -8
  154. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.hpp +1046 -121
  155. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Umbrella.hpp +66 -0
  156. package/nitrogen/generated/ios/NitroPlayerAutolinking.mm +16 -0
  157. package/nitrogen/generated/ios/NitroPlayerAutolinking.swift +30 -0
  158. package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.cpp +11 -0
  159. package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.hpp +386 -0
  160. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.cpp +11 -0
  161. package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.hpp +223 -0
  162. package/nitrogen/generated/ios/c++/HybridPlayerQueueSpecSwift.hpp +1 -0
  163. package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.hpp +46 -6
  164. package/nitrogen/generated/ios/swift/CurrentPlayingType.swift +48 -0
  165. package/nitrogen/generated/ios/swift/DownloadConfig.swift +270 -0
  166. package/nitrogen/generated/ios/swift/DownloadError.swift +69 -0
  167. package/nitrogen/generated/ios/swift/DownloadErrorReason.swift +60 -0
  168. package/nitrogen/generated/ios/swift/DownloadProgress.swift +91 -0
  169. package/nitrogen/generated/ios/swift/DownloadQueueStatus.swift +102 -0
  170. package/nitrogen/generated/ios/swift/DownloadState.swift +56 -0
  171. package/nitrogen/generated/ios/swift/DownloadStorageInfo.swift +80 -0
  172. package/nitrogen/generated/ios/swift/DownloadTask.swift +315 -0
  173. package/nitrogen/generated/ios/swift/DownloadedPlaylist.swift +103 -0
  174. package/nitrogen/generated/ios/swift/DownloadedTrack.swift +147 -0
  175. package/nitrogen/generated/ios/swift/EqualizerBand.swift +69 -0
  176. package/nitrogen/generated/ios/swift/EqualizerPreset.swift +70 -0
  177. package/nitrogen/generated/ios/swift/EqualizerState.swift +115 -0
  178. package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
  179. package/nitrogen/generated/ios/swift/Func_void_DownloadProgress.swift +47 -0
  180. package/nitrogen/generated/ios/swift/Func_void_DownloadStorageInfo.swift +47 -0
  181. package/nitrogen/generated/ios/swift/Func_void_DownloadedTrack.swift +47 -0
  182. package/nitrogen/generated/ios/swift/Func_void_PlayerState.swift +47 -0
  183. package/nitrogen/generated/ios/swift/Func_void_bool.swift +5 -5
  184. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
  185. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__std__string__.swift +66 -0
  186. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  187. package/nitrogen/generated/ios/swift/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.swift +47 -0
  188. package/nitrogen/generated/ios/swift/Func_void_std__vector_EqualizerBand_.swift +47 -0
  189. package/nitrogen/generated/ios/swift/Func_void_std__vector_TrackItem_.swift +47 -0
  190. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +47 -0
  191. package/nitrogen/generated/ios/swift/GainRange.swift +47 -0
  192. package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec.swift +90 -0
  193. package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec_cxx.swift +705 -0
  194. package/nitrogen/generated/ios/swift/HybridEqualizerSpec.swift +73 -0
  195. package/nitrogen/generated/ios/swift/HybridEqualizerSpec_cxx.swift +396 -0
  196. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec.swift +6 -2
  197. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec_cxx.swift +105 -8
  198. package/nitrogen/generated/ios/swift/PlaybackSource.swift +44 -0
  199. package/nitrogen/generated/ios/swift/PlayerState.swift +13 -2
  200. package/nitrogen/generated/ios/swift/PresetType.swift +40 -0
  201. package/nitrogen/generated/ios/swift/StorageLocation.swift +40 -0
  202. package/nitrogen/generated/ios/swift/TrackItem.swift +31 -1
  203. package/nitrogen/generated/ios/swift/TrackPlayerState.swift +4 -4
  204. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +18 -0
  205. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadError.swift +18 -0
  206. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadTask.swift +18 -0
  207. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedPlaylist.swift +18 -0
  208. package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedTrack.swift +18 -0
  209. package/nitrogen/generated/shared/c++/CurrentPlayingType.hpp +84 -0
  210. package/nitrogen/generated/shared/c++/DownloadConfig.hpp +108 -0
  211. package/nitrogen/generated/shared/c++/DownloadError.hpp +89 -0
  212. package/nitrogen/generated/shared/c++/DownloadErrorReason.hpp +96 -0
  213. package/nitrogen/generated/shared/c++/DownloadProgress.hpp +97 -0
  214. package/nitrogen/generated/shared/c++/DownloadQueueStatus.hpp +99 -0
  215. package/nitrogen/generated/shared/c++/DownloadState.hpp +92 -0
  216. package/nitrogen/generated/shared/c++/DownloadStorageInfo.hpp +91 -0
  217. package/nitrogen/generated/shared/c++/DownloadTask.hpp +122 -0
  218. package/nitrogen/generated/shared/c++/DownloadedPlaylist.hpp +101 -0
  219. package/nitrogen/generated/shared/c++/DownloadedTrack.hpp +107 -0
  220. package/nitrogen/generated/shared/c++/EqualizerBand.hpp +87 -0
  221. package/nitrogen/generated/shared/c++/EqualizerPreset.hpp +86 -0
  222. package/nitrogen/generated/shared/c++/EqualizerState.hpp +89 -0
  223. package/nitrogen/generated/shared/c++/GainRange.hpp +79 -0
  224. package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.cpp +55 -0
  225. package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.hpp +134 -0
  226. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.cpp +38 -0
  227. package/nitrogen/generated/shared/c++/HybridEqualizerSpec.hpp +95 -0
  228. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.cpp +4 -0
  229. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.hpp +11 -5
  230. package/nitrogen/generated/shared/c++/PlaybackSource.hpp +80 -0
  231. package/nitrogen/generated/shared/c++/PlayerState.hpp +9 -2
  232. package/nitrogen/generated/shared/c++/PresetType.hpp +76 -0
  233. package/nitrogen/generated/shared/c++/StorageLocation.hpp +76 -0
  234. package/nitrogen/generated/shared/c++/TrackItem.hpp +7 -2
  235. package/nitrogen/generated/shared/c++/TrackPlayerState.hpp +5 -5
  236. package/package.json +1 -1
  237. package/src/hooks/downloadCallbackManager.ts +149 -0
  238. package/src/hooks/equalizerCallbackManager.ts +138 -0
  239. package/src/hooks/index.ts +23 -0
  240. package/src/hooks/useActualQueue.ts +116 -0
  241. package/src/hooks/useDownloadActions.ts +179 -0
  242. package/src/hooks/useDownloadProgress.ts +126 -0
  243. package/src/hooks/useDownloadStorage.ts +84 -0
  244. package/src/hooks/useDownloadedTracks.ts +138 -0
  245. package/src/hooks/useEqualizer.ts +173 -0
  246. package/src/hooks/useEqualizerPresets.ts +140 -0
  247. package/src/hooks/useNowPlaying.ts +3 -2
  248. package/src/hooks/useOnChangeTrack.ts +15 -11
  249. package/src/hooks/useOnPlaybackStateChange.ts +19 -15
  250. package/src/hooks/usePlaylist.ts +161 -0
  251. package/src/index.ts +12 -0
  252. package/src/specs/DownloadManager.nitro.ts +203 -0
  253. package/src/specs/Equalizer.nitro.ts +69 -0
  254. package/src/specs/TrackPlayer.nitro.ts +6 -2
  255. package/src/types/DownloadTypes.ts +135 -0
  256. package/src/types/EqualizerTypes.ts +72 -0
  257. package/src/types/PlayerQueue.ts +9 -0
@@ -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
+ }
@@ -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,11 +51,11 @@ 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 updateState = useCallback(async () => {
54
55
  if (!isMounted.current) return
55
56
 
56
57
  try {
57
- const newState = TrackPlayer.getState()
58
+ const newState = await TrackPlayer.getState()
58
59
  setState(newState)
59
60
  } catch (error) {
60
61
  console.error('[useNowPlaying] Error updating player state:', error)