【 PremiumOne をデータベース化 】夏の自由研究(2016年:その2)
絶賛更新中のPremiumOneのプレイリスト化ですが、更新間隔があまりにも短いので、今は一週間毎にしています。
公開して満足ではなく、プレイリストかしたものを改めて聴いて、気づきがある方が良いのと、意外と聞き流してて、印象に残っていないことが多いので、気になった曲から収録アルバムを確認して、さらに広げることもできるので良いことですね。
で、本題に今回はSpofiy のWeb APIを叩いて曲の情報を得ることです。ファイルを見たところ、悪戦苦闘の痕跡が見られますが、如何せんソースが汚すぎるのが難点ですが、解読していきましょう。
できたこと(あるいはやってみたこと)
・Spotify Web APIからデータを取得し、必要なデータを保存する。
ここでの目標は、APIからデータを取得できるようにすること。叩き方をマスターに終始していました。
あと、FileMaker的な観点で言うと、Ver16からはcURLでAPIを叩けるけど、それ以降のバージョンでは叩けないので、ここでは、JSONを無理やりテキストデータと扱って、必要なデータを取得すると言うこともしています。
まずは、エンドポイントを叩く
エンドポイントは、「Get an Album's Tracks」を利用します。この時点でSpotifyでディベロッパー登録と、アプリ申請が必要です。
FileMakerで該当のスクリプトを見たところ「Barer Token」は何とスクリプトにハードコードしております。なので、動作検証がてらに再度、トークンを取得し、再度実行してみることに。
トークンは「Get an Album's Tracks」の検証用ページから確認が可能で、ページの右側にあるcurlのサンプル記述を、「URLから挿入」のオプションとして設定していきます。
動作したcURLオプションの記述を見るとこんな感じですね。実行されるコマンドは1行ですが、見やすく3行に分けて改行してあります。
" -X GET "
& "-H \"Accept: application/json\""
& "-H \"Authorization: Bearer BQDC8PHtHYYh2Rs1vztsm*********\""
APIから取得したデータを解析する
実際に取得したJSONデータを解析していきます。検索キーは「Miles Davis」の「Oleo」です。この記事ではさらっとあたかも簡単にできたぜぇ的な書き方ですが、実際は相当苦戦した気がします。
{
"artists" : {
"href" : "https://api.spotify.com/v1/search?query=Miles%2BDavis+Oleo&type=artist&market=JP&offset=0&limit=10",
"items" : [ ],
"limit" : 10,
"next" : null,
"offset" : 0,
"previous" : null,
"total" : 0
},
"tracks" : {
"href" : "https://api.spotify.com/v1/search?query=Miles%2BDavis+Oleo&type=track&market=JP&offset=0&limit=10",
"items" : [ {
"album" : {
"album_type" : "album",
"artists" : [ {
"external_urls" : {
"spotify" : "https://open.spotify.com/artist/0kbYTNQb4Pb1rPbbaF0pT4"
},
"href" : "https://api.spotify.com/v1/artists/0kbYTNQb4Pb1rPbbaF0pT4",
"id" : "0kbYTNQb4Pb1rPbbaF0pT4",
"name" : "Miles Davis",
"type" : "artist",
"uri" : "spotify:artist:0kbYTNQb4Pb1rPbbaF0pT4"
} ],
"external_urls" : {
"spotify" : "https://open.spotify.com/album/3lMyO4sezedN13MLfFFXUV"
},
"href" : "https://api.spotify.com/v1/albums/3lMyO4sezedN13MLfFFXUV",
"id" : "3lMyO4sezedN13MLfFFXUV",
"images" : [ {
"height" : 640,
"url" : "https://i.scdn.co/image/ab67616d0000b27383b3ac505761ce6e9322c262",
"width" : 640
}, {
"height" : 300,
"url" : "https://i.scdn.co/image/ab67616d00001e0283b3ac505761ce6e9322c262",
"width" : 300
}, {
"height" : 64,
"url" : "https://i.scdn.co/image/ab67616d0000485183b3ac505761ce6e9322c262",
"width" : 64
} ],
"name" : "Bags' Groove (RVG Remaster)",
"release_date" : "1957",
"release_date_precision" : "year",
"total_tracks" : 7,
"type" : "album",
"uri" : "spotify:album:3lMyO4sezedN13MLfFFXUV"
},
"artists" : {
・
・
・
以下省略(artistsが繰り返されていく)
ここからJSON形式のデータをSubstitute関数とカスタム関数のGetKeyLineで整形する。そこからさらに、必要な箇所のみデータを整形する。
artists:
href : https://api.spotify.com/v1/search?query=Miles%2BDavis+Oleo&type=artist&market=JP&offset=0&limit=10
items : [ ]
limit : 10
next : null
offset : 0
previous : null
total : 0
tracks :
href : https://api.spotify.com/v1/search?query=Miles%2BDavis+Oleo&type=track&market=JP&offset=0&limit=10
items : [
album:
album_type : album
artists : [
external_urls:
spotify : https://open.spotify.com/artist/0kbYTNQb4Pb1rPbbaF0pT4
href:https://api.spotify.com/v1/artists/0kbYTNQb4Pb1rPbbaF0pT4
id: 0kbYTNQb4Pb1rPbbaF0pT4
name:Miles Davis
type : artist
uri:spotify:artist:0kbYTNQb4Pb1rPbbaF0pT4
]
external_urls :
spotify:https://open.spotify.com/album/3lMyO4sezedN13MLfFFXUV
href : https://api.spotify.com/v1/albums/3lMyO4sezedN13MLfFFXUV
id : 3lMyO4sezedN13MLfFFXUV
images : [
height : 640
url : https://i.scdn.co/image/ab67616d0000b27383b3ac505761ce6e9322c262
width : 640
height : 300
url : https://i.scdn.co/image/ab67616d00001e0283b3ac505761ce6e9322c262
width : 300
height : 64
url : https://i.scdn.co/image/ab67616d0000485183b3ac505761ce6e9322c262
width : 64
]
name:Bags' Groove (RVG Remaster)
release_date : 1957
release_date_precision : year
total_tracks : 7
type : album
uri : spotify:album:3lMyO4sezedN13MLfFFXUV
・
・
・
GetKeyLineが大活躍ですね。要は行頭のキーワードの行のみを取得すると言う処理なので、JSONは、{ キーワード:データ } なので、{ を取り除いて、タブ等の空白を除去すれば、改行区切りデータになるので、処理が可能になります。
name:Miles Davis
name:Bags' Groove (RVG Remaster)type : artist
・
・
・
type : album
type : artist
・
・
・
url : https://i.scdn.co/image/ab67616d0000b27383b3ac505761ce6e9322c262
url : https://i.scdn.co/image/ab67616d00001e0283b3ac505761ce6e9322c262
url : https://i.scdn.co/image/ab67616d0000485183b3ac505761ce6e9322c262
・
・
・
track_number: 4
track_number: 4
・
・
・
APIのデータをレコードとして保存する
ここで処理を見て、Ver16で実装されたJSON関連の関数を全く使っていないことにびっくり。と言うのは、この処理だとデータを正しく処理することが難しいためです。
下記が実際の処理後の画面で4件しかデータが取得できていません。取得しているのは、アーティスト、アルバム、トラックと、カバーアートの大、中、小です。
JSONの末尾にあるページングを見ると「"limit" : 10」の「"total" : 41 」なので、10件のデータがあるはずなのに、4件しか認識できていません。かなり無理やり取得していることがよくわかります。
"limit" : 10,
"next" : "https://api.spotify.com/v1/search?query=Miles%2BDavis+Oleo&type=track&market=JP&offset=10&limit=10",
"offset" : 0,
"previous" : null,
"total" : 41
ここで重要なポイントがこれはあくまでも個人的な研究なので、業務だったらちゃんとデータを取得しろになるでしょうが、当初の目的は達成できているので良しとしましょう。
続編の2017年、2018年を見ると、それなりに改善はされていますね。これだけの手間と時間をかかってるのを見ると、無駄なことをしていると思われる方もいるかもしれません。
ここで重要なのは自分なりのテーマや課題を可能な限り自力で解決することです。スーパーマリオの生みの親、宮本茂さんの対談集から引用をご紹介。
つくるということは、すごく不安なことやから、知らないことをやっているわけやんか。
何かそれを知っていることでかためられた安心できるというのは、、、、。
わかるのやけど、そういうもんやないから。
飯野 賢治.スーパーヒットゲーム学,1998,P45.
この意味を理解するには20年くらい掛かりましたが、今年もテーマを決めて、のんびり続けたいと思っています。