/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

Ruby(Rails)からiTunes Search APIを使って音楽を検索する

だいぶご無沙汰な気がします。ちゃんと生きていました。

突然ですが、皆さん音楽ってどうやって聴いてます?iPod?PC?CD?最近の自分は、物理的なものはどんどん除外でKindleを買っていたりするので、音楽もiPhoneで聴いています。物理的なCDは買わなくなってきているんですよね。

 

iTunes Storeで音楽を探しているときにふっと、「Webで調べられないの?」と気になったのが事の発端。ってことで、RubyiTunes Search APIを使おうと思って調べたことのまとめておこうと思います。

 

いくつかのgemがあった

Ruby(というかRails)でiTunes Search APIに限らず何かしらのAPIを使おうと思った場合真っ先に調べるのがGem。

iTunes Search APIをラップしたGemもきっとあるだろうと思って調べてみました。

dewski/itunes

github.com

一番Starが多かったもの。これを使ってみようかなと思ったのですが、うまく使えなかったのと情報が少なかったため断念。

rlivsey/itunes-search-api

github.com

更新日時が古いけど使ったことあるという情報があったので第一候補。

johnnyiller/itunes-search

github.com

こちらもスターが多かったので使ってみようかなとも思ったのですが、特に理由なく保留。

 

結局、2番目に紹介したitunes-search-api を使うことにしました。

 

いざ使ってみよう

では、itunes-search-api のgemを使ってやってみようと思います。

環境

環境はいつも使っているCloud9のrubyプロジェクト。こんな感じ。

yatta472:~/workspace $ ruby -v
ruby 2.3.4p301 (2017-03-30 revision 58214) [x86_64-linux]
yatta472:~/workspace $ rails -v
Rails 4.2.5
yatta472:~/workspace $ 

Rails5も出ていることだしそろそろ使ってみないとやばいかな。

 

itunes-search-apiのインストール

そしてitunes-search-apiを公式のページを参考にインストール。・・・・・しようとしたのですが、参考にしたこちらのページで気になることが。

 

なにやら、itunes-search-apiのバージョンが古くて、いつの間にかApple側のエンドポイントが変わってしまっていて使えない機能があるとのこと。なので、使う場合にはこのファイルの内容をコピーしてつかったほうがいいよってのが書いてありました。

さらには実際のソースはこのファイルだけとのことなので、Gemとしてインストールする必要も特にないとのこと。

 

そうなのか・・・・

ってことで、Gemとしてではなく直接持ってきてしまいました。持ってきた場所はrailsプロジェクトのlib配下です。

yatta472:~/workspace/lib $ wget https://raw.githubusercontent.com/rlivsey/itunes-search-api/master/lib/itunes-search-api.rb

これでlib配下にitunes-search-api.rbってのがおかれました。

 

オリジナルのGemを入れれば依存関係のあるライブラリが勝手に入るのですが、今回は手動でやっているため、関係のあるライブラリは自分で入れる必要があります。itunes-search-apihttpaty というgemを使っていたので、それをGemfileに自分で追加します。そしてそのあと bundle install

gem 'httparty'

 

Railsの設定

結局、lib配下に独自のライブラリを入れて使うのと同じだと思うので、lib配下を読み取るように config/application.rb に設定を追加します。

module Workspace
  class Application < Rails::Application
 :
    :
    config.autoload_paths += %W(#{config.root}/lib)
  end
end

これでlib配下が自動的に読み込まれるようになった。

 

実行コード

さて。それではコード。SearchClientというクラスを作って、そこでitunes-search-apiを使っています。

 

ちなみに、iTunes Search APIにはsearchlookupの2種類あります。

  • search:文字列指定して、その文字列の検索結果を返す
  • lookup:IDを指定して、そのIDの情報を返す。

 

今回は、searchのほうで情報を調べてみようと思います。

lib/search_client.rb

require 'itunes-search-api'

class SearchClient
    def self.main
        
        ITunesSearchAPI.search(
            :term    => "8/pLanet",
            :country => 'jp',
            :media   => 'music',
            :lang    => 'ja_jp',
            :limit  => '10'
            ).each do |item|
            p item
            print("#{item['artistName']},#{item['trackName']}\n")
        end
    end
end

上記だと、検索ワードは 8/pLanet 、国が日本iTunes Music で言語は 日本語 ,上限を10 で検索しています。

 

実行するとこんな結果になります。

yatta472:~/workspace $ rails runner SearchClient.main
Running via Spring preloader in process 2345
{"wrapperType"=>"track", "kind"=>"song", "artistId"=>1115675551, "collectionId"=>1305511402, "trackId"=>1305511404, "artistName"=>"8/pLanet!!", "collectionName"=>"ふ わりあるたいむ - Single", "trackName"=>"ふわりあるたいむ", "collectionCensoredName"=>"ふわりあるたいむ - Single", "trackCensoredName"=>"ふわりあるたいむ", "artistViewUrl"=>"https://itunes.apple.com/jp/artist/8-planet/1115675551?uo=4", "collectionViewUrl"=>"https://itunes.apple.com/jp/album/%E3%81%B5%E3%82%8F%E3%82%8A%E3%81%82%E3%82%8B%E3%81%9F%E3%81%84%E3%82%80/1305511402?i=1305511404&uo=4", "trackViewUrl"=>"https://itunes.apple.com/jp/album/%E3%81%B5%E3%82%8F%E3%82%8A%E3%81%82%E3%82%8B%E3%81%9F%E3%81%84%E3%82%80/1305511402?i=1305511404&uo=4", "previewUrl"=>"https://audio-ssl.itunes.apple.com/apple-assets-us-std-000001/AudioPreview128/v4/07/3c/79/073c795b-c435-5396-68de-112e136a7241/mzaf_1369985339673438454.plus.aac.p.m4a", "artworkUrl30"=>"http://is1.mzstatic.com/image/thumb/Music118/v4/d4/c1/8c/d4c18c67-e750-ce27-0c55-b6c5801d4326/source/30x30bb.jpg", "artworkUrl60"=>"http://is1.mzstatic.com/image/thumb/Music118/v4/d4/c1/8c/d4c18c67-e750-ce27-0c55-b6c5801d4326/source/60x60bb.jpg", "artworkUrl100"=>"http://is1.mzstatic.com/image/thumb/Music118/v4/d4/c1/8c/d4c18c67-e750-ce27-0c55-b6c5801d4326/source/100x100bb.jpg", "collectionPrice"=>250.0, "trackPrice"=>250.0, "releaseDate"=>"2017-11-08T08:00:00Z", "collectionExplicitness"=>"notExplicit", "trackExplicitness"=>"notExplicit", "discCount"=>1, "discNumber"=>1, "trackCount"=>1, "trackNumber"=>1, "trackTimeMillis"=>209938, "country"=>"JPN", "currency"=>"JPY", "primaryGenreName"=>"アニメ", "isStreamable"=>false}
8/pLanet!!,ふわりあるたいむ
 :
 :

yatta472:~/workspace $ 

無事、searchで取得できました。

指定できるパラメータとか詳しい内容は以下を参考にするといいと思います。

https://affiliate.itunes.apple.com/resources/documentation/itunes_search_api_jp/

 

JSONの補足

1件だけJSONをピックアップ。

{"wrapperType"=>"track", "kind"=>"song", "artistId"=>1115675173, "collectionId"=>1196547832, "trackId"=>1196548013, "artistName"=>"8/pLanet!!", "collectionName"=>"Still. . . - Single", "trackName"=>"Still. . .", "collectionCensoredName"=>"Still. . . - Single", "trackCensoredName"=>"Still. . .", "artistViewUrl"=>"https://itunes.apple.com/jp/artist/8-planet/1115675173?uo=4", "collectionViewUrl"=>"https://itunes.apple.com/jp/album/still/1196547832?i=1196548013&uo=4", "trackViewUrl"=>"https://itunes.apple.com/jp/album/still/1196547832?i=1196548013&uo=4", "previewUrl"=>"https://audio-ssl.itunes.apple.com/apple-assets-us-std-000001/AudioPreview122/v4/13/c3/58/13c3586e-ef37-1e88-7f4e-f114a81fc886/mzaf_2365740846798721728.plus.aac.p.m4a", "artworkUrl30"=>"http://is4.mzstatic.com/image/thumb/Music122/v4/f1/88/ae/f188ae42-0d84-4e74-6c62-01d8cca73d02/source/30x30bb.jpg", "artworkUrl60"=>"http://is4.mzstatic.com/image/thumb/Music122/v4/f1/88/ae/f188ae42-0d84-4e74-6c62-01d8cca73d02/source/60x60bb.jpg", "artworkUrl100"=>"http://is4.mzstatic.com/image/thumb/Music122/v4/f1/88/ae/f188ae42-0d84-4e74-6c62-01d8cca73d02/source/100x100bb.jpg", "collectionPrice"=>250.0, "trackPrice"=>250.0, "releaseDate"=>"2017-02-08T08:00:00Z", "collectionExplicitness"=>"notExplicit", "trackExplicitness"=>"notExplicit", "discCount"=>1, "discNumber"=>1, "trackCount"=>1, "trackNumber"=>1, "trackTimeMillis"=>238937, "country"=>"JPN", "currency"=>"JPY", "primaryGenreName"=>"アニメ", "isStreamable"=>false}
8/pLanet!!,Still. . .

ふむ。色々と情報がカバーの情報とか、アーティスト情報とか値段とかリリース日とか入っておりますな。

色々と使えそうです。

 

まとめ

簡単ではありますが、iTunes Search APIを使って情報を検索してみました。

今回は音楽を対象にしていましたが、アプリとかムービーとかも調べられたので、使ってみると面白いかと思います。

コードとかに間違いがあればご指摘いただけると幸いです。

それではー。

参考にしたサイト

RubyでiTunes Search APIを使う - Qiita