Google Homeで好きなポッドキャストをスマートに再生する

## はじめに
Google Homeで好きなポッドキャストをスマートに再生したいと思ったことはありませんか？
今回は「OK, Google 〜(ポッドキャスト名)を再生して」と言うとそのポッドキャストの最新話が再生される仕組みを以下の構成で作ってみます
<img width="810" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/61075/60f7333c-67e8-82ca-e43b-38c5bde4e31a.png">

## Firebase Realtime Database
再生したいポッドキャストのRSSのURLをFirebase Realtime Databaseに保存できるようにします

#### Firebase Realtime Databaseの良いところ
* PUTリクエストでデータを編集できる
* データの変更をリアルタイムに検知できる

Firebase Databaseの設定に関しては以下の記事を参考にしてください
[新着メールを知らせてくれるGoogle Home](https://qiita.com/tetotetote/items/4d6ac866b716695fa4c9#firebase%E3%81%AE%E8%A8%AD%E5%AE%9A)

![Screenshot from 2017-12-17 22-18-58.png](https://qiita-image-store.s3.amazonaws.com/0/61075/88c5748c-cbbd-59e8-d839-2a00e90ce1e7.png)

直下に `url` というキーを作成しました

## IFTTT
#### トリガー
Firebase Databaseを利用できるようになったのでIFTTTのAppletを作成します
[Make an Applet - IFTTT](https://ifttt.com/create)

今回は例として私が好きなポッドキャストの一つである[Rebuild.fm](http://rebuild.fm/)の最新話を再生できるようにしてみます

`Google Assistant`の`Say a simple phrase`をトリガーとして以下のように設定します

![Screenshot from 2017-12-17 22-23-42.png](https://qiita-image-store.s3.amazonaws.com/0/61075/5e25cf9d-a14d-2eba-8b59-8fa1448c1e47.png)

ここではあなたが設定したいポッドキャスト名に適宜置き換えてください

#### アクション
トリガーが作成できたので次はそれに対するアクションです

`Webhooks`の`Make a Web request`をアクションとして以下のように設定します
![Screenshot from 2017-12-17 22-40-59.png](https://qiita-image-store.s3.amazonaws.com/0/61075/30d02bea-9e95-2fd0-1277-10438dc257f9.png)

URLには先ほど作成したFirebase Realtime DatabaseのプロジェクトURLの後に`/url.json`を付け加えたものを入力してください
`/url.json`の`url`とは作成したキーの名前です

Bodyには再生したいポッドキャストのRSSのURLを入力してください

これでIFTTTの設定は完了しました
リンクしたGoogleアカウントに紐付けられているGoogle Homeにトリガーとして、設定された文字列を与えてみてください
Firebase Realtime Databaseのコンソールにて値が更新されたら成功です

## Raspberry Pi
Google Homeで最新話を再生できるようにスクリプトを書いていきます
ここではスクリプトはRaspberry Piで動作させますが、Google Homeが存在しているLAN内で常時node.jsを動かせてインターネット接続ができるデバイスであればどんなものでも構いません

事前に`feedparser`, `firebase`, `google-home-notifier`, `request`パッケージを利用できるようにしてください

```javascript
var FeedParser = require('feedparser');
var firebase = require('firebase');
var googleHome = require('google-home-notifier');
var request = require('request');

const lang = 'ja';
const ip = '192.168.11.1'; //再生したいGoogle HomeのIPアドレス

googleHome.ip(ip, lang);

const config = {
  apiKey: 'hoge',
  authDomain: 'fuga.firebaseapp.com',
  databaseURL: 'https://fuga.firebaseio.com',
  projectId: 'fuga',
  storageBucket: '',
  messagingSenderId: 'piyo'
};
firebase.initializeApp(config);

var db = firebase.database();
var ref = db.ref('/');
ref.on('child_changed', function(snapshot) {
  var url = ref.child('url').val();
  if (url) {
    playLatestPodcast(url);
  }
  ref.update({'url': ''}); // 変更をリセット
});

function playLatestPodcast(url) {
  var req = request(url);
  var parser = new FeedParser();
  var items = [];

  req.on('response', function(res) {
    this.pipe(parser);
  });

  parser.on('readable', function() {
    while (item = this.read()) {
      items.push(item);
    }
  });

  parser.on('end', function() {
    googleHome.play(getLatestPodcastUrl(items), function(notifyRes) {});
  });
}

function getLatestPodcastUrl(items) {
    for (item of items) {
      for (enclosure of item.enclosures) {
        var url = enclosure['url'];
        if (url) {
            return url;
        }
      }
    }
    return "";
}
```

`ip`にはHomeアプリ等で確認したGoogle HomeのIPアドレスを入力してください
また、`config`はFirebaseのプロジェクトを作成した時に表示された認証情報に書き換えてください

プログラムの動きとしてはFirebase Realtime Database上のデータの変更を検知し、キー`url`に設定されたポッドキャストのRSSのURLをパースして最新話のポッドキャストのmp3のURLをGoogle Homeに渡しています

## 完成
早速試してみましょう！
「OK, Google 〜を流して」

反応速度は悪くないと思います
わざわざアプリを立ち上げる必要がないのが良いところです！

## 課題
* 対応させたいポッドキャスト毎にIFTTTのAppletを追加しなければならない  
→ IFTTTで認識したポッドキャスト名をGASに引き渡し、それをキーとしてGoogle スプレッドシートからRSSのURLを取得し、Firebase Realtime Databaseに投げるようにするとIFTTTのAppletは一つだけで済みそう  
しかし、ポッドキャスト名の認識のゆれを如何に吸収するかが問題
* 最新話しか再生できない  
→ IFTTTで話数を認識し、Firebase Realtime Databaseに話数の情報も保存し、ローカルのスクリプトでそれを利用する  
今回は時間がなかったので最新話だけの対応でした  
コンテクストを理解して、「次の話を再生して」などができると楽しそうです