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.
- 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/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 +16 -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.js +3 -2
- package/lib/hooks/useOnChangeTrack.js +15 -12
- package/lib/hooks/useOnPlaybackStateChange.js +16 -13
- 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/downloadCallbackManager.ts +149 -0
- package/src/hooks/equalizerCallbackManager.ts +138 -0
- package/src/hooks/index.ts +23 -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 +3 -2
- package/src/hooks/useOnChangeTrack.ts +15 -11
- package/src/hooks/useOnPlaybackStateChange.ts +19 -15
- 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
|
@@ -48,20 +48,24 @@ export function useOnChangeTrack(): TrackChangeResult {
|
|
|
48
48
|
useEffect(() => {
|
|
49
49
|
isMounted.current = true
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
51
|
+
const initializeTrack = async () => {
|
|
52
|
+
try {
|
|
53
|
+
const playerState = await TrackPlayer.getState()
|
|
54
|
+
if (isMounted.current) {
|
|
55
|
+
setTrack(playerState.currentTrack)
|
|
56
|
+
setIsReady(true)
|
|
57
|
+
}
|
|
58
|
+
} catch (error) {
|
|
59
|
+
console.error('[useOnChangeTrack] Failed to get initial state:', error)
|
|
60
|
+
if (isMounted.current) {
|
|
61
|
+
setTrack(null)
|
|
62
|
+
setIsReady(true)
|
|
63
|
+
}
|
|
62
64
|
}
|
|
63
65
|
}
|
|
64
66
|
|
|
67
|
+
initializeTrack()
|
|
68
|
+
|
|
65
69
|
return () => {
|
|
66
70
|
isMounted.current = false
|
|
67
71
|
}
|
|
@@ -47,24 +47,28 @@ export function useOnPlaybackStateChange(): PlaybackStateResult {
|
|
|
47
47
|
useEffect(() => {
|
|
48
48
|
isMounted.current = true
|
|
49
49
|
|
|
50
|
-
// Get initial state
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
50
|
+
// Get initial state asynchronously
|
|
51
|
+
const initializeState = async () => {
|
|
52
|
+
try {
|
|
53
|
+
const playerState = await TrackPlayer.getState()
|
|
54
|
+
if (isMounted.current) {
|
|
55
|
+
setState(playerState.currentState)
|
|
56
|
+
setIsReady(true)
|
|
57
|
+
}
|
|
58
|
+
} catch (error) {
|
|
59
|
+
console.error(
|
|
60
|
+
'[useOnPlaybackStateChange] Failed to get initial state:',
|
|
61
|
+
error
|
|
62
|
+
)
|
|
63
|
+
if (isMounted.current) {
|
|
64
|
+
setState('stopped')
|
|
65
|
+
setIsReady(true)
|
|
66
|
+
}
|
|
65
67
|
}
|
|
66
68
|
}
|
|
67
69
|
|
|
70
|
+
initializeState()
|
|
71
|
+
|
|
68
72
|
return () => {
|
|
69
73
|
isMounted.current = false
|
|
70
74
|
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { useEffect, useState, useRef, useCallback } from 'react'
|
|
2
|
+
import { PlayerQueue } from '../index'
|
|
3
|
+
import { callbackManager } from './callbackManager'
|
|
4
|
+
import type { Playlist, TrackItem } from '../types/PlayerQueue'
|
|
5
|
+
|
|
6
|
+
export interface UsePlaylistResult {
|
|
7
|
+
/** The currently loaded playlist */
|
|
8
|
+
currentPlaylist: Playlist | null
|
|
9
|
+
/** ID of the currently loaded playlist */
|
|
10
|
+
currentPlaylistId: string | null
|
|
11
|
+
/** All available playlists */
|
|
12
|
+
allPlaylists: Playlist[]
|
|
13
|
+
/** All tracks from all playlists (flattened) */
|
|
14
|
+
allTracks: TrackItem[]
|
|
15
|
+
/** Whether the playlists are currently loading */
|
|
16
|
+
isLoading: boolean
|
|
17
|
+
/** Manually refresh playlist data */
|
|
18
|
+
refreshPlaylists: () => void
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Hook to manage playlist state
|
|
23
|
+
*
|
|
24
|
+
* Provides current playlist, all playlists, and all tracks across playlists.
|
|
25
|
+
* Automatically refreshes when:
|
|
26
|
+
* - Component mounts
|
|
27
|
+
* - Track changes (to update currentPlaylistId)
|
|
28
|
+
* - Playlists are modified via PlayerQueue methods
|
|
29
|
+
*
|
|
30
|
+
* Call `refreshPlaylists()` after creating/deleting playlists to update the state.
|
|
31
|
+
*
|
|
32
|
+
* @returns Object containing playlist state and refresh function
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```tsx
|
|
36
|
+
* function MyComponent() {
|
|
37
|
+
* const { currentPlaylist, allTracks, refreshPlaylists } = usePlaylist();
|
|
38
|
+
*
|
|
39
|
+
* const handleCreatePlaylist = () => {
|
|
40
|
+
* PlayerQueue.createPlaylist('New Playlist');
|
|
41
|
+
* refreshPlaylists(); // Refresh to see the new playlist
|
|
42
|
+
* };
|
|
43
|
+
*
|
|
44
|
+
* return (
|
|
45
|
+
* <View>
|
|
46
|
+
* <Text>{currentPlaylist?.name}</Text>
|
|
47
|
+
* <Text>Total tracks: {allTracks.length}</Text>
|
|
48
|
+
* </View>
|
|
49
|
+
* );
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export function usePlaylist(): UsePlaylistResult {
|
|
54
|
+
const [currentPlaylist, setCurrentPlaylist] = useState<Playlist | null>(null)
|
|
55
|
+
const [currentPlaylistId, setCurrentPlaylistId] = useState<string | null>(
|
|
56
|
+
null
|
|
57
|
+
)
|
|
58
|
+
const [allPlaylists, setAllPlaylists] = useState<Playlist[]>([])
|
|
59
|
+
const [allTracks, setAllTracks] = useState<TrackItem[]>([])
|
|
60
|
+
const [isLoading, setIsLoading] = useState(true)
|
|
61
|
+
const isMounted = useRef(true)
|
|
62
|
+
const hasSubscribed = useRef(false)
|
|
63
|
+
|
|
64
|
+
const refreshPlaylists = useCallback(() => {
|
|
65
|
+
if (!isMounted.current) return
|
|
66
|
+
|
|
67
|
+
try {
|
|
68
|
+
// Get current playlist ID
|
|
69
|
+
const playlistId = PlayerQueue.getCurrentPlaylistId()
|
|
70
|
+
if (!isMounted.current) return
|
|
71
|
+
setCurrentPlaylistId(playlistId)
|
|
72
|
+
|
|
73
|
+
// Get current playlist details
|
|
74
|
+
if (playlistId) {
|
|
75
|
+
const playlist = PlayerQueue.getPlaylist(playlistId)
|
|
76
|
+
if (isMounted.current) {
|
|
77
|
+
setCurrentPlaylist(playlist)
|
|
78
|
+
}
|
|
79
|
+
} else {
|
|
80
|
+
if (isMounted.current) {
|
|
81
|
+
setCurrentPlaylist(null)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Get all playlists
|
|
86
|
+
const playlists = PlayerQueue.getAllPlaylists()
|
|
87
|
+
if (!isMounted.current) return
|
|
88
|
+
setAllPlaylists(playlists)
|
|
89
|
+
|
|
90
|
+
// Get all tracks from all playlists (deduplicated by id)
|
|
91
|
+
const trackMap = new Map<string, TrackItem>()
|
|
92
|
+
playlists.forEach((playlist) => {
|
|
93
|
+
playlist.tracks.forEach((track) => {
|
|
94
|
+
if (!trackMap.has(track.id)) {
|
|
95
|
+
trackMap.set(track.id, track)
|
|
96
|
+
}
|
|
97
|
+
})
|
|
98
|
+
})
|
|
99
|
+
if (isMounted.current) {
|
|
100
|
+
setAllTracks(Array.from(trackMap.values()))
|
|
101
|
+
setIsLoading(false)
|
|
102
|
+
}
|
|
103
|
+
} catch (error) {
|
|
104
|
+
console.error('[usePlaylist] Error refreshing playlists:', error)
|
|
105
|
+
if (isMounted.current) {
|
|
106
|
+
setIsLoading(false)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}, [])
|
|
110
|
+
|
|
111
|
+
// Initialize and setup mounted ref
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
isMounted.current = true
|
|
114
|
+
|
|
115
|
+
// Initial load
|
|
116
|
+
refreshPlaylists()
|
|
117
|
+
|
|
118
|
+
return () => {
|
|
119
|
+
isMounted.current = false
|
|
120
|
+
}
|
|
121
|
+
}, [refreshPlaylists])
|
|
122
|
+
|
|
123
|
+
// Subscribe to native playlist changes (only once)
|
|
124
|
+
useEffect(() => {
|
|
125
|
+
if (hasSubscribed.current) return
|
|
126
|
+
hasSubscribed.current = true
|
|
127
|
+
|
|
128
|
+
try {
|
|
129
|
+
PlayerQueue.onPlaylistsChanged(() => {
|
|
130
|
+
if (isMounted.current) {
|
|
131
|
+
refreshPlaylists()
|
|
132
|
+
}
|
|
133
|
+
})
|
|
134
|
+
} catch (error) {
|
|
135
|
+
console.error('[usePlaylist] Error setting up playlist listener:', error)
|
|
136
|
+
}
|
|
137
|
+
}, [refreshPlaylists])
|
|
138
|
+
|
|
139
|
+
// Also refresh when track changes (as it might indicate playlist loaded)
|
|
140
|
+
useEffect(() => {
|
|
141
|
+
const unsubscribe = callbackManager.subscribeToTrackChange(() => {
|
|
142
|
+
// Refresh to update currentPlaylistId when track changes
|
|
143
|
+
if (isMounted.current) {
|
|
144
|
+
refreshPlaylists()
|
|
145
|
+
}
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
return () => {
|
|
149
|
+
unsubscribe()
|
|
150
|
+
}
|
|
151
|
+
}, [refreshPlaylists])
|
|
152
|
+
|
|
153
|
+
return {
|
|
154
|
+
currentPlaylist,
|
|
155
|
+
currentPlaylistId,
|
|
156
|
+
allPlaylists,
|
|
157
|
+
allTracks,
|
|
158
|
+
isLoading,
|
|
159
|
+
refreshPlaylists,
|
|
160
|
+
}
|
|
161
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -9,6 +9,8 @@ import type {
|
|
|
9
9
|
import type { AndroidAutoMediaLibrary as AndroidAutoMediaLibraryType } from './specs/AndroidAutoMediaLibrary.nitro'
|
|
10
10
|
import type { AudioDevices as AudioDevicesType } from './specs/AudioDevices.nitro'
|
|
11
11
|
import type { AudioRoutePicker as AudioRoutePickerType } from './specs/AudioRoutePicker.nitro'
|
|
12
|
+
import type { DownloadManager as DownloadManagerType } from './specs/DownloadManager.nitro'
|
|
13
|
+
import type { Equalizer as EqualizerType } from './specs/Equalizer.nitro'
|
|
12
14
|
|
|
13
15
|
export const PlayerQueue =
|
|
14
16
|
NitroModules.createHybridObject<PlayerQueueType>('PlayerQueue')
|
|
@@ -35,12 +37,22 @@ export const AudioRoutePicker =
|
|
|
35
37
|
? NitroModules.createHybridObject<AudioRoutePickerType>('AudioRoutePicker')
|
|
36
38
|
: null
|
|
37
39
|
|
|
40
|
+
// Download Manager
|
|
41
|
+
export const DownloadManager =
|
|
42
|
+
NitroModules.createHybridObject<DownloadManagerType>('DownloadManager')
|
|
43
|
+
|
|
44
|
+
// Equalizer
|
|
45
|
+
export const Equalizer =
|
|
46
|
+
NitroModules.createHybridObject<EqualizerType>('Equalizer')
|
|
47
|
+
|
|
38
48
|
// Export hooks
|
|
39
49
|
export * from './hooks'
|
|
40
50
|
|
|
41
51
|
// Export types
|
|
42
52
|
export * from './types/PlayerQueue'
|
|
43
53
|
export * from './types/AndroidAutoMediaLibrary'
|
|
54
|
+
export * from './types/DownloadTypes'
|
|
55
|
+
export * from './types/EqualizerTypes'
|
|
44
56
|
export type { TAudioDevice } from './specs/AudioDevices.nitro'
|
|
45
57
|
export type { RepeatMode } from './specs/TrackPlayer.nitro'
|
|
46
58
|
// Export utilities
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import type { HybridObject } from 'react-native-nitro-modules'
|
|
2
|
+
import type { TrackItem } from '../types/PlayerQueue'
|
|
3
|
+
import type {
|
|
4
|
+
DownloadConfig,
|
|
5
|
+
DownloadTask,
|
|
6
|
+
DownloadProgress,
|
|
7
|
+
DownloadedTrack,
|
|
8
|
+
DownloadedPlaylist,
|
|
9
|
+
DownloadState,
|
|
10
|
+
DownloadStorageInfo,
|
|
11
|
+
DownloadQueueStatus,
|
|
12
|
+
DownloadError,
|
|
13
|
+
PlaybackSource,
|
|
14
|
+
} from '../types/DownloadTypes'
|
|
15
|
+
|
|
16
|
+
export interface DownloadManager
|
|
17
|
+
extends HybridObject<{ android: 'kotlin'; ios: 'swift' }> {
|
|
18
|
+
/**
|
|
19
|
+
* Configure the download manager
|
|
20
|
+
*/
|
|
21
|
+
configure(config: DownloadConfig): void
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Get current configuration
|
|
25
|
+
*/
|
|
26
|
+
getConfig(): DownloadConfig
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Download a single track
|
|
30
|
+
* @returns downloadId for tracking
|
|
31
|
+
*/
|
|
32
|
+
downloadTrack(track: TrackItem, playlistId?: string): Promise<string>
|
|
33
|
+
|
|
34
|
+
// =====================================
|
|
35
|
+
// PLAYLIST DOWNLOADS
|
|
36
|
+
// =====================================
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Download an entire playlist
|
|
40
|
+
* @returns downloadId array for each track
|
|
41
|
+
*/
|
|
42
|
+
downloadPlaylist(playlistId: string, tracks: TrackItem[]): Promise<string[]>
|
|
43
|
+
/**
|
|
44
|
+
* Pause a download
|
|
45
|
+
*/
|
|
46
|
+
pauseDownload(downloadId: string): Promise<void>
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Resume a paused download
|
|
50
|
+
*/
|
|
51
|
+
resumeDownload(downloadId: string): Promise<void>
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Cancel a download
|
|
55
|
+
*/
|
|
56
|
+
cancelDownload(downloadId: string): Promise<void>
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Retry a failed download
|
|
60
|
+
*/
|
|
61
|
+
retryDownload(downloadId: string): Promise<void>
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Pause all downloads
|
|
65
|
+
*/
|
|
66
|
+
pauseAllDownloads(): Promise<void>
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Resume all paused downloads
|
|
70
|
+
*/
|
|
71
|
+
resumeAllDownloads(): Promise<void>
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Cancel all downloads
|
|
75
|
+
*/
|
|
76
|
+
cancelAllDownloads(): Promise<void>
|
|
77
|
+
/**
|
|
78
|
+
* Get download task by ID
|
|
79
|
+
*/
|
|
80
|
+
getDownloadTask(downloadId: string): DownloadTask | null
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Get all active download tasks
|
|
84
|
+
*/
|
|
85
|
+
getActiveDownloads(): DownloadTask[]
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Get download queue status
|
|
89
|
+
*/
|
|
90
|
+
getQueueStatus(): DownloadQueueStatus
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Check if a track is currently downloading
|
|
94
|
+
*/
|
|
95
|
+
isDownloading(trackId: string): boolean
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Get download state for a track
|
|
99
|
+
*/
|
|
100
|
+
getDownloadState(trackId: string): DownloadState | null
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Check if a track is downloaded
|
|
104
|
+
*/
|
|
105
|
+
isTrackDownloaded(trackId: string): boolean
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Check if a playlist is fully downloaded
|
|
109
|
+
*/
|
|
110
|
+
isPlaylistDownloaded(playlistId: string): boolean
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Check if a playlist is partially downloaded
|
|
114
|
+
*/
|
|
115
|
+
isPlaylistPartiallyDownloaded(playlistId: string): boolean
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Get downloaded track by track ID
|
|
119
|
+
*/
|
|
120
|
+
getDownloadedTrack(trackId: string): DownloadedTrack | null
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Get all downloaded tracks
|
|
124
|
+
*/
|
|
125
|
+
getAllDownloadedTracks(): DownloadedTrack[]
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Get downloaded playlist by playlist ID
|
|
129
|
+
*/
|
|
130
|
+
getDownloadedPlaylist(playlistId: string): DownloadedPlaylist | null
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Get all downloaded playlists
|
|
134
|
+
*/
|
|
135
|
+
getAllDownloadedPlaylists(): DownloadedPlaylist[]
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Get local file path for a downloaded track
|
|
139
|
+
*/
|
|
140
|
+
getLocalPath(trackId: string): string | null
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Delete a downloaded track
|
|
144
|
+
*/
|
|
145
|
+
deleteDownloadedTrack(trackId: string): Promise<void>
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Delete a downloaded playlist (all its tracks)
|
|
149
|
+
*/
|
|
150
|
+
deleteDownloadedPlaylist(playlistId: string): Promise<void>
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Delete all downloaded content
|
|
154
|
+
*/
|
|
155
|
+
deleteAllDownloads(): Promise<void>
|
|
156
|
+
/**
|
|
157
|
+
* Get storage information
|
|
158
|
+
*/
|
|
159
|
+
getStorageInfo(): Promise<DownloadStorageInfo>
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Sync downloads - validates all downloads and removes orphaned records
|
|
163
|
+
* Call this to clean up after manual file deletion
|
|
164
|
+
* @returns number of orphaned records that were cleaned up
|
|
165
|
+
*/
|
|
166
|
+
syncDownloads(): number
|
|
167
|
+
/**
|
|
168
|
+
* Set playback source preference
|
|
169
|
+
*/
|
|
170
|
+
setPlaybackSourcePreference(preference: PlaybackSource): void
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Get current playback source preference
|
|
174
|
+
*/
|
|
175
|
+
getPlaybackSourcePreference(): PlaybackSource
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Get the effective URL for a track (local or network based on preference)
|
|
179
|
+
*/
|
|
180
|
+
getEffectiveUrl(track: TrackItem): string
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Called when download progress updates
|
|
184
|
+
*/
|
|
185
|
+
onDownloadProgress(callback: (progress: DownloadProgress) => void): void
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Called when download state changes
|
|
189
|
+
*/
|
|
190
|
+
onDownloadStateChange(
|
|
191
|
+
callback: (
|
|
192
|
+
downloadId: string,
|
|
193
|
+
trackId: string,
|
|
194
|
+
state: DownloadState,
|
|
195
|
+
error?: DownloadError
|
|
196
|
+
) => void
|
|
197
|
+
): void
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Called when a download completes
|
|
201
|
+
*/
|
|
202
|
+
onDownloadComplete(callback: (downloadedTrack: DownloadedTrack) => void): void
|
|
203
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { HybridObject } from 'react-native-nitro-modules'
|
|
2
|
+
import type {
|
|
3
|
+
EqualizerBand,
|
|
4
|
+
EqualizerPreset,
|
|
5
|
+
EqualizerState,
|
|
6
|
+
GainRange,
|
|
7
|
+
} from '../types/EqualizerTypes'
|
|
8
|
+
|
|
9
|
+
export interface Equalizer
|
|
10
|
+
extends HybridObject<{ android: 'kotlin'; ios: 'swift' }> {
|
|
11
|
+
// === Enable/Disable ===
|
|
12
|
+
/** Enable or disable the equalizer */
|
|
13
|
+
setEnabled(enabled: boolean): boolean
|
|
14
|
+
|
|
15
|
+
/** Check if equalizer is currently enabled */
|
|
16
|
+
isEnabled(): boolean
|
|
17
|
+
|
|
18
|
+
// === Band Control ===
|
|
19
|
+
/** Get all equalizer bands with current gain values */
|
|
20
|
+
getBands(): EqualizerBand[]
|
|
21
|
+
|
|
22
|
+
/** Set gain for a specific band index (-12 to +12 dB) */
|
|
23
|
+
setBandGain(bandIndex: number, gainDb: number): boolean
|
|
24
|
+
|
|
25
|
+
/** Set gains for all bands at once (array of 5 values) */
|
|
26
|
+
setAllBandGains(gains: number[]): boolean
|
|
27
|
+
|
|
28
|
+
/** Get the valid gain range for bands */
|
|
29
|
+
getBandRange(): GainRange
|
|
30
|
+
|
|
31
|
+
// === Presets ===
|
|
32
|
+
/** Get all available presets (built-in + custom) */
|
|
33
|
+
getPresets(): EqualizerPreset[]
|
|
34
|
+
|
|
35
|
+
/** Get built-in presets only */
|
|
36
|
+
getBuiltInPresets(): EqualizerPreset[]
|
|
37
|
+
|
|
38
|
+
/** Get custom user presets only */
|
|
39
|
+
getCustomPresets(): EqualizerPreset[]
|
|
40
|
+
|
|
41
|
+
/** Apply a preset by name */
|
|
42
|
+
applyPreset(presetName: string): boolean
|
|
43
|
+
|
|
44
|
+
/** Get currently applied preset name (null if custom values) */
|
|
45
|
+
getCurrentPresetName(): string | null
|
|
46
|
+
|
|
47
|
+
/** Save current settings as a custom preset */
|
|
48
|
+
saveCustomPreset(name: string): boolean
|
|
49
|
+
|
|
50
|
+
/** Delete a custom preset by name */
|
|
51
|
+
deleteCustomPreset(name: string): boolean
|
|
52
|
+
|
|
53
|
+
// === State ===
|
|
54
|
+
/** Get complete equalizer state */
|
|
55
|
+
getState(): EqualizerState
|
|
56
|
+
|
|
57
|
+
/** Reset to flat response (all bands at 0 dB) */
|
|
58
|
+
reset(): void
|
|
59
|
+
|
|
60
|
+
// === Events ===
|
|
61
|
+
/** Called when equalizer enabled state changes */
|
|
62
|
+
onEnabledChange(callback: (enabled: boolean) => void): void
|
|
63
|
+
|
|
64
|
+
/** Called when any band gain changes */
|
|
65
|
+
onBandChange(callback: (bands: EqualizerBand[]) => void): void
|
|
66
|
+
|
|
67
|
+
/** Called when preset changes */
|
|
68
|
+
onPresetChange(callback: (presetName: string | null) => void): void
|
|
69
|
+
}
|
|
@@ -60,11 +60,15 @@ export interface TrackPlayer
|
|
|
60
60
|
extends HybridObject<{ android: 'kotlin'; ios: 'swift' }> {
|
|
61
61
|
play(): void
|
|
62
62
|
pause(): void
|
|
63
|
-
playSong(songId: string, fromPlaylist?: string): void
|
|
63
|
+
playSong(songId: string, fromPlaylist?: string): Promise<void>
|
|
64
64
|
skipToNext(): void
|
|
65
|
+
skipToIndex(index: number): Promise<boolean>
|
|
65
66
|
skipToPrevious(): void
|
|
66
67
|
seek(position: number): void
|
|
67
|
-
|
|
68
|
+
addToUpNext(trackId: string): Promise<void>
|
|
69
|
+
playNext(trackId: string): Promise<void>
|
|
70
|
+
getActualQueue(): Promise<TrackItem[]>
|
|
71
|
+
getState(): Promise<PlayerState>
|
|
68
72
|
setRepeatMode(mode: RepeatMode): boolean
|
|
69
73
|
configure(config: PlayerConfig): void
|
|
70
74
|
onChangeTrack(callback: (track: TrackItem, reason?: Reason) => void): void
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { TrackItem, Playlist } from './PlayerQueue'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Storage location options for downloads
|
|
5
|
+
*/
|
|
6
|
+
export type StorageLocation = 'private' | 'public'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Current state of a download task
|
|
10
|
+
*/
|
|
11
|
+
export type DownloadState =
|
|
12
|
+
| 'pending'
|
|
13
|
+
| 'downloading'
|
|
14
|
+
| 'paused'
|
|
15
|
+
| 'completed'
|
|
16
|
+
| 'failed'
|
|
17
|
+
| 'cancelled'
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Reason for download failure
|
|
21
|
+
*/
|
|
22
|
+
export type DownloadErrorReason =
|
|
23
|
+
| 'network_error'
|
|
24
|
+
| 'storage_full'
|
|
25
|
+
| 'file_not_found'
|
|
26
|
+
| 'permission_denied'
|
|
27
|
+
| 'invalid_url'
|
|
28
|
+
| 'timeout'
|
|
29
|
+
| 'unknown'
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Source preference for playback
|
|
33
|
+
*/
|
|
34
|
+
export type PlaybackSource = 'auto' | 'download' | 'network'
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Progress information for a download
|
|
38
|
+
*/
|
|
39
|
+
export interface DownloadProgress {
|
|
40
|
+
trackId: string
|
|
41
|
+
downloadId: string
|
|
42
|
+
bytesDownloaded: number
|
|
43
|
+
totalBytes: number
|
|
44
|
+
progress: number // 0.0 to 1.0
|
|
45
|
+
state: DownloadState
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Download error information
|
|
50
|
+
*/
|
|
51
|
+
export interface DownloadError {
|
|
52
|
+
code: string
|
|
53
|
+
message: string
|
|
54
|
+
reason: DownloadErrorReason
|
|
55
|
+
isRetryable: boolean
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* A downloaded track with local file information
|
|
60
|
+
*/
|
|
61
|
+
export interface DownloadedTrack {
|
|
62
|
+
trackId: string
|
|
63
|
+
originalTrack: TrackItem
|
|
64
|
+
localPath: string
|
|
65
|
+
localArtworkPath?: string | null
|
|
66
|
+
downloadedAt: number // Unix timestamp
|
|
67
|
+
fileSize: number // bytes
|
|
68
|
+
storageLocation: StorageLocation
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* A playlist with download information
|
|
73
|
+
*/
|
|
74
|
+
export interface DownloadedPlaylist {
|
|
75
|
+
playlistId: string
|
|
76
|
+
originalPlaylist: Playlist
|
|
77
|
+
downloadedTracks: DownloadedTrack[]
|
|
78
|
+
totalSize: number // bytes
|
|
79
|
+
downloadedAt: number // Unix timestamp
|
|
80
|
+
isComplete: boolean // All tracks downloaded
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Download task information
|
|
85
|
+
*/
|
|
86
|
+
export interface DownloadTask {
|
|
87
|
+
downloadId: string
|
|
88
|
+
trackId: string
|
|
89
|
+
playlistId?: string | null
|
|
90
|
+
state: DownloadState
|
|
91
|
+
progress: DownloadProgress
|
|
92
|
+
createdAt: number // Unix timestamp
|
|
93
|
+
startedAt?: number | null
|
|
94
|
+
completedAt?: number | null
|
|
95
|
+
error?: DownloadError | null
|
|
96
|
+
retryCount: number
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Configuration for the DownloadManager
|
|
101
|
+
*/
|
|
102
|
+
export interface DownloadConfig {
|
|
103
|
+
storageLocation?: StorageLocation
|
|
104
|
+
maxConcurrentDownloads?: number
|
|
105
|
+
autoRetry?: boolean
|
|
106
|
+
maxRetryAttempts?: number
|
|
107
|
+
backgroundDownloadsEnabled?: boolean
|
|
108
|
+
downloadArtwork?: boolean
|
|
109
|
+
customDownloadPath?: string | null
|
|
110
|
+
wifiOnlyDownloads?: boolean
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Summary of download storage usage
|
|
115
|
+
*/
|
|
116
|
+
export interface DownloadStorageInfo {
|
|
117
|
+
totalDownloadedSize: number // bytes
|
|
118
|
+
trackCount: number
|
|
119
|
+
playlistCount: number
|
|
120
|
+
availableSpace: number // bytes
|
|
121
|
+
totalSpace: number // bytes
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Download queue status
|
|
126
|
+
*/
|
|
127
|
+
export interface DownloadQueueStatus {
|
|
128
|
+
pendingCount: number
|
|
129
|
+
activeCount: number
|
|
130
|
+
completedCount: number
|
|
131
|
+
failedCount: number
|
|
132
|
+
totalBytesToDownload: number
|
|
133
|
+
totalBytesDownloaded: number
|
|
134
|
+
overallProgress: number // 0.0 to 1.0
|
|
135
|
+
}
|