【Swift】iTunes APIで楽曲情報を取得をしてみる
hey How's going. しょーです。
今回Karaokeyのアップデートに伴って、APIを使用して楽曲検索を試み曲の追加を行いたい!
ということで楽曲情報を取得できるAPIを少し調べて実装してみました。
選定の結果、iTunesAPIが今回手っ取り早く使えそうなので利用してみました。
さて、今回も緩く行こう。
APIの選定
今回楽曲取得を行うにあたり、以下の2つで迷いました。
Spotify API
https://developer.spotify.com/discover/
Spotify APIでは、楽曲情報の取得はもちろん、様々な情報が取得できるものすごく多機能なAPIです。
楽曲のタイプ、どのくらいアコースティックか、ロックか、ダンスか、それぞれ数値化されておりその値も取得できます。
Spotifyを使用していると類似楽曲だったり似たジャンルのプレイリストだったりあったりしますが、それはこの値で編成されているんですねー。
使用にはSpotifyの登録とトークン等のやりとりが必要になります。
iTunes API
Apple製iTunesの情報を取得できるAPIです。
こちらは楽曲だけではなく、映画やpodcast、その他iTunesにデータがある情報ならなんでも取得できます。
基本的な楽曲情報は取得できます。個人開発者であればアプリの情報も取得できるので、自分のアプリ内で別のアプリを表示させるなんてこともできそうですね。
使用には登録やトークン設定は必要なく、URLを叩くだけで取得できます。
今回の目標は楽曲タイトルとアーティスト名のみなので、アクセスに労力を使用しないこちらを使用することに決めました。
iTunes APIの基本情報
簡単な基本情報です。
エンドポイントは以下。
https://itunes.apple.com/search
こちらは get で使用します。
クエリは映画やアプリなどによって変わりますが、楽曲情報を取得するのであれば
https://itunes.apple.com/search?term=[text]&media=music&country=jp
となり、[text]に検索したい文字列を入れるだけで検索が可能です。トークンが必要ないのが楽でいいですね。
countryにJPと入れることで日本語検索が可能になります。
試しに以下のAPI URL を叩いてみてください。JSONファイルをダウンロードできるかと思います。
https://itunes.apple.com/search?term=jack+johnson&media=music&country=jp
詳しいパラメータの説明は以下からお願いします。
こちら使用して楽曲情報の取得を行っていこう!
実装
Karaokeyに実装していきます。
- GET Method
- トークン等も必要ない
- 情報が単純
なので、Alamofire等のライブラリは使用せず、純正のURLSessionを使用していきたいと思います。
久しぶりにプレーンに書くぜ、、、
コード
public func fetchTrack(text: String, completion: @escaping (([Track]) -> Void)) {
let newStr = text.replacingOccurrences(of: " ", with: "+")
var compornent = URLComponents(string: "https://itunes.apple.com/search")!
compornent.queryItems = [
URLQueryItem(name: "term", value: newStr),
URLQueryItem(name: "media", value: "music"),
URLQueryItem(name: "country", value: "JP")
]
let task = URLSession.shared.dataTask(with: compornent.url!) { (data, _, error) in
if error == nil, let data = data {
do {
let datas = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! NSDictionary
let tracks = datas.object(forKey: "results") as! [[String: AnyObject]]
if tracks.count > 0 {
let trackDatas = tracks.map { Track(title: $0["trackName"] as! String, artist: $0["artistName"] as! String) }
completion(trackDatas)
}
} catch let error {
print(error)
}
}
}
task.resume()
}
struct Track: {
let title: String
let artist: String
init(title: String, artist: String) {
self.title = title
self.artist = artist
}
}
めちゃくちゃ単純にかけるやんけ。
実際のコードはもっといろいろ書いてますが、単純な接続ならこれでいけるはず。
completionHandlerで戻ってきたときはTableView等に表示させる想定なので、配列を返すように書いています。
検索文字列のスペースは+に置き換わるので以下の置換フローを追加しています。
let newStr = text.replacingOccurrences(of: " ", with: "+")
使ってみる
fetchTrack(text: text, completion: { tracks in
print(tracks[0].title)
})
// print > barbar
となるはずです!楽勝!
ざっとですが、こんな感じで実装できました。
アプリだとこんな感じに動いてます。
終わりに
以上でしたがどうですか、割と簡単に楽曲情報取得できましたよね。
アートワークも取得できるので、上記のような簡単な情報を取得するならばiTunesAPIを使用するのはアリじゃないでしょうか。
それ以上のデータを利用する場合はSpotifyAPIで遊ぶのもアリかと思います。
参考になれば良きです。
使ってみたかったら以下からよろしくな!
以上だ!
じゃーな!
ディスカッション
コメント一覧
まだ、コメントがありません