Google Home에서 팟캐스트를 재생할 때 TypeError: ref.child(...).val is not a function 오류

이 기사를 참조하여 막힌 부분이 있었기 때문에 메모

Google Home에서 좋아하는 팟캐스트를 스마트하게 재생

환경



Raspberry pi 3 ModelB
$ 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

パッケージのバージョン
[email protected]
[email protected]
[email protected]
[email protected]

기사를 참고하여 ●●.js를 만들었습니다
$ node ●●.js

를 실행하면 아래와 같은 경고가 나오고, 그대로의 상태가 된다
*** WARNING *** The program 'node' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node>
*** WARNING *** The program 'node' called 'DNSServiceRegister()' which is not supported (or only supported partially) in the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node&f=DNSServiceRegister>

GoolgeHome에서 podcast를 흘리라고 명령하면
Firebase RealtimeDatabase url 내용이 업데이트되지만
다음과 같은 오류가 발생합니다.
@firebase/database: FIREBASE WARNING: Exception was thrown by user callback. TypeError: ref.child(...).val is not a function

코드



위 문헌에서 인용
ref.on('child_changed', function(snapshot) {
  var url = ref.child('url').val();
  if (url) {
    playLatestPodcast(url);
  }
  ref.update({'url': ''}); // 変更をリセット
});
var url = ref.child('url').val(); 를 다음과 같이 다시 작성하면 podcast

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

코드 전체


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.xx.xx'; //再生したいGoogle HomeのIPアドレス

googleHome.ip(ip, lang);

const config = {
  apiKey: 'xxxxxxx_xxxxxxxxxxxxxxxxxxxxx_xxxxxxx',
  authDomain: 'xxxxxxxxxxxxxx.firebaseapp.com',
  databaseURL: 'https://xxxxxxxxxxxxxx.firebaseio.com',
  projectId: 'xxxxxxx',
  storageBucket: 'xxxxxxx.appspot.com',
  messagingSenderId: 'xxxxxxx'
};
firebase.initializeApp(config);

var db = firebase.database();
var ref = db.ref('/');

ref.on('child_changed', function(snapshot) {
  var url = snapshot.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 "";
}

참고문헌



Google Home에서 좋아하는 팟캐스트를 스마트하게 재생
감사합니다

좋은 웹페이지 즐겨찾기