イベント通知

mirakcはServer-Sent Events (SSE) によるイベント通知をサポートしています.これを利用することで,特定のイベントが発生したときにスクリプトを実行できます.

すでにmirakcが起動している場合,以下のコマンドを実行してみてください.通知されたイベントが表示されるはずです.番組情報の取得が完了していない場合は表示されません.番組情報の取得が完了するまで待ちましょう.

$ curl http://localhost:40772/events -sG
event:epg.programs-updated
data:{"serviceId":400101}

event:epg.programs-updated
data:{"serviceId":3273601025}

event:epg.programs-updated
data:{"serviceId":3273601024}

それでは,events.epg.programs-updatedイベントを使って,簡単なルール・ベースの自動録画予約機能を動かしてみます.

compose.yaml

services:
  recman:
    container_name: recman
    # arm32環境ではlukechannings/denoは動作しない
    # arm32環境では別のイメージを使うこと
    image: lukechannings/deno
    init: true
    restart: unless-stopped
    command: >-
      run --allow-net=mirakc
      https://raw.githubusercontent.com/mirakc/contrib/main/recording/simple-rules.js
      -b http://mirakc:40772 --folder videos
    environment:
      TZ: Asia/Tokyo
    depends_on:
      - mirakc

sample-rules.jsの実行にはdenoを使用します.nodeではないので注意してください.

recmanコンテナーを起動しログを確認します.

$ docker logs -f recman
...
Connect to http://mirakc:40772/events...
EPG programs updated: NHK総合1・東京: 3273601024
EPG programs updated: NHK総合2・東京: 3273601025
EPG programs updated: NHKBS1: 400101
Added: scheduled: NHK総合1・東京: 327360102422829: ...
...

スクリプトの実行完了をしばらく待って以下を実行すると,録画予約が自動登録されていることを確認できます.

$ curl http://localhost:40772/api/recording/schedules -sG | jq '.[].program.id'
327360102422829
327360102423293
327360102423762
327360102424202
327360102424706
327360102425360
327360102426083

$ curl http://localhost:40772/api/programs/327360102422829 -sG | \
    jq -r '.name | test("NHKニュース7")'
true

上記のスクリプトではepg.programs-updatedイベントのみを使っていますが,放送中の番組の追跡機能を有効化した場合に通知されるonair.program-changedイベントを使えば,放送中の番組(及び次に放送される番組)に対しても同様の自動録画ルールを適用できます.

今回のcompose.yamlの例では,GitHub上のスクリプトを直接指定していますが,通常はローカルのスクリプトを実行します.denoには--watchオプションがあります.このオプションを指定すると,denoは実行中のスクリプトの変更を監視し,自動で再起動します.ルールを書き換えた場合に自動で反映されるようになり,利便性が増します.

Note 外部の共有フォルダーに保存されているスクリプトをコンテナーにマウントしている場 合,スクリプトを修正してもdenoが変更を検出しない場合があります.そのような場 合はdockerを実行しているマシンにログインし,touchなどでスクリプトのタイム スタンプを更新するか,コンテナーを再起動する必要があります.

通知されるイベントの詳細については,mirakc/docs/events.mdを参照してください.

results matching ""

    No results matching ""