react-native-nitro-player 0.0.1 → 0.3.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +1 -610
  2. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAudioDevices.kt +37 -29
  3. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridTrackPlayer.kt +4 -0
  4. package/android/src/main/java/com/margelo/nitro/nitroplayer/core/TrackPlayerCore.kt +16 -0
  5. package/ios/HybridAudioRoutePicker.swift +47 -46
  6. package/ios/HybridTrackPlayer.swift +4 -0
  7. package/ios/core/TrackPlayerCore.swift +41 -0
  8. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.cpp +9 -0
  9. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.hpp +1 -0
  10. package/nitrogen/generated/android/c++/JRepeatMode.hpp +62 -0
  11. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridTrackPlayerSpec.kt +4 -0
  12. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/RepeatMode.kt +22 -0
  13. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Umbrella.hpp +3 -0
  14. package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.hpp +11 -0
  15. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec.swift +1 -0
  16. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec_cxx.swift +12 -0
  17. package/nitrogen/generated/ios/swift/RepeatMode.swift +44 -0
  18. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.cpp +1 -0
  19. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.hpp +4 -0
  20. package/nitrogen/generated/shared/c++/RepeatMode.hpp +80 -0
  21. package/package.json +7 -7
  22. package/src/index.ts +1 -1
  23. package/src/specs/TrackPlayer.nitro.ts +3 -0
  24. package/lib/hooks/index.d.ts +0 -6
  25. package/lib/hooks/index.js +0 -6
  26. package/lib/hooks/useAndroidAutoConnection.d.ts +0 -13
  27. package/lib/hooks/useAndroidAutoConnection.js +0 -26
  28. package/lib/hooks/useAudioDevices.d.ts +0 -26
  29. package/lib/hooks/useAudioDevices.js +0 -55
  30. package/lib/hooks/useOnChangeTrack.d.ts +0 -9
  31. package/lib/hooks/useOnChangeTrack.js +0 -17
  32. package/lib/hooks/useOnPlaybackProgressChange.d.ts +0 -9
  33. package/lib/hooks/useOnPlaybackProgressChange.js +0 -19
  34. package/lib/hooks/useOnPlaybackStateChange.d.ts +0 -9
  35. package/lib/hooks/useOnPlaybackStateChange.js +0 -17
  36. package/lib/hooks/useOnSeek.d.ts +0 -8
  37. package/lib/hooks/useOnSeek.js +0 -17
  38. package/lib/index.d.ts +0 -14
  39. package/lib/index.js +0 -24
  40. package/lib/specs/AndroidAutoMediaLibrary.nitro.d.ts +0 -21
  41. package/lib/specs/AndroidAutoMediaLibrary.nitro.js +0 -1
  42. package/lib/specs/AudioDevices.nitro.d.ts +0 -24
  43. package/lib/specs/AudioDevices.nitro.js +0 -1
  44. package/lib/specs/AudioRoutePicker.nitro.d.ts +0 -10
  45. package/lib/specs/AudioRoutePicker.nitro.js +0 -1
  46. package/lib/specs/TrackPlayer.nitro.d.ts +0 -39
  47. package/lib/specs/TrackPlayer.nitro.js +0 -1
  48. package/lib/types/AndroidAutoMediaLibrary.d.ts +0 -44
  49. package/lib/types/AndroidAutoMediaLibrary.js +0 -1
  50. package/lib/types/PlayerQueue.d.ts +0 -32
  51. package/lib/types/PlayerQueue.js +0 -1
  52. package/lib/utils/androidAutoMediaLibrary.d.ts +0 -47
  53. package/lib/utils/androidAutoMediaLibrary.js +0 -62
package/README.md CHANGED
@@ -1,610 +1 @@
1
- # React Native Nitro Player
2
-
3
- A powerful audio player library for React Native with playlist management, playback controls, and support for Android Auto and CarPlay.
4
-
5
- ## Installation
6
-
7
- ```bash
8
- npm install react-native-nitro-player
9
- # or
10
- yarn add react-native-nitro-player
11
- ```
12
-
13
- ### Peer Dependencies
14
-
15
- Make sure you have these installed:
16
-
17
- ```bash
18
- npm install react-native-nitro-modules
19
- ```
20
-
21
- ## Quick Start
22
-
23
- ### 1. Configure the Player
24
-
25
- Configure the player before using it in your app:
26
-
27
- ```typescript
28
- import { TrackPlayer } from 'react-native-nitro-player'
29
-
30
- TrackPlayer.configure({
31
- androidAutoEnabled: true,
32
- carPlayEnabled: false,
33
- showInNotification: true,
34
- })
35
- ```
36
-
37
- ### 2. Create Playlists
38
-
39
- ```typescript
40
- import { PlayerQueue } from 'react-native-nitro-player'
41
- import type { TrackItem } from 'react-native-nitro-player'
42
-
43
- const tracks: TrackItem[] = [
44
- {
45
- id: '1',
46
- title: 'Song Title',
47
- artist: 'Artist Name',
48
- album: 'Album Name',
49
- duration: 180.0, // in seconds
50
- url: 'https://example.com/song.mp3',
51
- artwork: 'https://example.com/artwork.jpg',
52
- },
53
- ]
54
-
55
- // Create a playlist
56
- const playlistId = PlayerQueue.createPlaylist(
57
- 'My Playlist',
58
- 'Playlist description',
59
- 'https://example.com/playlist-artwork.jpg'
60
- )
61
-
62
- // Add tracks to the playlist
63
- PlayerQueue.addTracksToPlaylist(playlistId, tracks)
64
- ```
65
-
66
- ### 3. Play Music
67
-
68
- ```typescript
69
- import { TrackPlayer, PlayerQueue } from 'react-native-nitro-player'
70
-
71
- // Load and play a playlist
72
- PlayerQueue.loadPlaylist(playlistId)
73
-
74
- // Or play a specific song
75
- TrackPlayer.playSong('song-id', playlistId)
76
-
77
- // Basic controls
78
- TrackPlayer.play()
79
- TrackPlayer.pause()
80
- TrackPlayer.skipToNext()
81
- TrackPlayer.skipToPrevious()
82
- TrackPlayer.seek(30) // Seek to 30 seconds
83
- ```
84
-
85
- ## Core Concepts
86
-
87
- ### PlayerQueue
88
-
89
- Manages playlists and tracks. Use it to:
90
-
91
- - Create, update, and delete playlists
92
- - Add or remove tracks from playlists
93
- - Load playlists for playback
94
- - Listen to playlist changes
95
-
96
- ### TrackPlayer
97
-
98
- Controls playback. Use it to:
99
-
100
- - Play, pause, and seek
101
- - Skip tracks
102
- - Get current player state
103
- - Listen to playback events
104
-
105
- ## React Hooks
106
-
107
- The library provides React hooks for reactive state management. These hooks automatically update your components when player state changes.
108
-
109
- ### `useOnChangeTrack()`
110
-
111
- Returns the current track and the reason why it changed.
112
-
113
- **Returns:**
114
-
115
- - `track: TrackItem | undefined` - The current track, or `undefined` if no track is playing
116
- - `reason: Reason | undefined` - The reason for the track change (`'user_action'`, `'skip'`, `'end'`, or `'error'`)
117
-
118
- ### `useOnPlaybackStateChange()`
119
-
120
- Returns the current playback state and the reason for the state change.
121
-
122
- **Returns:**
123
-
124
- - `state: TrackPlayerState | undefined` - Current playback state (`'playing'`, `'paused'`, or `'stopped'`)
125
- - `reason: Reason | undefined` - The reason for the state change
126
-
127
- ### `useOnPlaybackProgressChange()`
128
-
129
- Returns real-time playback progress updates.
130
-
131
- **Returns:**
132
-
133
- - `position: number` - Current playback position in seconds
134
- - `totalDuration: number` - Total duration of the current track in seconds
135
- - `isManuallySeeked: boolean | undefined` - `true` if the user manually seeked, `undefined` otherwise
136
-
137
- ### `useOnSeek()`
138
-
139
- Returns information about the last seek event.
140
-
141
- **Returns:**
142
-
143
- - `position: number | undefined` - The position where the user seeked to, or `undefined` if no seek has occurred
144
- - `totalDuration: number | undefined` - The total duration at the time of seek, or `undefined` if no seek has occurred
145
-
146
- ### `useAndroidAutoConnection()`
147
-
148
- Monitors Android Auto connection status.
149
-
150
- **Returns:**
151
-
152
- - `isConnected: boolean` - `true` if connected to Android Auto, `false` otherwise
153
-
154
- ### `useAudioDevices()` (Android only)
155
-
156
- Automatically polls for audio device changes every 2 seconds.
157
-
158
- **Returns:**
159
-
160
- - `devices: TAudioDevice[]` - Array of available audio devices
161
-
162
- ## Audio Device APIs
163
-
164
- ### `AudioDevices` (Android only)
165
-
166
- Android-specific API for managing audio output devices.
167
-
168
- #### `getAudioDevices(): TAudioDevice[]`
169
-
170
- Returns the list of available audio output devices.
171
-
172
- **Returns:** Array of `TAudioDevice` objects with:
173
-
174
- - `id: number` - Unique device ID
175
- - `name: string` - Device name (e.g., "Built-in Speaker", "Bluetooth")
176
- - `type: number` - Device type constant
177
- - `isActive: boolean` - Whether this device is currently active
178
-
179
- **Example:**
180
-
181
- ```typescript
182
- import { AudioDevices } from 'react-native-nitro-player'
183
-
184
- if (AudioDevices) {
185
- const devices = AudioDevices.getAudioDevices()
186
- devices.forEach((device) => {
187
- console.log(`${device.name} - Active: ${device.isActive}`)
188
- })
189
- }
190
- ```
191
-
192
- #### `setAudioDevice(deviceId: number): boolean`
193
-
194
- Sets the active audio output device.
195
-
196
- **Parameters:**
197
-
198
- - `deviceId: number` - The ID of the device to activate
199
-
200
- **Returns:** `true` if successful, `false` otherwise
201
-
202
- **Example:**
203
-
204
- ```typescript
205
- import { AudioDevices } from 'react-native-nitro-player'
206
-
207
- if (AudioDevices) {
208
- const success = AudioDevices.setAudioDevice(deviceId)
209
- console.log(`Device switch: ${success ? 'success' : 'failed'}`)
210
- }
211
- ```
212
-
213
- ### `AudioRoutePicker` (iOS only)
214
-
215
- iOS-specific API for displaying the native audio route picker (AirPlay menu).
216
-
217
- #### `showRoutePicker(): void`
218
-
219
- Shows the native AVRoutePickerView for selecting audio output routes like AirPlay, Bluetooth, etc.
220
-
221
- **Example:**
222
-
223
- ```typescript
224
- import { AudioRoutePicker } from 'react-native-nitro-player'
225
-
226
- if (AudioRoutePicker) {
227
- AudioRoutePicker.showRoutePicker()
228
- }
229
- ```
230
-
231
- ## Usage Examples
232
-
233
- ### Using React Hooks
234
-
235
- The library provides convenient React hooks for reactive state management:
236
-
237
- ```typescript
238
- import {
239
- useOnChangeTrack,
240
- useOnPlaybackStateChange,
241
- useOnPlaybackProgressChange,
242
- useOnSeek,
243
- useAndroidAutoConnection,
244
- } from 'react-native-nitro-player'
245
-
246
- function PlayerComponent() {
247
- // Get current track
248
- const { track, reason } = useOnChangeTrack()
249
-
250
- // Get playback state (playing, paused, stopped)
251
- const { state, reason: stateReason } = useOnPlaybackStateChange()
252
-
253
- // Get playback progress
254
- const { position, totalDuration, isManuallySeeked } = useOnPlaybackProgressChange()
255
-
256
- // Get seek events
257
- const { position: seekPosition, totalDuration: seekDuration } = useOnSeek()
258
-
259
- // Check Android Auto connection
260
- const { isConnected } = useAndroidAutoConnection()
261
-
262
- return (
263
- <View>
264
- {track && (
265
- <Text>Now Playing: {track.title} by {track.artist}</Text>
266
- )}
267
- <Text>State: {state}</Text>
268
- <Text>Progress: {position} / {totalDuration}</Text>
269
- </View>
270
- )
271
- }
272
- ```
273
-
274
- ### Managing Playlists
275
-
276
- ```typescript
277
- import { PlayerQueue } from 'react-native-nitro-player'
278
- import type { TrackItem, Playlist } from 'react-native-nitro-player'
279
-
280
- // Get all playlists
281
- const playlists = PlayerQueue.getAllPlaylists()
282
-
283
- // Get a specific playlist
284
- const playlist = PlayerQueue.getPlaylist(playlistId)
285
-
286
- // Get current playing playlist
287
- const currentPlaylistId = PlayerQueue.getCurrentPlaylistId()
288
-
289
- // Update playlist metadata
290
- PlayerQueue.updatePlaylist(playlistId, {
291
- name: 'Updated Name',
292
- description: 'New description',
293
- artwork: 'https://example.com/new-artwork.jpg',
294
- })
295
-
296
- // Add a single track
297
- PlayerQueue.addTrackToPlaylist(playlistId, newTrack)
298
-
299
- // Add multiple tracks
300
- PlayerQueue.addTracksToPlaylist(playlistId, [track1, track2, track3])
301
-
302
- // Remove a track
303
- PlayerQueue.removeTrackFromPlaylist(playlistId, trackId)
304
-
305
- // Reorder tracks
306
- PlayerQueue.reorderTrackInPlaylist(playlistId, trackId, newIndex)
307
-
308
- // Delete a playlist
309
- PlayerQueue.deletePlaylist(playlistId)
310
- ```
311
-
312
- ### Listening to Events
313
-
314
- ```typescript
315
- import { PlayerQueue, TrackPlayer } from 'react-native-nitro-player'
316
-
317
- // Listen to playlist changes
318
- PlayerQueue.onPlaylistsChanged((playlists, operation) => {
319
- console.log('Playlists updated:', operation)
320
- // operation can be: 'add', 'remove', 'clear', 'update'
321
- })
322
-
323
- // Listen to specific playlist changes
324
- PlayerQueue.onPlaylistChanged((playlistId, playlist, operation) => {
325
- console.log('Playlist changed:', playlistId, operation)
326
- })
327
-
328
- // Listen to track changes
329
- TrackPlayer.onChangeTrack((track, reason) => {
330
- console.log('Track changed:', track.title, reason)
331
- // reason can be: 'user_action', 'skip', 'end', 'error'
332
- })
333
-
334
- // Listen to playback state changes
335
- TrackPlayer.onPlaybackStateChange((state, reason) => {
336
- console.log('State changed:', state, reason)
337
- })
338
-
339
- // Listen to seek events
340
- TrackPlayer.onSeek((position, totalDuration) => {
341
- console.log('Seeked to:', position)
342
- })
343
-
344
- // Listen to playback progress
345
- TrackPlayer.onPlaybackProgressChange(
346
- (position, totalDuration, isManuallySeeked) => {
347
- console.log('Progress:', position, '/', totalDuration)
348
- }
349
- )
350
-
351
- // Listen to Android Auto connection changes
352
- TrackPlayer.onAndroidAutoConnectionChange((connected) => {
353
- console.log('Android Auto:', connected ? 'Connected' : 'Disconnected')
354
- })
355
- ```
356
-
357
- ### Getting Player State
358
-
359
- ```typescript
360
- import { TrackPlayer } from 'react-native-nitro-player'
361
-
362
- const state = TrackPlayer.getState()
363
-
364
- console.log(state.currentState) // 'playing' | 'paused' | 'stopped'
365
- console.log(state.currentPosition) // current position in seconds
366
- console.log(state.totalDuration) // total duration in seconds
367
- console.log(state.currentTrack) // current TrackItem or null
368
- console.log(state.currentPlaylistId) // current playlist ID or null
369
- console.log(state.currentIndex) // current track index in playlist
370
- ```
371
-
372
- ## Track Item Structure
373
-
374
- Each track must follow this structure:
375
-
376
- ```typescript
377
- interface TrackItem {
378
- id: string // Unique identifier
379
- title: string // Track title
380
- artist: string // Artist name
381
- album: string // Album name
382
- duration: number // Duration in seconds
383
- url: string // Audio file URL
384
- artwork?: string | null // Optional artwork URL
385
- }
386
- ```
387
-
388
- ## Playlist Structure
389
-
390
- ```typescript
391
- interface Playlist {
392
- id: string // Unique identifier
393
- name: string // Playlist name
394
- description?: string | null // Optional description
395
- artwork?: string | null // Optional artwork URL
396
- tracks: TrackItem[] // Array of tracks
397
- }
398
- ```
399
-
400
- ## Android Auto Customization
401
-
402
- Customize how your music library appears in Android Auto with a custom folder structure.
403
-
404
- ### Basic Setup
405
-
406
- By default, all playlists are shown in Android Auto. You can create a custom structure:
407
-
408
- ```typescript
409
- import { AndroidAutoMediaLibraryHelper } from 'react-native-nitro-player'
410
- import type { MediaLibrary } from 'react-native-nitro-player'
411
-
412
- // Check if available (Android only)
413
- if (AndroidAutoMediaLibraryHelper.isAvailable()) {
414
- const mediaLibrary: MediaLibrary = {
415
- layoutType: 'grid', // 'grid' or 'list'
416
- rootItems: [
417
- {
418
- id: 'my_music',
419
- title: '🎵 My Music',
420
- subtitle: 'Your music collection',
421
- mediaType: 'folder',
422
- isPlayable: false,
423
- layoutType: 'grid',
424
- children: [
425
- {
426
- id: 'favorites',
427
- title: 'Favorites',
428
- subtitle: '10 tracks',
429
- mediaType: 'playlist',
430
- playlistId: 'my-playlist-id', // References a playlist created with PlayerQueue
431
- isPlayable: false,
432
- },
433
- ],
434
- },
435
- {
436
- id: 'recent',
437
- title: '🕐 Recently Played',
438
- mediaType: 'folder',
439
- isPlayable: false,
440
- children: [
441
- // More playlist references...
442
- ],
443
- },
444
- ],
445
- }
446
-
447
- AndroidAutoMediaLibraryHelper.set(mediaLibrary)
448
- }
449
-
450
- // Reset to default (show all playlists)
451
- AndroidAutoMediaLibraryHelper.clear()
452
- ```
453
-
454
- ### MediaLibrary Structure
455
-
456
- ```typescript
457
- interface MediaLibrary {
458
- layoutType: 'grid' | 'list' // Default layout for items
459
- rootItems: MediaItem[] // Top-level items
460
- appName?: string // Optional app name
461
- appIconUrl?: string // Optional app icon
462
- }
463
-
464
- interface MediaItem {
465
- id: string // Unique identifier
466
- title: string // Display title
467
- subtitle?: string // Optional subtitle
468
- iconUrl?: string // Optional icon/artwork URL
469
- isPlayable: boolean // Whether item can be played
470
- mediaType: 'folder' | 'audio' | 'playlist' // Type of item
471
- playlistId?: string // Reference to playlist (for playlist items)
472
- children?: MediaItem[] // Child items (for folders)
473
- layoutType?: 'grid' | 'list' // Override default layout
474
- }
475
- ```
476
-
477
- ### Example: Organizing Playlists by Genre
478
-
479
- ```typescript
480
- import {
481
- PlayerQueue,
482
- AndroidAutoMediaLibraryHelper,
483
- } from 'react-native-nitro-player'
484
-
485
- // Create playlists first
486
- const rockPlaylistId = PlayerQueue.createPlaylist('Rock Classics')
487
- const jazzPlaylistId = PlayerQueue.createPlaylist('Jazz Essentials')
488
- const popPlaylistId = PlayerQueue.createPlaylist('Pop Hits')
489
-
490
- // Add tracks to playlists...
491
- PlayerQueue.addTracksToPlaylist(rockPlaylistId, rockTracks)
492
- PlayerQueue.addTracksToPlaylist(jazzPlaylistId, jazzTracks)
493
- PlayerQueue.addTracksToPlaylist(popPlaylistId, popTracks)
494
-
495
- // Create custom Android Auto structure
496
- AndroidAutoMediaLibraryHelper.set({
497
- layoutType: 'list',
498
- rootItems: [
499
- {
500
- id: 'genres',
501
- title: '🎸 By Genre',
502
- mediaType: 'folder',
503
- isPlayable: false,
504
- layoutType: 'grid',
505
- children: [
506
- {
507
- id: 'rock',
508
- title: 'Rock',
509
- mediaType: 'playlist',
510
- playlistId: rockPlaylistId,
511
- isPlayable: false,
512
- },
513
- {
514
- id: 'jazz',
515
- title: 'Jazz',
516
- mediaType: 'playlist',
517
- playlistId: jazzPlaylistId,
518
- isPlayable: false,
519
- },
520
- {
521
- id: 'pop',
522
- title: 'Pop',
523
- mediaType: 'playlist',
524
- playlistId: popPlaylistId,
525
- isPlayable: false,
526
- },
527
- ],
528
- },
529
- {
530
- id: 'all_music',
531
- title: '📀 All Music',
532
- mediaType: 'folder',
533
- isPlayable: false,
534
- children: [
535
- {
536
- id: 'all_rock',
537
- title: 'Rock Classics',
538
- mediaType: 'playlist',
539
- playlistId: rockPlaylistId,
540
- isPlayable: false,
541
- },
542
- {
543
- id: 'all_jazz',
544
- title: 'Jazz Essentials',
545
- mediaType: 'playlist',
546
- playlistId: jazzPlaylistId,
547
- isPlayable: false,
548
- },
549
- {
550
- id: 'all_pop',
551
- title: 'Pop Hits',
552
- mediaType: 'playlist',
553
- playlistId: popPlaylistId,
554
- isPlayable: false,
555
- },
556
- ],
557
- },
558
- ],
559
- })
560
- ```
561
-
562
- ### Notes
563
-
564
- - The `playlistId` field must reference a playlist created with `PlayerQueue.createPlaylist()`
565
- - Changes are immediately reflected in Android Auto
566
- - Use folders to organize playlists hierarchically
567
- - Grid layout is best for album/playlist browsing
568
- - List layout is best for song lists
569
- - Only available on Android (use `isAvailable()` to check)
570
-
571
- ## Features
572
-
573
- - ✅ **Playlist Management**: Create, update, and manage multiple playlists
574
- - ✅ **Playback Controls**: Play, pause, seek, skip tracks
575
- - ✅ **React Hooks**: Built-in hooks for reactive state management
576
- - ✅ **Event Listeners**: Listen to track changes, state changes, and more
577
- - ✅ **Android Auto Support**: Control playback from Android Auto with customizable UI
578
- - ✅ **CarPlay Support**: Control playback from CarPlay (iOS)
579
- - ✅ **Notification Controls**: Show playback controls in notifications
580
- - ✅ **Progress Tracking**: Real-time playback progress updates
581
-
582
- ## TypeScript Support
583
-
584
- The library is written in TypeScript and includes full type definitions. All types are exported for your convenience:
585
-
586
- ```typescript
587
- import type {
588
- TrackItem,
589
- Playlist,
590
- PlayerState,
591
- TrackPlayerState,
592
- QueueOperation,
593
- Reason,
594
- PlayerConfig,
595
- MediaLibrary,
596
- MediaItem,
597
- LayoutType,
598
- MediaType,
599
- } from 'react-native-nitro-player'
600
- ```
601
-
602
- ## Platform Support
603
-
604
- - ✅ **iOS**: Full support with CarPlay integration
605
- - ✅ **Android**: Full support with Android Auto integration
606
- - 🎯 **Android Auto Media Library**: Android-only feature for customizing the Android Auto UI
607
-
608
- ## License
609
-
610
- MIT
1
+ Refer Root readme