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,149 @@
1
+ import { DownloadManager } from '../index'
2
+ import type {
3
+ DownloadProgress,
4
+ DownloadState,
5
+ DownloadedTrack,
6
+ DownloadError,
7
+ } from '../types/DownloadTypes'
8
+
9
+ type ProgressCallback = (progress: DownloadProgress) => void
10
+ type StateChangeCallback = (
11
+ downloadId: string,
12
+ trackId: string,
13
+ state: DownloadState,
14
+ error?: DownloadError
15
+ ) => void
16
+ type CompleteCallback = (downloadedTrack: DownloadedTrack) => void
17
+
18
+ /**
19
+ * Internal subscription manager for download callbacks.
20
+ * Allows multiple hooks to subscribe to a single native callback.
21
+ */
22
+ class DownloadCallbackSubscriptionManager {
23
+ private progressSubscribers = new Set<ProgressCallback>()
24
+ private stateChangeSubscribers = new Set<StateChangeCallback>()
25
+ private completeSubscribers = new Set<CompleteCallback>()
26
+
27
+ private isProgressRegistered = false
28
+ private isStateChangeRegistered = false
29
+ private isCompleteRegistered = false
30
+
31
+ /**
32
+ * Subscribe to download progress updates
33
+ * @returns Unsubscribe function
34
+ */
35
+ subscribeToProgress(callback: ProgressCallback): () => void {
36
+ this.progressSubscribers.add(callback)
37
+ this.ensureProgressRegistered()
38
+
39
+ return () => {
40
+ this.progressSubscribers.delete(callback)
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Subscribe to download state changes
46
+ * @returns Unsubscribe function
47
+ */
48
+ subscribeToStateChange(callback: StateChangeCallback): () => void {
49
+ this.stateChangeSubscribers.add(callback)
50
+ this.ensureStateChangeRegistered()
51
+
52
+ return () => {
53
+ this.stateChangeSubscribers.delete(callback)
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Subscribe to download completions
59
+ * @returns Unsubscribe function
60
+ */
61
+ subscribeToComplete(callback: CompleteCallback): () => void {
62
+ this.completeSubscribers.add(callback)
63
+ this.ensureCompleteRegistered()
64
+
65
+ return () => {
66
+ this.completeSubscribers.delete(callback)
67
+ }
68
+ }
69
+
70
+ private ensureProgressRegistered(): void {
71
+ if (this.isProgressRegistered) return
72
+
73
+ try {
74
+ DownloadManager.onDownloadProgress((progress) => {
75
+ this.progressSubscribers.forEach((subscriber) => {
76
+ try {
77
+ subscriber(progress)
78
+ } catch (error) {
79
+ console.error(
80
+ '[DownloadCallbackManager] Error in progress subscriber:',
81
+ error
82
+ )
83
+ }
84
+ })
85
+ })
86
+ this.isProgressRegistered = true
87
+ } catch (error) {
88
+ console.error(
89
+ '[DownloadCallbackManager] Failed to register progress callback:',
90
+ error
91
+ )
92
+ }
93
+ }
94
+
95
+ private ensureStateChangeRegistered(): void {
96
+ if (this.isStateChangeRegistered) return
97
+
98
+ try {
99
+ DownloadManager.onDownloadStateChange(
100
+ (downloadId, trackId, state, error) => {
101
+ this.stateChangeSubscribers.forEach((subscriber) => {
102
+ try {
103
+ subscriber(downloadId, trackId, state, error)
104
+ } catch (err) {
105
+ console.error(
106
+ '[DownloadCallbackManager] Error in state change subscriber:',
107
+ err
108
+ )
109
+ }
110
+ })
111
+ }
112
+ )
113
+ this.isStateChangeRegistered = true
114
+ } catch (error) {
115
+ console.error(
116
+ '[DownloadCallbackManager] Failed to register state change callback:',
117
+ error
118
+ )
119
+ }
120
+ }
121
+
122
+ private ensureCompleteRegistered(): void {
123
+ if (this.isCompleteRegistered) return
124
+
125
+ try {
126
+ DownloadManager.onDownloadComplete((downloadedTrack) => {
127
+ this.completeSubscribers.forEach((subscriber) => {
128
+ try {
129
+ subscriber(downloadedTrack)
130
+ } catch (error) {
131
+ console.error(
132
+ '[DownloadCallbackManager] Error in complete subscriber:',
133
+ error
134
+ )
135
+ }
136
+ })
137
+ })
138
+ this.isCompleteRegistered = true
139
+ } catch (error) {
140
+ console.error(
141
+ '[DownloadCallbackManager] Failed to register complete callback:',
142
+ error
143
+ )
144
+ }
145
+ }
146
+ }
147
+
148
+ // Export singleton instance
149
+ export const downloadCallbackManager = new DownloadCallbackSubscriptionManager()
@@ -0,0 +1,138 @@
1
+ import { Equalizer } from '../index'
2
+ import type { EqualizerBand } from '../types/EqualizerTypes'
3
+
4
+ type EnabledChangeCallback = (enabled: boolean) => void
5
+ type BandChangeCallback = (bands: EqualizerBand[]) => void
6
+ type PresetChangeCallback = (presetName: string | null) => void
7
+
8
+ /**
9
+ * Internal subscription manager that allows multiple hooks to subscribe
10
+ * to equalizer callbacks. This solves the problem where registering
11
+ * a new callback overwrites the previous one.
12
+ */
13
+ class EqualizerCallbackSubscriptionManager {
14
+ private enabledChangeSubscribers = new Set<EnabledChangeCallback>()
15
+ private bandChangeSubscribers = new Set<BandChangeCallback>()
16
+ private presetChangeSubscribers = new Set<PresetChangeCallback>()
17
+ private isEnabledChangeRegistered = false
18
+ private isBandChangeRegistered = false
19
+ private isPresetChangeRegistered = false
20
+
21
+ /**
22
+ * Subscribe to enabled state changes
23
+ * @returns Unsubscribe function
24
+ */
25
+ subscribeToEnabledChange(callback: EnabledChangeCallback): () => void {
26
+ this.enabledChangeSubscribers.add(callback)
27
+ this.ensureEnabledChangeRegistered()
28
+
29
+ return () => {
30
+ this.enabledChangeSubscribers.delete(callback)
31
+ }
32
+ }
33
+
34
+ /**
35
+ * Subscribe to band changes
36
+ * @returns Unsubscribe function
37
+ */
38
+ subscribeToBandChange(callback: BandChangeCallback): () => void {
39
+ this.bandChangeSubscribers.add(callback)
40
+ this.ensureBandChangeRegistered()
41
+
42
+ return () => {
43
+ this.bandChangeSubscribers.delete(callback)
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Subscribe to preset changes
49
+ * @returns Unsubscribe function
50
+ */
51
+ subscribeToPresetChange(callback: PresetChangeCallback): () => void {
52
+ this.presetChangeSubscribers.add(callback)
53
+ this.ensurePresetChangeRegistered()
54
+
55
+ return () => {
56
+ this.presetChangeSubscribers.delete(callback)
57
+ }
58
+ }
59
+
60
+ private ensureEnabledChangeRegistered(): void {
61
+ if (this.isEnabledChangeRegistered) return
62
+
63
+ try {
64
+ Equalizer.onEnabledChange((enabled) => {
65
+ this.enabledChangeSubscribers.forEach((subscriber) => {
66
+ try {
67
+ subscriber(enabled)
68
+ } catch (error) {
69
+ console.error(
70
+ '[EqualizerCallbackManager] Error in enabled change subscriber:',
71
+ error
72
+ )
73
+ }
74
+ })
75
+ })
76
+ this.isEnabledChangeRegistered = true
77
+ } catch (error) {
78
+ console.error(
79
+ '[EqualizerCallbackManager] Failed to register enabled change callback:',
80
+ error
81
+ )
82
+ }
83
+ }
84
+
85
+ private ensureBandChangeRegistered(): void {
86
+ if (this.isBandChangeRegistered) return
87
+
88
+ try {
89
+ Equalizer.onBandChange((bands) => {
90
+ this.bandChangeSubscribers.forEach((subscriber) => {
91
+ try {
92
+ subscriber(bands)
93
+ } catch (error) {
94
+ console.error(
95
+ '[EqualizerCallbackManager] Error in band change subscriber:',
96
+ error
97
+ )
98
+ }
99
+ })
100
+ })
101
+ this.isBandChangeRegistered = true
102
+ } catch (error) {
103
+ console.error(
104
+ '[EqualizerCallbackManager] Failed to register band change callback:',
105
+ error
106
+ )
107
+ }
108
+ }
109
+
110
+ private ensurePresetChangeRegistered(): void {
111
+ if (this.isPresetChangeRegistered) return
112
+
113
+ try {
114
+ Equalizer.onPresetChange((presetName) => {
115
+ this.presetChangeSubscribers.forEach((subscriber) => {
116
+ try {
117
+ subscriber(presetName)
118
+ } catch (error) {
119
+ console.error(
120
+ '[EqualizerCallbackManager] Error in preset change subscriber:',
121
+ error
122
+ )
123
+ }
124
+ })
125
+ })
126
+ this.isPresetChangeRegistered = true
127
+ } catch (error) {
128
+ console.error(
129
+ '[EqualizerCallbackManager] Failed to register preset change callback:',
130
+ error
131
+ )
132
+ }
133
+ }
134
+ }
135
+
136
+ // Export singleton instance
137
+ export const equalizerCallbackManager =
138
+ new EqualizerCallbackSubscriptionManager()
@@ -7,3 +7,26 @@ export { useOnPlaybackProgressChange } from './useOnPlaybackProgressChange'
7
7
  export { useAndroidAutoConnection } from './useAndroidAutoConnection'
8
8
  export { useAudioDevices } from './useAudioDevices'
9
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
+
15
+ // Download hooks
16
+ export { useDownloadProgress } from './useDownloadProgress'
17
+ export type {
18
+ UseDownloadProgressOptions,
19
+ UseDownloadProgressResult,
20
+ } from './useDownloadProgress'
21
+ export { useDownloadedTracks } from './useDownloadedTracks'
22
+ export type { UseDownloadedTracksResult } from './useDownloadedTracks'
23
+ export { useDownloadActions } from './useDownloadActions'
24
+ export type { UseDownloadActionsResult } from './useDownloadActions'
25
+ export { useDownloadStorage } from './useDownloadStorage'
26
+ export type { UseDownloadStorageResult } from './useDownloadStorage'
27
+
28
+ // Equalizer hooks
29
+ export { useEqualizer } from './useEqualizer'
30
+ export type { UseEqualizerResult } from './useEqualizer'
31
+ export { useEqualizerPresets } from './useEqualizerPresets'
32
+ export type { UseEqualizerPresetsResult } from './useEqualizerPresets'
@@ -0,0 +1,116 @@
1
+ import { useEffect, useState, useRef, useCallback } from 'react'
2
+ import { TrackPlayer } from '../index'
3
+ import { callbackManager } from './callbackManager'
4
+ import type { TrackItem } from '../types/PlayerQueue'
5
+
6
+ export interface UseActualQueueResult {
7
+ /** The current queue in playback order */
8
+ queue: TrackItem[]
9
+ /** Manually refresh the queue */
10
+ refreshQueue: () => void
11
+ /** Whether the queue is currently loading */
12
+ isLoading: boolean
13
+ }
14
+
15
+ /**
16
+ * Hook to get the actual playback queue including temporary tracks
17
+ *
18
+ * Returns the complete queue in playback order:
19
+ * [tracks_before_current] + [current] + [playNext_stack] + [upNext_queue] + [remaining_tracks]
20
+ *
21
+ * Auto-updates when:
22
+ * - Track changes
23
+ * - Playback state changes
24
+ *
25
+ * Call `refreshQueue()` after adding tracks via `playNext()` or `addToUpNext()`
26
+ * to immediately see the updated queue.
27
+ *
28
+ * @returns Object containing queue array, refresh function, and loading state
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * function QueueView() {
33
+ * const { queue, refreshQueue, isLoading } = useActualQueue();
34
+ *
35
+ * const handleAddToUpNext = (trackId: string) => {
36
+ * TrackPlayer.addToUpNext(trackId);
37
+ * // Refresh queue after adding track
38
+ * setTimeout(refreshQueue, 100);
39
+ * };
40
+ *
41
+ * return (
42
+ * <ScrollView>
43
+ * {queue.map((track, index) => (
44
+ * <Text key={track.id}>
45
+ * {index + 1}. {track.title}
46
+ * </Text>
47
+ * ))}
48
+ * </ScrollView>
49
+ * );
50
+ * }
51
+ * ```
52
+ */
53
+ export function useActualQueue(): UseActualQueueResult {
54
+ const [queue, setQueue] = useState<TrackItem[]>([])
55
+ const [isLoading, setIsLoading] = useState(true)
56
+ const isMounted = useRef(true)
57
+
58
+ const updateQueue = useCallback(async () => {
59
+ if (!isMounted.current) return
60
+
61
+ try {
62
+ const actualQueue = await TrackPlayer.getActualQueue()
63
+ if (isMounted.current) {
64
+ setQueue(actualQueue)
65
+ setIsLoading(false)
66
+ }
67
+ } catch (error) {
68
+ console.error('[useActualQueue] Error getting queue:', error)
69
+ if (isMounted.current) {
70
+ setQueue([])
71
+ setIsLoading(false)
72
+ }
73
+ }
74
+ }, [])
75
+
76
+ const refreshQueue = useCallback(() => {
77
+ if (!isMounted.current) return
78
+ setIsLoading(true)
79
+ updateQueue()
80
+ }, [updateQueue])
81
+
82
+ // Initialize queue
83
+ useEffect(() => {
84
+ isMounted.current = true
85
+ updateQueue()
86
+
87
+ return () => {
88
+ isMounted.current = false
89
+ }
90
+ }, [updateQueue])
91
+
92
+ // Update queue on track changes (with slight delay to ensure native side has updated)
93
+ useEffect(() => {
94
+ const unsubscribe = callbackManager.subscribeToTrackChange(() => {
95
+ // Small delay to ensure native queue is updated
96
+ setTimeout(updateQueue, 50)
97
+ })
98
+
99
+ return () => {
100
+ unsubscribe()
101
+ }
102
+ }, [updateQueue])
103
+
104
+ // Update queue on playback state changes
105
+ useEffect(() => {
106
+ const unsubscribe = callbackManager.subscribeToPlaybackState(() => {
107
+ updateQueue()
108
+ })
109
+
110
+ return () => {
111
+ unsubscribe()
112
+ }
113
+ }, [updateQueue])
114
+
115
+ return { queue, refreshQueue, isLoading }
116
+ }
@@ -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
+ }