iTunes APIのURLを叩くだけでカンタンに楽曲情報を取得できる方法を見つけたので、具体的なコードなども含めてご説明します。
独自構造体を作る
まずは楽曲情報を格納するための自作構造体を作ります。
import Foundation
struct MusicInfoModel: Codable {
var trackViewUrl : String
var collectionId : Int
var trackId : Int
var artistName: String
var trackName: String
var collectionName: String
var artworkUrl100: String
var releaseDate: String
var primaryGenreName: String
init(trackViewUrl: String,
collectionId: Int,
trackId: Int,
artistName: String,
trackName: String,
collectionName: String,
artworkUrl100: String,
releaseDate: String,
primaryGenreName: String) {
self.trackViewUrl = trackViewUrl
self.collectionId = collectionId
self.trackId = trackId
self.artistName = artistName
self.trackName = trackName
self.collectionName = collectionName
self.artworkUrl100 = artworkUrl100
self.releaseDate = releaseDate
self.primaryGenreName = primaryGenreName
}
}
取得している情報は
コレクションID
トラックID
アーティスト名
トラック名
コレクション名
アートワーク画像
リリース日
ジャンル名
といった感じ。
iTunes APIで楽曲情報を取得
次にiTunes APIで楽曲情報を取得する関数を定義。
//曲検索関数
public func fetchTrack(text: String, completion: @escaping (([MusicInfoModel]) -> 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{
MusicInfoModel(
trackViewUrl: $0["trackViewUrl"] as? String ?? "",
collectionId: $0["collectionId"] as? Int ?? 0,
trackId: $0["trackId"] as? Int ?? 0,
artistName: $0["artistName"] as? String ?? "",
trackName: $0["trackName"] as? String ?? "",
collectionName: $0["collectionName"] as? String ?? "",
artworkUrl100: $0["artworkUrl100"] as? String ?? "",
releaseDate: $0["releaseDate"] as? String ?? "",
primaryGenreName: $0["primaryGenreName"] as? String ?? "")
}
completion(trackDatas)
}
else{
print("検索結果が見つかりませんでした")
}
} catch let error {
print("error",error)
}
}
}
task.resume()
}
関数を呼び出す時は以下の通り。
self.fetchTrack(text: value, completion: { tracks in
print(tracks[0])
})
参考URL
Swiftのお役立ち情報