LoginSignup
0
2

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

Last updated at Posted at 2021-10-06

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のお役立ち情報

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2