expo-native-track-player 0.1.1

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/ExpoNativeTrackPlayer.podspec +21 -0
  2. package/LICENSE +20 -0
  3. package/README.md +267 -0
  4. package/android/build.gradle +71 -0
  5. package/android/src/main/AndroidManifest.xml +12 -0
  6. package/android/src/main/java/com/exponativetrackplayer/ExpoNativeTrackPlayerModule.kt +528 -0
  7. package/android/src/main/java/com/exponativetrackplayer/ExpoNativeTrackPlayerPackage.kt +34 -0
  8. package/android/src/main/java/com/exponativetrackplayer/ExpoNativeTrackPlayerService.kt +118 -0
  9. package/ios/ExpoNativeTrackPlayer.h +6 -0
  10. package/ios/ExpoNativeTrackPlayer.mm +475 -0
  11. package/lib/module/NativeExpoNativeTrackPlayer.js +5 -0
  12. package/lib/module/NativeExpoNativeTrackPlayer.js.map +1 -0
  13. package/lib/module/constants.js +31 -0
  14. package/lib/module/constants.js.map +1 -0
  15. package/lib/module/events.js +56 -0
  16. package/lib/module/events.js.map +1 -0
  17. package/lib/module/hooks.js +105 -0
  18. package/lib/module/hooks.js.map +1 -0
  19. package/lib/module/index.js +150 -0
  20. package/lib/module/index.js.map +1 -0
  21. package/lib/module/package.json +1 -0
  22. package/lib/module/types/ResourceObject.js +2 -0
  23. package/lib/module/types/ResourceObject.js.map +1 -0
  24. package/lib/module/types/Track.js +4 -0
  25. package/lib/module/types/Track.js.map +1 -0
  26. package/lib/module/types/TrackMetadataBase.js +2 -0
  27. package/lib/module/types/TrackMetadataBase.js.map +1 -0
  28. package/lib/typescript/package.json +1 -0
  29. package/lib/typescript/src/NativeExpoNativeTrackPlayer.d.ts +57 -0
  30. package/lib/typescript/src/NativeExpoNativeTrackPlayer.d.ts.map +1 -0
  31. package/lib/typescript/src/constants.d.ts +23 -0
  32. package/lib/typescript/src/constants.d.ts.map +1 -0
  33. package/lib/typescript/src/events.d.ts +163 -0
  34. package/lib/typescript/src/events.d.ts.map +1 -0
  35. package/lib/typescript/src/hooks.d.ts +12 -0
  36. package/lib/typescript/src/hooks.d.ts.map +1 -0
  37. package/lib/typescript/src/index.d.ts +65 -0
  38. package/lib/typescript/src/index.d.ts.map +1 -0
  39. package/lib/typescript/src/types/ResourceObject.d.ts +5 -0
  40. package/lib/typescript/src/types/ResourceObject.d.ts.map +1 -0
  41. package/lib/typescript/src/types/Track.d.ts +22 -0
  42. package/lib/typescript/src/types/Track.d.ts.map +1 -0
  43. package/lib/typescript/src/types/TrackMetadataBase.d.ts +18 -0
  44. package/lib/typescript/src/types/TrackMetadataBase.d.ts.map +1 -0
  45. package/package.json +172 -0
  46. package/src/NativeExpoNativeTrackPlayer.ts +70 -0
  47. package/src/constants.ts +40 -0
  48. package/src/events.ts +136 -0
  49. package/src/hooks.ts +149 -0
  50. package/src/index.tsx +250 -0
  51. package/src/types/ResourceObject.ts +4 -0
  52. package/src/types/Track.ts +23 -0
  53. package/src/types/TrackMetadataBase.ts +17 -0
package/src/index.tsx ADDED
@@ -0,0 +1,250 @@
1
+ import ExpoNativeTrackPlayer, {
2
+ type RepeatMode,
3
+ type State as NativeState,
4
+ type TrackMetadata,
5
+ } from './NativeExpoNativeTrackPlayer';
6
+ import {
7
+ AudioEvents,
8
+ Event,
9
+ TrackPlayerEvents,
10
+ type PlaybackPositionEvent,
11
+ type PlaybackStateEvent,
12
+ type QueueUpdatedEvent,
13
+ type TrackChangedEvent,
14
+ } from './events';
15
+ import type { EventName } from './events';
16
+ import {
17
+ useCurrentTrack,
18
+ useCurrentTrackIndex,
19
+ usePlaybackState,
20
+ useProgress,
21
+ useQueue,
22
+ } from './hooks';
23
+ import type { AddTrack, Track } from './types/Track';
24
+ import type { ResourceObject } from './types/ResourceObject';
25
+ import type { TrackMetadataBase } from './types/TrackMetadataBase';
26
+ import { PitchAlgorithms, TrackTypes } from './constants';
27
+ import type {
28
+ PitchAlgorithm,
29
+ RepeatModeType,
30
+ StateType,
31
+ TrackType,
32
+ } from './constants';
33
+
34
+ export { State, RepeatModes } from './constants';
35
+
36
+ function resolveResourceUri(
37
+ resource?: string | ResourceObject
38
+ ): string | undefined {
39
+ if (resource == null) return undefined;
40
+ if (typeof resource === 'string') return resource;
41
+ return resource.uri;
42
+ }
43
+
44
+ function toTrackMetadata(track: AddTrack): TrackMetadata {
45
+ const { url, artwork, artworkUri, ...rest } = track;
46
+
47
+ const resolvedUrl = resolveResourceUri(url);
48
+ if (!resolvedUrl) {
49
+ throw new Error('Track.url is required');
50
+ }
51
+
52
+ const resolvedArtwork = resolveResourceUri(artwork);
53
+ const metadata: TrackMetadata = {
54
+ ...(rest as TrackMetadata),
55
+ url: resolvedUrl,
56
+ artworkUri: resolvedArtwork ?? artworkUri,
57
+ };
58
+
59
+ return metadata;
60
+ }
61
+
62
+ function toTrackMetadataList(tracks: AddTrack[]): TrackMetadata[] {
63
+ return tracks.map(toTrackMetadata);
64
+ }
65
+
66
+ function callVoid(action: () => void): Promise<void> {
67
+ try {
68
+ action();
69
+ return Promise.resolve();
70
+ } catch (error) {
71
+ return Promise.reject(error);
72
+ }
73
+ }
74
+
75
+ function callValue<T>(action: () => T): Promise<T> {
76
+ try {
77
+ return Promise.resolve(action());
78
+ } catch (error) {
79
+ return Promise.reject(error);
80
+ }
81
+ }
82
+
83
+ export function addToQueue(track: AddTrack): Promise<void> {
84
+ return callVoid(() =>
85
+ ExpoNativeTrackPlayer.addToQueue(toTrackMetadata(track))
86
+ );
87
+ }
88
+
89
+ export function addQueue(tracks: AddTrack[]): Promise<void> {
90
+ return callVoid(() =>
91
+ ExpoNativeTrackPlayer.addQueue(toTrackMetadataList(tracks))
92
+ );
93
+ }
94
+
95
+ export function getQueue(): Promise<TrackMetadata[]> {
96
+ return callValue(() => ExpoNativeTrackPlayer.getQueue());
97
+ }
98
+
99
+ export function removeFromQueue(trackId: string): Promise<void> {
100
+ return callVoid(() => ExpoNativeTrackPlayer.removeFromQueue(trackId));
101
+ }
102
+
103
+ export function clearQueue(): Promise<void> {
104
+ return callVoid(() => ExpoNativeTrackPlayer.clearQueue());
105
+ }
106
+
107
+ export function play(index?: number | null): Promise<void> {
108
+ return callVoid(() => ExpoNativeTrackPlayer.play(index ?? null));
109
+ }
110
+
111
+ export function pause(): Promise<void> {
112
+ return callVoid(() => ExpoNativeTrackPlayer.pause());
113
+ }
114
+
115
+ export function stop(): Promise<void> {
116
+ return callVoid(() => ExpoNativeTrackPlayer.stop());
117
+ }
118
+
119
+ export function skipToNext(): Promise<void> {
120
+ return callVoid(() => ExpoNativeTrackPlayer.skipToNext());
121
+ }
122
+
123
+ export function skipToPrevious(): Promise<void> {
124
+ return callVoid(() => ExpoNativeTrackPlayer.skipToPrevious());
125
+ }
126
+
127
+ export function skipToIndex(index: number): Promise<void> {
128
+ return callVoid(() => ExpoNativeTrackPlayer.skipToIndex(index));
129
+ }
130
+
131
+ export function seekTo(positionMs: number): Promise<void> {
132
+ return callVoid(() => ExpoNativeTrackPlayer.seekTo(positionMs));
133
+ }
134
+
135
+ export function reset(): Promise<void> {
136
+ return callVoid(() => ExpoNativeTrackPlayer.reset());
137
+ }
138
+
139
+ export function setRepeatMode(
140
+ mode: RepeatMode,
141
+ startMs?: number | null,
142
+ endMs?: number | null
143
+ ): Promise<void> {
144
+ return callVoid(() =>
145
+ ExpoNativeTrackPlayer.setRepeatMode(mode, startMs ?? null, endMs ?? null)
146
+ );
147
+ }
148
+
149
+ export function getRepeatMode(): Promise<RepeatMode> {
150
+ return callValue(() => ExpoNativeTrackPlayer.getRepeatMode());
151
+ }
152
+
153
+ export function getCurrentTrack(): Promise<Track | null> {
154
+ return callValue(
155
+ () => ExpoNativeTrackPlayer.getCurrentTrack() as Track | null
156
+ );
157
+ }
158
+
159
+ export function getCurrentTrackIndex(): Promise<number> {
160
+ return callValue(() => ExpoNativeTrackPlayer.getCurrentTrackIndex());
161
+ }
162
+
163
+ export function getPosition(): Promise<number> {
164
+ return callValue(() => ExpoNativeTrackPlayer.getPosition());
165
+ }
166
+
167
+ export function getDuration(): Promise<number> {
168
+ return callValue(() => ExpoNativeTrackPlayer.getDuration());
169
+ }
170
+
171
+ export function getPlaybackState(): Promise<NativeState> {
172
+ return callValue(() => ExpoNativeTrackPlayer.getPlaybackState());
173
+ }
174
+
175
+ export function setVolume(volume: number): Promise<void> {
176
+ return callVoid(() => ExpoNativeTrackPlayer.setVolume(volume));
177
+ }
178
+
179
+ export function getVolume(): Promise<number> {
180
+ return callValue(() => ExpoNativeTrackPlayer.getVolume());
181
+ }
182
+
183
+ export function setRate(rate: number): Promise<void> {
184
+ return callVoid(() => ExpoNativeTrackPlayer.setRate(rate));
185
+ }
186
+
187
+ export function getRate(): Promise<number> {
188
+ return callValue(() => ExpoNativeTrackPlayer.getRate());
189
+ }
190
+
191
+ const TrackPlayer = {
192
+ addToQueue,
193
+ addQueue,
194
+ getQueue,
195
+ removeFromQueue,
196
+ clearQueue,
197
+ play,
198
+ pause,
199
+ stop,
200
+ skipToNext,
201
+ skipToPrevious,
202
+ skipToIndex,
203
+ seekTo,
204
+ reset,
205
+ setRepeatMode,
206
+ getRepeatMode,
207
+ getCurrentTrack,
208
+ getCurrentTrackIndex,
209
+ getPosition,
210
+ getDuration,
211
+ getPlaybackState,
212
+ setVolume,
213
+ getVolume,
214
+ setRate,
215
+ getRate,
216
+ };
217
+
218
+ export default TrackPlayer;
219
+ export type {
220
+ EventName,
221
+ RepeatMode,
222
+ NativeState as PlaybackState,
223
+ Track,
224
+ AddTrack,
225
+ TrackMetadata,
226
+ TrackMetadataBase,
227
+ ResourceObject,
228
+ TrackType,
229
+ PitchAlgorithm,
230
+ RepeatModeType,
231
+ StateType,
232
+ };
233
+ export {
234
+ AudioEvents,
235
+ Event,
236
+ TrackPlayerEvents,
237
+ PitchAlgorithms,
238
+ TrackTypes,
239
+ useCurrentTrack,
240
+ useCurrentTrackIndex,
241
+ usePlaybackState,
242
+ useProgress,
243
+ useQueue,
244
+ };
245
+ export type {
246
+ PlaybackPositionEvent,
247
+ PlaybackStateEvent,
248
+ QueueUpdatedEvent,
249
+ TrackChangedEvent,
250
+ };
@@ -0,0 +1,4 @@
1
+ export interface ResourceObject {
2
+ uri: string;
3
+ [key: string]: string | number | boolean | null | undefined;
4
+ }
@@ -0,0 +1,23 @@
1
+ import type { PitchAlgorithm, TrackType } from '../constants';
2
+ import type { ResourceObject } from './ResourceObject';
3
+ import type { TrackMetadataBase } from './TrackMetadataBase';
4
+
5
+ export interface Track extends TrackMetadataBase {
6
+ url: string;
7
+ type?: TrackType;
8
+ /** The user agent HTTP header */
9
+ userAgent?: string;
10
+ /** Mime type of the media file */
11
+ contentType?: string;
12
+ /** (iOS only) The pitch algorithm to apply to the sound. */
13
+ pitchAlgorithm?: PitchAlgorithm;
14
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ headers?: { [key: string]: any };
16
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+ [key: string]: any;
18
+ }
19
+
20
+ export type AddTrack = Track & {
21
+ url: string | ResourceObject;
22
+ artwork?: string | ResourceObject;
23
+ };
@@ -0,0 +1,17 @@
1
+ export interface TrackMetadataBase {
2
+ id: string;
3
+ title?: string;
4
+ artist?: string;
5
+ albumName?: string;
6
+ artworkUri?: string;
7
+ trackNumber?: number;
8
+ duration?: number;
9
+ composer?: string;
10
+ conductor?: string;
11
+ genre?: string;
12
+ compilation?: string;
13
+ subtitle?: string;
14
+ description?: string;
15
+ station?: string;
16
+ mediaType?: number;
17
+ }