SwiftySpot - Swift Spotify API 库
Spotify API 的 swift 实现
内容
简介
此库提供了一个与 Spotify API 交互的接口
该模块支持 macOS 10.13+ 和 iOS 11.0+
要使用 Spotify API 需要以下内容
- 活动会话(客户端令牌)。通常,令牌的有效期为 14 天。令牌在客户端通过挑战时提供。过期后必须重新生成
- 授权:访问和刷新令牌。通常访问令牌的有效期为 2 小时。在过期后,可以通过刷新令牌(如果存在)或通过登录重新生成
- 访问点主机(对于某些端点)。可以通过活动会话检索
设置
###SwiftPM
SwiftySpot 通过 SPM(Swift 包管理器)可用
.package(url: "https://github.com/mIwr/CryptoSwift.git", .from(from: "0.4.9"))
CocoaPods
SwiftSpot 通过 CocoaPods 可用。要安装模块,只需将其添加到 Podfile 中
- iOS
platform :ios, '11.0'
...
pod 'SwiftySpot'
- macOS
platform :osx, '10.13'
...
pod 'SwiftySpot'
入门
您可以通过 SPClient 实例与 API 交互。
客户端有 3 种状态
- 无会话和授权的客户端。例如,第一次启动
- 具有会话但无授权的客户端
- 具有会话和授权的客户端,包括无访问令牌但具有刷新凭据的状态
SPClient 管理自己的会话:初始化(客户端会话)或必要时刷新(客户端会话和 auth 令牌)
客户端初始化。状态 1
import SwiftySpot
let device = SPDevice(os: "osName", osVer: "osVersion", osVerNum: 1, cpuAbi: "32", manufacturer: "brand", model: "model", deviceId: "{8 bytes hex string}")
let client = SPClient(device: device)
可用的 API 方法 - 使用凭据授权。在授权过程中将自动生成客户端令牌
客户端初始化。状态 2
import SwiftySpot
let device = SPDevice(os: "osName", osVer: "os version, osVerNum: {os number}, cpuAbi: "32", manufacturer: "brand", model: "model", deviceId: "{8 bytes hex string}")
let clToken = "..."
let clExpires = 3600
let clRefresh = 4800
let clCreateTs = 0
let client = SPClient(device: device, clToken: clToken, clTokenExpires: clExpires, clTokenRefreshAfter: clRefresh, clTokenCreateTsUTC: clCreated)
可用的 API 方法 - 使用凭据授权
客户端初始化。状态 3
import SwiftySpot
let device = SPDevice(os: "osName", osVer: "os version, osVerNum: {os number}, cpuAbi: "32", manufacturer: "brand", model: "model", deviceId: "{8 bytes hex string}")
let clToken = "..."
let clExpires = 3600
let clRefresh = 4800
let clCreateTs = 0
let authToken = "..."
let authExpires = 7200
let authCreateTs = 0
let username = "..."
let storedCredential = Data()
let client = SPClient(device: device, clToken: clToken, clTokenExpires: clExpires, clTokenRefreshAfter: clRefresh, clTokenCreateTsUTC: clCreated, authToken: authToken, authExpiresInS: authExpires, username: username, storedCred: storedCredential, authTokenCreateTsUTC: authCreateTs)
所有 API 方法都可用
管理元数据
库内置了元数据管理器。它缓存 API 请求的所有艺术家、专辑和曲目元数据,默认使用空存储初始化 API 客户端。您可以用起始元数据初始化该管理器
元数据提供者提示
元数据可以通过以下 3 种方式提供:
- 通过管理实例的 search 方法:searchTrack(-s)、searchArtist(-s)、searchAlbum(-s)
let trackNavUri = "spotify:track:123
let track: SPMetadataTrack? = client.metaStorage.findTrack(uri: trackNavUri)
- 通过管理实例的属性,这些属性返回所有可用数据
let allAlbumsMeta: [SPMetadataAlbum] = client.metaStorage.cachedAlbumsMeta
- 通过 通知中心 更新事件
通知.Name | 名称键 | 有效载荷类型 | 描述 |
---|---|---|---|
SPAritistMetaUpdate | SPAritistMetaUpdate | SPMetadataArtist | API 客户端收到艺术家元数据 |
SPAlbumMetaUpdate | SPAlbumMetaUpdate | SPMetadataAlbum | API 客户端收到专辑元数据 |
SPTrackMetaUpdate | SPTrackMetaUpdate | SPMetadataTrack | API 客户端收到曲目元数据 |
库具有通知扩展,它提供将有效载荷对象解析为 API 实例的方法
//notification: Notification
let artistParseRes: (Bool, SPMetadataArtist?) = notifcation.tryParseArtistMetaUpdate()
let albumParseRes: (Bool, SPMetadataAlbum?) = notifcation.tryParseAlbumMetaUpdate()
let trackParseRes: (Bool, SPMetadataTrack?) = notifcation.tryParseTrackMetaUpdate()
括号对中的第一个变量(布尔值)是解析状态。'True' 值表示通知具有正确的名称和有效载荷对象类型
管理喜欢和不喜欢集合
图书馆内置了喜欢/不喜欢集合管理器。它将在RAM中缓存艺术家和曲目喜欢/不喜欢,这些将通过API进行处理。管理器在API客户端初始化时默认使用空存储进行初始化。您可以使用“开始集合”初始化管理器。
此外,管理器会保存当前集合状态,包括:
- 同步令牌(集合更新ID)
- 下一页令牌
喜欢/不喜欢提供者提示
喜欢/不喜欢信息可以通过以下三种方式从管理器提供:
- 通过管理器实例的“find”方法
let trackNavUri = "spotify:track:123
let collectionItem: SPCollectionItem? = client.likedTracksStorage.find(uri: trackNavUri)
- 通过管理器实例属性,返回按添加时间顺序排列的所有可用的数据
let allAlbumsMeta: [SPCollectionItem] = client.likedAlbumsStorage.orderedItems
- 通过 通知中心 更新事件
通知.Name | 名称键 | 有效载荷类型 | 描述 |
---|---|---|---|
SPArtistLikeUpdate | SPArtistLikeUpdate | SPCollectionItem | 在喜欢/不喜欢操作时触发,通过增量API请求获取集合或更新集合 |
SPArtistDislikeUpdate | SPArtistDislikeUpdate | SPCollectionItem | 在喜欢/不喜欢操作时触发,通过增量API请求获取集合或更新集合 |
SPAlbumLikeUpdate | SPAlbumLikeUpdate | SPCollectionItem | 在喜欢/不喜欢操作时触发,通过增量API请求获取集合或更新集合 |
SPAlbumDislikeUpdate | SPAlbumDislikeUpdate | SPCollectionItem | 在喜欢/不喜欢操作时触发,通过增量API请求获取集合或更新集合 |
SPTrackLikeUpdate | SPTrackLikeUpdate | SPCollectionItem | 在喜欢/不喜欢操作时触发,通过增量API请求获取集合或更新集合 |
SPTrackDislikeUpdate | SPTrackDislikeUpdate | SPCollectionItem | 在喜欢/不喜欢操作时触发,通过增量API请求获取集合或更新集合 |
库具有通知扩展,它提供将有效载荷对象解析为 API 实例的方法
//notification: Notification
var parseRes: (Bool, SPCollectionItem?) = notifcation.tryParseArtistLikeUpdate()
parseRes = notifcation.tryParseArtistDislikeUpdate()
parseRes = notifcation.tryParseAlbumLikeUpdate()
parseRes = notifcation.tryParseAlbumDislikeUpdate()
parseRes = notifcation.tryParseTrackLikeUpdate()
parseRes = notifcation.tryParseTrackDislikeUpdate()
括号对中的第一个变量(布尔值)是解析状态。'True' 值表示通知具有正确的名称和有效载荷对象类型
用法示例
启动登录(Dac请求)
Spotify Dac对象包含屏幕设计信息和与播放列表的负载数据。SPClient从响应中提取播放列表并将其推送到完成处理器。
client.getLandingData { result in
guard let landing = try? result.get() else {return}
//processing playlists...
}
获取元数据
let uri = SPNavigateUriUtil.generateTrackUri(id: TestConstants.trackId)
client.getTracksDetails(trackUris: [uri]) { result in
guard let meta = try? result.get() else {return}
//processing tracks full info...
}
曲目元数据还包含编解码器下载信息,可用于检索直接下载链接
曲目下载信息
尽管每个Spotify曲目都有许多编解码器变体可供下载(ogg、mp3、mp4、flac等),但只能下载OGG文件(免费-96、160 kbps,高级-320 kbps)
let fileIdHex = "..."//From track audio file metadata
client.getDownloadInfo(hexFileId: fileIdHex) { result in
guard let di = try? result.get() else {return}
//processing track direct download links...
}
应用示例
为API创建了适用于iOS(14.0+、SwiftUI)的应用程序。它实现了一个最小的功能:从dac启动播放列表、显示播放列表曲目、喜欢或不喜欢它们、显示“我的收藏”曲目和搜索曲目。它的源代码是公开的。