2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GoogleHomeとIFTTTとFirebaseとラズパイとnode.jsでyoutubeの音を流す

Last updated at Posted at 2018-10-28

はじめに

GoogleHomeとIFTTTとFirebaseとラズパイで指定した数に対応した音を流す(英単語読み上げツールの作成)
これの記事の続きです

もうすこしgoogle-home-notifierで遊んでみたくなったので下記を参考に、IFTTTで試してみたバージョンの作業メモ
Google Home自身でYoutubeの音楽を再生する

環境

ラズパイ

$lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 9.4 (n/a)
Release:	9.4
Codename:	n/a

$npm -v
5.6.0

$node -v
v9.4.0

Firebaseの設定

Realtime Databaseの中で+ボタンを押して新しい項目を追加する
googlehomeとその中にword""の項目をつくる
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3137363437392f36633831333539312d363336392d343863642d643765342d3439303633613638313039332e706e67.png

IFTTTの設定

Google Assistant

スクリーンショット 2018-10-23 22.25.29.png

GoogleHomeに「トリガー ○○」というとその言葉をもとにyoutubeから探してくるようにします
書き方は下記のようにトリガー $と書くと任意の文字列が$に入ります
スクリーンショット 2018-10-29 0.10.18.png

webhooksの設定

スクリーンショット 2018-10-29 0.14.21.png `URL`にはFirebase Realtime Databaseの中で設定した項目にBodyの中身を送られるように下記のように設定する
https://{Firebaseで設定したプロジェクトID 例:XXXXXXXXXXX-12345}.firebaseio.com/googlehome/word.json

をいれる

Bodyには下記のように入れた

"youtube {{TextField}}"

TextFieldという白い枠がなければ下のAdd ingredientを押して出すことができる

#ラズパイ内

Google Home自身でYoutubeの音楽を再生する内の手順通り
youtube-dlを導入する

sudo pip3 install youtube-dl

foreverで永続化させようとした時に何故かconfig/local.jsを読み込んでくれず手こずったので、index.jsファイル内にすべてのconfigで必要な項目を入れれるように参考資料のコードを少し改造しました


'use strict';
const firebase = require("firebase");

const config = {
  apiKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  authDomain: 'xxxxxxxxxxxxxxx.firebaseapp.com',
  databaseURL: 'https://xxxxxxxxxxxxxxxx.firebaseio.com',
  projectId: 'xxxxxxxxxxxxxxxxxxxxx',
  storageBucket: 'xxxxxxxxxxxxx.appspot.com',
  messagingSenderId: 'xxxxxxxxxxx'
};

firebase.initializeApp(config);

const Youtube = require('youtube-node');
const youtube = new Youtube();
youtube.setKey('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');//youtubeのAPIキーを取得しココに入れる

const notifier = require('google-home-notifier');
notifier.ip('xxx.xxx.xxx.xxxxxx');//googlehomeのipアドレスをいれる
notifier.device('xxxxxxxxxx', 'ja');//googlehomeの名前を入れる
notifier.accent('ja');

const  exec = require('child_process').exec;


//database更新時
var db = firebase.database();
db.ref("/googlehome").on("value", function(changedSnapshot) {
  //値取得
  var value = changedSnapshot.child("word").val();
  console.log('valueチェック: %s', value);
  if (value) {

//コマンド生成
    getJsonData(value.split(" ")[0], {
      // youtube
      "youtube": function() {
        let keyword = value.split(" ");
        keyword.shift();
        keyword = keyword.join(' ');
        console.log('keywordチェック: %s', keyword);
        play_youtube(keyword);
      }
    })();

    //firebase clear
    db.ref("/googlehome").set({"word": ""});

  }
});

//jsonからvalueに一致する値取得
function getJsonData(value, json) {
  for (var word in json){
     if (value == word){
         console.log('json[word]チェック: %s', json[word]);
     }
     console.log('json["default"]チェック: %s', json["default"]);
  }
  return json["default"]
}


function play_youtube(keyword) {
  // categoryIdの10はMusic https://stackoverflow.com/questions/17698040/youtube-api-v3-where-can-i-find-a-list-of-each-videocategoryid
  youtube.search(keyword, 1, {'type':'video', 'videoCategoryId':10}  , function(error, result) {
    if (error) {
      console.log(error);
      return ;
    }
    console.log(JSON.stringify(result, null, 2));
    for (const item of result.items) {
      if (item.id.videoId) {
        console.log(item.id.videoId);

            exec('youtube-dl -g -x https://www.youtube.com/watch?v='+item.id.videoId, function(error, stdout, stderr) {
              if (error !== null) {
                console.log('exec error: '+error);
              }
              const soundUrl = stdout;
              console.log(soundUrl);

              notifier.play(soundUrl, function(res) {
                console.log(res);
              });
            });

      }
    }
  });
}

#node.jsをラズパイ内で永続化
こちらを参考にしました
[Node.js] Foreverコマンドでスクリプトをバックグラウンドで動かす

vim /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

# googlehomeがyoutubeで音楽を検索するアプリ
sudo -u {{ユーザー名}} /usr/local/bin/node /usr/local/bin/forever start -p /var/run/forever --pidfile /var/run/node-app.pid -l /home/{{ユーザー名}}/Repository/google-home-play-youtube/google-home-notifier/out.log -a -d /home/{{ユーザー名}}/Repository/google-home-play-youtube/google-home-notifier/index.js

exit 0

ラズパイをリブートしてきちんと永続化されているか確認する

$ sudo reboot

再起動後
$ forever list

info:    Forever processes running
data:        uid  command             script                                                                                  forever pid  id logfile                                                                         uptime
~~~~~~省略~~~~~~~
data:    [3] Vf2l /usr/local/bin/node /home/{{ユーザー名}}/Repository/google-home-play-youtube/google-home-notifier/index.js        948     1020    /home/{{ユーザー名}}/Repository/google-home-play-youtube/google-home-notifier/out.log 0:10:32:6.993

参考資料

Google Home自身でYoutubeの音楽を再生する
[Node.js] Foreverコマンドでスクリプトをバックグラウンドで動かす
先人の皆様に感謝を込めて・・・とても助かりました :pray:

結局foreverで他のファイルを読み取れない原因がよくわからなかった・・・・

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?