Создание массива треков из нескольких списков воспроизведения в Spotify iOS SDK 3.0

#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()
    })
}