Androidのメモとか

ポキオの日記です。今日も遅延してない。

Node.jsからSonosの状態を取得してみる

ヌー民。

ポキオ Sonos Node.js

Sonosで聞いてる曲をシェアしたい

そう思ったわけです。

relativelayout.hatenablog.com

Sonosのスピーカーで曲を聞いたことをTriggerにIFTTTを動かしたかったりしたんですが、残念ながらSonosはTriggerを提供しておらず、すべてActionとなっていました。そこで、今回はNode.jsの便利なパッケージを使って、Sonosで聞いた曲を取得してみようと思います。

その名もnode-sonos

そのままですね。

github.com

これがすごい便利。とりあえず、

npm i sonos

とかでインストールしてやって。ひとまず同じネットワーク内の機器探索から。

const Sonos = require('sonos')

Sonos.DeviceDiscovery((device) => {
    console.log('--------- device found ----------')
    console.log(device)
})

こんな感じで機器探索の機能が準備されています。これを実行すると・・・。

--------- device found ----------
Sonos {
  host: '192.168.1.35',
  port: 1400,
  options: 
   { endpoints: 
      { transport: '/MediaRenderer/AVTransport/Control',
        rendering: '/MediaRenderer/RenderingControl/Control',
        device: '/DeviceProperties/Control' },
     spotify: { region: '3079' } },
  _events: { newListener: [AsyncFunction: implicitListen] },
  _eventsCount: 1 }

ここで取得できたIPアドレスとポート番号を使って、聞いている音楽の情報を取得してみます。

const Sonos = require('sonos')
const device = new Sonos.Sonos('192.168.1.35', '1400')

device.on('CurrentTrack', (track) => {
    console.log('--------- now playing... ---------')
    console.log(track)
})

すると、スクリプト実行時と曲が変わるタイミングで、情報が取得できます。

--------- now playing... ---------
{ id: null,
  parentID: null,
  title: 'McDonald Romance',
  artist: 'King Gnu',
  album: 'McDonald Romance',
  albumArtURI: 'https://i.scdn.co/image/xxxxxxxxxx',
  uri: 'x-sonos-spotify:spotify:track:xxxxxxxxxx',
  duration: 165,
  queuePosition: 1 }

たまに2回同じ曲名のイベントが発火してる気がしますが、そこはなんとかよしなに処理してあげましょう。

[asin:B07HSBKTFH:detail]

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。