@wwdrew/expo-spotify-sdk
Version:
Expo module wrapping the native Spotify iOS (v5) and Android (v4) SDKs for OAuth authentication and App Remote playback control
124 lines • 4.65 kB
JavaScript
import ExpoSpotifySDKModule from "../ExpoSpotifySDKModule";
import { createNativeErrorRethrow } from "../internal/native-errors";
import { SpotifyURI } from "../uri";
import { PlayerError } from "./error";
export { PlayerError } from "./error";
// ---------------------------------------------------------------------------
// Internal helpers
// ---------------------------------------------------------------------------
const rethrowAsPlayerError = createNativeErrorRethrow({
ErrorClass: PlayerError,
unknownCode: "UNKNOWN",
validCodes: new Set([
"NOT_CONNECTED",
"CONNECTION_LOST",
"PREMIUM_REQUIRED",
"INVALID_URI",
"INVALID_PARAMETER",
"OPERATION_NOT_ALLOWED",
"UNKNOWN",
]),
});
// ---------------------------------------------------------------------------
// Player namespace
// ---------------------------------------------------------------------------
/**
* Spotify Player namespace. Transport controls, queue management, and
* player-state subscriptions. Requires `AppRemote.connect()` to be resolved
* before any call.
*
* @example
* ```ts
* import { Player, SpotifyURI } from "@wwdrew/expo-spotify-sdk";
*
* await Player.play(SpotifyURI.from("spotify:track:4uLU6hMCjMI75M1A2tKUQC"));
* const state = await Player.getPlayerState();
*
* const sub = Player.addListener("playerStateChange", (state) => {
* console.log("now playing:", state.track.name, "paused:", state.isPaused);
* });
* ```
*/
export const Player = {
/**
* Asks Spotify to play the entity identified by the given URI.
* Requires Spotify Premium for on-demand track playback; throws
* `PlayerError("PREMIUM_REQUIRED", ...)` for Free users.
*/
play(uri) {
return ExpoSpotifySDKModule.playerPlay(uri).catch(rethrowAsPlayerError);
},
/** Pauses playback. */
pause() {
return ExpoSpotifySDKModule.playerPause().catch(rethrowAsPlayerError);
},
/** Resumes paused playback. */
resume() {
return ExpoSpotifySDKModule.playerResume().catch(rethrowAsPlayerError);
},
/** Skips to the next track in the queue or context. */
skipNext() {
return ExpoSpotifySDKModule.playerSkipNext().catch(rethrowAsPlayerError);
},
/** Skips to the previous track. */
skipPrevious() {
return ExpoSpotifySDKModule.playerSkipPrevious().catch(rethrowAsPlayerError);
},
/**
* Seeks to the given position in milliseconds.
* Only valid when `PlaybackRestrictions.canSeek` is `true`.
*/
seekTo(positionMs) {
return ExpoSpotifySDKModule.playerSeekTo(positionMs).catch(rethrowAsPlayerError);
},
/** Enables or disables shuffle. */
setShuffle(enabled) {
return ExpoSpotifySDKModule.playerSetShuffle(enabled).catch(rethrowAsPlayerError);
},
/**
* Sets the repeat mode.
* @param mode 0 = off, 1 = repeat track, 2 = repeat context.
*/
setRepeatMode(mode) {
return ExpoSpotifySDKModule.playerSetRepeatMode(mode).catch(rethrowAsPlayerError);
},
/**
* Sets the podcast playback speed. Only takes effect when a podcast episode
* is playing; valid speeds are `0.5 | 0.8 | 1.0 | 1.2 | 1.5 | 2.0 | 3.0`.
*/
setPodcastPlaybackSpeed(speed) {
return ExpoSpotifySDKModule.playerSetPodcastPlaybackSpeed(speed).catch(rethrowAsPlayerError);
},
/** Adds a track URI to the end of the current playback queue. */
queue(uri) {
return ExpoSpotifySDKModule.playerQueue(uri).catch(rethrowAsPlayerError);
},
/** Returns the current {@link PlayerState} as a one-shot pull. */
getPlayerState() {
return ExpoSpotifySDKModule.playerGetPlayerState().catch(rethrowAsPlayerError);
},
/** Returns the current {@link CrossfadeState} as a one-shot pull. */
getCrossfadeState() {
return ExpoSpotifySDKModule.playerGetCrossfadeState().catch(rethrowAsPlayerError);
},
/**
* Subscribes to player state changes. The callback fires whenever the
* Spotify app reports a state update (track change, pause/resume, seek,
* shuffle/repeat change, etc.).
*
* Returns a `Subscription` — call `.remove()` to unsubscribe.
*
* @example
* ```ts
* const sub = Player.addListener("playerStateChange", (state) => {
* console.log("track:", state.track.name, "paused:", state.isPaused);
* });
* // ...later:
* sub.remove();
* ```
*/
addListener(event, listener) {
return ExpoSpotifySDKModule.addListener("onPlayerStateChange", listener);
},
};
//# sourceMappingURL=index.js.map