【Swift】iTunes APIでカンタンに楽曲情報を取得する方法

iTunes APIのURLを叩くだけでカンタンに楽曲情報を取得できる方法を見つけたので、具体的なコードなども含めてご説明します。

## 独自構造体を作る
まずは楽曲情報を格納するための自作構造体を作ります。

```swift
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で楽曲情報を取得する関数を定義。

```swift
    //曲検索関数
    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()
    }


```

関数を呼び出す時は以下の通り。

```swift
self.fetchTrack(text: value, completion: { tracks in
    print(tracks[0])
})
```

## 参考URL

https://blog.shota-ito.com/2020/07/03/post-592/

## Swiftのお役立ち情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html