JavaScript
iTunes
nodejs
Slack
Electron

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