UNPKG

@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
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