react-native-nitro-player 0.5.6 → 0.5.7

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 (31) hide show
  1. package/README.md +2 -0
  2. package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridTrackPlayer.kt +43 -0
  3. package/android/src/main/java/com/margelo/nitro/nitroplayer/core/TrackPlayerCore.kt +340 -0
  4. package/android/src/main/java/com/margelo/nitro/nitroplayer/playlist/PlaylistManager.kt +60 -0
  5. package/ios/HybridTrackPlayer.swift +54 -1
  6. package/ios/core/TrackPlayerCore.swift +254 -2
  7. package/ios/playlist/PlaylistManager.swift +68 -0
  8. package/lib/specs/TrackPlayer.nitro.d.ts +47 -0
  9. package/lib/types/PlayerQueue.d.ts +5 -0
  10. package/nitrogen/generated/android/NitroPlayerOnLoad.cpp +2 -0
  11. package/nitrogen/generated/android/c++/JFunc_void_std__vector_TrackItem__double.hpp +104 -0
  12. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.cpp +160 -0
  13. package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.hpp +8 -0
  14. package/nitrogen/generated/android/c++/JPlayerConfig.hpp +7 -3
  15. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__vector_TrackItem__double.kt +80 -0
  16. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridTrackPlayerSpec.kt +37 -0
  17. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlayerConfig.kt +6 -3
  18. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.cpp +16 -0
  19. package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.hpp +65 -0
  20. package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.hpp +62 -0
  21. package/nitrogen/generated/ios/swift/Func_void_double.swift +47 -0
  22. package/nitrogen/generated/ios/swift/Func_void_std__vector_TrackItem__double.swift +47 -0
  23. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec.swift +8 -0
  24. package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec_cxx.swift +173 -0
  25. package/nitrogen/generated/ios/swift/PlayerConfig.swift +24 -1
  26. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.cpp +8 -0
  27. package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.hpp +8 -0
  28. package/nitrogen/generated/shared/c++/PlayerConfig.hpp +6 -2
  29. package/package.json +1 -1
  30. package/src/specs/TrackPlayer.nitro.ts +57 -0
  31. package/src/types/PlayerQueue.ts +5 -0
@@ -455,4 +455,177 @@ open class HybridTrackPlayerSpec_cxx {
455
455
  return bridge.create_Result_bool_(__exceptionPtr)
456
456
  }
457
457
  }
458
+
459
+ @inline(__always)
460
+ public final func updateTracks(tracks: bridge.std__vector_TrackItem_) -> bridge.Result_std__shared_ptr_Promise_void___ {
461
+ do {
462
+ let __result = try self.__implementation.updateTracks(tracks: tracks.map({ __item in __item }))
463
+ let __resultCpp = { () -> bridge.std__shared_ptr_Promise_void__ in
464
+ let __promise = bridge.create_std__shared_ptr_Promise_void__()
465
+ let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_void__(__promise)
466
+ __result
467
+ .then({ __result in __promiseHolder.resolve() })
468
+ .catch({ __error in __promiseHolder.reject(__error.toCpp()) })
469
+ return __promise
470
+ }()
471
+ return bridge.create_Result_std__shared_ptr_Promise_void___(__resultCpp)
472
+ } catch (let __error) {
473
+ let __exceptionPtr = __error.toCpp()
474
+ return bridge.create_Result_std__shared_ptr_Promise_void___(__exceptionPtr)
475
+ }
476
+ }
477
+
478
+ @inline(__always)
479
+ public final func getTracksById(trackIds: bridge.std__vector_std__string_) -> bridge.Result_std__shared_ptr_Promise_std__vector_TrackItem____ {
480
+ do {
481
+ let __result = try self.__implementation.getTracksById(trackIds: trackIds.map({ __item in String(__item) }))
482
+ let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__vector_TrackItem___ in
483
+ let __promise = bridge.create_std__shared_ptr_Promise_std__vector_TrackItem___()
484
+ let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__vector_TrackItem___(__promise)
485
+ __result
486
+ .then({ __result in __promiseHolder.resolve({ () -> bridge.std__vector_TrackItem_ in
487
+ var __vector = bridge.create_std__vector_TrackItem_(__result.count)
488
+ for __item in __result {
489
+ __vector.push_back(__item)
490
+ }
491
+ return __vector
492
+ }()) })
493
+ .catch({ __error in __promiseHolder.reject(__error.toCpp()) })
494
+ return __promise
495
+ }()
496
+ return bridge.create_Result_std__shared_ptr_Promise_std__vector_TrackItem____(__resultCpp)
497
+ } catch (let __error) {
498
+ let __exceptionPtr = __error.toCpp()
499
+ return bridge.create_Result_std__shared_ptr_Promise_std__vector_TrackItem____(__exceptionPtr)
500
+ }
501
+ }
502
+
503
+ @inline(__always)
504
+ public final func getTracksNeedingUrls() -> bridge.Result_std__shared_ptr_Promise_std__vector_TrackItem____ {
505
+ do {
506
+ let __result = try self.__implementation.getTracksNeedingUrls()
507
+ let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__vector_TrackItem___ in
508
+ let __promise = bridge.create_std__shared_ptr_Promise_std__vector_TrackItem___()
509
+ let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__vector_TrackItem___(__promise)
510
+ __result
511
+ .then({ __result in __promiseHolder.resolve({ () -> bridge.std__vector_TrackItem_ in
512
+ var __vector = bridge.create_std__vector_TrackItem_(__result.count)
513
+ for __item in __result {
514
+ __vector.push_back(__item)
515
+ }
516
+ return __vector
517
+ }()) })
518
+ .catch({ __error in __promiseHolder.reject(__error.toCpp()) })
519
+ return __promise
520
+ }()
521
+ return bridge.create_Result_std__shared_ptr_Promise_std__vector_TrackItem____(__resultCpp)
522
+ } catch (let __error) {
523
+ let __exceptionPtr = __error.toCpp()
524
+ return bridge.create_Result_std__shared_ptr_Promise_std__vector_TrackItem____(__exceptionPtr)
525
+ }
526
+ }
527
+
528
+ @inline(__always)
529
+ public final func getNextTracks(count: Double) -> bridge.Result_std__shared_ptr_Promise_std__vector_TrackItem____ {
530
+ do {
531
+ let __result = try self.__implementation.getNextTracks(count: count)
532
+ let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__vector_TrackItem___ in
533
+ let __promise = bridge.create_std__shared_ptr_Promise_std__vector_TrackItem___()
534
+ let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__vector_TrackItem___(__promise)
535
+ __result
536
+ .then({ __result in __promiseHolder.resolve({ () -> bridge.std__vector_TrackItem_ in
537
+ var __vector = bridge.create_std__vector_TrackItem_(__result.count)
538
+ for __item in __result {
539
+ __vector.push_back(__item)
540
+ }
541
+ return __vector
542
+ }()) })
543
+ .catch({ __error in __promiseHolder.reject(__error.toCpp()) })
544
+ return __promise
545
+ }()
546
+ return bridge.create_Result_std__shared_ptr_Promise_std__vector_TrackItem____(__resultCpp)
547
+ } catch (let __error) {
548
+ let __exceptionPtr = __error.toCpp()
549
+ return bridge.create_Result_std__shared_ptr_Promise_std__vector_TrackItem____(__exceptionPtr)
550
+ }
551
+ }
552
+
553
+ @inline(__always)
554
+ public final func getCurrentTrackIndex() -> bridge.Result_std__shared_ptr_Promise_double___ {
555
+ do {
556
+ let __result = try self.__implementation.getCurrentTrackIndex()
557
+ let __resultCpp = { () -> bridge.std__shared_ptr_Promise_double__ in
558
+ let __promise = bridge.create_std__shared_ptr_Promise_double__()
559
+ let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_double__(__promise)
560
+ __result
561
+ .then({ __result in __promiseHolder.resolve(__result) })
562
+ .catch({ __error in __promiseHolder.reject(__error.toCpp()) })
563
+ return __promise
564
+ }()
565
+ return bridge.create_Result_std__shared_ptr_Promise_double___(__resultCpp)
566
+ } catch (let __error) {
567
+ let __exceptionPtr = __error.toCpp()
568
+ return bridge.create_Result_std__shared_ptr_Promise_double___(__exceptionPtr)
569
+ }
570
+ }
571
+
572
+ @inline(__always)
573
+ public final func onTracksNeedUpdate(callback: bridge.Func_void_std__vector_TrackItem__double) -> bridge.Result_void_ {
574
+ do {
575
+ try self.__implementation.onTracksNeedUpdate(callback: { () -> ([TrackItem], Double) -> Void in
576
+ let __wrappedFunction = bridge.wrap_Func_void_std__vector_TrackItem__double(callback)
577
+ return { (__tracks: [TrackItem], __lookahead: Double) -> Void in
578
+ __wrappedFunction.call({ () -> bridge.std__vector_TrackItem_ in
579
+ var __vector = bridge.create_std__vector_TrackItem_(__tracks.count)
580
+ for __item in __tracks {
581
+ __vector.push_back(__item)
582
+ }
583
+ return __vector
584
+ }(), __lookahead)
585
+ }
586
+ }())
587
+ return bridge.create_Result_void_()
588
+ } catch (let __error) {
589
+ let __exceptionPtr = __error.toCpp()
590
+ return bridge.create_Result_void_(__exceptionPtr)
591
+ }
592
+ }
593
+
594
+ @inline(__always)
595
+ public final func setPlaybackSpeed(speed: Double) -> bridge.Result_std__shared_ptr_Promise_void___ {
596
+ do {
597
+ let __result = try self.__implementation.setPlaybackSpeed(speed: speed)
598
+ let __resultCpp = { () -> bridge.std__shared_ptr_Promise_void__ in
599
+ let __promise = bridge.create_std__shared_ptr_Promise_void__()
600
+ let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_void__(__promise)
601
+ __result
602
+ .then({ __result in __promiseHolder.resolve() })
603
+ .catch({ __error in __promiseHolder.reject(__error.toCpp()) })
604
+ return __promise
605
+ }()
606
+ return bridge.create_Result_std__shared_ptr_Promise_void___(__resultCpp)
607
+ } catch (let __error) {
608
+ let __exceptionPtr = __error.toCpp()
609
+ return bridge.create_Result_std__shared_ptr_Promise_void___(__exceptionPtr)
610
+ }
611
+ }
612
+
613
+ @inline(__always)
614
+ public final func getPlaybackSpeed() -> bridge.Result_std__shared_ptr_Promise_double___ {
615
+ do {
616
+ let __result = try self.__implementation.getPlaybackSpeed()
617
+ let __resultCpp = { () -> bridge.std__shared_ptr_Promise_double__ in
618
+ let __promise = bridge.create_std__shared_ptr_Promise_double__()
619
+ let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_double__(__promise)
620
+ __result
621
+ .then({ __result in __promiseHolder.resolve(__result) })
622
+ .catch({ __error in __promiseHolder.reject(__error.toCpp()) })
623
+ return __promise
624
+ }()
625
+ return bridge.create_Result_std__shared_ptr_Promise_double___(__resultCpp)
626
+ } catch (let __error) {
627
+ let __exceptionPtr = __error.toCpp()
628
+ return bridge.create_Result_std__shared_ptr_Promise_double___(__exceptionPtr)
629
+ }
630
+ }
458
631
  }
@@ -19,7 +19,7 @@ public extension PlayerConfig {
19
19
  /**
20
20
  * Create a new instance of `PlayerConfig`.
21
21
  */
22
- init(androidAutoEnabled: Bool?, carPlayEnabled: Bool?, showInNotification: Bool?) {
22
+ init(androidAutoEnabled: Bool?, carPlayEnabled: Bool?, showInNotification: Bool?, lookaheadCount: Double?) {
23
23
  self.init({ () -> bridge.std__optional_bool_ in
24
24
  if let __unwrappedValue = androidAutoEnabled {
25
25
  return bridge.create_std__optional_bool_(__unwrappedValue)
@@ -38,6 +38,12 @@ public extension PlayerConfig {
38
38
  } else {
39
39
  return .init()
40
40
  }
41
+ }(), { () -> bridge.std__optional_double_ in
42
+ if let __unwrappedValue = lookaheadCount {
43
+ return bridge.create_std__optional_double_(__unwrappedValue)
44
+ } else {
45
+ return .init()
46
+ }
41
47
  }())
42
48
  }
43
49
 
@@ -112,4 +118,21 @@ public extension PlayerConfig {
112
118
  }()
113
119
  }
114
120
  }
121
+
122
+ var lookaheadCount: Double? {
123
+ @inline(__always)
124
+ get {
125
+ return self.__lookaheadCount.value
126
+ }
127
+ @inline(__always)
128
+ set {
129
+ self.__lookaheadCount = { () -> bridge.std__optional_double_ in
130
+ if let __unwrappedValue = newValue {
131
+ return bridge.create_std__optional_double_(__unwrappedValue)
132
+ } else {
133
+ return .init()
134
+ }
135
+ }()
136
+ }
137
+ }
115
138
  }
@@ -35,6 +35,14 @@ namespace margelo::nitro::nitroplayer {
35
35
  prototype.registerHybridMethod("onAndroidAutoConnectionChange", &HybridTrackPlayerSpec::onAndroidAutoConnectionChange);
36
36
  prototype.registerHybridMethod("isAndroidAutoConnected", &HybridTrackPlayerSpec::isAndroidAutoConnected);
37
37
  prototype.registerHybridMethod("setVolume", &HybridTrackPlayerSpec::setVolume);
38
+ prototype.registerHybridMethod("updateTracks", &HybridTrackPlayerSpec::updateTracks);
39
+ prototype.registerHybridMethod("getTracksById", &HybridTrackPlayerSpec::getTracksById);
40
+ prototype.registerHybridMethod("getTracksNeedingUrls", &HybridTrackPlayerSpec::getTracksNeedingUrls);
41
+ prototype.registerHybridMethod("getNextTracks", &HybridTrackPlayerSpec::getNextTracks);
42
+ prototype.registerHybridMethod("getCurrentTrackIndex", &HybridTrackPlayerSpec::getCurrentTrackIndex);
43
+ prototype.registerHybridMethod("onTracksNeedUpdate", &HybridTrackPlayerSpec::onTracksNeedUpdate);
44
+ prototype.registerHybridMethod("setPlaybackSpeed", &HybridTrackPlayerSpec::setPlaybackSpeed);
45
+ prototype.registerHybridMethod("getPlaybackSpeed", &HybridTrackPlayerSpec::getPlaybackSpeed);
38
46
  });
39
47
  }
40
48
 
@@ -90,6 +90,14 @@ namespace margelo::nitro::nitroplayer {
90
90
  virtual void onAndroidAutoConnectionChange(const std::function<void(bool /* connected */)>& callback) = 0;
91
91
  virtual bool isAndroidAutoConnected() = 0;
92
92
  virtual bool setVolume(double volume) = 0;
93
+ virtual std::shared_ptr<Promise<void>> updateTracks(const std::vector<TrackItem>& tracks) = 0;
94
+ virtual std::shared_ptr<Promise<std::vector<TrackItem>>> getTracksById(const std::vector<std::string>& trackIds) = 0;
95
+ virtual std::shared_ptr<Promise<std::vector<TrackItem>>> getTracksNeedingUrls() = 0;
96
+ virtual std::shared_ptr<Promise<std::vector<TrackItem>>> getNextTracks(double count) = 0;
97
+ virtual std::shared_ptr<Promise<double>> getCurrentTrackIndex() = 0;
98
+ virtual void onTracksNeedUpdate(const std::function<void(const std::vector<TrackItem>& /* tracks */, double /* lookahead */)>& callback) = 0;
99
+ virtual std::shared_ptr<Promise<void>> setPlaybackSpeed(double speed) = 0;
100
+ virtual std::shared_ptr<Promise<double>> getPlaybackSpeed() = 0;
93
101
 
94
102
  protected:
95
103
  // Hybrid Setup
@@ -37,10 +37,11 @@ namespace margelo::nitro::nitroplayer {
37
37
  std::optional<bool> androidAutoEnabled SWIFT_PRIVATE;
38
38
  std::optional<bool> carPlayEnabled SWIFT_PRIVATE;
39
39
  std::optional<bool> showInNotification SWIFT_PRIVATE;
40
+ std::optional<double> lookaheadCount SWIFT_PRIVATE;
40
41
 
41
42
  public:
42
43
  PlayerConfig() = default;
43
- explicit PlayerConfig(std::optional<bool> androidAutoEnabled, std::optional<bool> carPlayEnabled, std::optional<bool> showInNotification): androidAutoEnabled(androidAutoEnabled), carPlayEnabled(carPlayEnabled), showInNotification(showInNotification) {}
44
+ explicit PlayerConfig(std::optional<bool> androidAutoEnabled, std::optional<bool> carPlayEnabled, std::optional<bool> showInNotification, std::optional<double> lookaheadCount): androidAutoEnabled(androidAutoEnabled), carPlayEnabled(carPlayEnabled), showInNotification(showInNotification), lookaheadCount(lookaheadCount) {}
44
45
  };
45
46
 
46
47
  } // namespace margelo::nitro::nitroplayer
@@ -55,7 +56,8 @@ namespace margelo::nitro {
55
56
  return margelo::nitro::nitroplayer::PlayerConfig(
56
57
  JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "androidAutoEnabled")),
57
58
  JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "carPlayEnabled")),
58
- JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "showInNotification"))
59
+ JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "showInNotification")),
60
+ JSIConverter<std::optional<double>>::fromJSI(runtime, obj.getProperty(runtime, "lookaheadCount"))
59
61
  );
60
62
  }
61
63
  static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::nitroplayer::PlayerConfig& arg) {
@@ -63,6 +65,7 @@ namespace margelo::nitro {
63
65
  obj.setProperty(runtime, "androidAutoEnabled", JSIConverter<std::optional<bool>>::toJSI(runtime, arg.androidAutoEnabled));
64
66
  obj.setProperty(runtime, "carPlayEnabled", JSIConverter<std::optional<bool>>::toJSI(runtime, arg.carPlayEnabled));
65
67
  obj.setProperty(runtime, "showInNotification", JSIConverter<std::optional<bool>>::toJSI(runtime, arg.showInNotification));
68
+ obj.setProperty(runtime, "lookaheadCount", JSIConverter<std::optional<double>>::toJSI(runtime, arg.lookaheadCount));
66
69
  return obj;
67
70
  }
68
71
  static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) {
@@ -76,6 +79,7 @@ namespace margelo::nitro {
76
79
  if (!JSIConverter<std::optional<bool>>::canConvert(runtime, obj.getProperty(runtime, "androidAutoEnabled"))) return false;
77
80
  if (!JSIConverter<std::optional<bool>>::canConvert(runtime, obj.getProperty(runtime, "carPlayEnabled"))) return false;
78
81
  if (!JSIConverter<std::optional<bool>>::canConvert(runtime, obj.getProperty(runtime, "showInNotification"))) return false;
82
+ if (!JSIConverter<std::optional<double>>::canConvert(runtime, obj.getProperty(runtime, "lookaheadCount"))) return false;
79
83
  return true;
80
84
  }
81
85
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-nitro-player",
3
- "version": "0.5.6",
3
+ "version": "0.5.7",
4
4
  "description": "A powerful audio player library for React Native with playlist management, playback controls, and support for Android Auto and CarPlay",
5
5
  "main": "lib/index",
6
6
  "module": "lib/index",
@@ -87,4 +87,61 @@ export interface TrackPlayer
87
87
  onAndroidAutoConnectionChange(callback: (connected: boolean) => void): void
88
88
  isAndroidAutoConnected(): boolean
89
89
  setVolume(volume: number): boolean
90
+
91
+ /**
92
+ * Update entire track objects across all playlists
93
+ * Matches by track.id and updates all properties (url, artwork, title, etc.)
94
+ * Note: Empty string "" is valid for TrackItem.url to support lazy loading
95
+ * @param tracks Array of full TrackItem objects to update
96
+ * @returns Promise that resolves when updates complete
97
+ */
98
+ updateTracks(tracks: TrackItem[]): Promise<void>
99
+
100
+ /**
101
+ * Get tracks by IDs from all playlists
102
+ * @param trackIds Array of track IDs to fetch
103
+ * @returns Promise resolving to array of matching tracks
104
+ */
105
+ getTracksById(trackIds: string[]): Promise<TrackItem[]>
106
+
107
+ /**
108
+ * Get tracks with missing/empty URLs from current playlist
109
+ * @returns Promise resolving to array of tracks needing URLs
110
+ */
111
+ getTracksNeedingUrls(): Promise<TrackItem[]>
112
+
113
+ /**
114
+ * Get next N tracks from current position in playlist
115
+ * Useful for preloading URLs before they're needed
116
+ * @param count Number of upcoming tracks to return
117
+ * @returns Promise resolving to array of next tracks
118
+ */
119
+ getNextTracks(count: number): Promise<TrackItem[]>
120
+
121
+ /**
122
+ * Get current track index in the active playlist
123
+ * @returns Promise resolving to 0-based index, or -1 if no track playing
124
+ */
125
+ getCurrentTrackIndex(): Promise<number>
126
+
127
+ /**
128
+ * Register callback that fires when tracks will be needed soon
129
+ * Useful for proactive URL resolution in Android Auto/CarPlay
130
+ * @param callback Function called with tracks needing URLs and lookahead count
131
+ */
132
+ onTracksNeedUpdate(
133
+ callback: (tracks: TrackItem[], lookahead: number) => void
134
+ ): void
135
+
136
+ /**
137
+ * Get the current track index in the active playlist
138
+ * @returns Promise resolving to 0-based index, or -1 if no track playing
139
+ */
140
+ setPlaybackSpeed(speed: number): Promise<void>
141
+
142
+ /**
143
+ * Get the current playback speed
144
+ * @returns Promise resolving to playback speed
145
+ */
146
+ getPlaybackSpeed(): Promise<number>
90
147
  }
@@ -44,4 +44,9 @@ export interface PlayerConfig {
44
44
  androidAutoEnabled?: boolean
45
45
  carPlayEnabled?: boolean
46
46
  showInNotification?: boolean
47
+ /**
48
+ * Number of upcoming tracks to preload URLs for (default: 5)
49
+ * Higher values = more proactive loading, but more network requests
50
+ */
51
+ lookaheadCount?: number
47
52
  }