nativescript-spotify
为您的 NativeScript 应用提供 Spotify 功能。
npm i --save nativescript-spotify

alt text

适用于 Spotify iOS 和 Android SDK 的 NativeScript 插件。

安装

npm install nativescript-spotify --save

先决条件

  • Spotify 流媒体需要 高级 账户。
  • 在此处创建 Spotify 开发者账户:https://developer.spotify.com/
  • 在您的开发者账户中创建一个应用,并按照以下说明进行设置:https://developer.spotify.com/technologies/spotify-ios-sdk/tutorial/#creating-your-client-id-secret-and-callback-uri

背景

用法

平台先决条件

iOS

设置

  • app.ts

配置应用程序启动阶段,设置您的 Spotify 应用 CLIENT_ID 和 REDIRECT_URL(您在开发者账户中创建的)

import * as application from 'application';
import {NSSpotifyConstants, NSSpotifyAuth} from 'nativescript-spotify';

class MyDelegate extends UIResponder {
public static ObjCProtocols = [UIApplicationDelegate];

public applicationDidFinishLaunchingWithOptions(application: UIApplication, launchOptions: NSDictionary): boolean {

NSSpotifyConstants.CLIENT_ID = 'your spotify premium account api key';
TNSSpotifyAuth.REDIRECT_URL = 'your-app-custom-url-scheme://spotifylogin';
return true;
}
}
application.ios.delegate = MyDelegate;
application.mainModule = "main-page";
application.cssFile = "./app.css";
application.start();
  • main-page.ts
import {SpotifyDemo} from "./main-view-model";

function pageLoaded(args) {
var page = args.object;
page.bindingContext = new SpotifyDemo();
}
exports.pageLoaded = pageLoaded;
  • main-view-model.ts
import {Observable, EventData} from 'data/observable';
import {Page} from 'ui/page';
import {topmost} from 'ui/frame';
import {AnimationCurve} from 'ui/enums';
import * as loader from 'nativescript-loading-indicator';
import {TNSSpotifyConstants, TNSSpotifyAuth, TNSSpotifyPlayer, TNSSpotifyPlaylist, TNSSpotifyRequest, Utils} from 'nativescript-spotify';

export class SpotifyDemo extends Observable {
private _spotify: TNSSpotifyPlayer;

constructor() {
super();

this._spotify = new TNSSpotifyPlayer();

// when using iOS delegates that extend NSObject, TypeScript constructors are not used, therefore a separate `initPlayer()` exists
this._spotify.initPlayer(true); // passing `true` lets player know you want it to emit events (sometimes it's not desired)

// small sample of events (see Documentation below for full list)
this._spotify.audioEvents.on('
albumArtChange', (eventData) => {
this.updateAlbumArt(eventData.data.url);
});
this._spotify.audioEvents.on('
authLoginSuccess', (eventData) => {
this.loginSuccess();
});
}

public login() {
TNSSpotifyAuth.LOGIN();
}

public play(args?: EventData) {
this._spotify.togglePlay('
spotify:track:58s6EuEYJdlb0kO7awm3Vp').then((isPlaying: boolean) => {
console.log(isPlaying ? '
Playing!' : 'Paused!');
}, (error) => {
console.log(`Playback error: ${error}`);
});
}

private updateAlbumArt(url: string) {
this.set(`currentAlbumUrl`, url);
}

private loginSuccess() {
console.log(`loginSuccess!`);
}
}

截图

示例 1 示例 2
Sample1 Sample2
示例 3 示例 4
Sample3 Sample4

Android

设置

  • Android 文档即将推出...

文档

TNSSpotifyPlayer

TNSSpotifyPlayer 实现 SPTAudioStreamingPlaybackDelegate

创建

// Option 1: simple
this.spotify = new TNSSpotifyPlayer();
this.spotify.initPlayer();

// Option 2: advanced
this.spotify = new TNSSpotifyPlayer();
// passing `true` will let the player know it should emit events
this.spotify.initPlayer(true);

// it allows you to listen to events like so:
this.spotify.audioEvents.on('startedPlayingTrack', (event) => {
console.log(event.data.url); // spotify track url
});

// play/pause a track
this.spotify.togglePlay('spotify:track:58s6EuEYJdlb0kO7awm3Vp').then((isPlaying: boolean) => {
console.log(isPlaying ? 'Playing!' : 'Paused!');
}, (error) => {
console.log(`Playback error: ${error}`);
});

方法

方法 描述
togglePlay(track?: string): Promise<any> 允许在指定曲目上切换播放/暂停,或更改曲目。 track 必须是有效的 Spotify 曲目 uri。 了解更多信息
isPlaying(): boolean 确定播放器是否正在播放
isLoggedIn(): boolean 确定播放器是否已认证
setVolume(value: number): Promise<any> 设置播放器音量
loadedTrack(): string 确定当前加载的曲目(Spotify 曲目 uri)
currentTrackMetadata(): ISpotifyTrackMetadata 获取当前曲目的元数据。 了解更多信息

事件

事件 描述
authLoginChange 当认证状态更改时,发送 data = status: boolean
authLoginCheck 当认证回调返回并验证认证时
authLoginSuccess 当认证成功时
albumArtChange 当曲目触发播放开始时,发送 data = url: string,这将触发发送正确的曲目专辑封面。
playerReady 当会话已验证且播放器准备好播放时
changedPlaybackStatus 当播放状态更改时,发送 data = playing: boolean
seekedToOffset 当播放器已跳转到指定偏移量时,发送 data = offset: number
changedVolume 当播放器音量更改时,发送 data = volume: number
changedShuffleStatus 当更改随机播放设置时,发送 data = shuffle: number
changedRepeatStatus 当更改重复设置时,发送 data = repeat: number
changedToTrack 当曲目更改发生时,发送 data = metadata: any
failedToPlayTrack 当曲目播放失败时,发送 data = url: string。提供失败的曲目 URL。
startedPlayingTrack 在播放开始时发送 data = url: string。提供已开始播放的音轨的URL。
stoppedPlayingTrack 在播放停止时发送 data = url: string。提供已停止播放的音轨的URL。
skippedToNextTrack 当播放器跳转到下一音轨时。
skippedToPreviousTrack 当播放器跳转到上一音轨时。
activePlaybackDevice 当音频流对象成为用户账户上的活动播放设备时。
inactivePlaybackDevice 当音频流对象成为用户账户上的非活动播放设备时。
poppedQueue 当音频流对象成为用户账户上的非活动播放设备时。
temporaryConnectionError 发生了临时连接错误。
streamError 在发生流错误时发送 data = error: any
receivedMessage 收到来自Spotify服务的消息时发送 data = message: string
streamDisconnected 当流断开连接时。

TNSSpotifyAuth

TNSSpotifyAuth

提供用于处理身份验证和用户管理的静态属性和方法。

属性

属性 描述
REDIRECT_URL: string 用于设置您的Spotify应用程序重定向URL,用于设备身份验证重定向,例如:'your-app-custom-url-scheme://spotifylogin'
SESSION: SPTSession 表示当前的身份验证会话。
CLEAR_COOKIES: boolean 在身份验证窗口中清除cookie以不记住上次登录的用户。默认值为false
PREMIUM_MSG: string 当非高级用户尝试播放音轨时显示的消息。

方法

方法 描述
LOGIN(): void 启动登录序列。
LOGIN_WITH_SESSION(session): void 使用从应用程序内浏览器身份验证窗口返回的会话登录用户。
LOGOUT(): void 清除持久化的用户会话并通知登录更改。
HANDLE_AUTH_CALLBACK(url): boolean 当使用标准浏览器重定向身份验证时,可以在应用程序启动阶段使用此方法来处理身份验证重定向回应用程序。在旧版本中可能需要。
VERIFY_SESSION(session?: any): Promise<any> 主要在内部使用,但用于从本地持久化中恢复会话和/或更新。
SAVE_SESSION(session): void 主要在内部使用,但可用于持久化有效的Spotify会话。
GET_STORED_SESSION(): any 获取当前用户的会话。 了解更多信息
RENEW_SESSION(session): Promise<any> 可用于将过期的会话传递以更新它。
CURRENT_USER(): Promise<any> 获取当前用户对象。 了解更多信息

TNSSpotifySearch

TNSSpotifyAuth

提供1个静态方法来搜索Spotify。

方法

方法 描述
QUERY(query: string, queryType: string, offset: number = 0): Promise<any> 搜索并分页浏览Spotify搜索结果。解析为对象结构:{page: number (offset), hasNextPage: boolean, totalListLength: number, tracks: Array}。目前支持使用queryType = 'track'。更多查询类型即将推出。

为什么使用TNS前缀名称?

TNS代表Telerik NativeScript

iOS使用以NS前缀的类(源自古老的NeXTSTEP时代):https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/

为了避免与iOS原生类混淆,使用TNS

许可证

MIT