こんにちは、ウエハラ シンペイです。
今回MusicBrainz APIとLINE botを使って
アーティストの人気の曲を教えてくれると作っていこうと思います。
MusicBrainz APIとは?
非営利団体であるMetaBrai
nzによって運営されいる、オープンな音楽データベースサービスだそうです。国内アーティストの情報を形成されていて、今回はこのAPIを試しに触ってみました。
MusicBrainz APIは何ができる?
アーティスト、イベント、ジャンル、レーベル、作品など音楽に関係する情報が数多く検索可能でそれをXMLまたはJSON形式で返してくれるもののようです。
特に金額は発生せず、API キーもいらないけど、リクエストに返される数には制限があり最大25個とのこと(多分)
LINEでアーティストを送ると曲名を返してもらう
実際のコード
sample.js
const express = require('express');
const line = require('@line/bot-sdk');
const axios = require('axios'); // axiosを追加
const app = express();
const config = {
channelSecret: process.env.CHANNEL_SECRET || 'XXXXXXXXXXXXXXX',
channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN || 'XXXXXXXXXXXXXXX',
};
const client = new line.Client(config);
app.post('/webhook', line.middleware(config), (req, res) => {
Promise
.all(req.body.events.map(handleEvent))
.then((result) => res.json(result))
.catch((err) => {
console.error(err);
res.status(500).end();
});
});
async function handleEvent(event) {
if (event.type !== 'message' || event.message.type !== 'text') {
return Promise.resolve(null);
}
const artistName = event.message.text;
try {
const response = await axios.get(`https://musicbrainz.org/ws/2/recording/?query=artist:${encodeURIComponent(artistName)}&fmt=json`);
const recordings = response.data.recordings;
if (recordings.length > 0) {
const titles = recordings.map(recording => recording.title).join('\n');
return client.replyMessage(event.replyToken, {
type: 'text',
text: `曲名リスト:\n${titles}`,
});
} else {
return client.replyMessage(event.replyToken, {
type: 'text',
text: 'アーティスト名が一致しません',
});
}
} catch (error) {
console.error(error);
return client.replyMessage(event.replyToken, {
type: 'text',
text: 'エラーが発生しました',
});
}
}
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`Listening on port ${port}`);
});
曲名が無事帰ってきました!!
ただ、いきなりインストが入っていたりと順番を人気順にしたいところでしたが、MusicBrainz APIに関するようなデータがないらしく、このあたりは他の方法があれば知りたいところでした。