だいぶご無沙汰な気がします。ちゃんと生きていました。
突然ですが、皆さん音楽ってどうやって聴いてます?iPod?PC?CD?最近の自分は、物理的なものはどんどん除外でKindleを買っていたりするので、音楽もiPhoneで聴いています。物理的なCDは買わなくなってきているんですよね。
iTunes Storeで音楽を探しているときにふっと、「Webで調べられないの?」と気になったのが事の発端。ってことで、RubyでiTunes Search APIを使おうと思って調べたことのまとめておこうと思います。
いくつかのgemがあった
Ruby(というかRails)でiTunes Search APIに限らず何かしらのAPIを使おうと思った場合真っ先に調べるのがGem。
iTunes Search APIをラップしたGemもきっとあるだろうと思って調べてみました。
dewski/itunes
一番Starが多かったもの。これを使ってみようかなと思ったのですが、うまく使えなかったのと情報が少なかったため断念。
rlivsey/itunes-search-api
更新日時が古いけど使ったことあるという情報があったので第一候補。
johnnyiller/itunes-search
こちらもスターが多かったので使ってみようかなとも思ったのですが、特に理由なく保留。
結局、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-apiは httpaty
という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にはsearch
と lookup
の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を使って情報を検索してみました。
今回は音楽を対象にしていましたが、アプリとかムービーとかも調べられたので、使ってみると面白いかと思います。
コードとかに間違いがあればご指摘いただけると幸いです。
それではー。