SwiftySpot 0.5.3

SwiftySpot 0.5.3

mIwr 维护。



  • 作者
  • mIwr

SwiftySpot - Swift Spotify API 库

Swift Package Manager compatible Platform

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 种状态

  1. 无会话和授权的客户端。例如,第一次启动
  2. 具有会话但无授权的客户端
  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 种方式提供:

  1. 通过管理实例的 search 方法:searchTrack(-s)、searchArtist(-s)、searchAlbum(-s)
let trackNavUri = "spotify:track:123
let track: SPMetadataTrack? = client.metaStorage.findTrack(uri: trackNavUri)
  1. 通过管理实例的属性,这些属性返回所有可用数据
let allAlbumsMeta: [SPMetadataAlbum] = client.metaStorage.cachedAlbumsMeta
  1. 通过 通知中心 更新事件
通知.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)
  • 下一页令牌

喜欢/不喜欢提供者提示

喜欢/不喜欢信息可以通过以下三种方式从管理器提供:

  1. 通过管理器实例的“find”方法
let trackNavUri = "spotify:track:123
let collectionItem: SPCollectionItem? = client.likedTracksStorage.find(uri: trackNavUri)
  1. 通过管理器实例属性,返回按添加时间顺序排列的所有可用的数据
let allAlbumsMeta: [SPCollectionItem] = client.likedAlbumsStorage.orderedItems
  1. 通过 通知中心 更新事件
通知.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启动播放列表、显示播放列表曲目、喜欢或不喜欢它们、显示“我的收藏”曲目和搜索曲目。它的源代码是公开的。