Skip to content

Instantly share code, notes, and snippets.

@bimusiek
Created March 6, 2016 14:02
Show Gist options
  • Save bimusiek/7697ba2bccb53ccb2608 to your computer and use it in GitHub Desktop.
Save bimusiek/7697ba2bccb53ccb2608 to your computer and use it in GitHub Desktop.
SpotifyAPI helper in Swift
import Foundation
import Alamofire
import RxSwift
import SwiftyJSON
class SpotifyAPI {
let accessToken:String
let url:String
let params:[String:AnyObject]
var items:[JSON] = []
var offset = 0
var limit = 30
init(accessToken:String, url:String, params:[String:AnyObject]) {
self.accessToken = accessToken
self.url = url
self.params = params
}
func getAll(offset:Int = 0) -> Observable<JSON> {
let headers = [
"Accept": "application/json; charset=utf-8",
"Authorization": "Bearer \(self.accessToken)"
]
var params = self.params
params["offset"] = offset
params["limit"] = self.limit
DLOG("Getting `\(url)`: params: \(params)")
return Observable.create({ (subscriber) -> Disposable in
delay(0.5, closure: {
Alamofire.request(.GET, self.url, parameters: params, headers: headers).validate().responseJSON { (response) in
switch(response.result) {
case .Success:
let data = JSON(response.result.value!)
self.items.append(data)
subscriber.onNext(data)
subscriber.onCompleted()
case .Failure(let error):
let data = String(data: response.data!, encoding: NSUTF8StringEncoding)
DLOG("Got error from Spotify API: \(data)")
subscriber.onError(error)
subscriber.onCompleted()
return
}
}
})
return AnonymousDisposable {
}
}).flatMap({ (data:JSON) -> Observable<JSON> in
let totalItems = self.items.count * self.limit
if data["total"].intValue > totalItems && data["items"].array!.count > 0 {
return self.getAll(totalItems)
}
return Observable.empty()
})
}
}
// And here example usage
let api = SpotifyAPI(accessToken: SpotifyAuth.sharedInstance.session!.accessToken, url: "https://api.spotify.com/v1/me/tracks", params: [:])
let observableApi = api.getAll()
_ = observableApi.subscribe(onNext: nil, onError: { (error) in
DLOG("Got error on Spotify API: \(error)")
self.delegate?.playlist(self, gotError: error as NSError)
done()
}, onCompleted: {
self.tracks = api.items.flatMap({ (data) -> [JSON] in
let items = data["items"].array!
return items
}).flatMap({ (track) -> Track? in
guard let trackId = track["track"]["id"].string else {
return nil
}
return Track(id: trackId, name: track["track"]["name"].string!, album: track["track"]["album"]["name"].string!, artist: track["track"]["artists"][0]["name"].string!)
})
done()
}, onDisposed: nil)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment