expo-gliph-player 1.0.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.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +348 -0
  3. package/android/build.gradle +82 -0
  4. package/android/src/main/AndroidManifest.xml +31 -0
  5. package/android/src/main/java/com/gliphplayer/DeviceInfoModule.kt +48 -0
  6. package/android/src/main/java/com/gliphplayer/DeviceInfoPackage.kt +16 -0
  7. package/android/src/main/java/com/gliphplayer/GliphPlayerModule.kt +360 -0
  8. package/android/src/main/java/com/gliphplayer/GliphPlayerPackage.kt +48 -0
  9. package/android/src/main/java/com/gliphplayer/GliphPlayerService.kt +797 -0
  10. package/android/src/main/res/xml/automotive_app_desc.xml +4 -0
  11. package/android/src/oldarch/com/gliphplayer/NativeGliphPlayerSpec.kt +56 -0
  12. package/app.plugin.js +1 -0
  13. package/expo-gliph-player.podspec +91 -0
  14. package/ios/GliphAudioPlayer.h +77 -0
  15. package/ios/GliphAudioPlayer.swift +697 -0
  16. package/ios/GliphPlayer-Bridging-Header.h +3 -0
  17. package/ios/GliphPlayerModule.h +12 -0
  18. package/ios/GliphPlayerModule.mm +243 -0
  19. package/ios/expo_gliph_player.h +22 -0
  20. package/lib/commonjs/GliphPlayer.js +310 -0
  21. package/lib/commonjs/GliphPlayer.js.map +1 -0
  22. package/lib/commonjs/hooks.js +233 -0
  23. package/lib/commonjs/hooks.js.map +1 -0
  24. package/lib/commonjs/index.js +166 -0
  25. package/lib/commonjs/index.js.map +1 -0
  26. package/lib/commonjs/package.json +1 -0
  27. package/lib/commonjs/specs/NativeGliphPlayer.js +19 -0
  28. package/lib/commonjs/specs/NativeGliphPlayer.js.map +1 -0
  29. package/lib/commonjs/types.js +175 -0
  30. package/lib/commonjs/types.js.map +1 -0
  31. package/lib/module/GliphPlayer.js +305 -0
  32. package/lib/module/GliphPlayer.js.map +1 -0
  33. package/lib/module/hooks.js +221 -0
  34. package/lib/module/hooks.js.map +1 -0
  35. package/lib/module/index.js +20 -0
  36. package/lib/module/index.js.map +1 -0
  37. package/lib/module/package.json +1 -0
  38. package/lib/module/specs/NativeGliphPlayer.js +20 -0
  39. package/lib/module/specs/NativeGliphPlayer.js.map +1 -0
  40. package/lib/module/types.js +181 -0
  41. package/lib/module/types.js.map +1 -0
  42. package/lib/typescript/src/GliphPlayer.d.ts +113 -0
  43. package/lib/typescript/src/GliphPlayer.d.ts.map +1 -0
  44. package/lib/typescript/src/hooks.d.ts +51 -0
  45. package/lib/typescript/src/hooks.d.ts.map +1 -0
  46. package/lib/typescript/src/index.d.ts +11 -0
  47. package/lib/typescript/src/index.d.ts.map +1 -0
  48. package/lib/typescript/src/specs/NativeGliphPlayer.d.ts +80 -0
  49. package/lib/typescript/src/specs/NativeGliphPlayer.d.ts.map +1 -0
  50. package/lib/typescript/src/types.d.ts +348 -0
  51. package/lib/typescript/src/types.d.ts.map +1 -0
  52. package/package.json +62 -0
  53. package/src/GliphPlayer.ts +356 -0
  54. package/src/hooks.ts +256 -0
  55. package/src/index.ts +61 -0
  56. package/src/specs/NativeGliphPlayer.ts +105 -0
  57. package/src/types.ts +395 -0
  58. package/src/withGliphPlayer.js +166 -0
@@ -0,0 +1,12 @@
1
+ #import <React/RCTBridgeModule.h>
2
+ #import <React/RCTEventEmitter.h>
3
+
4
+ #ifdef RCT_NEW_ARCH_ENABLED
5
+ #import <RNGliphPlayerSpec/RNGliphPlayerSpec.h>
6
+
7
+ @interface GliphPlayerModule : RCTEventEmitter <NativeGliphPlayerSpec>
8
+ #else
9
+ @interface GliphPlayerModule : RCTEventEmitter <RCTBridgeModule>
10
+ #endif
11
+
12
+ @end
@@ -0,0 +1,243 @@
1
+ /**
2
+ * GliphPlayerModule.mm
3
+ *
4
+ * Objective-C++ bridge that connects React Native (New + Old Arch) to
5
+ * the Swift GliphAudioPlayer implementation.
6
+ */
7
+
8
+ #import "GliphPlayerModule.h"
9
+ #import "expo_gliph_player-Swift.h"
10
+
11
+ @interface GliphPlayerModule ()
12
+ @property (nonatomic, strong) GliphAudioPlayer *player;
13
+ @end
14
+
15
+ @implementation GliphPlayerModule {
16
+ bool _hasListeners;
17
+ }
18
+
19
+ RCT_EXPORT_MODULE(RNGliphPlayer)
20
+
21
+ - (instancetype)init {
22
+ if (self = [super init]) {
23
+ __weak GliphPlayerModule *weakSelf = self;
24
+ _player = [[GliphAudioPlayer alloc] initWithEventEmitter:^(NSString *event, NSDictionary *data) {
25
+ [weakSelf sendEventWithName:event body:data];
26
+ }];
27
+ }
28
+ return self;
29
+ }
30
+
31
+ + (BOOL)requiresMainQueueSetup {
32
+ return NO;
33
+ }
34
+
35
+ - (NSArray<NSString *> *)supportedEvents {
36
+ return @[
37
+ @"playback-state",
38
+ @"playback-error",
39
+ @"playback-active-track-changed",
40
+ @"playback-queue-ended",
41
+ @"playback-progress-updated",
42
+ @"playback-metadata-received",
43
+ @"remote-play",
44
+ @"remote-pause",
45
+ @"remote-stop",
46
+ @"remote-next",
47
+ @"remote-previous",
48
+ @"remote-skip",
49
+ @"remote-jump-forward",
50
+ @"remote-jump-backward",
51
+ @"remote-seek",
52
+ @"remote-set-rating",
53
+ @"remote-duck",
54
+ @"remote-like",
55
+ @"remote-dislike",
56
+ @"remote-bookmark",
57
+ ];
58
+ }
59
+
60
+ - (void)startObserving { _hasListeners = YES; }
61
+ - (void)stopObserving { _hasListeners = NO; }
62
+
63
+ RCT_EXPORT_METHOD(setupPlayer:(NSDictionary *)options
64
+ resolve:(RCTPromiseResolveBlock)resolve
65
+ reject:(RCTPromiseRejectBlock)reject) {
66
+ [_player setupPlayerWithOptions:options resolve:resolve reject:reject];
67
+ }
68
+
69
+ RCT_EXPORT_METHOD(destroy) {
70
+ [_player destroy];
71
+ }
72
+
73
+ RCT_EXPORT_METHOD(isServiceRunning:(RCTPromiseResolveBlock)resolve
74
+ reject:(RCTPromiseRejectBlock)reject) {
75
+ resolve(@([_player isReady]));
76
+ }
77
+
78
+ RCT_EXPORT_METHOD(add:(NSArray *)tracks
79
+ insertBeforeIndex:(double)insertBeforeIndex
80
+ resolve:(RCTPromiseResolveBlock)resolve
81
+ reject:(RCTPromiseRejectBlock)reject) {
82
+ [_player addTracks:tracks insertBeforeIndex:(NSInteger)insertBeforeIndex resolve:resolve reject:reject];
83
+ }
84
+
85
+ RCT_EXPORT_METHOD(remove:(NSArray *)trackIds
86
+ resolve:(RCTPromiseResolveBlock)resolve
87
+ reject:(RCTPromiseRejectBlock)reject) {
88
+ [_player removeTracks:trackIds resolve:resolve reject:reject];
89
+ }
90
+
91
+ RCT_EXPORT_METHOD(removeUpcomingTracks:(RCTPromiseResolveBlock)resolve
92
+ reject:(RCTPromiseRejectBlock)reject) {
93
+ [_player removeUpcomingTracksWithResolve:resolve reject:reject];
94
+ }
95
+
96
+ RCT_EXPORT_METHOD(skip:(double)index
97
+ initialPosition:(double)initialPosition
98
+ resolve:(RCTPromiseResolveBlock)resolve
99
+ reject:(RCTPromiseRejectBlock)reject) {
100
+ [_player skipToIndex:(NSInteger)index initialPosition:initialPosition resolve:resolve reject:reject];
101
+ }
102
+
103
+ RCT_EXPORT_METHOD(skipToNext:(double)initialPosition
104
+ resolve:(RCTPromiseResolveBlock)resolve
105
+ reject:(RCTPromiseRejectBlock)reject) {
106
+ [_player skipToNextWithInitialPosition:initialPosition resolve:resolve reject:reject];
107
+ }
108
+
109
+ RCT_EXPORT_METHOD(skipToPrevious:(double)initialPosition
110
+ resolve:(RCTPromiseResolveBlock)resolve
111
+ reject:(RCTPromiseRejectBlock)reject) {
112
+ [_player skipToPreviousWithInitialPosition:initialPosition resolve:resolve reject:reject];
113
+ }
114
+
115
+ RCT_EXPORT_METHOD(move:(double)fromIndex
116
+ toIndex:(double)toIndex
117
+ resolve:(RCTPromiseResolveBlock)resolve
118
+ reject:(RCTPromiseRejectBlock)reject) {
119
+ [_player moveFrom:(NSInteger)fromIndex toIndex:(NSInteger)toIndex resolve:resolve reject:reject];
120
+ }
121
+
122
+ RCT_EXPORT_METHOD(play:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
123
+ [_player playWithResolve:resolve reject:reject];
124
+ }
125
+
126
+ RCT_EXPORT_METHOD(pause:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
127
+ [_player pauseWithResolve:resolve reject:reject];
128
+ }
129
+
130
+ RCT_EXPORT_METHOD(stop:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
131
+ [_player stopWithResolve:resolve reject:reject];
132
+ }
133
+
134
+ RCT_EXPORT_METHOD(reset:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
135
+ [_player resetWithResolve:resolve reject:reject];
136
+ }
137
+
138
+ RCT_EXPORT_METHOD(seekTo:(double)position
139
+ resolve:(RCTPromiseResolveBlock)resolve
140
+ reject:(RCTPromiseRejectBlock)reject) {
141
+ [_player seekTo:position resolve:resolve reject:reject];
142
+ }
143
+
144
+ RCT_EXPORT_METHOD(seekBy:(double)offset
145
+ resolve:(RCTPromiseResolveBlock)resolve
146
+ reject:(RCTPromiseRejectBlock)reject) {
147
+ [_player seekBy:offset resolve:resolve reject:reject];
148
+ }
149
+
150
+ RCT_EXPORT_METHOD(setVolume:(double)volume
151
+ resolve:(RCTPromiseResolveBlock)resolve
152
+ reject:(RCTPromiseRejectBlock)reject) {
153
+ [_player setVolume:(float)volume resolve:resolve reject:reject];
154
+ }
155
+
156
+ RCT_EXPORT_METHOD(getVolume:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
157
+ resolve(@([_player getVolume]));
158
+ }
159
+
160
+ RCT_EXPORT_METHOD(setRate:(double)rate
161
+ resolve:(RCTPromiseResolveBlock)resolve
162
+ reject:(RCTPromiseRejectBlock)reject) {
163
+ [_player setRate:(float)rate resolve:resolve reject:reject];
164
+ }
165
+
166
+ RCT_EXPORT_METHOD(getRate:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
167
+ resolve(@([_player getRate]));
168
+ }
169
+
170
+ RCT_EXPORT_METHOD(setRepeatMode:(double)mode
171
+ resolve:(RCTPromiseResolveBlock)resolve
172
+ reject:(RCTPromiseRejectBlock)reject) {
173
+ [_player setRepeatMode:(NSInteger)mode resolve:resolve reject:reject];
174
+ }
175
+
176
+ RCT_EXPORT_METHOD(getRepeatMode:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
177
+ resolve(@([_player getRepeatMode]));
178
+ }
179
+
180
+ RCT_EXPORT_METHOD(getQueue:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
181
+ resolve([_player getQueue]);
182
+ }
183
+
184
+ RCT_EXPORT_METHOD(getActiveTrackIndex:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
185
+ NSNumber *idx = [_player getActiveTrackIndex];
186
+ resolve(idx);
187
+ }
188
+
189
+ RCT_EXPORT_METHOD(getActiveTrack:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
190
+ resolve([_player getActiveTrack]);
191
+ }
192
+
193
+ RCT_EXPORT_METHOD(getTrack:(double)index
194
+ resolve:(RCTPromiseResolveBlock)resolve
195
+ reject:(RCTPromiseRejectBlock)reject) {
196
+ resolve([_player getTrackAtIndex:(NSInteger)index]);
197
+ }
198
+
199
+ RCT_EXPORT_METHOD(getQueueSize:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
200
+ resolve(@([_player getQueueSize]));
201
+ }
202
+
203
+ RCT_EXPORT_METHOD(getPlaybackState:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
204
+ resolve([_player getPlaybackState]);
205
+ }
206
+
207
+ RCT_EXPORT_METHOD(getProgress:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
208
+ resolve([_player getProgress]);
209
+ }
210
+
211
+ RCT_EXPORT_METHOD(updateMetadataForTrack:(double)index
212
+ metadata:(NSDictionary *)metadata
213
+ resolve:(RCTPromiseResolveBlock)resolve
214
+ reject:(RCTPromiseRejectBlock)reject) {
215
+ [_player updateMetadataForTrack:(NSInteger)index metadata:metadata resolve:resolve reject:reject];
216
+ }
217
+
218
+ RCT_EXPORT_METHOD(clearNowPlayingMetadata:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
219
+ [_player clearNowPlayingMetadataWithResolve:resolve reject:reject];
220
+ }
221
+
222
+ RCT_EXPORT_METHOD(updateNowPlayingMetadata:(NSDictionary *)metadata
223
+ resolve:(RCTPromiseResolveBlock)resolve
224
+ reject:(RCTPromiseRejectBlock)reject) {
225
+ [_player updateNowPlayingMetadata:metadata resolve:resolve reject:reject];
226
+ }
227
+
228
+ RCT_EXPORT_METHOD(updateOptions:(NSDictionary *)options
229
+ resolve:(RCTPromiseResolveBlock)resolve
230
+ reject:(RCTPromiseRejectBlock)reject) {
231
+ [_player updateOptions:options resolve:resolve reject:reject];
232
+ }
233
+
234
+ // ── New Architecture (TurboModule) ────────────────────────────────────────────
235
+
236
+ #ifdef RCT_NEW_ARCH_ENABLED
237
+ - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
238
+ (const facebook::react::ObjCTurboModule::InitParams &)params {
239
+ return std::make_shared<facebook::react::NativeGliphPlayerSpecJSI>(params);
240
+ }
241
+ #endif
242
+
243
+ @end
@@ -0,0 +1,22 @@
1
+ //
2
+ // expo_gliph_player.h
3
+ //
4
+ // Master header matching the pod's module name (dashes -> underscores).
5
+ // Xcode's Swift-generated interop header (expo_gliph_player-Swift.h) hardcodes
6
+ // a self-import of <expo_gliph_player/expo_gliph_player.h> for any module that
7
+ // has DEFINES_MODULE = YES and contains Swift — this file only needs to EXIST
8
+ // under that exact name for the build to find it.
9
+ //
10
+ // IMPORTANT: do NOT re-export GliphAudioPlayer.h from here (e.g. via
11
+ // `#import "GliphAudioPlayer.h"`). The authoritative Objective-C interface
12
+ // for the Swift `GliphAudioPlayer` class is auto-generated by the Swift
13
+ // compiler itself, inside expo_gliph_player-Swift.h. GliphPlayerModule.mm
14
+ // imports that generated header directly. If this file also pulls in a
15
+ // second, hand-written declaration of the same class name, both end up in
16
+ // the same translation unit and the build fails with:
17
+ // "Duplicate interface definition for class 'GliphAudioPlayer'"
18
+ // (which in turn cascades into unrelated-looking parse errors later in
19
+ // GliphPlayerModule.mm, since Clang's parser gets confused after the
20
+ // redefinition).
21
+ //
22
+ #import <Foundation/Foundation.h>
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ exports.isBuffering = isBuffering;
8
+ exports.isPaused = isPaused;
9
+ exports.isPlaying = isPlaying;
10
+ exports.isStopped = isStopped;
11
+ var _reactNative = require("react-native");
12
+ var _NativeGliphPlayer = _interopRequireDefault(require("./specs/NativeGliphPlayer"));
13
+ var _types = require("./types");
14
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
+ /**
16
+ * GliphPlayer.ts
17
+ *
18
+ * Main JS/TS API surface. Wraps the TurboModule (NativeGliphPlayer) and
19
+ * provides a clean, typed interface identical in spirit to react-native-track-player.
20
+ */
21
+
22
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
23
+
24
+ let _emitter = null;
25
+ function getEmitter() {
26
+ if (!_NativeGliphPlayer.default) {
27
+ throw new Error('[RNGliphPlayer] Native module not found. Is it linked correctly?');
28
+ }
29
+ if (!_emitter) {
30
+ _emitter = new _reactNative.NativeEventEmitter(_NativeGliphPlayer.default);
31
+ }
32
+ return _emitter;
33
+ }
34
+
35
+ /** Resolve a require()'d asset to a URI string the native side can consume */
36
+ function resolveAssetSource(source) {
37
+ if (typeof source === 'number') {
38
+ const {
39
+ Image
40
+ } = require('react-native');
41
+ return Image.resolveAssetSource(source).uri;
42
+ }
43
+ return source;
44
+ }
45
+
46
+ /** Serialize a Track to a plain object safe for the TurboModule bridge */
47
+ function serializeTrack(track) {
48
+ return {
49
+ id: track.id ?? `track_${Date.now()}_${Math.random().toString(36).slice(2)}`,
50
+ url: resolveAssetSource(track.url),
51
+ title: track.title,
52
+ artist: track.artist,
53
+ album: track.album ?? '',
54
+ artwork: track.artwork != null ? resolveAssetSource(track.artwork) : '',
55
+ duration: track.duration ?? -1,
56
+ genre: track.genre ?? '',
57
+ date: track.date ?? '',
58
+ description: track.description ?? '',
59
+ rating: track.rating ?? 0,
60
+ isLiveStream: track.isLiveStream ?? false,
61
+ headers: track.headers ?? {},
62
+ pitchAlgorithm: track.pitchAlgorithm ?? 0,
63
+ userAgent: track.userAgent ?? ''
64
+ };
65
+ }
66
+ function checkModule() {
67
+ if (!_NativeGliphPlayer.default) {
68
+ throw new Error('[RNGliphPlayer] Native module not found. ' + 'Ensure you have rebuilt the app after installing the library and ' + 'that you are not calling player methods before the JSI bridge is ready.');
69
+ }
70
+ return _NativeGliphPlayer.default;
71
+ }
72
+
73
+ // ─── GliphPlayer API ─────────────────────────────────────────────────────────
74
+
75
+ const GliphPlayer = {
76
+ // ── Setup ──────────────────────────────────────────────────────────────────
77
+
78
+ /**
79
+ * Initialize the player. Must be called once before any other method.
80
+ * Safe to call multiple times — subsequent calls are no-ops.
81
+ */
82
+ async setupPlayer(options = {}) {
83
+ if (!_NativeGliphPlayer.default) {
84
+ throw new Error('[RNGliphPlayer] Native module not ready. Ensure setup is called after app initialization.');
85
+ }
86
+ const opts = {
87
+ minBuffer: options.minBuffer ?? 15,
88
+ maxBuffer: options.maxBuffer ?? 50,
89
+ playBuffer: options.playBuffer ?? 2.5,
90
+ backBuffer: options.backBuffer ?? 0,
91
+ maxCacheSize: options.maxCacheSize ?? 0,
92
+ iosCategory: options.iosCategory ?? 'playback',
93
+ iosCategoryMode: options.iosCategoryMode ?? 'default',
94
+ iosCategoryOptions: options.iosCategoryOptions ?? [],
95
+ waitForBuffer: options.waitForBuffer ?? true,
96
+ autoHandleInterruptions: options.autoHandleInterruptions ?? false,
97
+ autoUpdateMetadata: options.autoUpdateMetadata ?? true,
98
+ progressUpdateEventInterval: options.progressUpdateEventInterval ?? 1.0,
99
+ android: options.android ?? {}
100
+ };
101
+ return _NativeGliphPlayer.default.setupPlayer(opts);
102
+ },
103
+ /**
104
+ * Destroy the player and release all resources.
105
+ */
106
+ destroy() {
107
+ checkModule().destroy();
108
+ _emitter = null;
109
+ },
110
+ /**
111
+ * Returns true if the background service is running (Android).
112
+ */
113
+ async isServiceRunning() {
114
+ if (_reactNative.Platform.OS !== 'android') {
115
+ return true;
116
+ }
117
+ return checkModule().isServiceRunning();
118
+ },
119
+ // ── Queue management ───────────────────────────────────────────────────────
120
+
121
+ /**
122
+ * Add one or more tracks to the queue.
123
+ * @param tracks Single track or array of tracks.
124
+ * @param insertBeforeIndex Insert position. Defaults to end of queue.
125
+ * @returns The index of the first inserted track.
126
+ */
127
+ async add(tracks, insertBeforeIndex) {
128
+ const arr = Array.isArray(tracks) ? tracks : [tracks];
129
+ const serialized = arr.map(serializeTrack);
130
+ // Pass -1 as sentinel for "append to end" — Codegen doesn't support optional number params
131
+ const result = await checkModule().add(serialized, insertBeforeIndex ?? -1);
132
+ return result;
133
+ },
134
+ /**
135
+ * Remove tracks by their IDs.
136
+ */
137
+ async remove(trackIds) {
138
+ const ids = Array.isArray(trackIds) ? trackIds : [trackIds];
139
+ return checkModule().remove(ids);
140
+ },
141
+ /**
142
+ * Remove all tracks after the current one.
143
+ */
144
+ async removeUpcomingTracks() {
145
+ return checkModule().removeUpcomingTracks();
146
+ },
147
+ /**
148
+ * Skip to a specific queue index.
149
+ */
150
+ async skip(index, initialPosition) {
151
+ return checkModule().skip(index, initialPosition ?? -1);
152
+ },
153
+ /**
154
+ * Skip to the next track.
155
+ */
156
+ async skipToNext(initialPosition) {
157
+ return checkModule().skipToNext(initialPosition ?? -1);
158
+ },
159
+ /**
160
+ * Skip to the previous track.
161
+ */
162
+ async skipToPrevious(initialPosition) {
163
+ return checkModule().skipToPrevious(initialPosition ?? -1);
164
+ },
165
+ /**
166
+ * Move a track from one index to another.
167
+ */
168
+ async move(fromIndex, toIndex) {
169
+ return checkModule().move(fromIndex, toIndex);
170
+ },
171
+ // ── Playback control ───────────────────────────────────────────────────────
172
+
173
+ async play() {
174
+ return checkModule().play();
175
+ },
176
+ async pause() {
177
+ return checkModule().pause();
178
+ },
179
+ async stop() {
180
+ return checkModule().stop();
181
+ },
182
+ /**
183
+ * Stop playback and clear the queue.
184
+ */
185
+ async reset() {
186
+ return checkModule().reset();
187
+ },
188
+ /**
189
+ * Seek to an absolute position in seconds.
190
+ */
191
+ async seekTo(position) {
192
+ return checkModule().seekTo(position);
193
+ },
194
+ /**
195
+ * Seek by a relative offset in seconds (positive = forward, negative = back).
196
+ */
197
+ async seekBy(offset) {
198
+ return checkModule().seekBy(offset);
199
+ },
200
+ /**
201
+ * Set volume (0.0 – 1.0).
202
+ */
203
+ async setVolume(volume) {
204
+ if (volume < 0 || volume > 1) {
205
+ throw new Error('Volume must be between 0 and 1');
206
+ }
207
+ return checkModule().setVolume(volume);
208
+ },
209
+ async getVolume() {
210
+ return checkModule().getVolume();
211
+ },
212
+ /**
213
+ * Set playback rate (1.0 = normal speed).
214
+ */
215
+ async setRate(rate) {
216
+ return checkModule().setRate(rate);
217
+ },
218
+ async getRate() {
219
+ return checkModule().getRate();
220
+ },
221
+ async setRepeatMode(mode) {
222
+ return checkModule().setRepeatMode(mode);
223
+ },
224
+ async getRepeatMode() {
225
+ const mode = await checkModule().getRepeatMode();
226
+ return mode;
227
+ },
228
+ // ── Queue getters ──────────────────────────────────────────────────────────
229
+
230
+ async getQueue() {
231
+ const queue = await checkModule().getQueue();
232
+ return queue;
233
+ },
234
+ async getActiveTrackIndex() {
235
+ const idx = await checkModule().getActiveTrackIndex();
236
+ // Native returns -1 as sentinel when no track is active
237
+ return idx < 0 ? null : idx;
238
+ },
239
+ async getActiveTrack() {
240
+ const track = await checkModule().getActiveTrack();
241
+ return track;
242
+ },
243
+ async getTrack(index) {
244
+ const track = await checkModule().getTrack(index);
245
+ return track;
246
+ },
247
+ async getQueueSize() {
248
+ return checkModule().getQueueSize();
249
+ },
250
+ // ── State / progress ───────────────────────────────────────────────────────
251
+
252
+ async getPlaybackState() {
253
+ const state = await checkModule().getPlaybackState();
254
+ return state;
255
+ },
256
+ async getProgress() {
257
+ const progress = await checkModule().getProgress();
258
+ return progress;
259
+ },
260
+ // ── Metadata ───────────────────────────────────────────────────────────────
261
+
262
+ async updateMetadataForTrack(index, metadata) {
263
+ return checkModule().updateMetadataForTrack(index, metadata);
264
+ },
265
+ async clearNowPlayingMetadata() {
266
+ return checkModule().clearNowPlayingMetadata();
267
+ },
268
+ async updateNowPlayingMetadata(metadata) {
269
+ return checkModule().updateNowPlayingMetadata(metadata);
270
+ },
271
+ // ── Options / notification ─────────────────────────────────────────────────
272
+
273
+ /**
274
+ * Configure notification capabilities, jump intervals, etc.
275
+ */
276
+ async updateOptions(options) {
277
+ return checkModule().updateOptions(options);
278
+ },
279
+ // ── Event subscription ─────────────────────────────────────────────────────
280
+
281
+ /**
282
+ * Subscribe to a player event.
283
+ * Returns an unsubscribe function — call it to remove the listener.
284
+ *
285
+ * @example
286
+ * const unsub = GliphPlayer.addEventListener(Event.PlaybackState, ({ state }) => {
287
+ * console.log('State:', state);
288
+ * });
289
+ * // later:
290
+ * unsub();
291
+ */
292
+ addEventListener(event, listener) {
293
+ const subscription = getEmitter().addListener(event, listener);
294
+ return () => subscription.remove();
295
+ }
296
+ };
297
+ var _default = exports.default = GliphPlayer; // ─── Convenience state helpers ────────────────────────────────────────────────
298
+ function isPlaying(state) {
299
+ return state === _types.State.Playing;
300
+ }
301
+ function isPaused(state) {
302
+ return state === _types.State.Paused;
303
+ }
304
+ function isBuffering(state) {
305
+ return state === _types.State.Buffering || state === _types.State.Loading;
306
+ }
307
+ function isStopped(state) {
308
+ return state === _types.State.Stopped || state === _types.State.None;
309
+ }
310
+ //# sourceMappingURL=GliphPlayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","_NativeGliphPlayer","_interopRequireDefault","_types","e","__esModule","default","_emitter","getEmitter","NativeGliphPlayer","Error","NativeEventEmitter","resolveAssetSource","source","Image","uri","serializeTrack","track","id","Date","now","Math","random","toString","slice","url","title","artist","album","artwork","duration","genre","date","description","rating","isLiveStream","headers","pitchAlgorithm","userAgent","checkModule","GliphPlayer","setupPlayer","options","opts","minBuffer","maxBuffer","playBuffer","backBuffer","maxCacheSize","iosCategory","iosCategoryMode","iosCategoryOptions","waitForBuffer","autoHandleInterruptions","autoUpdateMetadata","progressUpdateEventInterval","android","destroy","isServiceRunning","Platform","OS","add","tracks","insertBeforeIndex","arr","Array","isArray","serialized","map","result","remove","trackIds","ids","removeUpcomingTracks","skip","index","initialPosition","skipToNext","skipToPrevious","move","fromIndex","toIndex","play","pause","stop","reset","seekTo","position","seekBy","offset","setVolume","volume","getVolume","setRate","rate","getRate","setRepeatMode","mode","getRepeatMode","getQueue","queue","getActiveTrackIndex","idx","getActiveTrack","getTrack","getQueueSize","getPlaybackState","state","getProgress","progress","updateMetadataForTrack","metadata","clearNowPlayingMetadata","updateNowPlayingMetadata","updateOptions","addEventListener","event","listener","subscription","addListener","_default","exports","isPlaying","State","Playing","isPaused","Paused","isBuffering","Buffering","Loading","isStopped","Stopped","None"],"sourceRoot":"..\\..\\src","sources":["GliphPlayer.ts"],"mappings":"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","ignoreList":[]}