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.
- package/README.md +444 -4
- package/android/build.gradle +4 -1
- package/android/src/main/AndroidManifest.xml +16 -1
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAndroidAutoMediaLibrary.kt +2 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAudioDevices.kt +8 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridDownloadManager.kt +225 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridEqualizer.kt +105 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridPlayerQueue.kt +6 -6
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridTrackPlayer.kt +37 -12
- package/android/src/main/java/com/margelo/nitro/nitroplayer/core/TrackPlayerCore.kt +970 -213
- package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadDatabase.kt +475 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadFileManager.kt +159 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadManagerCore.kt +489 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadWorker.kt +209 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/equalizer/EqualizerCore.kt +486 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaBrowserService.kt +3 -1
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaSessionManager.kt +14 -6
- package/android/src/main/java/com/margelo/nitro/nitroplayer/playlist/PlaylistManager.kt +27 -0
- package/ios/HybridDownloadManager.swift +226 -0
- package/ios/HybridEqualizer.swift +111 -0
- package/ios/HybridTrackPlayer.swift +36 -8
- package/ios/core/TrackPlayerCore.swift +998 -276
- package/ios/download/DownloadDatabase.swift +493 -0
- package/ios/download/DownloadFileManager.swift +241 -0
- package/ios/download/DownloadManagerCore.swift +923 -0
- package/ios/equalizer/EqualizerCore.swift +685 -0
- package/ios/media/MediaSessionManager.swift +40 -28
- package/ios/playlist/PlaylistManager.swift +40 -9
- package/ios/queue/HybridPlayerQueue.swift +33 -13
- package/lib/hooks/callbackManager.d.ts +28 -0
- package/lib/hooks/callbackManager.js +76 -0
- package/lib/hooks/downloadCallbackManager.d.ts +36 -0
- package/lib/hooks/downloadCallbackManager.js +108 -0
- package/lib/hooks/equalizerCallbackManager.d.ts +37 -0
- package/lib/hooks/equalizerCallbackManager.js +109 -0
- package/lib/hooks/index.d.ts +18 -0
- package/lib/hooks/index.js +10 -0
- package/lib/hooks/useActualQueue.d.ts +48 -0
- package/lib/hooks/useActualQueue.js +98 -0
- package/lib/hooks/useDownloadActions.d.ts +26 -0
- package/lib/hooks/useDownloadActions.js +117 -0
- package/lib/hooks/useDownloadProgress.d.ts +25 -0
- package/lib/hooks/useDownloadProgress.js +79 -0
- package/lib/hooks/useDownloadStorage.d.ts +19 -0
- package/lib/hooks/useDownloadStorage.js +60 -0
- package/lib/hooks/useDownloadedTracks.d.ts +25 -0
- package/lib/hooks/useDownloadedTracks.js +69 -0
- package/lib/hooks/useEqualizer.d.ts +25 -0
- package/lib/hooks/useEqualizer.js +124 -0
- package/lib/hooks/useEqualizerPresets.d.ts +22 -0
- package/lib/hooks/useEqualizerPresets.js +96 -0
- package/lib/hooks/useNowPlaying.d.ts +2 -2
- package/lib/hooks/useNowPlaying.js +42 -33
- package/lib/hooks/useOnChangeTrack.d.ts +33 -6
- package/lib/hooks/useOnChangeTrack.js +68 -9
- package/lib/hooks/useOnPlaybackStateChange.d.ts +32 -6
- package/lib/hooks/useOnPlaybackStateChange.js +68 -9
- package/lib/hooks/usePlaylist.d.ts +48 -0
- package/lib/hooks/usePlaylist.js +136 -0
- package/lib/index.d.ts +6 -0
- package/lib/index.js +6 -0
- package/lib/specs/DownloadManager.nitro.d.ts +152 -0
- package/lib/specs/DownloadManager.nitro.js +1 -0
- package/lib/specs/Equalizer.nitro.d.ts +43 -0
- package/lib/specs/Equalizer.nitro.js +1 -0
- package/lib/specs/TrackPlayer.nitro.d.ts +6 -2
- package/lib/types/DownloadTypes.d.ts +110 -0
- package/lib/types/DownloadTypes.js +1 -0
- package/lib/types/EqualizerTypes.d.ts +52 -0
- package/lib/types/EqualizerTypes.js +1 -0
- package/lib/types/PlayerQueue.d.ts +4 -0
- package/nitro.json +8 -0
- package/nitrogen/generated/android/NitroPlayer+autolinking.cmake +10 -1
- package/nitrogen/generated/android/NitroPlayerOnLoad.cpp +32 -2
- package/nitrogen/generated/android/c++/JCurrentPlayingType.hpp +65 -0
- package/nitrogen/generated/android/c++/JDownloadConfig.hpp +92 -0
- package/nitrogen/generated/android/c++/JDownloadError.hpp +71 -0
- package/nitrogen/generated/android/c++/JDownloadErrorReason.hpp +74 -0
- package/nitrogen/generated/android/c++/JDownloadProgress.hpp +79 -0
- package/nitrogen/generated/android/c++/JDownloadQueueStatus.hpp +81 -0
- package/nitrogen/generated/android/c++/JDownloadState.hpp +71 -0
- package/nitrogen/generated/android/c++/JDownloadStorageInfo.hpp +73 -0
- package/nitrogen/generated/android/c++/JDownloadTask.hpp +108 -0
- package/nitrogen/generated/android/c++/JDownloadedPlaylist.hpp +111 -0
- package/nitrogen/generated/android/c++/JDownloadedTrack.hpp +92 -0
- package/nitrogen/generated/android/c++/JEqualizerBand.hpp +69 -0
- package/nitrogen/generated/android/c++/JEqualizerPreset.hpp +78 -0
- package/nitrogen/generated/android/c++/JEqualizerState.hpp +91 -0
- package/nitrogen/generated/android/c++/JFunc_void_DownloadProgress.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_DownloadedTrack.hpp +89 -0
- package/nitrogen/generated/android/c++/JFunc_void_TrackItem_std__optional_Reason_.hpp +2 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__std__string__.hpp +81 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string_Playlist_std__optional_QueueOperation_.hpp +2 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string_std__string_DownloadState_std__optional_DownloadError_.hpp +83 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_EqualizerBand_.hpp +97 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Playlist__std__optional_QueueOperation_.hpp +2 -0
- package/nitrogen/generated/android/c++/JGainRange.hpp +61 -0
- package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.cpp +470 -0
- package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.hpp +99 -0
- package/nitrogen/generated/android/c++/JHybridEqualizerSpec.cpp +204 -0
- package/nitrogen/generated/android/c++/JHybridEqualizerSpec.hpp +82 -0
- package/nitrogen/generated/android/c++/JHybridPlayerQueueSpec.cpp +2 -0
- package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.cpp +117 -15
- package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.hpp +6 -2
- package/nitrogen/generated/android/c++/JPlaybackSource.hpp +62 -0
- package/nitrogen/generated/android/c++/JPlayerState.hpp +11 -3
- package/nitrogen/generated/android/c++/JPlaylist.hpp +2 -0
- package/nitrogen/generated/android/c++/JPresetType.hpp +59 -0
- package/nitrogen/generated/android/c++/JStorageLocation.hpp +59 -0
- package/nitrogen/generated/android/c++/JTrackItem.hpp +9 -3
- package/nitrogen/generated/android/c++/JTrackPlayerState.hpp +3 -3
- package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.hpp +74 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.hpp +84 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.hpp +85 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.hpp +80 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Playlist.hpp +2 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_TrackItem.hpp +2 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/CurrentPlayingType.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadConfig.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadError.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadErrorReason.kt +26 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadProgress.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadQueueStatus.kt +56 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadState.kt +25 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadStorageInfo.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadTask.kt +65 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedPlaylist.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedTrack.kt +56 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerBand.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerPreset.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerState.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadProgress.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadedTrack.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__optional_std__variant_nitro__NullType__std__string__.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__vector_EqualizerBand_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/GainRange.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridDownloadManagerSpec.kt +210 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridEqualizerSpec.kt +141 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridTrackPlayerSpec.kt +19 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlaybackSource.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlayerState.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PresetType.kt +21 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/StorageLocation.kt +21 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackItem.kt +7 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackPlayerState.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_Double.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadError.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadTask.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedPlaylist.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedTrack.kt +59 -0
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.cpp +138 -8
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.hpp +1046 -121
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Umbrella.hpp +66 -0
- package/nitrogen/generated/ios/NitroPlayerAutolinking.mm +16 -0
- package/nitrogen/generated/ios/NitroPlayerAutolinking.swift +30 -0
- package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.hpp +386 -0
- package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.hpp +223 -0
- package/nitrogen/generated/ios/c++/HybridPlayerQueueSpecSwift.hpp +1 -0
- package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.hpp +46 -6
- package/nitrogen/generated/ios/swift/CurrentPlayingType.swift +48 -0
- package/nitrogen/generated/ios/swift/DownloadConfig.swift +270 -0
- package/nitrogen/generated/ios/swift/DownloadError.swift +69 -0
- package/nitrogen/generated/ios/swift/DownloadErrorReason.swift +60 -0
- package/nitrogen/generated/ios/swift/DownloadProgress.swift +91 -0
- package/nitrogen/generated/ios/swift/DownloadQueueStatus.swift +102 -0
- package/nitrogen/generated/ios/swift/DownloadState.swift +56 -0
- package/nitrogen/generated/ios/swift/DownloadStorageInfo.swift +80 -0
- package/nitrogen/generated/ios/swift/DownloadTask.swift +315 -0
- package/nitrogen/generated/ios/swift/DownloadedPlaylist.swift +103 -0
- package/nitrogen/generated/ios/swift/DownloadedTrack.swift +147 -0
- package/nitrogen/generated/ios/swift/EqualizerBand.swift +69 -0
- package/nitrogen/generated/ios/swift/EqualizerPreset.swift +70 -0
- package/nitrogen/generated/ios/swift/EqualizerState.swift +115 -0
- package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_DownloadProgress.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_DownloadStorageInfo.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_DownloadedTrack.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_PlayerState.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +5 -5
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__std__string__.swift +66 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_EqualizerBand_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_TrackItem_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +47 -0
- package/nitrogen/generated/ios/swift/GainRange.swift +47 -0
- package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec.swift +90 -0
- package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec_cxx.swift +705 -0
- package/nitrogen/generated/ios/swift/HybridEqualizerSpec.swift +73 -0
- package/nitrogen/generated/ios/swift/HybridEqualizerSpec_cxx.swift +396 -0
- package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec.swift +6 -2
- package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec_cxx.swift +105 -8
- package/nitrogen/generated/ios/swift/PlaybackSource.swift +44 -0
- package/nitrogen/generated/ios/swift/PlayerState.swift +13 -2
- package/nitrogen/generated/ios/swift/PresetType.swift +40 -0
- package/nitrogen/generated/ios/swift/StorageLocation.swift +40 -0
- package/nitrogen/generated/ios/swift/TrackItem.swift +31 -1
- package/nitrogen/generated/ios/swift/TrackPlayerState.swift +4 -4
- package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_DownloadError.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_DownloadTask.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedPlaylist.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedTrack.swift +18 -0
- package/nitrogen/generated/shared/c++/CurrentPlayingType.hpp +84 -0
- package/nitrogen/generated/shared/c++/DownloadConfig.hpp +108 -0
- package/nitrogen/generated/shared/c++/DownloadError.hpp +89 -0
- package/nitrogen/generated/shared/c++/DownloadErrorReason.hpp +96 -0
- package/nitrogen/generated/shared/c++/DownloadProgress.hpp +97 -0
- package/nitrogen/generated/shared/c++/DownloadQueueStatus.hpp +99 -0
- package/nitrogen/generated/shared/c++/DownloadState.hpp +92 -0
- package/nitrogen/generated/shared/c++/DownloadStorageInfo.hpp +91 -0
- package/nitrogen/generated/shared/c++/DownloadTask.hpp +122 -0
- package/nitrogen/generated/shared/c++/DownloadedPlaylist.hpp +101 -0
- package/nitrogen/generated/shared/c++/DownloadedTrack.hpp +107 -0
- package/nitrogen/generated/shared/c++/EqualizerBand.hpp +87 -0
- package/nitrogen/generated/shared/c++/EqualizerPreset.hpp +86 -0
- package/nitrogen/generated/shared/c++/EqualizerState.hpp +89 -0
- package/nitrogen/generated/shared/c++/GainRange.hpp +79 -0
- package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.cpp +55 -0
- package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.hpp +134 -0
- package/nitrogen/generated/shared/c++/HybridEqualizerSpec.cpp +38 -0
- package/nitrogen/generated/shared/c++/HybridEqualizerSpec.hpp +95 -0
- package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.cpp +4 -0
- package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.hpp +11 -5
- package/nitrogen/generated/shared/c++/PlaybackSource.hpp +80 -0
- package/nitrogen/generated/shared/c++/PlayerState.hpp +9 -2
- package/nitrogen/generated/shared/c++/PresetType.hpp +76 -0
- package/nitrogen/generated/shared/c++/StorageLocation.hpp +76 -0
- package/nitrogen/generated/shared/c++/TrackItem.hpp +7 -2
- package/nitrogen/generated/shared/c++/TrackPlayerState.hpp +5 -5
- package/package.json +1 -1
- package/src/hooks/callbackManager.ts +96 -0
- package/src/hooks/downloadCallbackManager.ts +149 -0
- package/src/hooks/equalizerCallbackManager.ts +138 -0
- package/src/hooks/index.ts +25 -0
- package/src/hooks/useActualQueue.ts +116 -0
- package/src/hooks/useDownloadActions.ts +179 -0
- package/src/hooks/useDownloadProgress.ts +126 -0
- package/src/hooks/useDownloadStorage.ts +84 -0
- package/src/hooks/useDownloadedTracks.ts +138 -0
- package/src/hooks/useEqualizer.ts +173 -0
- package/src/hooks/useEqualizerPresets.ts +140 -0
- package/src/hooks/useNowPlaying.ts +47 -33
- package/src/hooks/useOnChangeTrack.ts +81 -13
- package/src/hooks/useOnPlaybackStateChange.ts +87 -13
- package/src/hooks/usePlaylist.ts +161 -0
- package/src/index.ts +12 -0
- package/src/specs/DownloadManager.nitro.ts +203 -0
- package/src/specs/Equalizer.nitro.ts +69 -0
- package/src/specs/TrackPlayer.nitro.ts +6 -2
- package/src/types/DownloadTypes.ts +135 -0
- package/src/types/EqualizerTypes.ts +72 -0
- package/src/types/PlayerQueue.ts +9 -0
package/lib/hooks/index.d.ts
CHANGED
|
@@ -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';
|
package/lib/hooks/index.js
CHANGED
|
@@ -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;
|