Intel N100搭載PCでTV録画・視聴用サーバーを作る

※内容は2025/7/26時点で実行確認できている手順です。記載している情報は随時上書きアップデートしていますので、あらかじめご了承ください。

下記記事にあるようにRaspberryPi 4でTVサーバーを運用してきましたが、放送中の番組や録画番組の再生は別PCでKonomiTVをインストールして視聴していました。

しかし、PC2台での運用はシステムメンテナンスの手間がかかります。録画と視聴をPC1台で実行できればPC間連携処理を省くことができ、メンテナンスがかなり楽になります。

そこでIntel N100で視聴用としてTVサーバーをセットアップした結果、RaspberryPi 4は録画に特化でき、Intel N100はTV視聴用&RespberryPiの録画バックアップPCとして運用することで、同時に録画と視聴する場合にチューナー不足を気にする必要がなくなり、TV視聴システムとしてかなり便利に使えるようになりました。

Intel N100 PCへのソフトインストールの手順は主要な部分はRasberryPiと同じ手順ですが、細かい部分で違いがあり、RaspberryPiの記事に注釈をつけると混乱を招くので、RaspberryPiの記事にをコピーしてIntel N100向けにアレンジしています。

Intel N100 PCは2万円前後とRaspberryPiに数千円上乗せした額で手に入るので、新規にTVサーバーをセットアップするならRaspberryPiよりはIntel N100 PCの方がお勧めです。

TVサーバーは一旦構築して運用してみると以下のようなメリットがあることが実感できます。

  • 4chの地デジ録画と4chBS録画が可能(Raspberry Pi4の場合は合計6番組まで)
  • Chromeを起動できるスマホやPCで新たにソフトをインストールすることなくTVを見ることができる
  • 録画データを他のストレージにバックアップでき、永久保存できるようになる
  • 録画データからCMを削除でき、MP4ファイルへ変換することで最終保存ファイルの再生時間とファイルサイズを縮小できる
  • 録画データの再生方法に縛りがない(ミラーリングによる再生ができない、USB接続スピーカーで音声出力ができないなど)
  • 録画ファイルを再生する際に、同時視聴・同時録画に伴う視聴制限を受けることがない
  • 録画予約やファイル整理に専用アプリを必要とせず、ブラウザ上の広い画面で操作でき、文字の入力にPC・スマホ・タブレットのキーボードを使えるので操作性がいい
  • スマホやタブレットに録画番組をローカルに保持して再生できる
  • 一度セットアップするとメンテナンスフリーでHDDレコーダー並に安定稼働する
  • ハード故障時の復旧時には、故障箇所のハードウェアの入れ替えのみで即復旧できる
  • 待機電力は10W、録画時も12W弱程度で消費電力が低い

TVサーバーを1ヶ月放置運用してみたところ、強制リセットが必要な場面に遭遇することもなく動作は非常に安定しています。録画品質についてもチューナーにPX-Q3U4を使用した場合、1日4時間程度の録画頻度という条件で2ヶ月に1番組程度の割合でDropが10回程度発生する程度のDrop率でこの時も録画画像に破綻はなかったので、市販のHDDレコーダー並みの録画品質は確保できていると判断しています。

上記の理由からTVサーバーのメリットは絶大なので、市販のHDDレコーダーに戻ることはなさそうです。

しかし、TVサーバーをセットアップするために必要な設定と手順はネット上に散逸しており、古い情報も出てきたりして、後日同じ設定をしようとしても時間がかかります。そこで、検証を重ねて確定させたセットアップの最小手順、及び設定内容と設定の意味を忘れないようにここにメモしておきます。

目指すTV録画サーバー仕様について

TVサーバーを組み上げるときに選択できる機能は数多くあるので野放図に設定をすると仕様が一向に固まらず、設定に終わりが見えなくなります。そこで、ここでは下記の条件に留意しつつ設定手順を記載しています。

  • 設定値はできるだけデフォルトのものを使用し、一から復旧する際の手順を単純化する
  • TVサーバーの処理はm2tsでのTV録画、TV番組のリアルタイム視聴、録画番組の再生とし、RaspberryPiでの録画トラブルがあった際にIntel N100の録画データで補完できるようにする
  • Databaseの不整合を避けるため、録画ファイルの管理はEPG stationでのみ行い、コンソールやSamba経由での録画ファイル操作は行わない
  • 設定については安定稼働と管理コストの最小化を最優先事項とする

準備するもの

Intel N100で録画サーバーを製作するにあたり、準備したものは以下のとおりです。

  • Intel N100搭載PC ※N95/N97/N150でも問題はないと思います
  • 地デジ+BSチューナー
  • カードリーダー & B-CASカード

Intel N100搭載PC

Intel製CPUが搭載されているPCであれば何でもいいですが、コストパフォーマンスと消費電力の点でIntel N100搭載PCがいいです。N95/N97/N150でも問題はないと思います。Ryzen CPUはTV視聴や録画ファイル再生時にGPUが使えない可能性があるのでお勧めしません。

録画ファイル保存用ストレージ

録画ファイル保存用ストレージは常に書き込み処理が走り常に稼働状態で故障のリスクも高いため、TVサーバの録画データは消えてもいいものとして扱い、録画データの担保はRaspberryPi側で行うこととします。。

いつ壊れてもいいという前提で運用するので、古いPCから抜き出したHDD/SSDを再利用するといいです。録画データのファイルサイズは1時間あたり7.5GBになるため、100時間以上の録画データを保存できる1GB以上のHDD/SSDが使いやすいと思います。

地デジチューナー

地デジ/BSチューナーは入手のしやすさや、ネット上に設定方法やトラブルシュート情報が豊富にあるという点でPLEX製のものを選択することになります。録画品質の安定性の点から、事実上の選択肢はPX-W3U4かPX-Q3U4の2択です。

PX-Q1UDはチューナーごとに受信品質が異なる、複数同時録画すると特定チャンネルでドロップが発生するなど録画品質を一定に保つことが困難でしたが、PX-Q3U4は4ch同時録画でもドロップが発生することもなく安定動作しています。

ただし、PX-W3U4は内蔵ファンの音がかなり大きく静かな場所ではかなり耳障りな音を発するため、今は天井裏に録画サーバーを移動して騒音対策をしています。

もし、リビングや寝室など居住スペースに設置する必要がある場合は、PX-Q3U4のファンを自分で外してしまうか、地デジ1chのみになりますがPX-S1UDが良いと思います。

カードリーダー & B-CASカード

PX-W3U4にはB-CASカードリーダーが内蔵されていますが、TVサーバーからは内蔵カードリーダーは使えないため、別途B-CASカード用のカードリーダーを接続する必要があります。

カードリーダーはネット上に設定方法が豊富にあるSCR3310を利用するのが一番安全です。

B-CASカードについては古いテレビやHDDレコーダーのものを取り出して利用します。2160円でB-CASカードを入手する方法もあるようですが、購入未経験のため入手方法や注意事項については他のHPを参照してください。

アンテナ分波器・分配器

壁に2口のアンテナ出力があればいいですが、少ない場合は購入しましょう。なお、チューナーに直接アンテナケーブルを挿す場合、ケーブルが硬いとチューナーが軽すぎて位置が定まらなくなるのでケーブルの柔らかい分配器・分波器を挟むとケーブルの取り回しがよくなります。

実際に購入したもの

参考までに購入時の注文画面のキャプチャを貼っておきます。

ハードウェア設定

ネットワーク接続方法

無線LAN接続ではTV視聴時に無線接続が不安定なことが原因で放送が途切れる可能性があるので、ネットワーク接続は有線LAN接続一択です。

Ubuntu OSをセットアップする

OSはUbuntuであればOSのバージョンはいずれでも問題はないと思います。ただし、TVサーバーは一旦設置を完了するとほぼノーメンテナンス状態になるので、セキュリティの観点で最新のLTSバージョンである24.4.2 LTSをインストールします。

インストール時に特別な設定は必要はなく、インストーラーもシンプルで分かりやすいため、ここではインストール方法については割愛します。デフォルトでインストールするソフトは最小限で問題はないです。

以降の設定はインストール時にログインユーザー名を「tv-recorder」を設定していることを前提とします。

IPアドレスを固定する

IPアドレスを固定しないとルーターの再起動時にTVサーバーのIPが変わってしまうので、DHCPで常に固定IPが渡されるように設定するか、Ubuntu側でIPアドレスが固定されるように設定します。

SSHサーバーをインストールする

UbuntuはデフォルトではSSH接続ができないので、SSHサーバーをインストールする必要があります。

$ sudo apt update
$ sudo apt install openssh-server

ログインパスワード無しでssh接続できるようにする

TVサーバーの設定やメンテナンス時には必ずssh経由でログインすることが多々ありますが、その度にパスワードを入力するのはかなりの手間です。この入力をスキップするためにSSH公開鍵認証でログインできるようにします。

まずログインするPC上で秘密鍵キーを以下のコマンドで作成します。

$ ssh-keygen -t ed25519

実行が完了すると、秘密鍵と公開鍵がそれぞれ~/.ssh/id_ed25519~/.ssh/id_ed25519.pubに生成されます。

次にPC上で以下のコマンドを実行し公開鍵をTVサーバーに転送します。このときパスワードの入力を求められるので、tv-recorderのパスワードを入力します。

$ ssh-copy-id -i ~/.ssh/id_ed25519.pub tv-recorder@192.168.1.xxxCode language: JavaScript (javascript)

これでSSH接続時のパスワード入力が不要になります。

パスワード無しでsudoを実行できるようにする

TVサーバー設定時にはsudoコマンドを多用しますが、コンソールを立ち上げるたびにパスワード入力を必要とします。この手間を省くために、以下の設定をしてログインユーザーがtv-recorderの場合はパスワードを不要とするようにします。

$ sudo visudo
---
...
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
tv-recorder ALL=(ALL) NOPASSWD: ALL 【追加】
...
---Code language: PHP (php)

フォルダ名を英語に変更する

Ubuntuインストール時に言語設定を日本語にすると、userフォルダ内のデフォルトのフォルダ名が日本語で設定されます。日本語だとコンソール上からファイル指定がしにくいので、下記コマンドを実行して英語に変更します。

$ LANG=C xdg-user-dirs-gtk-updateCode language: Bash (bash)

必須ソフトをインストール・アップデートする

下記コマンドを実行してaptのパッケージリストをアップデートします。

$ sudo apt update
$ sudo apt upgrade -yCode language: Bash (bash)

下記コマンドを実行してgitなどセットアップに必要なソフトをインストールします。

$ sudo apt-get install nodejs cmake g++ git curl unzip gcc makeCode language: Bash (bash)

録画データのフォルダ名・ファイル名は日本語になるため、コマンドラインでの録画ファイルの整理はかなりの手間になります。この問題を解決するため、FDもインストールしておきます。

$ sudo apt-get install fdcloneCode language: JavaScript (javascript)

また、意図せずにディスクがいっぱいになったときにディスクを占有しているファイルやフォルダを特定できるようにするため、ncduもインストールしておきます。

$ sudo apt-get install ncduCode language: JavaScript (javascript)

HDD/SSDをセットアップする

ここでは外付けSSD/HDDをフォーマットして読み書きができるようにセットアップする方法を記載します。バックアップ・入れ替え時の手間・運用時の柔軟性の観点から、セットアップは1パーティション構成としています。

HDD/SSDを接続してOSが認識できることを確認する

まず外付けストレージをUSBで接続します。次に下記コマンドを実行して、RaspberryPi OS上からHDD/SSDが見えていることを確認します。

$ sudo fdisk -l
...
Disk /dev/sda: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: MQ01ABD100      
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
... 

もし接続したHDD/SSDが表示されていない場合は、接続に問題がない、故障していないかなどを確認し、正しく表示されるようにする必要があります。

HDD/SSDの既存のパーティションを削除する

すでに作成されているパーティションがある場合は'fdisk -l'コマンド実行時に下記のように/dev/sda1~のように追加情報が表示されます。

$ sudo fdisk -l
...
Disk /dev/sda: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: TOSHIBA MQ01ABD1
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd940675f
Device     Boot      Start        End    Sectors   Size Id Type
/dev/sda1             2048 1048578047 1048576000   500G 83 Linux
/dev/sda2       1048578048 1953525167  904947120 431.5G 83 Linux
...

この場合は下記のようにfdiskでdコマンドを実行して既存のパーティションを削除します。

$ sudo fdisk /dev/sda
Welcome to fdisk (util-linux 2.36.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): d
Partition number (1,2, default 2): 1
Partition 1 has been deleted.
Command (m for help): d
Selected partition 2
Partition 2 has been deleted.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.Code language: JavaScript (javascript)

HDD/SSDのパーティションを作成する

下記コマンドを実行してHDD/SSDをフォーマットします。一旦運用が始まるとパーティションのサイズの調整はできないのでパーティションは切らずHDD/SSD全体を1パーティションとします。

$ sudo fdisk /dev/sda
Welcome to fdisk (util-linux 2.36.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 
First sector (2048-1953525167, default 2048): 2048
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-1953523120, default 1953523120): 1953523120       
Created a new partition 1 of type 'Linux' and of size 931.5 GiB.
Partition #1 contains a ext4 signature.
Command (m for help): w
The partition table has been altered.Code language: PHP (php)

wコマンド実行時に実際にパーティションが作成されます。実行後にfdiskコマンドでパーティションができたかを確認します。

$ sudo fdisk -l /dev/sda
Disk /dev/sda: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: TOSHIBA MQ01ABD1
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xa615109d
Device     Boot     Start        End    Sectors   Size Id Type
/dev/sda1            2048 1953523120 1953523120 931.5G 83 Linux

作成したパーティションをフォーマットする

下記コマンドでHDD/SDDをext4でフォーマットします。/dev/sda1の部分はフォーマット対象のHDD/SSDのデバイス名に置き換えて実行します。コマンド実行時に確認メッセージは表示されないため、デバイス名を間違えないように気をつけましょう。フォーマットは10秒程度で完了します。

$ sudo mkfs.ext4 /dev/sda1
mke2fs 1.46.2 (28-Feb-2021)
Creating filesystem with 13107200 4k blocks and 3276800 inodes
Filesystem UUID: 7e24b26f-0e1e-41fb-8812-b5a7522c592d
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: doneCode language: JavaScript (javascript)

HDD/SSDを自動マウントする

/etc/fstabを編集し、再起動時に’/mnt/tv-recorderにHDD/SSDをマウントするように設定します。

まず、下記コマンドでマウントポイントを作成します。

$ sudo mkdir -p /mnt/tv-recorder
$ sudo chmod 777 /mnt/tv-recorder
$ sudo chown -R tv-recorder:tv-recorder /mnt/tv-recorder

/etc/fstab で起動時にマウントさせるため、HDD/SSDのパーティションのID(PARTUUID)を調べます。

$ sudo blkid
...
/dev/sda1: UUID="61cc9c24-b882-9949-88c8-88eab12b1ce5" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="432802cd-a1c7-ab4c-aeee-10bdddde3212"
......Code language: JavaScript (javascript)

/etc/fstabにエントリを追加します。
※パーティションを作成せず、HDD/SSD全体を1パーティションとした場合はPARTUUIDがありません。この場合はUUID=…でデバイスを指定すること。

$ sudo vi /etc/fstab
---
proc            /proc           proc    defaults          0       0
PARTUUID=47e8465b-01  /boot           vfat    defaults          0       2
PARTUUID=47e8465b-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that
PARTUUID=61cc9c24-b882-9949-88c8-88eab12b1ce5 /mnt/tv-recorder  ext4 defaults,nofail 0 0Code language: PHP (php)

再起動して自動マウントされることを確認します。

$ df
Filesystem     1K-blocks      Used Available Use% Mounted on
...
/dev/sda1      960302824 297730032 613718332   1% /mnt/tv-recorder
...Code language: JavaScript (javascript)

自動マウントされていることが確認できたら'touch /mnt/tv-recorder/testfile'コマンドでファイルが書けるかを確認しましょう。

Sambaサーバーをインストールする

Windows PCから録画ファイルを読めるように、sambaをインストールします。操作ミスで録画ファイルを消さないようにread onlyをyesにしておき、ファイル操作は全てEPG stationからでしかできないようにします。

$ sudo apt install samba samba-common-bin

下記コマンドを実行し、smbアカウントを追加します。

$ sudo smbpasswd -a tv-recorder

/etc/samba/smb.confに以下を追加します。

$ sudo vi /etc/samba/smb.conf
---
...
[tv-recorder]
path = /mnt/tv-recorder/
public = yes
guest ok = yes
read only = yes
force user = tv-recorder
comment=EPG stationCode language: JavaScript (javascript)

smb.confを書き換えた場合は下記コマンドでsambaサーバーを再起動する必要があります。

$ sudo systemctl restart smbd

再起動したら他のPCからIntel N100のrecordedフォルダにアクセスできることを確認します。

カードリーダー/TVチューナーをセットアップする

カードリーダーを接続する

Intel N100 PC上のUSB2.0ポートに接続します。カードリーダーはUSB1.0として認識されるため、USB 3.0ポートへの接続は無意味です。

次に下記コマンドを実行してドライバをインストールします。

$ sudo apt install -y libpcsclite-dev pcscd pcsc-tools libccid

カードリーダーにB-CASカードを挿入し、下記コマンドを実行してB-CASカードが正しく認識されていることを確認します。カード挿入時はIC面が上になるよう、カードの向きに注意しましょう。

$ pcsc_scan
...
Japanese Chijou Digital B-CAS Card (pay TV)
...

pcsc_scanコマンドは自動終了しないため、上記メッセージを確認できたらCTRL-Cで強制終了します。以降このドライバは使用しないため、サービスを停止しておきます。

$ sudo systemctl stop pcscd.socket
$ sudo systemctl disable pcscd.socket
Removed "/etc/systemd/system/sockets.target.wants/pcscd.socket".Code language: JavaScript (javascript)

TVチューナーを接続する

TVチューナーはIntel N100 PC上のUSB2.0ポートに接続します。TVチューナーはUSB 2.0として認識されるため、USB3.0ポートへの接続は無意味です。

【PX-Q3U4の場合】

ドライバインストール方法ググるとpx4_drvが表示されますが、本家のpx4_drvではインストールができないため、つくみ島だよりでリリースされているFork版をインストールします。

https://github.com/tsukumijima/px4_drv?tab=readme-ov-file

上記解説の通りにコマンドを実行すればインストール完了です。以下に実行したコマンドを列挙します。

$ sudo apt install dkms
$ sudo apt-get -y install raspberrypi-kernel-headers
$ git clone https://github.com/tsukumijima/px4_drv.git
$ cd ~/px4_drv/fwtool
$ make
$ wget http://plex-net.co.jp/plex/pxw3u4/pxw3u4_BDA_ver1x64.zip -O pxw3u4_BDA_ver1x64.zip
$ unzip -oj pxw3u4_BDA_ver1x64.zip pxw3u4_BDA_ver1x64/PXW3U4.sys && rm pxw3u4_BDA_ver1x64.zip
$ ./fwtool PXW3U4.sys it930x-firmware.bin && rm PXW3U4.sys
$ sudo mkdir -p /lib/firmware && sudo cp it930x-firmware.bin /lib/firmware/
$ cd ~/px4_drv/driver/
$ make
$ sudo make install
$ cd ~/px4_drv
$ wget https://github.com/tsukumijima/px4_drv/releases/download/v0.4.5/px4-drv-dkms_0.4.5_all.deb
$ sudo cp -a ./ /usr/src/px4_drv-0.4.5
$ sudo dkms add px4_drv/0.4.5
$ sudo dkms install px4_drv/0.4.5Code language: PHP (php)

このタイミングでPX-Q3U4のLEDが点灯しファンが回り出します。インストール完了後に下記コマンドを実行して、下記のような出力が表示されればOKです。

$ sudo modprobe px4_drv
$ lsmod | grep -e ^px4_drv
px4_drv               143360  0

【PX-Q1UDの場合】

PX-U1DXはバスパワーで問題なく動作することを確認しているため、TVチューナーに付属している電源を接続する必要はありません。

また、電源を接続しているとチューナー側からUSBポートを通して電力が供給されるため、再起動時に接続されたハードウェアが完全にリセットされる保証がなく、トラブル時の原因の切り分けが難しくなりますので、電源は外しておいた方が無難です。

※電源無しで動作することは公式に保証しておらず、私の環境で問題がないことを確認しているだけですので、動作不安定な場合には電源を接続して、問題が改善するかどうか確認しましょう。

PX-Q1UDのドライバはUbuntuにデフォルトでインストールされており、接続した直後からPX-S1UDが4つとして認識されていますが、このドライバでは起動時にファイル不足のエラーが吐かれていることがdmesgで確認できEPGデータも取得できないことを確認しているので、下記コマンドを実行して公式サイトにあるドライバをインストールします。

$ wget http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip
$ unzip PX-S1UD_driver_Ver.1.0.1.zip
$ sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware/Code language: JavaScript (javascript)

ドライバインストール後にPX-S1UDを接続したままOSを再起動し、下記コマンドを実行してPX-Q1UDが認識されていることを確認しましょう。

$ dmesg | grep PX-
[ 2.792753] usb 1-1.2.1: Product: PX-S1UD Digital TV Tuner
[ 2.980706] usb 1-1.2.2: Product: PX-S1UD Digital TV Tuner
[ 3.164841] usb 1-1.2.3: Product: PX-S1UD Digital TV Tuner
[ 3.348650] usb 1-1.2.4: Product: PX-S1UD Digital TV Tuner
$ ls -al /dev/dvb*
total 0
drwxr-xr-x  6 root root  120 Sep 30 01:47 .
drwxr-xr-x 18 root root 4220 Sep 30 01:47 ..
drwxr-xr-x  2 root root  100 Sep 30 01:47 adapter0
drwxr-xr-x  2 root root  100 Sep 30 01:47 adapter1
drwxr-xr-x  2 root root  100 Sep 30 01:47 adapter2
drwxr-xr-x  2 root root  100 Sep 30 01:47 adapter3

TVチューナーが認識されていない場合は、ディスプレイを繋いでTVチューナー接続時にエラーが出ていないか確認しましょう。エラーが出ている場合はリブートすると¥。

Docker版mirakurun-epgstationをインストールする

現時点でメンテナンスが継続されていて、かつI/Fが最も洗練されているのはEPG stationです。現在Docker版でメンテナンスが進んでいます。しかし、そのままではPX-Q3U4では利用できないため、DockerコンテナをPX-Q3U4に設定してビルドして対応します

Docker/Docker-composeをインストールする

まず下記コマンドを実行してDockerをインストールします。

$ sudo curl -sSL https://get.docker.com/ | CHANNEL=stable sh
...
$ sudo usermod -aG docker $USER
$ docker --version
Docker version 28.3.2, build 578ccf6Code language: PHP (php)

次に下記コマンドを実行してDocker Composeをインストールします。

$ sudo apt install docker-compose
...

Docker版EPG Stationをインストールする

基本的な手順は以下のサイトを参考にし、現状に合わせて実行コマンドとオプションをアップデートしています。

ビルド環境を整える

まず、下記コマンドを実行して、dockerコンテナのビルド環境を整えます。

$ cd ~
$ git clone https://github.com/l3tnun/docker-mirakurun-epgstation -b v2 docker-mirakurun-epgstationCode language: PHP (php)

Configurationファイルをコピーする

まずファイルをテンプレートからコピーしておきます。

$ cd ~/docker-mirakurun-epgstation
$ cp docker compose-sample.yml docker-compose.yml
$ cp epgstation/config/config.yml.template epgstation/config/config.yml
$ cp epgstation/config/operatorLogConfig.sample.yml epgstation/config/operatorLogConfig.yml
$ cp epgstation/config/epgUpdaterLogConfig.sample.yml epgstation/config/epgUpdaterLogConfig.yml
$ cp epgstation/config/serviceLogConfig.sample.yml epgstation/config/serviceLogConfig.yml

※この時点で編集済みのdocker-compose.yml、epgstation/config/config.ymlがある場合はコピーをしておくことで復旧の手間を省くことができます

docker-compose.ymlを編集する

はじめにカードリーダのデバイス番号を確認します。BusとDeviceの番号でデバイスファイルを特定できます。下記の例では/dev/bus/usb/001/003がカードリーダーのデバイスファイルになります。

$ lsusb
...
Bus 001 Device 003: ID 04e6:5116 SCM Microsystems, Inc. SCR331-LC1 / SCR3310 SmartCard Reader
...
【PX-Q3U4の場合】

docker-compose.ymlを以下のように書き換えます。

$ vi ~/docker-mirakurun-epgstation/docker-compose.yml
---
services:
    mirakurun:
        image: chinachu/mirakurun
        cap_add:
            - SYS_ADMIN
            - SYS_NICE
        ports:
            - "40772:40772"
            - "9229:9229"
        volumes:
            - ./mirakurun/conf:/app-config
            - ./mirakurun/data:/app-data
            - ./mirakurun/run:/var/run
            - ./mirakurun/opt:/opt
        environment:
            TZ: "Asia/Tokyo"
        devices:
            - /dev/bus:/dev/bus
            - /dev/px4video0:/dev/px4video0
            - /dev/px4video1:/dev/px4video1
            - /dev/px4video2:/dev/px4video2
            - /dev/px4video3:/dev/px4video3
            - /dev/px4video4:/dev/px4video4
            - /dev/px4video5:/dev/px4video5
            - /dev/px4video6:/dev/px4video6
            - /dev/px4video7:/dev/px4video7
            - /dev/bus/usb/001/003 # card reader
        restart: always
        logging:
            driver: json-file
            options:
                max-file: "1"
                max-size: 10m
    mysql:
        image: mariadb:10.5
        # image: mysql:8.0 # 囲み文字を使用する場合
        volumes:
            - mysql-db:/var/lib/mysql
        environment:
            MYSQL_USER: epgstation
            MYSQL_PASSWORD: epgstation
            MYSQL_ROOT_PASSWORD: epgstation
            MYSQL_DATABASE: epgstation
            TZ: "Asia/Tokyo"
        command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --performance-schema=false --expire_logs_days=1 # for mariadb
        # command: --character-set-server=utf8mb4 --collation-server=utf8mb4_0900_as_ci --performance-schema=false --expire_logs_days=1 --default-authentication-plugin=mysql_native_password # for myql
        restart: always
        logging:
            options:
                max-size: "10m"
                max-file: "3"
    epgstation:
        build:
            context: "./epgstation"
            dockerfile: "debian.Dockerfile"
        volumes:
            - ./epgstation/config:/app/config
            - ./epgstation/data:/app/data
            - ./epgstation/thumbnail:/app/thumbnail
            - ./epgstation/logs:/app/logs
            - /mnt/tv-recorder/backup:/app/backup
            - /mnt/tv-recorder/recorded_files/keep:/app/keep
            - /mnt/tv-recorder/recorded_files/no_conversion:/app/no_conversion
            - /mnt/tv-recorder/recorded_files/delete:/app/delete
            - /mnt/tv-recorder/recorded_files/delete_after_watch:/app/delete_after_watch
            - /mnt/tv-recorder/droplog:/app/droplog
        environment:
            TZ: "Asia/Tokyo"
        depends_on:
            - mirakurun
            - mysql
        ports:
            - "8888:8888"
            - "8889:8889"
        user: "1000:1000"
#         devices:
#             - /dev/dri:/dev/dri
        restart: always
volumes:
    mysql-db:
        driver: local
Code language: PHP (php)

ファイルの差分は以下のとおりです。

$ diff docker-compose.yml docker-compose-sample.yml 
14,15d13
<             - ./mirakurun/run:/var/run
<             - ./mirakurun/opt:/opt
20,29c18
<             - /dev/px4video0:/dev/px4video0
<             - /dev/px4video1:/dev/px4video1
<             - /dev/px4video2:/dev/px4video2
<             - /dev/px4video3:/dev/px4video3
<             - /dev/px4video4:/dev/px4video4
<             - /dev/px4video5:/dev/px4video5
<             - /dev/px4video6:/dev/px4video6
<             - /dev/px4video7:/dev/px4video7
<             - /dev/bus/usb/001/003 # card reader
---
>             - /dev/dvb:/dev/dvb
65,70d54
<             - /mnt/tv-recorder/backup:/app/backup
<             - /mnt/tv-recorder/recorded_files/keep:/app/keep
<             - /mnt/tv-recorder/recorded_files/no_conversion:/app/no_conversion
<             - /mnt/tv-recorder/recorded_files/delete_after_watch:/app/delete_after_watch
<             - /mnt/tv-recorder/droplog:/app/droplog
< 
78c63
<         user: "1000:1000"
---
> #         user: "1000:1000"Code language: PHP (php)

【PX-Q1UDの場合】

docker-compose.ymlを以下のように書き換えます。

$ vi ~/docker-mirakurun-epgstation/docker-compose.yml
---
services:
    mirakurun:
        image: chinachu/mirakurun
        cap_add:
            - SYS_ADMIN
            - SYS_NICE
        ports:
            - "40772:40772"
            - "9229:9229"
        volumes:
            - ./mirakurun/conf:/app-config
            - ./mirakurun/data:/app-data
            - ./mirakurun/run:/var/run
            - ./mirakurun/opt:/opt
        environment:
            TZ: "Asia/Tokyo"
        devices:
            - /dev/bus:/dev/bus
            - /dev/dvb:/dev/dvb
            - /dev/bus/usb/001/003
        restart: always
        logging:
            driver: json-file
            options:
                max-file: "1"
                max-size: 10m
    mysql:
        image: mariadb:10.5
        # image: mysql:8.0 # 囲み文字を使用する場合
        volumes:
            - mysql-db:/var/lib/mysql
        environment:
            MYSQL_USER: epgstation
            MYSQL_PASSWORD: epgstation
            MYSQL_ROOT_PASSWORD: epgstation
            MYSQL_DATABASE: epgstation
            TZ: "Asia/Tokyo"
        command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --performance-schema=false --expire_logs_days=1 # for mariadb
        # command: --character-set-server=utf8mb4 --collation-server=utf8mb4_0900_as_ci --performance-schema=false --expire_logs_days=1 --default-aut
hentication-plugin=mysql_native_password # for myql
        restart: always
        logging:
            options:
                max-size: "10m"
                max-file: "3"
    epgstation:
        build:
            context: "./epgstation"
            dockerfile: "debian.Dockerfile"
        volumes:
            - ./epgstation/config:/app/config
            - ./epgstation/data:/app/data
            - ./epgstation/thumbnail:/app/thumbnail
            - ./epgstation/logs:/app/logs
            - ./mirakurun/opt:/opt
            - /mnt/tv-recorder/backup:/app/backup
            - /mnt/tv-recorder/recorded_files/keep:/app/keep
            - /mnt/tv-recorder/recorded_files/no_conversion:/app/no_conversion
            - /mnt/tv-recorder/recorded_files/delete:/app/delete
            - /mnt/tv-recorder/recorded_files/delete_after_watch:/app/delete_after_watch
            - /mnt/tv-recorder/droplog:/app/droplog
        environment:
            TZ: "Asia/Tokyo"
        depends_on:
            - mirakurun
            - mysql
        ports:
            - "8888:8888"
            - "8889:8889"
        user: "1000:1000"
#         devices:
#             - /dev/dri:/dev/dri
        restart: always
volumes:
    mysql-db:
        driver: local
Code language: PHP (php)

ファイルの差分は以下のとおりです。

14,15d13
<             - ./mirakurun/run:/var/run
<             - ./mirakurun/opt:/opt
21d18
<             - /dev/bus/usb/001/003
57,61c54
<             - ./mirakurun/opt:/opt
<             - /mnt/tv-recorder/backup:/app/backup
<             - /mnt/tv-recorder/recorded_files/keep:/app/keep
<             - /mnt/tv-recorder/recorded_files/no_conversion:/app/no_conversion
<             - /mnt/tv-recorder/recorded_files/delete:/app/delete
<             - /mnt/tv-recorder/recorded_files/delete_after_watch:/app/delete_after_watch
<             - /mnt/tv-recorder/droplog:/app/droplog
---
>             - ./recorded:/app/recorded
70c63
<         user: "1000:1000"
---
> #         user: "1000:1000"Code language: PHP (php)

tuners.ymlを編集する

tuners.ymlを書き換えます。

【PX-Q3U4の場合】
$ vi ~/docker-mirakurun-epgstation/mirakurun/conf/tuners.yml
---
- name: PX-Q3U4_S1
  types:
    - BS
    - CS
  command: recpt1 --device /dev/px4video0 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false
- name: PX-Q3U4_S2
  types:
    - BS
    - CS
  command: recpt1 --device /dev/px4video1 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false
- name: PX-Q3U4_T1
  types:
    - GR
  command: recpt1 --device /dev/px4video2 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false
- name: PX-W3U4_T2
  types:
    - GR
  command: recpt1 --device /dev/px4video3 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false
- name: PX-W3U4_S3
  types:
    - BS
    - CS
  command: recpt1 --device /dev/px4video4 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false
- name: PX-W3U4_S4
  types:
    - BS
    - CS
  command: recpt1 --device /dev/px4video5 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false
- name: PX-W3U4_T3
  types:
    - GR
  command: recpt1 --device /dev/px4video6 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false
- name: PX-W3U4_T4
  types:
    - GR
  command: recpt1 --device /dev/px4video7 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: falseCode language: JavaScript (javascript)
【PX-Q1UDの場合】
$ vi ~/docker-mirakurun-epgstation/mirakurun/conf/tuners.yml
---
- name: adapter0
  types:
    - GR
  dvbDevicePath: /dev/dvb/adapter0/dvr0
  decoder: arib-b25-stream-test
  command: dvbv5-zap -a 0 -c ./config/dvbconf-for-isdb/conf/dvbv5_channels_isdbt.conf
    -r -P <channel>
  isDisabled: false
- name: adapter1
  types:
    - GR
  dvbDevicePath: /dev/dvb/adapter1/dvr0
  decoder: arib-b25-stream-test
  command: dvbv5-zap -a 1 -c ./config/dvbconf-for-isdb/conf/dvbv5_channels_isdbt.conf
    -r -P <channel>
  isDisabled: false
- name: adapter2
  types:
    - GR
  dvbDevicePath: /dev/dvb/adapter2/dvr0
  decoder: arib-b25-stream-test
  command: dvbv5-zap -a 2 -c ./config/dvbconf-for-isdb/conf/dvbv5_channels_isdbt.conf
    -r -P <channel>
  isDisabled: false
- name: adapter3
  types:
    - GR
  dvbDevicePath: /dev/dvb/adapter3/dvr0
  decoder: arib-b25-stream-test
  command: dvbv5-zap -a 3 -c ./config/dvbconf-for-isdb/conf/dvbv5_channels_isdbt.conf
    -r -P <channel>
  isDisabled: falseCode language: JavaScript (javascript)

docker fileをビルドし起動する

下記コマンドを実行してMirakurun/EPG Stataionをビルドし起動します。ビルドには20分程度かかるのでのんびり待ちましょう。

$ cd ~/docker-mirakurun-epgstation/
$ sudo docker compose pull
$ sudo docker compose run --rm -e SETUP=true mirakurun
$ sudo docker compose up -dCode language: JavaScript (javascript)

インストール完了後、ブラウザから'http://<IP Address>:40772/'にアクセスしてMirakrunのHPが表示され、'http://<IP Address>:8888/'にアクセスしてEPG Stationが表示されることを確認します。

録画コマンドをインストールする【PX-Q3U4の場合のみ必要】

下記コマンドを実行して録画コマンドrecpt1をdockerコンテナ上でコンパイルし~/docker-mirakurun-epgstation/mirakurun/opt/bin/へインストールします。docker上でコンパイルしないとglibcのバージョン違いが原因でコマンドが動作しないため、Docker上でコンパイルし、コンパイルした実行ファイルを~/docker-mirakurun-epgstation/mirakurun/opt/bin/へインストールします。

$ sudo docker container exec docker-mirakurun-epgstation-mirakurun-1 apt-get update
$ sudo docker container exec docker-mirakurun-epgstation-mirakurun-1 apt-get upgrade -y
$ sudo docker container exec docker-mirakurun-epgstation-mirakurun-1 apt-get install -y --no-install-recommends make gcc g++ pkg-config pcscd libpcsclite-dev libccid pcsc-tools
$ sudo docker container exec docker-mirakurun-epgstation-mirakurun-1 apt-get -y install build-essential libtool autoconf git automake wget cmake
$ sudo docker container exec docker-mirakurun-epgstation-mirakurun-1 sh -c 'git clone https://github.com/stz2012/recpt1 /tmp/recpt1 && cd /tmp/recpt1/recpt1 && ./autogen.sh && ./configure && make && make install && mkdir -p /opt/bin && cp -f /tmp/recpt1/recpt1/recpt1 /opt/bin && cp -f /tmp/recpt1/recpt1/recpt1ctl /opt/bin && cp -f /tmp/recpt1/recpt1/checksignal /opt/bin && rm -rf /tmp/recpt1'Code language: JavaScript (javascript)

下記コマンドを実行して録画ファイルができることを確認します。ここで録画したファイルはTS抜きはされていないのでファイルを再生しても録画した番組は表示されません。

$ ~/docker-mirakurun-epgstation/mirakurun/opt/bin/recpt1 --device /dev/px4video0 BS15_0 10 bs0.m2ts
$ ~/docker-mirakurun-epgstation/mirakurun/opt/bin/recpt1 --device /dev/px4video1 BS01_2 10 bs1.m2ts
$ ~/docker-mirakurun-epgstation/mirakurun/opt/bin/recpt1 --device /dev/px4video2 BS15_0 10 bs0.m2ts 27 10 gr0.m2ts
$ ~/docker-mirakurun-epgstation/mirakurun/opt/bin/recpt1 --device /dev/px4video3 BS15_0 10 bs0.m2ts 27 10 gr1.m2ts
$ ~/docker-mirakurun-epgstation/mirakurun/opt/bin/recpt1 --device /dev/px4video4 BS15_0 10 bs0.m2ts
$ ~/docker-mirakurun-epgstation/mirakurun/opt/bin/recpt1 --device /dev/px4video5 BS01_2 10 bs1.m2ts
$ ~/docker-mirakurun-epgstation/mirakurun/opt/bin/recpt1 --device /dev/px4video6 BS15_0 10 bs0.m2ts 27 10 gr0.m2ts
$ ~/docker-mirakurun-epgstation/mirakurun/opt/bin/recpt1 --device /dev/px4video7 BS15_0 10 bs0.m2ts 27 10 gr1.m2tsCode language: JavaScript (javascript)

チャンネルスキャンをする

下記コマンドを実行してチャンネルスキャンを実行します。スキャンは10分程度で完了します。

$ curl -X PUT "http://localhost:40772/api/config/channels/scan"Code language: JavaScript (javascript)

実行しなくてもEPG stationで番組が表示されますが、一部チャンネル(TOKYO MXなど)が表示されないことがあること、再取得処理が延々と続きプロセスを圧迫することがあり、録画が突然停止することもあるため、未実施の場合は必ず実行しましょう。

動作を確認する

上記のすべての設定が完了したらTVサーバーを再起動して、EPG Stationが起動することと、視聴や録画が正しくすることを確認してください。

【参考】EPG Stationをカスタマイズする

ここではdocker-compose.ymlとepgstation/config/config.ymlを編集して、EPG Stationの録画用ディスク構成や録画ファイル名などを設定する方法を記載します。この2つのymlを設定後にバックアップをとっておくことで次回の設定の手間を省くことができます。

録画データを分類するためのフォルダを作成する

録画データの分類用フォルダは以下のように設定しました。

  • ‘no_conversion’ -> mp4への変換不要の番組(ニュースなど)
  • ‘delete’ -> 期限が来たら削除する(バラエティ番組など)
  • ‘delete_after_watch’ -> 視聴したら削除する(ドラマなど)
  • ‘keep’ -> ずっと残す(取っておいて何度も見たい映画・アニメなど)

さらにSDデータのbackup用のフォルダも用意します。

$ sudo mkdir -p /mnt/tv-recorder/backup /mnt/tv-recorder/recorded_files/delete /mnt/tv-recorder/recorded_files/delete_after_watch /mnt/tv-recorder/recorded_files/keep /mnt/tv-recorder/recorded_files/no_conversion 
$ sudo chmod -R 777 /mnt/tv-recorder
$ sudo chown -R tv-recorder:tv-recorder /mnt/tv-recorderCode language: JavaScript (javascript)

Dockerから外付けストレージにアクセスできるように設定する

録画ファイルの保存先として以下のディレクトリを指定できるようにdocker-conpose.ymlを修正します。

  • /mnt/tv-recorder/recorded_files/keep
  • /mnt/tv-recorder/recorded_files/delete_after_watch
  • /mnt/tv-recorder/recorded_files/delete
  • /mnt/tv-recorder/recorded_files/no_conversion
$ cd ~
$ vi docker-mirakurun-epgstation/docker-compose.yml
---
services:
    ...
    epgstation:
        ...
        volumes:
            ...
(修正前)    
            - ./recorded:/app/recorded
(修正後)    
            - /mnt/tv-recorder/backup:/app/backup
            - /mnt/tv-recorder/recorded_files/keep:/app/keep
            - /mnt/tv-recorder/recorded_files/no_conversion:/app/no_conversion
            - /mnt/tv-recorder/recorded_files/delete:/app/delete
            - /mnt/tv-recorder/recorded_files/delete_after_watch:/app/delete_after_watchCode language: JavaScript (javascript)

設定が完了したらdockerを再起動し、dockerコンテナから/mnt/tv-recorder以下にマウントしたbackup,recorded,tentativeディレクトリにアクセスできるようになったことを確認します。docker inspectコマンドで指定するContainer IDは起動ごとに動的に変化するため、psコマンドで確認する必要があります。
※再起動時はrestartではなく down & up -dで行わないと設定が反映されません

$ cd ~/docker-mirakurun-epgstation
$ sudo docker compose down 
$ sudo docker compose up -d
$ sudo docker ps -a
CONTAINER ID   IMAGE                                    COMMAND                  CREATED       STATUS        PORTS                                              NAMES
562d4973e9d5   docker-mirakurun-epgstation-epgstation   "npm start"              10 days ago   Up 35 hours   0.0.0.0:8888-8889->8888-8889/tcp                   docker-mirakurun-epgstation_epgstation_1
dd8371eb9ce9   chinachu/mirakurun                       "docker-entrypoint.s…"   10 days ago   Up 36 hours   0.0.0.0:9229->9229/tcp, 0.0.0.0:40772->40772/tcp   docker-mirakurun-epgstation_mirakurun_1
d6b9da403421   mariadb:10.5                             "docker-entrypoint.s…"   10 days ago   Up 36 hours   3306/tcp                                           docker-mirakurun-epgstation_mysql_1
$ sudo docker inspect 562d4973e9d5
...
           {
                "Type": "bind",
                "Source": "/mnt/tv-recorder/backup",
                "Destination": "/app/backup",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/mnt/tv-recorder/recorded_files/no_conversion",
                "Destination": "/app/no_conversion",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/mnt/tv-recorder/recorded_files/keep",
                "Destination": "/app/keep",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/mnt/tv-recorder/recorded_files/delete_after_watch",
                "Destination": "/app/delete_after_watch",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/mnt/tv-recorder/recorded_files/delete",
                "Destination": "/app/delete",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            },
  ...Code language: PHP (php)

録画ファイルの保存パスとデフォルト録画ファイル名を変更する

まず、ファイル名を'YYYYMMDD_HHMM <番組名>'に変更します。

$ cd ~
$ vi docker-mirakurun-epgstation/epgstation/config/config.yml
---
...
(修正前)
recordedFormat: '%YEAR%年%MONTH%月%DAY%日%HOUR%時%MIN%分%SEC%秒-%TITLE%'
(修正後)
recordedFormat: '%YEAR%%MONTH%%DAY%_%HALF_WIDTH_TITLE%'
...Code language: JavaScript (javascript)

さらに録画データの保存先を’自動削除する'(delete)、’保存する'(keep)で指定できるように、下記のように変更します。

設定ではHDDの容量が50GBを切った場合に、自動で古いものからファイルを削除するようにしています。EPG stationは保存先によらず単純に古い録画データから消していく仕様のようなので、削除開始の閾値は全て同じにする方が動作がわかりやすくなります。

$ cd ~
$ vi docker-mirakurun-epgstation/epgstation/config/config.yml
---
...
(修正前)
recorded:
    - name: recorded
      path: '%ROOT%/recorded'
(修正後)
recorded:
    - name: '自動削除する'
      path: '%ROOT%/delete'
      limitThreshold: 50000
      action : remove
    - name: '見たら消す'
      path: '%ROOT%/delete_after_watch'
      limitThreshold: 50000
      action : remove
    - name: '保存する'
      path: '%ROOT%/keep'
      limitThreshold: 50000
      action : remove
    - name: '録画のみ'
      path: '%ROOT%/no_conversion'
      limitThreshold: 50000
      action : removeCode language: JavaScript (javascript)

容量が足りなくなる前に常に手動で消す方法でもいいですが、削除する量が足りない、削除忘れなどのヒューマンエラーで容量不足になるリスクがあることから、自動削除で対応する方が良いかと思います。保存期間を長くしたい場合はHDD/SSDの容量を大きくすればいいだけですので対応も簡単です。

修正後にEPGStationを再起動し、EPGStationのメニューの’ストレージ’を選択して保存先が正しく認識され、録画可能な容量がHDDサイズになっていることを確認します。

$ cd ~/docker-mirakurun-epgstation
$ sudo docker compose restart

録画データの所有者IDをtv-recorderに変更する

デフォルトの録画ファイルの所有者はrootになっており、sudoで実行しないと録画ファイルの移動や削除ができません。この手間を解消するため、ファイルの所有者がtv-recorderになるようにconfig.ymlに’uid: 1000′(1000はtv-redcorderのUID)を追加します。

$ cd ~
$ vi docker-mirakurun-epgstation/epgstation/config/config.yml
---
...
uid: 1000
gid: 1000
...Code language: Bash (bash)

droplogを記録する

録画ファイルのクオリティ(ドロップ数)を確認できるようにするために、ダッシュボード表示時にドロップ数などの情報を表示するように設定します。

まず、droplogの格納場所を作成します。

$ sudo mkdir -p /mnt/tv-recorder/droplog
$ sudo chmod -R 777 /mnt/tv-recorder/droplog
$ sudo chown -R tv-recorder:tv-recorder /mnt/tv-recorder/droplog

次にdroplogを記録するようにepgstationに設定を追加します。

$ cd ~
$ vi docker-mirakurun-epgstation/docker-compose.yml
---
services:
    ...
    epgstation:
        ...
        volumes:
            ...
           - /mnt/tv-recorder/droplog:/app/droplog 【追加】
---
$ vi ~/docker-mirakurun-epgstation/epgstation/config/config.yml
---
...
isEnabledDropCheck: true【追加】
dropLog: '/app/droplog'【追加】
...Code language: JavaScript (javascript)

編集が終わったらEPG Stationを再起動します。

$ cd ~/docker-mirakurun-epgstation
$ sudo docker compose down 
$ sudo docker compose up -d

ダッシュボードでドロップ情報を表示するように設定を変更します。

以上の設定で下記のようにドロップ情報が表示されるようになります。

【参考】docker containerでshellを起動する

docker上で起動する実行ファイルをコンパイルするときなどにterminalと同様のコマンドで実行する場合は、下記コマンドを実行してdocker container上のshellを起動することで、docker container上で各種コマンドを実行できます。

$ docker compose exec epgstation bash

再生環境セットアップ

再生環境セットアップにはKonomi TVを利用します。Konomi TVはブラウザで再生するタイプのプレイヤーでPCやスマホなどにソフトをインストールする必要がないので、TV再生用ソフトとしては現時点でベストです。

インストールするにはKonomi TVが必要とするファイルをインストールし、Konomi TVインストーラー実行時の指示に従っていけばインストールが完了します。

node.js・pm2・lshwのインストール

Konomi TVインストールにはnode.js・pm2・lshwが必要です。インストール時にエラーが出る場合は、下記コマンドを実行してインストールします。

$ curl -sL https://deb.nodesource.com/setup_18.x | sudo bash -
$ sudo apt install -y nodejs
$ sudo npm install -g pm2
$ sudo apt install lshwCode language: JavaScript (javascript)

Konomi TVインストール

下記コマンドを実行してインストーラをダウンロードして実行します。

$ wget https://github.com/tsukumijima/KonomiTV/releases/download/v0.12.0/KonomiTV-Installer.elf
$ chmod a+x KonomiTV-Installer.elf
$ ./KonomiTV-Installer.elfCode language: JavaScript (javascript)

Konomi TVのインストーラは非常に簡潔にできていますので、インストーラー実行後の説明はここでは割愛します。

動作確認

まず再起動したあとにdmesgコマンドで表示されるカーネルログで致命的なエラーが出力されていないかを確認しましょう。私の環境ではエラーは出力されませんでした。

次に、30分程度電源を入れっぱなしにして放置したあとにEPG stationの番組表を表示し、利用するすべてのチャンネルの番組表が表示されていることを確認しましょう。表示されない場合はアンテナ接続やMirakurunの動作(http://<IP address>:40772)などを確認しましょう。

次にEPG stationから4番組同時録画を1時間程度実行し、録画データを再生してみてノイズがないことを確認しましょう。

あとは継続使用をしてトラブルに見舞われたら随時対応と対策を打つようにします。

トラブルシュートの欄に記載した電波強度とエラーブロックの発生状況を知るツールをあらかじめ用意しておくと、ブロックノイズ発生時に原因の特定がスムースに行えます。

リモート視聴

Talescaleを使用して外部からアクセスできるようにすることで、宅内と同様に操作することができます。Talescaleの設定方法は簡単でネットに情報が多く載っていますので、ここでの設定方法は割愛します。

ルーターに穴を開けて視聴する方法は法に触れるようですので、VPN経由でアクセスする方法が安心安全です。

録画データのバックアップとmp4への変換

下記に別記事としてまとめましたので、こちらを参照してください。

EPG stationのデータのバックアップとリストア

EPG stationのデータ(録画データのメタ情報、サムネイル、録画予約など)

/mnt/tv-recorder/backupフォルダに下記のスクリプトを作成し、’chmod 777 backup.sh’で実行権限をつけて、バックアップできることを確認します。下記スクリプトはEPG stationのデータの他に、homeディレクトリと/etc以下の編集したファイルをバックアップする処理を追加してあります。

#!/bin/bash

function set_attribute()
{
	sudo mkdir -p     $1
	sudo chmod -R a+r $1
	sudo chmod -R a+w $1
	sudo chown tv-recorder:tv-recorder $1
}
record_dir=/mnt/tv-recorder
backup_dir=${record_dir}/backup

#create record directory
set_attribute ${record_dir}/recorded_files/keep
sudo touch ${record_dir}/recorded_files/keep/.keep
set_attribute ${record_dir}/recorded_files/delete
sudo touch ${record_dir}/recorded_files/delete/.keep
set_attribute ${record_dir}/recorded_files/delete_after_watch
sudo touch ${record_dir}/recorded_files/delete_after_watch/.keep
set_attribute ${record_dir}/recorded_files/no_conversion
sudo touch ${record_dir}/recorded_files/no_conversion/.keep

#create backup directory
set_attribute ${record_dir}/backup
set_attribute ${record_dir}/backup/epgstation
set_attribute ${record_dir}/backup/etc
set_attribute ${record_dir}/backup/home
# Delete empty directory
find ${record_dir}/recorded_files/ -type d -empty -exec sudo rm -rf {} \;

#backup epgstation
pushd ${backup_dir}/epgstation
	sudo cp -rf database_backup database_backup_old
	sudo docker exec docker-mirakurun-epgstation-epgstation-1 npm run backup /app/backup/epgstation/database_backup
	set_attribute ./docker-mirakurun-epgstation/epgstation/thumbnail
	cp ~/docker-mirakurun-epgstation/epgstation/thumbnail/* ./docker-mirakurun-epgstation/epgstation/thumbnail/
	set_attribute ./docker-mirakurun-epgstation/epgstation/config
	cp ~/docker-mirakurun-epgstation/epgstation/config/config.yml ./docker-mirakurun-epgstation/epgstation/config/
	cp ~/docker-mirakurun-epgstation/docker-compose.yml ./docker-mirakurun-epgstation/
popd

#backup etc
pushd ${backup_dir}/etc
	cp /etc/fstab .
	mkdir -p samba
	cp /etc/samba/smb.conf samba/
	mkdir -p systemd/system
	cp /etc/systemd/system/epgstation.* systemd/system/
popd

#backup home
sudo rsync -aP --delete /home/tv-recorder/ ${backup_dir}/home/

次に夜中の1時にバックアップ処理が走るように、crontabで下記エントリを追加します。

$ crontab -e
---
0 3 * * * cd ~ && ./backup.sh -eCode language: Bash (bash)

OS再インストール時などでEPG stationを再構築した時は、下記コマンドを実行することでbackupファイルからリストアできます。

$ sudo docker exec docker-mirakurun-epgstation-epgstation-1 npm run restore /app/backup/epgstation/database_backup
$ cp /mnt/tv-recorder/backup/epgstation/docker-mirakurun-epgstation/epgstation/thumbnail/* ~/docker-mirakurun-epgstation/epgstation/thumbnail/ 

録画データ

録画データは前述の変換スクリプトでWindows PCにバックアップされます。

EPGStationの録画予約の同期

冒頭で記述したとおり、拙宅ではRasberryPiは録画専用サーバー、Intel N100はリアルタイム視聴用と録画専用サーバーダウン時のバックアップサーバーとして動作させています。

このときに問題になるのが、録画予約情報の同期です。録画専用サーバーで録画予約を追加・変更したときにもう一台のサーバーにも同じ予約をいれるのは面倒で、予約を間違うと録画していたつもりが録画されていない事態にもなります。

このような事態を避けるために、夜中にスクリプトを自動実行して同期をとるように設定します。

同期にはバックアップ時に生成されるdatabaseファイルをバックアップサーバーへ転送し、バックアップサーバーのEPGStationへ反映する方法をとります。データベースの転送にはscpを利用しますが、パスワードの入力を省略するため、バックアップサーバーの公開鍵を録画サーバーにコピーしておく必要があります。

$ ssh-keygen -t ed25519
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub tv-recorder@192.168.1.xxxCode language: JavaScript (javascript)

あとは、下記スクリプトをcrontabで毎日実行すれば常に録画サーバーの予約情報がバックアップサーバーに反映されます。毎時55分くらいに設定すればバックアップサーバー側で録画情報の反映の遅れが原因による録画ミスが減ると思います。

#!/bin/bash

scp 192.168.1.xxx:/mnt/tv-recorder/backup/epgstation/database_backup /mnt/tv-recorder/backup/epgstation/database_backup_for_sync
sudo docker exec docker-mirakurun-epgstation-epgstation-1 npm run restore /app/backup/epgstation/database_backup_for_sync
rm /mnt/tv-recorder/backup/epgstation/database_backup_for_syncCode language: JavaScript (javascript)
$ crontab -e
---
0 4 * * * cd ~ && ./sync_epgstation_databaase.sh -e

Tips & Troubleshooting

ここでは、録画サーバーをセットアップしたときに躓いたところや、動作確認の際に調べたことをメモしておきます。

同時録画ができない

Mirakurunのページを開いて、下記のPidの数値が上がっている場合は録画開始時に録画プロセスが死んでおり、RaspberryPiへの電源供給が足りていないために発生するようです。20W以上の供給能力を持つ充電アダプタをつけましょう。

CrontabでEPG stationのデータだけがバックアップできない

バックアップスクリプトを手動で実行した場合はバックアップできるにもかかわらず、Crontabで動作させるとdocker内のEPG stationのデータだけがバックアップされない場合があります。

この場合はdocker execコマンドに-itオプションがついているので、-itオプションを削除して対応します。

(正) $ sudo docker exec -it epgstation-v2.6.20 npm run backup /app/recorded/_backup/epgstation_database_backup
(誤) $ sudo docker exec     epgstation-v2.6.20 npm run backup /app/recorded/_backup/epgstation_database_backup

EPGは取得できるがTV放送が表示されない

B-CASカードがきちんと挿さっていない場合に発生します。再生状態でカードリーダーのLEDが動作中を示しているか確認し、点灯していない場合は挿入し直しましょう。

トラブル解析時にEPG stationのLogを見たい

下記コマンドでログのリアルタイム出力を確認できます。

$ sudo docker compose logs -f mirakurun
$ sudo docker compose logs -f mysql
$ sudo docker compose logs -f epgstation

KonomiTVでテレビを見ているとプチフリーズ(または再生停止)する

スペックの低いタブレットなどでKonomiTVを使用してテレビを見ているとTV再生中にプチフリーズが発生したり、再生が停止したりすることがあります。調べてみるとEPG情報を取得するタイミングでプチフリーズが発生しているようです。

そこで下記のようにEPGの取得間隔を24時間に伸ばし、EPG情報更新発生のタイミングを減らせばフリーズをなくすことができます。

$ vi ~/docker-mirakurun-epgstation/mirakurun/conf/server.yml
---
programGCInterval: 86400000  # イベント情報ガベージコレクション間隔を24時間に
epgGatheringInterval: 86400000  # EPGを更新した後の休止時間を24時間にCode language: PHP (php)

編集が終わったらEPG Stationを再起動します。

$ cd ~/docker-mirakurun-epgstation
$ sudo docker compose down
$ sudo docker compose up -d

以上、参考になれば幸いです。

覚えると便利、xargsコマンドの使い方12選

特定のファイルをtar.gzにまとめる方法

find ディレクトリパス -name '*.拡張子' -type f -print0 | xargs -0 tar -cvzf ファイル名.tar.gzCode language: JavaScript (javascript)

lsコマンドの出力を1行にまとめる方法

ls -1 ディレクトリパス | xargs

システムを使っているユーザリストを1行にまとめる方法

cut -d: -f1 &lt; /etc/passwd | sort | xargsCode language: HTML, XML (xml)

複数のファイルに対してwcコマンドを個別に実行する方法

ls *キーワード* | xargs wc

特定のディレクトリを再帰的に削除する方法

find ディレクトリパス -name "名前" -type d -print0 | xargs -0 /bin/rm -v -rf "{}"Code language: JavaScript (javascript)

特定のファイルを削除する方法

find . -name "ファイル名" -type f -print0 | xargs -0 /bin/rm -v -rf "{}"Code language: JavaScript (javascript)

ファイルを複数のディレクトリにコピーする方法

echo ディレクトリパス1/ ディレクトリパス2/ | xargs -n 1 cp -v コピー元ファイルパスCode language: PHP (php)

ファイルを特定のディレクトリに名前を変えつつ移動する方法

find ディレクトリパス -depth | xargs -n 1 rename -v 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;Code language: JavaScript (javascript)

特定のファイルを除いてほかのファイルを削除する方法

find . -type f -not -name '*gz' -print0 | xargs -0 -I "{}" rm -v "{}"Code language: JavaScript (javascript)

ファイルにアイテム一覧を書いておいて適用する方法

xargs -a リストファイルパス

実行するコマンドを実行前に標準エラー出力に出力させる方法

find ディレクトリパス -name "名前" -type d -print0 | xargs -0 -t /bin/rm -rf "{}"Code language: JavaScript (javascript)

実行前に確認プロンプトを表示させる方法

echo ディレクトリパス1/ ディレクトリパス2/ | xargs -p -n 1 cp -v コピー元ファイルパスCode language: PHP (php)
xargsコマンド実行例

xargsコマンド実行例

記事で紹介されている方法のいくつかは、xargsコマンドを使わなくてもコマンドの引数に指定することで実行させることが可能だ。しかし、xargsコマンドを利用すると引数の上限数を気にすることなく利用できるようになるという利点がある。引数に渡される数がオペレーティングシステムの提供している上限を超える場合は、xargsを利用することで問題を回避できる。

引用元:https://news.mynavi.jp/article/20180816-678553/

ソース不要の業務スーパー肉の牛肩ロースステーキ

材料(2人分)

【牛肉・にんじん・付け合わせ】

  • 牛肩ロース   約200g
  • にんじん    1本
  • オリーブオイル 大2
  • 塩       適量
  • 黒胡椒     適量
  • ニンニク    3片

【ソース】

  • バルサミコ酢  大2
  • 無塩バター   30g
  • レモン     適量
  • お好みのハーブ 適量

調理道具

  • バットと網(ドリップを抜く・焼いた肉を置いておく)
  • フライパン大(肉を焼く)

下準備

【にんじんを茹でる】

  1. 2リットルのお湯を鍋に入れ、40gの塩を溶かす
  2. 皮付きのにんじんを30分茹でる ※茹でている間に次工程の牛肉のドリップを取り除く
  3. 30分経ったらにんじんを取り出し、皮を剥ぐ
  4. にんじんを大きめの輪切り(厚さ2.5cm程度)に切る

【牛肉のドリップを取り除く】

  1. 牛肉を取り出してクッキングペーパーでドリップを拭く
  2. 牛肉の両面に塩を塗し、網付きバットに10分以上置いて水分を出す
  3. 牛肉の表面に出た水分をクッキングペーパーで拭く
  4. 牛肉の筋を切る

【その他】

  • ニンニクの皮を剥いで、包丁の腹で潰しておく

調理

【牛肉を焼く】

  1. フライパンに油を引き、強火で煙が出るまでフライパンを焼く
  2. フライパンにオリーブオイル大さじ2を入れて強火で温める
  3. 牛肉に軽く塩を振り、塩を振った面を下にしてフライパンで強火で40~50秒ほど焼く
  4. 牛肉を裏返して強火で40~50秒程度焼く
  5. 焼いた牛肉をバットに置いて、アルミホイルで軽く蓋をする

【付け合わせを作る】

  1. フライパンを軽く拭き、オリーブオイルを大さじ2入れて弱中火で温める
  2. ニンニクとにんじんを入れて10分かけて揚げ焼きにする
  3. にんじんの表面に模様が出て乾いてきたら、オリーブオイルを軽く拭く
  4. フライパンからニンニクを取り出す
  5. フライパンに無塩バター・胡椒・バットにたまった肉汁を入れる
  6. にんじんにバターをかけながら、バターが軽く色づくまで温める

【牛肉を温める】

  1. フライパンに牛肉を入れ、焦がしバターをかけて肉に熱を通す
  2. 熱が通ったら牛肉をバットに戻す

【ソースを作る・盛り付ける】

  1. フライパンにバルサミコ酢を入れ、にんじんにかけて纏わせる
  2. 牛肉を一口大に切り皿に盛り付け、にんじんを添えてソースをかけて出来上がり

メモ

  • 肉の味が隠れず、いい感じで肉に味がつきます
  • にんじん調理の部分を抜くと時間を短縮できます

参考レシピ

こねない塩麹パン

材料(4個分)

  • 強力粉     200g
  • ぬるま湯    140ml
  • きび砂糖    5g
  • ドライイースト 1g
  • 塩麹      大さじ1杯
  • オリーブオイル 大さじ1杯

調理道具

  • ボウル大(生地を作る)
  • 小皿(イースト液を作る)
  • 竹べら(生地を混ぜる)
  • まな板(生地を切って整形する)

下準備

【イースト水を作る】

  1. 小皿にぬるま湯140mlを入れる
  2. きび砂糖5gとドライイーストを溶かす
  3. 5分置いておく

調理

【生地を作る】

  1. ボウル大に強力粉200gを入れで、空気を含ませるように軽く混ぜる
  2. ボウル大に塩麹大さじ1とオリーブオイル大さじ1、イースト水を入れる
  3. 生地を切る要領で混ぜる
  4. 粉感がなくなり粘りが出たらラップをして30分置く

【生地を醗酵させる】

  1. ヘラで外側から内側へ巻き込ようにして練る(器に密着した部分の生地を空気に触れさせるようにする感じ)
  2. 5をボウル3周程度繰り返す
  3. ラップをしてレンジで30度90分で醗酵させる(生地の大きさが2倍程度になるまで待つ)

【生地を整形する】

  1. ボウルの生地に打ち粉を振る
  2. まな板に打ち粉を振る
  3. 生地をまな板に広げる
  4. 生地を3分の1ずつ、4回折りたたむ
  5. 生地を4分割する(切ったらくっつかないようにすぐに離すこと)
  6. 巾着状にして丸める
  7. オリーブオイルを上面に塗る
  8. ひっくり返してラップをし、10分置く

【生地を二次醗酵させる】

  1. 生地をまたひっくり返してクッキングペーパーに載せる
  2. オーブンを40度で30分にセットして生地を入れ2次醗酵させる

【焼く】

  1. オーブンを230度で予熱する
  2. 生地に薄くオリーブオイルを塗る
  3. 予熱が完了したらオーブンで230度で15分焼く
  4. 焼き上がったらオーブンから出して出来上がり

メモ

  • 作り方が悪かったのか、ホームベーカリーで作ったものと同じような味のパンになり、それほど味に差のないものができました。もう一度やり直しです。

参考レシピ