【Gracenote Rhythm API】世界最大級音楽ビッグデータGracenoteのAPIで楽曲をレコメンド

2014年12月2日

Pocket

gracenote_thumb

GracenoteのデータはiTunes、Spotifyなど、皆さんもお馴染みの音楽アプリやサービスで使われています。
音楽サービスを始めるならなくてはならないGracenote!!世界最大級の音楽ビッグデータを持つGracenoteのRhythm APIを使って楽曲をレコメンドしてみました!
 
またまた、ハッカソンの話なのですが、GracenoteのAPIは、MUSICIANS HACKATHONとTechCrunch Tokyo Hackathon 2014に参加した時に使わせていただいた、私たちTicaLabお気に入りのAPIです!
情報量が多いので使い道もさまざまで、今までハッカソンだけでもGracenoteを使用した面白いソフトウェアがたくさん作られています。
では、さっそく使ってみましょう。今回は、Rhythm APIを利用してみました。
 
 

APP作成

GracenoteのAPIを利用するためには、まずアカウントを作成しなくてはいけません。
さっそくアカウントを作りましょう。
GracenoteのDeveloperサイトにアクセスし、アカウントを作成して下さい。
Gracenote | Developer Portal
 
アカウント作成が完了したらAPPを作成します。
gracenote1
 
App Nameの名前を入力し、Create Appをクリックします。
gracenote2
 
APPが作成されました。
gracenote4
Client IDは後で使用します。
 
 

ユーザーIDを取得する

user.xmlというファイルをデスクトップに作成します。
user.xmlの中に下記のコードを記入して保存してください。
CLIENT IDのところは、先ほどのCLIENT ID(XXXXXXX-◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯)を入力してください。

<QUERIES>
  <QUERY CMD="REGISTER">
    <CLIENT>CLIENT ID</CLIENT>
  </QUERY>
</QUERIES> 

 
ターミナルを起動します。

//デスクトップに移動
$ cd Desktop
$ curl -d @user.xml https://cXXXXXXX.web.cddbp.net/webapi/xml/1.0/

“XXXXXXX”のところはCLIENT IDのハイフン前の7桁の数字を入れます。
すると下記のようなレスポンスが返ってきます。
 

<RESPONSES>
 <RESPONSE STATUS="OK">
   <USER>△△△△△△△△△△-■■■■■■■■■■■■■■■■■■■■■</USER>
 </RESPONSE>
</RESPONSES>

USERのタグの中に放っているユーザーIDを使用するのでメモしておいてください。
 
 

Rhythm APIで使えるムード、ジャンル、年代を調べる

今回は、Rhythm APIを使用しますのでムード、ジャンル、年代のIDが欲しいので一覧を調べます。
Rhythm APIでは曲名、アーティスト名、ジャンル、年代、ムードなどで楽曲を選曲できるAPIです。
Rhythm API | Gracenote
下記のURLを叩くと一覧情報が返ってきます。
 
ジャンル一覧を見る
”https:/cXXXXXXX.web.cddbp.net/webapi/xml/1.0/radio/fieldvalues?fieldname=RADIOGENRE&lang=jpn&client=CLIENT ID&user=USER ID”
 
gracenote3
 
ムード一覧を見る
”https:/cXXXXXXX.web.cddbp.net/webapi/xml/1.0/radio/fieldvalues?fieldname=RADIOMOOD&lang=jpn&client=CLIENT ID&user=USER ID”
 
年代一覧を見る
”https:/cXXXXXXX.web.cddbp.net/webapi/xml/1.0/radio/fieldvalues?fieldname=RADIOERA&lang=jpn&client=CLIENT ID&user=USER ID”
 
 

ジャンルで楽曲を検索

ジャンルで検索してみたいと思います。
先ほど調べたIDを使用して検索します。
とりあえずポップのジャンルを検索。

<?php
$genre_coad = 36056; //ジャンルーポップのID
$xml = "https://c634880.web.cddbp.net/webapi/xml/1.0/radio/create?genre=" . $genre_coad ."&lang=jpn&return_count=10&client=CLIENT ID&user=USER ID";//ファイルを指定
$xmlData = simplexml_load_file($xml);//xmlを読み込む

echo "<pre>";
var_dump($xmlData);
echo "</pre>";
?>

ポップのジャンルの楽曲データが10曲取得できました。
 
 

ムードで楽曲を検索

ムードで検索してみたいと思います。
センチメンタルのムードを検索。

<?php
$mood_coad = 65324; //ムードーセンチメンタルのID
$xml = "https://c634880.web.cddbp.net/webapi/xml/1.0/radio/create?mood=" . $mood_coad . "&lang=jpn&return_count=10&client=CLIENT ID&user=USER ID";//ファイルを指定
$xmlData = simplexml_load_file($xml);//xmlを読み込む

echo "<pre>";
var_dump($xmlData);
echo "</pre>";
?>

センチメンタルのムードの楽曲データが10曲取得できました。
 
 

年代で楽曲を検索

年代で検索してみたいと思います。
2010年代を検索。

<?php
$era_coad = 42877; //年代ー2010年代のID
$xml = "https://c634880.web.cddbp.net/webapi/xml/1.0/radio/create?era=" . $era_coad . "&lang=jpn&return_count=10&client=CLIENT ID&user=USER ID";//ファイルを指定
$xmlData = simplexml_load_file($xml);//xmlを読み込む

echo "<pre>";
var_dump($xmlData);
echo "</pre>";
?>

2010年代の楽曲データが10曲取得できました。
 
 

気分で楽曲レコメンドDEMO

上記の検索を使ってジャンル、ムード、年代を選んで楽曲をレコメンドしてくれるデモを作ってみました!
楽曲再生にはiTunes APIを使用しています。
 
DEMO
 
HTML

<?php
$submit_flg = false;

if($_POST['submit']){

	$submit_flg = true;

	$genre_id = htmlspecialchars($_POST['genre'],ENT_QUOTES);
	$mood_id = htmlspecialchars($_POST['mood'],ENT_QUOTES);
	$era_id = htmlspecialchars($_POST['era'],ENT_QUOTES);

	$xml = "https://c634880.web.cddbp.net/webapi/xml/1.0/radio/create?focus_popularity=1000&genre=" . $genre_id . "&mood=" . $mood_id . "&era=" . $era_id . "&lang=jpn&return_count=10&client=CLIENT ID&user=USER ID";//ファイルを指定
	$xmlData = simplexml_load_file($xml);

}

//ジャンルリスト
$xml = "https://c634880.web.cddbp.net/webapi/xml/1.0/radio/fieldvalues?fieldname=RADIOGENRE&lang=jpn&client=CLIENT ID&user=USER ID";
$genre_xmlData = simplexml_load_file($xml);

//ムードリスト
$xml = "https://c634880.web.cddbp.net/webapi/xml/1.0/radio/fieldvalues?fieldname=RADIOMOOD&lang=jpn&client=CLIENT ID&user=USER ID";
$mood_xmlData = simplexml_load_file($xml);

//年代
$xml = "https://c634880.web.cddbp.net/webapi/xml/1.0/radio/fieldvalues?fieldname=RADIOERA&lang=jpn&client=CLIENT ID&user=USER ID";
$era_xmlData = simplexml_load_file($xml);
?>

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	
	<title>Gracenote DEMO</title>

	<!-- js -->
	<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
	
</head>
<body>

<form action="" method="post">

	<div>
		ジャンル
		<select name="genre">
			<?php foreach ($genre_xmlData->RESPONSE->GENRE as $genre_list) : ?>
				<option value="<?php echo $genre_list[0]['ID']; ?>"><?php echo $genre_list[0][0]; ?></option>
			<?php endforeach; ?>
		</select>
	</div>
	
	<div>
		ムード
		<select name="mood">
			<?php foreach ($mood_xmlData->RESPONSE->MOOD as $mood_list) : ?>
				<option value="<?php echo $mood_list[0]['ID']; ?>"><?php echo $mood_list[0][0]; ?></option>
			<?php endforeach; ?>
		</select>
	</div>
	
	<div>
		年代
		<select name="era">
			<?php foreach ($era_xmlData->RESPONSE->ERA as $era_list) : ?>
				<option value="<?php echo $era_list[0]['ID']; ?>"><?php echo $era_list[0][0]; ?></option>
			<?php endforeach; ?>
		</select>
	</div>
	<input type="submit" name="submit" value="検索">

</form>

<?php if($submit_flg) : ?>

	<div class="player">
		<div class="image"></div>
		<p class="play_title"></p>
		<p class="play_artist"></p>
	</div>

	<ul>
		<?php 
		$track_no = 0;
		foreach ($xmlData->RESPONSE->ALBUM as $music) : 
			$track_no++;
		?>
			<li id="track_<?php echo $track_no; ?>">
				<p class="title"><?php echo $music->TRACK->TITLE; ?></p>
				<p class="artist"><?php echo $music->ARTIST; ?></p>
			</li>
		<?php endforeach; ?>
	</ul>
<?php endif; ?>
</body>
</html>

focus_popularity=1000としているのですが、曲のポピュラー度を制御しています、。
数値が大きくなるほどポピュラー度が高くなります。
 
JS

var track_count = 1;

var artist_name = $('#track_1').children('.artist').html();
var music_title = $('#track_1').children('.title').html();

// 検索する
search({
  term: artist_name + ' ' + music_title,
  limit: 1,
  entity: 'song',
  country: 'JP',
});

//iTunes APIから楽曲を取得する
function search(options) {

  var params = {
    lang: 'ja_jp',
    entry: 'music',
    media: 'music',
    country: 'JP',
  };

  if (options && options.term) {
    params.term = options.term;
  }

  if (options && options.limit) {
    params.limit = options.limit;
  }

  $.ajax({
    url: 'https://itunes.apple.com/search',
    method: 'GET',
    data: params,
    dataType: 'jsonp',

    success: function(json) {
      showData(json, options);
    },

    error: function() {
      console.log('itunes api search error. ', arguments);
    },
  });
};

//取得した楽曲を表示
var music_url = "";
var TARGET;
var showData = function(json) {

	if(json.results.length == 0){

		track_count++;

		artist_name = $('#track_' + track_count).children('.artist').html();
		music_title = $('#track_' + track_count).children('.title').html();
        	
		// 検索する
		search({
		term: artist_name[data_key] + ' ' + music_title[data_key],
		limit: 1,
		entity: 'song',
		country: 'JP',
		});

	 }else{
  
	    for (var i = 0, len = json.results.length; i < len; i++) {

	      var result = json.results[i];

	      music_url = result.previewUrl;

	      var html = '<audio id="sound" src="' + result.previewUrl + '" controls />';
	      $('.player').children('audio').remove();
	      $('.player').append(html);
	      var html = '<img src="' + result.artworkUrl100 + '">';
	      $('.player').children('.image').empty().append(html);

	      $('.player').children('.play_artist').html(artist_name);
	      $('.player').children('.play_title').html(music_title);

	      TARGET = document.getElementById('sound');

	      play();

	      track_count++;
	    }

	}

}

function play(){
    TARGET.play();
    timeupdate();
}

function timeupdate(){
    TARGET.play();
    TARGET.addEventListener("timeupdate", function() {
  
        if(TARGET.currentTime == TARGET.duration){

        	artist_name = $('#track_' + track_count).children('.artist').html();
			music_title = $('#track_' + track_count).children('.title').html();
        	// 検索する
			search({
			  term: artist_name + ' ' + music_title,
			  limit: 1,
			  entity: 'song',
			  country: 'JP',
			});
        }

    }, true);
}

 
 
 

他にもざまざまな方法で楽曲をレコメンドできるので、いろいろ試してみてください。
自分専用に好みの検索のかけ方をプログラミングして楽曲レコメンドアプリを作ってもいいかもしれません!
http://www.gracenote.com/?language=ja

続きを読む

このサイトについて


『意識低い系女と高い系男の一年戦争』はクリエイティブ会社エアゼの代表2人が運営するブログです。エアゼは、アプリ・Web・IoT・インタラクティブコンテンツのデザイン・開発を手がけています。

エアゼ ホームページ