【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

https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI/index.html#//apple_ref/doc/uid/TP40017632-CH3-SW1

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

詳しいパラメータの説明は以下からお願いします。

https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI/Searching.html#//apple_ref/doc/uid/TP40017632-CH5-SW1

こちら使用して楽曲情報の取得を行っていこう!

実装

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で遊ぶのもアリかと思います。

参考になれば良きです。

使ってみたかったら以下からよろしくな!

以上だ!
じゃーな!