Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

Python で iTunes Search API を叩いて iTunes Storeの音楽を検索する

はじめに

iTunes の Search API を使うと、iTunes Storeで販売されているコンテンツを検索することができます。

iTunes Search API – Partner Resources

検索用のAPI自体は、デベロッパーとしての登録やAPIトークンが必要ないため、手軽に利用できます。

この記事では、PythoniTunes Search API を叩いてiTunes Storeで販売されている音源を検索する方法を紹介します。

iTunes Search API の使い方

エンドポイント

GETメソッドで以下のURIを叩きます。

https://itunes.apple.com/search?parameterkeyvalue

検索のためのクエリの詳細をparameterkeyvalueに与えることで、所望の検索を実行できます。

クエリパラメタ(音楽検索向け)

利用頻度の高そうなクエリパラメータをまとめてみました。

term: 検索キーワード

一番重要な、検索キーワードを渡すための Parameter key です。

URL-encoded された文字列を与えます。また、スペース(空白文字)は"+"で表現します。

例:back number => term:back+number

country: 国コード

検索対象国を国コードで指定します。

国コードは ISO Country Codes を参照してください。 ISO 3166-1 alpha-2 - Wikipedia

国によって検索順位が変わるようであり、注意が必要なパラメタです。

media

メディアの種類を以下のキーワードの中から指定できます。デフォルトではallとなっています。

  • movie
  • podcast
  • music
  • musicVideo
  • audiobook
  • shortFilm
  • tvShow
  • software
  • ebook
  • all

entity

mediaで選択したコンテンツで、さらに細かくコンテンツ内容を指定できます。

media="music"の場合、以下のentityを指定できます。

  • musicArtist
  • musicTrack
  • album
  • musicVideo
  • mix
  • song

attribute

検索キーワードについての指定です。

media="music"の場合、以下のentityを指定できます。

  • genreIndex
  • artistTerm
  • albumTerm
  • ratingIndex
  • songTerm

指定がない場合、すべての属性で検索されます。

limit:

返される検索結果の数を指定できます。

デフォルトでは 50 で、1~200の範囲で指定できます。

lang:

返される検索結果の言語を指定できます。

英語もしくは日本語が指定でき、それぞれen_usja_jp を文字列として与えてください。

JSON result の見方

主要な key を掲載します。

  • kind:
    • 検索結果として帰ってきたコンテンツの種類
    • media とは異なるので注意が必要
  • trackName: 楽曲のタイトル
  • artistName: アーディスト名
  • collectionName: (音楽の場合) アルバム名
  • trackViewUrl: 楽曲の再生ページへのURL
  • previewUrl
    • 30秒のプレビュー音源への直リンク
  • artworkUrl100, artworkUrl60
    • アートワークへの直リンク
  • artistId, collectionId, trackId: 各ID

その他、音楽の場合は、販売金額や時間長なども取得できます。

pythonAPI を叩く

実装

import json
import requests
import urllib
from pprint import pprint


def itunes_api_search_encoder(d):
    s = ""
    for k, v in d.items():
        if k == "term":
            v.replace(" ", "+")
        
        s += k + "=" + v + "&"
    s = s[0:-1]
    #s = urllib.parse.quote(s[0:-1])
    return s
    
def itunes_api_song_parser(json_data):
    lst_in = json_data.get("results")
    lst_ret = []
    
    for d_in in lst_in:
        d_ret = {
            "title":     d_in.get("trackName"),
            "artist":    d_in.get("artistName"),
            "album":     d_in.get("collectionName"),
            "title":     d_in.get("trackName"),
            "id_track":  d_in.get("trackId"),
            "id_artist": d_in.get("artistId"),
            "id_album":  d_in.get("collectionId"),
            "no_disk":   d_in.get("discNumber"),
            "no_track":  d_in.get("trackNumber"),
            "url":       urllib.parse.unquote(d_in.get("trackViewUrl")),
        }
        lst_ret.append(d_ret)
        
    return lst_ret

 
uri = 'https://itunes.apple.com/search'
params = {
    "term":      "あいみょん",
    "attribute": "artistTerm",
    "entity":    "song",
    "country":   "JP",
    "lang":      "ja_jp", #"en_us", #
    "limit":     "3",
}
"""
params = {
    "term":      "カントリーロード",
    "attribute": "songTerm",
    "entity":    "song",
    "country":   "JP",
    "lang":      "ja_jp", #"en_us", #
    "limit":     "3",
}
"""

uri = uri + "?" + itunes_api_search_encoder(params)

res = requests.get(uri)

json_data = json.loads(res.text)

data = itunes_api_song_parser(json_data)

print("URI:\t" + uri + "\n")
pprint(data)

結果

アーティスト検索

$>python call_itunes_search_api.py
URI:    https://itunes.apple.com/search?term=あいみょん&attribute=artistTerm&entity=song&country=JP&lang=ja_jp&limit=3

[{'album': 'マリーゴールド - Single',
  'artist': 'あいみょん',
  'id_album': 1402042886,
  'id_artist': 1165017710,
  'id_track': 1402042897,
  'no_disk': 1,
  'no_track': 1,
  'title': 'マリーゴールド',
  'url': 'https://music.apple.com/jp/album/マリーゴールド/1402042886?i=1402042897&uo=4'},
 {'album': '青春のエキサイトメント',
  'artist': 'あいみょん',
  'id_album': 1273709789,
  'id_artist': 1165017710,
  'id_track': 1273709797,
  'no_disk': 1,
  'no_track': 3,
  'title': '君はロックを聴かない',
  'url': 'https://music.apple.com/jp/album/君はロックを聴かない/1273709789?i=1273709797&uo=4'},
 {'album': '愛を伝えたいだとか - EP',
  'artist': 'あいみょん',
  'id_album': 1218860381,
  'id_artist': 1165017710,
  'id_track': 1218860394,
  'no_disk': 1,
  'no_track': 1,
  'title': '愛を伝えたいだとか',
  'url': 'https://music.apple.com/jp/album/愛を伝えたいだとか/1218860381?i=1218860394&uo=4'}]

楽曲検索

[{'album': 'Country Road - EP',
  'artist': 'ASIAN2',
  'id_album': 262802696,
  'id_artist': 41297187,
  'id_track': 262802698,
  'no_disk': 1,
  'no_track': 1,
  'title': 'Country Road',
  'url': 'https://music.apple.com/jp/album/country-road/262802696?i=262802698&uo=4'},
 {'album': 'ジブリ・ジャズ',
  'artist': 'All That Jazz',
  'id_album': 513714253,
  'id_artist': 274522804,
  'id_track': 513714264,
  'no_disk': 1,
  'no_track': 7,
  'title': 'カントリーロード',
  'url': 'https://music.apple.com/jp/album/カントリーロード/513714253?i=513714264&uo=4'},
 {'album': '耳をすませば サウンドトラック',
  'artist': '野見祐二',
  'id_album': 667855209,
  'id_artist': 193510669,
  'id_track': 667855313,
  'no_disk': 1,
  'no_track': 22,
  'title': 'カントリー・ロード',
  'url': 'https://music.apple.com/jp/album/カントリー-ロード/667855209?i=667855313&uo=4'}]

まとめ

PythoniTunes Search API を叩いてiTunes Storeの音楽を検索しました。

大量楽曲の iTunes Storeへのリンク作成や、販売されているかどうかを調べる際に役立つと思います。