Edited at

iTunesで聞いている音楽をSlackのStatusに表示させるアプリを作った

More than 1 year has passed since last update.


SlackのStatus

image.png

ここにiTunesで聞いている曲を表示させたいがためのアプリを作った。

https://github.com/narikei/nowplaying-on-slack


Statusを更新するAPI

ここを更新するにはusers.profile.setを使います。

https://api.slack.com/methods/users.profile.set#updating_a_user_s_current_status

{

"status_text": "ANTIHERO - LiSA",
"status_emoji": ":musical_note:"
}

これを送るだけ。


main.js

const request = require('request');

const token = process.env.SLACK_API_TOKEN;

request({
url: 'https://slack.com/api/users.profile.set',
method: 'POST',
form: {
token,
profile: JSON.stringify({
status_text: 'ANTIHERO - LiSA',
status_emoji: ':musical_note:',
}),
},
}, (error, response, body) => {
if (error) {
console.error(error, response, body);
}
});


SlackのTokenは環境変数で引き渡す形式にし、

$ SLACK_API_TOKEN=xoxp-xxxx-xxxx-xxxx-xxxx node main.js とかやるとStatusが更新されます。

Slackのアプリのscopeには users.profile:write を許可しておく


現在再生中の曲をiTunesから取得する

playbackというライブラリーが比較的簡単に取り扱えるため、こいつを使っています。

https://github.com/jwalgran/playback


main.js

const playback = require('playback');

playback.currentTrack((res) => {
if (!res) {
return;
}

console.log(res);
// { name: 'ANTIHERO', artist: 'LiSA', album: 'Launcher' }
});


曲名、アーティスト名、アルバム名がそれぞれ取得できます。

再生中でない場合はnullが返ってきます。


Electron化

常駐させるためにElectron化しました。とくに操作が必要なアプリではないため、

ウィンドウは作らずにapp.on('ready')でプログラムを開始させています。


main.js

const electron = require('electron');

const request = require('request');
const playback = require('playback');

const app = electron.app;

const token = process.env.SLACK_API_TOKEN;

const sendToSlack = (message) => {
request({
url: 'https://slack.com/api/users.profile.set',
method: 'POST',
form: {
token,
profile: JSON.stringify({
status_text: message,
status_emoji: ':musical_note:',
}),
},
}, (error, response, body) => {
if (!error) {
return;
}

console.error(error, response, body);
});
};

const watchiTunes = () => {
let nowplaying;

setInterval(() => {
playback.currentTrack((res) => {
if (!res) {
return;
}

const message = `${res.name} - ${res.artist}`;
if (nowplaying === message) {
return;
}

console.log(message);
sendToSlack(message);

nowplaying = message;
});
}, 3000);
};

app.on('ready', () => {
if (!token) {
console.log('token ga naiyo');
return;
}

watchiTunes();
});



おわり

こっちにも表示されます。

スクリーンショット 2017-08-22 8.30.20.png