react-native-mp3 0.1.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/android/build.gradle +111 -0
- package/android/src/main/AndroidManifest.xml +44 -0
- package/android/src/main/java/com/reactnativemp3/Mp3Package.kt +23 -0
- package/android/src/main/java/com/reactnativemp3/Mp3TurboModule.kt +43 -0
- package/android/src/main/java/com/reactnativemp3/database/MusicDatabase.kt +48 -0
- package/android/src/main/java/com/reactnativemp3/database/dao/SongDao.kt +72 -0
- package/android/src/main/java/com/reactnativemp3/database/entities/PlaylistEntity.kt +58 -0
- package/android/src/main/java/com/reactnativemp3/database/entities/SongEntity.kt +104 -0
- package/android/src/main/java/com/reactnativemp3/database/entities/ThumbnailCacheEntity.kt +43 -0
- package/android/src/main/java/com/reactnativemp3/managers/CacheManager.kt +0 -0
- package/android/src/main/java/com/reactnativemp3/managers/EqualizerManager.kt +0 -0
- package/android/src/main/java/com/reactnativemp3/modules/MetadataModule.kt +330 -0
- package/android/src/main/java/com/reactnativemp3/modules/NotificationModule.kt +236 -0
- package/android/src/main/java/com/reactnativemp3/modules/PlayerModule.kt +710 -0
- package/android/src/main/java/com/reactnativemp3/modules/ScannerModule.kt +640 -0
- package/android/src/main/java/com/reactnativemp3/services/AudioFocusService.kt +0 -0
- package/android/src/main/java/com/reactnativemp3/services/FileObserverService.kt +0 -0
- package/android/src/main/java/com/reactnativemp3/services/MusicService.kt +309 -0
- package/android/src/main/java/com/reactnativemp3/utils/MediaStoreUtils.kt +0 -0
- package/android/src/main/java/com/reactnativemp3/utils/PermissionUtils.kt +0 -0
- package/android/src/main/jni/Mp3TurboModule.cpp +29 -0
- package/android/src/main/res/drawable/ic_music_note.xml +11 -0
- package/android/src/main/res/drawable/ic_pause.xml +11 -0
- package/android/src/main/res/drawable/ic_play.xml +11 -0
- package/android/src/main/res/drawable/ic_skip_next.xml +11 -0
- package/android/src/main/res/drawable/ic_skip_previous.xml +11 -0
- package/android/src/main/res/drawable/ic_stop.xml +11 -0
- package/lib/components/MusicList.d.ts +0 -0
- package/lib/components/MusicList.js +1 -0
- package/lib/components/MusicPlayerUI.d.ts +0 -0
- package/lib/components/MusicPlayerUI.js +1 -0
- package/lib/hooks/useMusicPlayer.d.ts +38 -0
- package/lib/hooks/useMusicPlayer.js +242 -0
- package/lib/hooks/useMusicScanner.d.ts +27 -0
- package/lib/hooks/useMusicScanner.js +217 -0
- package/lib/hooks/usePermissions.d.ts +9 -0
- package/lib/hooks/usePermissions.js +55 -0
- package/lib/index.d.ts +144 -0
- package/lib/index.js +148 -0
- package/lib/types/common.types.d.ts +79 -0
- package/lib/types/common.types.js +2 -0
- package/lib/types/index.d.ts +3 -0
- package/lib/types/index.js +2 -0
- package/lib/types/player.types.d.ts +35 -0
- package/lib/types/player.types.js +2 -0
- package/lib/types/scanner.types.d.ts +29 -0
- package/lib/types/scanner.types.js +2 -0
- package/lib/utils/constants.d.ts +31 -0
- package/lib/utils/constants.js +55 -0
- package/lib/utils/events.d.ts +0 -0
- package/lib/utils/events.js +1 -0
- package/package.json +62 -0
- package/src/components/MusicList.tsx +0 -0
- package/src/components/MusicPlayerUI.tsx +0 -0
- package/src/hooks/useMusicPlayer.ts +358 -0
- package/src/hooks/useMusicScanner.ts +286 -0
- package/src/hooks/usePermissions.ts +64 -0
- package/src/index.ts +214 -0
- package/src/types/common.types.ts +86 -0
- package/src/types/index.ts +4 -0
- package/src/types/player.types.ts +37 -0
- package/src/types/scanner.types.ts +31 -0
- package/src/utils/constants.ts +56 -0
- package/src/utils/events.ts +0 -0
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { ScannerEvents, PlayerEvents, RepeatMode, EqualizerPresets, AudioExtensions } from './utils/constants';
|
|
2
|
+
import { Album, Artist, PlaybackState, ScannerOptions, Song } from './types';
|
|
3
|
+
export { Song, Album, Artist, Playlist, PlaybackState, EqualizerPreset, ScannerOptions, PlayerOptions, } from './types/common.types';
|
|
4
|
+
export type { ScannerEvents as ScannerEventsType, ScannerEventType, } from './types/scanner.types';
|
|
5
|
+
export type { PlayerEvents as PlayerEventsType, PlayerEventType, } from './types/player.types';
|
|
6
|
+
export { ScannerEvents, PlayerEvents, RepeatMode, EqualizerPresets, AudioExtensions, };
|
|
7
|
+
export { useMusicPlayer } from './hooks/useMusicPlayer';
|
|
8
|
+
export { useMusicScanner } from './hooks/useMusicScanner';
|
|
9
|
+
export { usePermissions } from './hooks/usePermissions';
|
|
10
|
+
export declare const Scanner: {
|
|
11
|
+
requestStoragePermission: () => Promise<boolean>;
|
|
12
|
+
checkPermissionStatus: () => Promise<boolean>;
|
|
13
|
+
scanMusicFiles: (options?: ScannerOptions) => Promise<any>;
|
|
14
|
+
getCachedSongs: (options?: any) => Promise<Song[]>;
|
|
15
|
+
deleteSong: (songId: string) => Promise<boolean>;
|
|
16
|
+
addToFavorites: (songId: string) => Promise<boolean>;
|
|
17
|
+
removeFromFavorites: (songId: string) => Promise<boolean>;
|
|
18
|
+
getAlbums: () => Promise<Album[]>;
|
|
19
|
+
getArtists: () => Promise<Artist[]>;
|
|
20
|
+
searchSongs: (query: string) => Promise<Song[]>;
|
|
21
|
+
clearCache: () => Promise<boolean>;
|
|
22
|
+
startFileMonitoring: () => void;
|
|
23
|
+
stopFileMonitoring: () => void;
|
|
24
|
+
addEventListener: (event: string, listener: (data: any) => void) => {
|
|
25
|
+
remove: () => void;
|
|
26
|
+
};
|
|
27
|
+
removeAllListeners: (event?: string) => void;
|
|
28
|
+
};
|
|
29
|
+
export declare const Player: {
|
|
30
|
+
play: (uri: string) => Promise<void>;
|
|
31
|
+
playFromQueue: (index: number) => void;
|
|
32
|
+
pause: () => void;
|
|
33
|
+
stop: () => void;
|
|
34
|
+
seekTo: (position: number) => void;
|
|
35
|
+
skipToNext: () => void;
|
|
36
|
+
skipToPrevious: () => void;
|
|
37
|
+
setVolume: (volume: number) => void;
|
|
38
|
+
setPlaybackRate: (rate: number) => void;
|
|
39
|
+
setQueue: (songs: Song[]) => void;
|
|
40
|
+
addToQueue: (songs: Song[]) => void;
|
|
41
|
+
clearQueue: () => void;
|
|
42
|
+
getQueue: () => Promise<Song[]>;
|
|
43
|
+
getCurrentTrack: () => Promise<Song>;
|
|
44
|
+
getPlaybackState: () => Promise<PlaybackState>;
|
|
45
|
+
getCurrentTime: () => Promise<number>;
|
|
46
|
+
getDuration: () => Promise<number>;
|
|
47
|
+
isPlaying: () => Promise<boolean>;
|
|
48
|
+
setRepeatMode: (mode: "none" | "one" | "all") => void;
|
|
49
|
+
setShuffleMode: (enabled: boolean) => void;
|
|
50
|
+
setEqualizerPreset: (preset: string) => void;
|
|
51
|
+
setEqualizerBands: (bands: number[]) => void;
|
|
52
|
+
getEqualizerPresets: () => Promise<string[]>;
|
|
53
|
+
enableEqualizer: (enabled: boolean) => void;
|
|
54
|
+
setSleepTimer: (minutes: number) => void;
|
|
55
|
+
cancelSleepTimer: () => void;
|
|
56
|
+
setupBackgroundPlayback: (config?: any) => void;
|
|
57
|
+
stopBackgroundPlayback: () => void;
|
|
58
|
+
addEventListener: (event: string, listener: (data: any) => void) => {
|
|
59
|
+
remove: () => void;
|
|
60
|
+
};
|
|
61
|
+
removeAllListeners: (event?: string) => void;
|
|
62
|
+
};
|
|
63
|
+
export declare const Metadata: {
|
|
64
|
+
extractMetadata: (uri: string) => Promise<any>;
|
|
65
|
+
getAlbumArt: (uri: string, size?: number) => Promise<string>;
|
|
66
|
+
getLyrics: (uri: string) => Promise<string | null>;
|
|
67
|
+
updateMetadata: (uri: string, metadata: any) => Promise<boolean>;
|
|
68
|
+
};
|
|
69
|
+
export declare const Notifications: {
|
|
70
|
+
setupNotificationChannel: () => void;
|
|
71
|
+
updateNotification: (metadata: any) => void;
|
|
72
|
+
hideNotification: () => void;
|
|
73
|
+
showNotification: () => void;
|
|
74
|
+
};
|
|
75
|
+
declare const _default: {
|
|
76
|
+
Scanner: {
|
|
77
|
+
requestStoragePermission: () => Promise<boolean>;
|
|
78
|
+
checkPermissionStatus: () => Promise<boolean>;
|
|
79
|
+
scanMusicFiles: (options?: ScannerOptions) => Promise<any>;
|
|
80
|
+
getCachedSongs: (options?: any) => Promise<Song[]>;
|
|
81
|
+
deleteSong: (songId: string) => Promise<boolean>;
|
|
82
|
+
addToFavorites: (songId: string) => Promise<boolean>;
|
|
83
|
+
removeFromFavorites: (songId: string) => Promise<boolean>;
|
|
84
|
+
getAlbums: () => Promise<Album[]>;
|
|
85
|
+
getArtists: () => Promise<Artist[]>;
|
|
86
|
+
searchSongs: (query: string) => Promise<Song[]>;
|
|
87
|
+
clearCache: () => Promise<boolean>;
|
|
88
|
+
startFileMonitoring: () => void;
|
|
89
|
+
stopFileMonitoring: () => void;
|
|
90
|
+
addEventListener: (event: string, listener: (data: any) => void) => {
|
|
91
|
+
remove: () => void;
|
|
92
|
+
};
|
|
93
|
+
removeAllListeners: (event?: string) => void;
|
|
94
|
+
};
|
|
95
|
+
Player: {
|
|
96
|
+
play: (uri: string) => Promise<void>;
|
|
97
|
+
playFromQueue: (index: number) => void;
|
|
98
|
+
pause: () => void;
|
|
99
|
+
stop: () => void;
|
|
100
|
+
seekTo: (position: number) => void;
|
|
101
|
+
skipToNext: () => void;
|
|
102
|
+
skipToPrevious: () => void;
|
|
103
|
+
setVolume: (volume: number) => void;
|
|
104
|
+
setPlaybackRate: (rate: number) => void;
|
|
105
|
+
setQueue: (songs: Song[]) => void;
|
|
106
|
+
addToQueue: (songs: Song[]) => void;
|
|
107
|
+
clearQueue: () => void;
|
|
108
|
+
getQueue: () => Promise<Song[]>;
|
|
109
|
+
getCurrentTrack: () => Promise<Song>;
|
|
110
|
+
getPlaybackState: () => Promise<PlaybackState>;
|
|
111
|
+
getCurrentTime: () => Promise<number>;
|
|
112
|
+
getDuration: () => Promise<number>;
|
|
113
|
+
isPlaying: () => Promise<boolean>;
|
|
114
|
+
setRepeatMode: (mode: "none" | "one" | "all") => void;
|
|
115
|
+
setShuffleMode: (enabled: boolean) => void;
|
|
116
|
+
setEqualizerPreset: (preset: string) => void;
|
|
117
|
+
setEqualizerBands: (bands: number[]) => void;
|
|
118
|
+
getEqualizerPresets: () => Promise<string[]>;
|
|
119
|
+
enableEqualizer: (enabled: boolean) => void;
|
|
120
|
+
setSleepTimer: (minutes: number) => void;
|
|
121
|
+
cancelSleepTimer: () => void;
|
|
122
|
+
setupBackgroundPlayback: (config?: any) => void;
|
|
123
|
+
stopBackgroundPlayback: () => void;
|
|
124
|
+
addEventListener: (event: string, listener: (data: any) => void) => {
|
|
125
|
+
remove: () => void;
|
|
126
|
+
};
|
|
127
|
+
removeAllListeners: (event?: string) => void;
|
|
128
|
+
};
|
|
129
|
+
Metadata: {
|
|
130
|
+
extractMetadata: (uri: string) => Promise<any>;
|
|
131
|
+
getAlbumArt: (uri: string, size?: number) => Promise<string>;
|
|
132
|
+
getLyrics: (uri: string) => Promise<string | null>;
|
|
133
|
+
updateMetadata: (uri: string, metadata: any) => Promise<boolean>;
|
|
134
|
+
};
|
|
135
|
+
Notifications: {
|
|
136
|
+
setupNotificationChannel: () => void;
|
|
137
|
+
updateNotification: (metadata: any) => void;
|
|
138
|
+
hideNotification: () => void;
|
|
139
|
+
showNotification: () => void;
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
export default _default;
|
|
143
|
+
export declare const isAndroid: boolean;
|
|
144
|
+
export declare const isIOS: boolean;
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isIOS = exports.isAndroid = exports.Notifications = exports.Metadata = exports.Player = exports.Scanner = exports.usePermissions = exports.useMusicScanner = exports.useMusicPlayer = exports.AudioExtensions = exports.EqualizerPresets = exports.RepeatMode = exports.PlayerEvents = exports.ScannerEvents = void 0;
|
|
4
|
+
const react_native_1 = require("react-native");
|
|
5
|
+
// Import constants
|
|
6
|
+
const constants_1 = require("./utils/constants");
|
|
7
|
+
Object.defineProperty(exports, "ScannerEvents", { enumerable: true, get: function () { return constants_1.ScannerEvents; } });
|
|
8
|
+
Object.defineProperty(exports, "PlayerEvents", { enumerable: true, get: function () { return constants_1.PlayerEvents; } });
|
|
9
|
+
Object.defineProperty(exports, "RepeatMode", { enumerable: true, get: function () { return constants_1.RepeatMode; } });
|
|
10
|
+
Object.defineProperty(exports, "EqualizerPresets", { enumerable: true, get: function () { return constants_1.EqualizerPresets; } });
|
|
11
|
+
Object.defineProperty(exports, "AudioExtensions", { enumerable: true, get: function () { return constants_1.AudioExtensions; } });
|
|
12
|
+
// Hooks
|
|
13
|
+
var useMusicPlayer_1 = require("./hooks/useMusicPlayer");
|
|
14
|
+
Object.defineProperty(exports, "useMusicPlayer", { enumerable: true, get: function () { return useMusicPlayer_1.useMusicPlayer; } });
|
|
15
|
+
var useMusicScanner_1 = require("./hooks/useMusicScanner");
|
|
16
|
+
Object.defineProperty(exports, "useMusicScanner", { enumerable: true, get: function () { return useMusicScanner_1.useMusicScanner; } });
|
|
17
|
+
var usePermissions_1 = require("./hooks/usePermissions");
|
|
18
|
+
Object.defineProperty(exports, "usePermissions", { enumerable: true, get: function () { return usePermissions_1.usePermissions; } });
|
|
19
|
+
// Optional UI Components (if needed)
|
|
20
|
+
// export { MusicPlayerUI } from './components/MusicPlayerUI';
|
|
21
|
+
// export { MusicList } from './components/MusicList';
|
|
22
|
+
// Native Modules
|
|
23
|
+
const { ScannerModule, PlayerModule, MetadataModule, NotificationModule } = react_native_1.NativeModules;
|
|
24
|
+
// Event Emitters
|
|
25
|
+
const scannerEventEmitter = new react_native_1.NativeEventEmitter(ScannerModule);
|
|
26
|
+
const playerEventEmitter = new react_native_1.NativeEventEmitter(PlayerModule);
|
|
27
|
+
// Check if native modules are available
|
|
28
|
+
if (!ScannerModule || !PlayerModule) {
|
|
29
|
+
console.warn('react-native-mp3 native modules are not available. Make sure to link the package properly.');
|
|
30
|
+
}
|
|
31
|
+
// Scanner Module Functions
|
|
32
|
+
exports.Scanner = {
|
|
33
|
+
// Permission
|
|
34
|
+
requestStoragePermission: () => ScannerModule.requestStoragePermission(),
|
|
35
|
+
checkPermissionStatus: () => ScannerModule.checkPermissionStatus(),
|
|
36
|
+
// Scanning
|
|
37
|
+
scanMusicFiles: (options) => ScannerModule.scanMusicFiles(options || {}),
|
|
38
|
+
getCachedSongs: (options) => ScannerModule.getCachedSongs(options || {}),
|
|
39
|
+
// File Operations
|
|
40
|
+
deleteSong: (songId) => ScannerModule.deleteSong(songId),
|
|
41
|
+
addToFavorites: (songId) => ScannerModule.addToFavorites(songId),
|
|
42
|
+
removeFromFavorites: (songId) => ScannerModule.removeFromFavorites(songId),
|
|
43
|
+
// Metadata
|
|
44
|
+
getAlbums: () => ScannerModule.getAlbums(),
|
|
45
|
+
getArtists: () => ScannerModule.getArtists(),
|
|
46
|
+
searchSongs: (query) => ScannerModule.searchSongs(query),
|
|
47
|
+
// Cache Management
|
|
48
|
+
clearCache: () => ScannerModule.clearCache(),
|
|
49
|
+
// File Monitoring
|
|
50
|
+
startFileMonitoring: () => ScannerModule.startFileMonitoring(),
|
|
51
|
+
stopFileMonitoring: () => ScannerModule.stopFileMonitoring(),
|
|
52
|
+
// Events
|
|
53
|
+
addEventListener: (event, listener) => {
|
|
54
|
+
const subscription = scannerEventEmitter.addListener(event, listener);
|
|
55
|
+
return { remove: () => subscription.remove() };
|
|
56
|
+
},
|
|
57
|
+
removeAllListeners: (event) => {
|
|
58
|
+
if (event) {
|
|
59
|
+
scannerEventEmitter.removeAllListeners(event);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// Remove all events by specifying each event type
|
|
63
|
+
const scannerEventTypes = Object.values(constants_1.ScannerEvents);
|
|
64
|
+
scannerEventTypes.forEach(eventType => {
|
|
65
|
+
scannerEventEmitter.removeAllListeners(eventType);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
// Player Module Functions
|
|
71
|
+
exports.Player = {
|
|
72
|
+
// Playback Control
|
|
73
|
+
play: (uri) => PlayerModule.play(uri),
|
|
74
|
+
playFromQueue: (index) => PlayerModule.playFromQueue(index),
|
|
75
|
+
pause: () => PlayerModule.pause(),
|
|
76
|
+
stop: () => PlayerModule.stop(),
|
|
77
|
+
seekTo: (position) => PlayerModule.seekTo(position),
|
|
78
|
+
skipToNext: () => PlayerModule.skipToNext(),
|
|
79
|
+
skipToPrevious: () => PlayerModule.skipToPrevious(),
|
|
80
|
+
setVolume: (volume) => PlayerModule.setVolume(volume),
|
|
81
|
+
setPlaybackRate: (rate) => PlayerModule.setPlaybackRate(rate),
|
|
82
|
+
// Queue Management
|
|
83
|
+
setQueue: (songs) => PlayerModule.setQueue(songs),
|
|
84
|
+
addToQueue: (songs) => PlayerModule.addToQueue(songs),
|
|
85
|
+
clearQueue: () => PlayerModule.clearQueue(),
|
|
86
|
+
getQueue: () => PlayerModule.getQueue(),
|
|
87
|
+
getCurrentTrack: () => PlayerModule.getCurrentTrack(),
|
|
88
|
+
// Playback State
|
|
89
|
+
getPlaybackState: () => PlayerModule.getPlaybackState(),
|
|
90
|
+
getCurrentTime: () => PlayerModule.getCurrentTime(),
|
|
91
|
+
getDuration: () => PlayerModule.getDuration(),
|
|
92
|
+
isPlaying: () => PlayerModule.isPlaying(),
|
|
93
|
+
// Playback Modes
|
|
94
|
+
setRepeatMode: (mode) => PlayerModule.setRepeatMode(mode),
|
|
95
|
+
setShuffleMode: (enabled) => PlayerModule.setShuffleMode(enabled),
|
|
96
|
+
// Equalizer
|
|
97
|
+
setEqualizerPreset: (preset) => PlayerModule.setEqualizerPreset(preset),
|
|
98
|
+
setEqualizerBands: (bands) => PlayerModule.setEqualizerBands(bands),
|
|
99
|
+
getEqualizerPresets: () => PlayerModule.getEqualizerPresets(),
|
|
100
|
+
enableEqualizer: (enabled) => PlayerModule.enableEqualizer(enabled),
|
|
101
|
+
// Sleep Timer
|
|
102
|
+
setSleepTimer: (minutes) => PlayerModule.setSleepTimer(minutes),
|
|
103
|
+
cancelSleepTimer: () => PlayerModule.cancelSleepTimer(),
|
|
104
|
+
// Background Playback
|
|
105
|
+
setupBackgroundPlayback: (config) => PlayerModule.setupBackgroundPlayback(config || {}),
|
|
106
|
+
stopBackgroundPlayback: () => PlayerModule.stopBackgroundPlayback(),
|
|
107
|
+
// Events
|
|
108
|
+
addEventListener: (event, listener) => {
|
|
109
|
+
const subscription = playerEventEmitter.addListener(event, listener);
|
|
110
|
+
return { remove: () => subscription.remove() };
|
|
111
|
+
},
|
|
112
|
+
removeAllListeners: (event) => {
|
|
113
|
+
if (event) {
|
|
114
|
+
playerEventEmitter.removeAllListeners(event);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
// Remove all events by specifying each event type
|
|
118
|
+
const playerEventTypes = Object.values(constants_1.PlayerEvents);
|
|
119
|
+
playerEventTypes.forEach(eventType => {
|
|
120
|
+
playerEventEmitter.removeAllListeners(eventType);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
// Metadata Module Functions
|
|
126
|
+
exports.Metadata = {
|
|
127
|
+
extractMetadata: (uri) => MetadataModule.extractMetadata(uri),
|
|
128
|
+
getAlbumArt: (uri, size) => MetadataModule.getAlbumArt(uri, size || 300),
|
|
129
|
+
getLyrics: (uri) => MetadataModule.getLyrics(uri),
|
|
130
|
+
updateMetadata: (uri, metadata) => MetadataModule.updateMetadata(uri, metadata),
|
|
131
|
+
};
|
|
132
|
+
// Notification Module Functions
|
|
133
|
+
exports.Notifications = {
|
|
134
|
+
setupNotificationChannel: () => NotificationModule.setupNotificationChannel(),
|
|
135
|
+
updateNotification: (metadata) => NotificationModule.updateNotification(metadata),
|
|
136
|
+
hideNotification: () => NotificationModule.hideNotification(),
|
|
137
|
+
showNotification: () => NotificationModule.showNotification(),
|
|
138
|
+
};
|
|
139
|
+
// Default export
|
|
140
|
+
exports.default = {
|
|
141
|
+
Scanner: exports.Scanner,
|
|
142
|
+
Player: exports.Player,
|
|
143
|
+
Metadata: exports.Metadata,
|
|
144
|
+
Notifications: exports.Notifications,
|
|
145
|
+
};
|
|
146
|
+
// Platform check
|
|
147
|
+
exports.isAndroid = react_native_1.Platform.OS === 'android';
|
|
148
|
+
exports.isIOS = react_native_1.Platform.OS === 'ios';
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export interface Song {
|
|
2
|
+
id: string;
|
|
3
|
+
title: string;
|
|
4
|
+
artist: string;
|
|
5
|
+
album: string;
|
|
6
|
+
duration: number;
|
|
7
|
+
path: string;
|
|
8
|
+
uri: string;
|
|
9
|
+
albumArtUri?: string;
|
|
10
|
+
size: number;
|
|
11
|
+
mimeType: string;
|
|
12
|
+
trackNumber: number;
|
|
13
|
+
year?: number;
|
|
14
|
+
genre?: string;
|
|
15
|
+
dateAdded: number;
|
|
16
|
+
lastModified: number;
|
|
17
|
+
isFavorite: boolean;
|
|
18
|
+
playCount: number;
|
|
19
|
+
lastPlayed?: number;
|
|
20
|
+
bitrate?: number;
|
|
21
|
+
sampleRate?: number;
|
|
22
|
+
channels?: number;
|
|
23
|
+
composer?: string;
|
|
24
|
+
bookmark: number;
|
|
25
|
+
isPodcast: boolean;
|
|
26
|
+
rating?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface Album {
|
|
29
|
+
name: string;
|
|
30
|
+
songCount: number;
|
|
31
|
+
albumArtUri?: string;
|
|
32
|
+
artist?: string;
|
|
33
|
+
year?: number;
|
|
34
|
+
}
|
|
35
|
+
export interface Artist {
|
|
36
|
+
name: string;
|
|
37
|
+
songCount: number;
|
|
38
|
+
albumCount: number;
|
|
39
|
+
}
|
|
40
|
+
export interface Playlist {
|
|
41
|
+
id: string;
|
|
42
|
+
name: string;
|
|
43
|
+
songCount: number;
|
|
44
|
+
thumbnailUri?: string;
|
|
45
|
+
createdAt: number;
|
|
46
|
+
}
|
|
47
|
+
export interface PlaybackState {
|
|
48
|
+
isPlaying: boolean;
|
|
49
|
+
currentTime: number;
|
|
50
|
+
duration: number;
|
|
51
|
+
buffered?: number;
|
|
52
|
+
playbackRate: number;
|
|
53
|
+
volume: number;
|
|
54
|
+
repeatMode: 'none' | 'one' | 'all';
|
|
55
|
+
shuffleMode: boolean;
|
|
56
|
+
currentSong?: Song;
|
|
57
|
+
queue: Song[];
|
|
58
|
+
queuePosition: number;
|
|
59
|
+
error?: string;
|
|
60
|
+
}
|
|
61
|
+
export interface EqualizerPreset {
|
|
62
|
+
name: string;
|
|
63
|
+
bands: number[];
|
|
64
|
+
}
|
|
65
|
+
export interface ScannerOptions {
|
|
66
|
+
forceRescan?: boolean;
|
|
67
|
+
paths?: string[];
|
|
68
|
+
maxFiles?: number;
|
|
69
|
+
extensions?: string[];
|
|
70
|
+
}
|
|
71
|
+
export interface PlayerOptions {
|
|
72
|
+
autoPlay?: boolean;
|
|
73
|
+
keepAwake?: boolean;
|
|
74
|
+
volume?: number;
|
|
75
|
+
speed?: number;
|
|
76
|
+
repeatMode?: 'none' | 'one' | 'all';
|
|
77
|
+
audioFocus?: boolean;
|
|
78
|
+
ducking?: boolean;
|
|
79
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type { Song, Album, Artist, Playlist, PlaybackState, EqualizerPreset, ScannerOptions, PlayerOptions } from './common.types';
|
|
2
|
+
export type { ScannerEvents, ScannerEventType } from './scanner.types';
|
|
3
|
+
export type { PlayerEvents, PlayerEventType } from './player.types';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface PlayerEvents {
|
|
2
|
+
PLAYBACK_STATE_CHANGED: {
|
|
3
|
+
isPlaying: boolean;
|
|
4
|
+
currentTime: number;
|
|
5
|
+
duration: number;
|
|
6
|
+
buffered?: number;
|
|
7
|
+
};
|
|
8
|
+
PLAYBACK_QUEUE_CHANGED: {
|
|
9
|
+
queue: any[];
|
|
10
|
+
position: number;
|
|
11
|
+
};
|
|
12
|
+
PLAYBACK_ERROR: {
|
|
13
|
+
error: string;
|
|
14
|
+
songId?: string;
|
|
15
|
+
};
|
|
16
|
+
PLAYBACK_COMPLETE: {
|
|
17
|
+
songId: string;
|
|
18
|
+
};
|
|
19
|
+
PLAYBACK_NEXT: {
|
|
20
|
+
songId: string;
|
|
21
|
+
};
|
|
22
|
+
PLAYBACK_PREVIOUS: {
|
|
23
|
+
songId: string;
|
|
24
|
+
};
|
|
25
|
+
EQUALIZER_CHANGED: {
|
|
26
|
+
enabled: boolean;
|
|
27
|
+
preset?: string;
|
|
28
|
+
bands?: number[];
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export type PlayerEventType = keyof PlayerEvents;
|
|
32
|
+
export interface AudioFocusConfig {
|
|
33
|
+
focusGain: number;
|
|
34
|
+
willPauseWhenDucked: boolean;
|
|
35
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface ScannerEvents {
|
|
2
|
+
SCAN_PROGRESS: {
|
|
3
|
+
processed: number;
|
|
4
|
+
total: number;
|
|
5
|
+
percentage: number;
|
|
6
|
+
};
|
|
7
|
+
SCAN_COMPLETE: {
|
|
8
|
+
totalSongs: number;
|
|
9
|
+
scanPaths: string[];
|
|
10
|
+
};
|
|
11
|
+
FILE_ADDED: {
|
|
12
|
+
songId: string;
|
|
13
|
+
path: string;
|
|
14
|
+
song: any;
|
|
15
|
+
};
|
|
16
|
+
FILE_DELETED: {
|
|
17
|
+
songId: string;
|
|
18
|
+
path: string;
|
|
19
|
+
};
|
|
20
|
+
PERMISSION_STATUS: {
|
|
21
|
+
granted: boolean;
|
|
22
|
+
message: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export type ScannerEventType = keyof ScannerEvents;
|
|
26
|
+
export interface ScanResult {
|
|
27
|
+
totalSongs: number;
|
|
28
|
+
scanPaths: string[];
|
|
29
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare const ScannerEvents: {
|
|
2
|
+
readonly SCAN_PROGRESS: "SCAN_PROGRESS";
|
|
3
|
+
readonly SCAN_COMPLETE: "SCAN_COMPLETE";
|
|
4
|
+
readonly FILE_ADDED: "FILE_ADDED";
|
|
5
|
+
readonly FILE_DELETED: "FILE_DELETED";
|
|
6
|
+
readonly PERMISSION_STATUS: "PERMISSION_STATUS";
|
|
7
|
+
};
|
|
8
|
+
export declare const PlayerEvents: {
|
|
9
|
+
readonly PLAYBACK_STATE_CHANGED: "PLAYBACK_STATE_CHANGED";
|
|
10
|
+
readonly PLAYBACK_QUEUE_CHANGED: "PLAYBACK_QUEUE_CHANGED";
|
|
11
|
+
readonly PLAYBACK_ERROR: "PLAYBACK_ERROR";
|
|
12
|
+
readonly PLAYBACK_COMPLETE: "PLAYBACK_COMPLETE";
|
|
13
|
+
readonly PLAYBACK_NEXT: "PLAYBACK_NEXT";
|
|
14
|
+
readonly PLAYBACK_PREVIOUS: "PLAYBACK_PREVIOUS";
|
|
15
|
+
readonly EQUALIZER_CHANGED: "EQUALIZER_CHANGED";
|
|
16
|
+
};
|
|
17
|
+
export declare const RepeatMode: {
|
|
18
|
+
readonly NONE: "none";
|
|
19
|
+
readonly ONE: "one";
|
|
20
|
+
readonly ALL: "all";
|
|
21
|
+
};
|
|
22
|
+
export declare const EqualizerPresets: {
|
|
23
|
+
readonly NORMAL: "normal";
|
|
24
|
+
readonly ROCK: "rock";
|
|
25
|
+
readonly POP: "pop";
|
|
26
|
+
readonly JAZZ: "jazz";
|
|
27
|
+
readonly CLASSIC: "classic";
|
|
28
|
+
readonly DANCE: "dance";
|
|
29
|
+
readonly FLAT: "flat";
|
|
30
|
+
};
|
|
31
|
+
export declare const AudioExtensions: string[];
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AudioExtensions = exports.EqualizerPresets = exports.RepeatMode = exports.PlayerEvents = exports.ScannerEvents = void 0;
|
|
4
|
+
exports.ScannerEvents = {
|
|
5
|
+
SCAN_PROGRESS: 'SCAN_PROGRESS',
|
|
6
|
+
SCAN_COMPLETE: 'SCAN_COMPLETE',
|
|
7
|
+
FILE_ADDED: 'FILE_ADDED',
|
|
8
|
+
FILE_DELETED: 'FILE_DELETED',
|
|
9
|
+
PERMISSION_STATUS: 'PERMISSION_STATUS',
|
|
10
|
+
};
|
|
11
|
+
exports.PlayerEvents = {
|
|
12
|
+
PLAYBACK_STATE_CHANGED: 'PLAYBACK_STATE_CHANGED',
|
|
13
|
+
PLAYBACK_QUEUE_CHANGED: 'PLAYBACK_QUEUE_CHANGED',
|
|
14
|
+
PLAYBACK_ERROR: 'PLAYBACK_ERROR',
|
|
15
|
+
PLAYBACK_COMPLETE: 'PLAYBACK_COMPLETE',
|
|
16
|
+
PLAYBACK_NEXT: 'PLAYBACK_NEXT',
|
|
17
|
+
PLAYBACK_PREVIOUS: 'PLAYBACK_PREVIOUS',
|
|
18
|
+
EQUALIZER_CHANGED: 'EQUALIZER_CHANGED',
|
|
19
|
+
};
|
|
20
|
+
exports.RepeatMode = {
|
|
21
|
+
NONE: 'none',
|
|
22
|
+
ONE: 'one',
|
|
23
|
+
ALL: 'all',
|
|
24
|
+
};
|
|
25
|
+
exports.EqualizerPresets = {
|
|
26
|
+
NORMAL: 'normal',
|
|
27
|
+
ROCK: 'rock',
|
|
28
|
+
POP: 'pop',
|
|
29
|
+
JAZZ: 'jazz',
|
|
30
|
+
CLASSIC: 'classic',
|
|
31
|
+
DANCE: 'dance',
|
|
32
|
+
FLAT: 'flat',
|
|
33
|
+
};
|
|
34
|
+
exports.AudioExtensions = [
|
|
35
|
+
'.mp3',
|
|
36
|
+
'.mp4',
|
|
37
|
+
'.m4a',
|
|
38
|
+
'.aac',
|
|
39
|
+
'.flac',
|
|
40
|
+
'.wav',
|
|
41
|
+
'.ogg',
|
|
42
|
+
'.opus',
|
|
43
|
+
'.wma',
|
|
44
|
+
'.amr',
|
|
45
|
+
'.aif',
|
|
46
|
+
'.aiff',
|
|
47
|
+
'.mid',
|
|
48
|
+
'.midi',
|
|
49
|
+
'.xmf',
|
|
50
|
+
'.mxmf',
|
|
51
|
+
'.rtttl',
|
|
52
|
+
'.rtx',
|
|
53
|
+
'.ota',
|
|
54
|
+
'.imy',
|
|
55
|
+
];
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "react-native-mp3",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A comprehensive music player for React Native with offline/online playback, file scanning, metadata extraction, and background playback",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"types": "lib/index.d.ts",
|
|
7
|
+
"react-native": "src/index.ts",
|
|
8
|
+
"source": "src/index.ts",
|
|
9
|
+
"files": [
|
|
10
|
+
"src",
|
|
11
|
+
"android",
|
|
12
|
+
"lib",
|
|
13
|
+
"!**/__tests__",
|
|
14
|
+
"!**/__fixtures__",
|
|
15
|
+
"!**/__mocks__",
|
|
16
|
+
"!example"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"prepare": "npm run build",
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"dev": "tsc --watch",
|
|
22
|
+
"lint": "eslint src --ext .ts,.tsx",
|
|
23
|
+
"prepack": "npm run build",
|
|
24
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"react-native",
|
|
28
|
+
"android",
|
|
29
|
+
"music",
|
|
30
|
+
"player",
|
|
31
|
+
"mp3",
|
|
32
|
+
"audio",
|
|
33
|
+
"scanner",
|
|
34
|
+
"metadata"
|
|
35
|
+
],
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "https://github.com/RakeshPrasad28/react-native-mp3.git"
|
|
39
|
+
},
|
|
40
|
+
"author": "Rakesh",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/yourusername/react-native-mp3/issues"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://github.com/yourusername/react-native-mp3#readme",
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"react": ">=16.8.0",
|
|
48
|
+
"react-native": ">=0.60.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/react": "^18.0.0",
|
|
52
|
+
"@types/react-native": "^0.70.0",
|
|
53
|
+
"typescript": "^4.9.0",
|
|
54
|
+
"@react-native-community/eslint-config": "^3.2.0",
|
|
55
|
+
"eslint": "^8.0.0",
|
|
56
|
+
"react": "18.2.0",
|
|
57
|
+
"react-native": "0.72.0"
|
|
58
|
+
},
|
|
59
|
+
"engines": {
|
|
60
|
+
"node": ">=14.0.0"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
File without changes
|
|
File without changes
|