#ios #spotify
#iOS #spotify
Вопрос:
Я смог сделать это с помощью CocoaLibSpotify, но я не могу понять, как это должно быть сделано в новом Spotify iOS SDK.
Я пытаюсь создать массив треков из нескольких списков воспроизведения, которые я загружаю через их URI. Цель здесь — иметь возможность воспроизводить случайным образом треки из всего набора списков воспроизведения.
Я смог загрузить плейлист из его URI, он представлен в виде SPPlaylistSnapshot. Похоже, что нет способа получить отдельные треки из этого SPPlaylistSnapshot, чтобы я мог создать пул, который я могу добавлять и извлекать из него.
Кто-нибудь знает способ сделать это?
Ответ №1:
SPTPlaylistSnapshot
имеет firstTrackPage
свойство, которое содержит первые x треков, где x — номер, который я не могу вспомнить. На этой первой странице вы можете запрашивать дополнительные страницы, пока не получите все треки.
Смотрите документацию для SPTPlaylistSnapshot
и SPTListPage
для получения подробной информации.
Комментарии:
1. Я знаю, что есть более новый API, но я не вижу, чтобы этот был заблокирован. Прямо сейчас, когда я пытаюсь получить элементы с FirstPage или любой другой страницы, значение items.count всегда равно 0, даже если firstTrackPage.totalListLength возвращает > 0, кроме того, количество треков равно 0 в результате SPTPlaylistSnapshot. список воспроизведения (с помощью
Ответ №2:
После аутентификации определите запрос списка воспроизведения, например:
let playListRequest = try! SPTPlaylistList.createRequestForGettingPlaylists(forUser: userName, withAccessToken: token)
Я использую alamofire для отправки этого запроса:
Alamofire.request(playListRequest)
.response { response in
let list = try! SPTPlaylistList(from: response.data, with: response.response)
for playList in list.items {
if let playlist = playList as? SPTPartialPlaylist {
print( playlist.name ) // playlist name
print( playlist.uri) // playlist uri
let stringFromUrl = playlist.uri.absoluteString
let uri = URL(string: stringFromUrl)
// use SPTPlaylistSnapshot to get all the playlists
SPTPlaylistSnapshot.playlist(withURI: uri, accessToken: token!) { (error, snap) in
if let s = snap as? SPTPlaylistSnapshot {
// get the tracks for each playlist
print(s.name)
for track in s.firstTrackPage.items {
if let thistrack = track as? SPTPlaylistTrack {
print(thistrack.name)
}
}
}
}
}
}
}
Ответ №3:
В принципе, все говорят правильно, используйте SPTPlaylistSnapshot, чтобы получить треки для списка воспроизведения, вот мой код для получения всех элементов в списке воспроизведения в Swift 3.
func getTracksFrom(page:SPTListPage, allItems:[SPTPlaylistTrack]) -> [SPTPlaylistTrack] {
guard let items = page.items as? [SPTPlaylistTrack] else {print("empty page");return allItems}
var allTracks = allItems
allTracks.append(contentsOf: items)
var nextPage = SPTListPage()
if page.hasNextPage {
page.requestNextPage(withAccessToken: (SPTAuth.defaultInstance().session.accessToken)!) { (error, data) in
guard let p = data as? SPTListPage else {return}
nextPage = p
}
return getTracksFrom(page:nextPage,allItems:allTracks)
}
return allTracks
}
func getAllTracksFrom(_ playlist:SPTPlaylistSnapshot) -> [SPTPlaylistTrack] {
var allTracks:[SPTPlaylistTrack] = []
allTracks = getTracksFrom(page: playlist.firstTrackPage, allItems: allTracks)
return allTracks
}
override func viewDidLoad() {
super.viewDidLoad()
guard let p = playlist else {return}
SPTPlaylistSnapshot.playlist(withURI: p.uri, accessToken: (SPTAuth.defaultInstance().session.accessToken)!, callback: { (error, dataOrNil) in
guard error == nil else {print(error!);return}
guard let playlistSnapshot = dataOrNil as? SPTPlaylistSnapshot else {print("couldn't cast as SPTPlaylistSnapshot");return}
self.tracks = self.getAllTracksFrom(playlistSnapshot)
self.tableView.reloadData()
})
}