以前紹介したMirakurun+EDCB+KonomiTV環境の安定度・レスポンスが良すぎるので、TV環境を構築するなら今はその構成が一番おすすめですけれど、今後の事も考えて、mirakc+EDCB+KonomiTV環境についてもメモ程度に残しておきます。微妙にレスポンスが悪いのとチューナー解放などの安定度もイマイチな気がするので、記録として残しておくだけです。本格的な運用については、またそのうち。
KonomiTVはDockerでインストールしようとしたらエラーだったのでPM2で。miarkc(Docker)、EDCB(systemd)、KonomiTV(PM2)と無駄が多いのがレスポンス悪い原因かも。全部Dockerで固めたほうが良いのかも。
Docker環境を構築
まずはDocker環境を構築。完了後にログアウト→再ログインが必要です。既にDocker環境があるならここは飛ばしてもOK。
#!/bin/bash
set -e
echo "=== Docker インストール ==="
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER
echo "======================================================"
echo "Dockerインストール完了!"
echo "ログアウトして再ログイン後に setup_2_main.sh を実行してください。"
echo "======================================================"
mirakc,EDCB,KonomiTVインストール
#!/bin/bash
set -e
# ============================================================
# 0. ユーザー入力(最初に実行)
# ============================================================
echo "=== 1/8: キー設定 ==="
echo "キーの内容を貼り付けてください(入力後、Enterキーを2回押すと確定します):"
BCAS_CONTENT=$(sed '/^$/q')
# ============================================================
# 1. 依存パッケージの一括インストール
# ============================================================
echo "=== 2/8: 依存パッケージをインストール中 ==="
sudo apt update
sudo apt install -y \
autoconf automake cmake libtool libpcsclite-dev git build-essential pkg-config \
curl wget libclang-dev libdvbv5-dev libudev-dev \
nodejs npm ffmpeg liblua5.2-dev lua-zlib g++ make gcc
# ============================================================
# 2. TVチューナードライバ (px4_drv) のインストール
# ============================================================
echo "=== 3/8: PX4 ドライバをセットアップ中 ==="
mkdir -p ~/dtv
cd ~/dtv
DRIVER_VERSION="0.5.5"
DRIVER_DEB="px4-drv-dkms_${DRIVER_VERSION}_all.deb"
DRIVER_URL="https://github.com/tsukumijima/px4_drv/releases/download/v${DRIVER_VERSION}/${DRIVER_DEB}"
if [ ! -f "${DRIVER_DEB}" ]; then
curl -L -o "${DRIVER_DEB}" "${DRIVER_URL}"
fi
sudo apt install -y "./${DRIVER_DEB}"
sudo modprobe px4_drv || true
# ============================================================
# 3. libyakisoba / libsobacas のビルド・インストール
# ============================================================
echo "=== 4/8: 復号ライブラリのビルド ==="
cd ~/dtv
for repo in "libyakisoba" "libsobacas"; do
if [ ! -d "$repo" ]; then
git clone "https://github.com/tsunoda14/${repo}.git"
fi
cd "$repo"
autoreconf -i
mkdir -p build && cd build
[ "$repo" == "libyakisoba" ] && ../configure --sysconfdir=/usr/local/etc || ../configure
make -j"$(nproc)"
sudo make install
cd ~/dtv
done
sudo ldconfig
# ============================================================
# 4. recisdb のビルド
# ============================================================
echo "=== 5/8: Rust と recisdb のビルド ==="
if ! command -v cargo &> /dev/null; then
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
fi
source "$HOME/.cargo/env" || export PATH="$HOME/.cargo/bin:$PATH"
sudo mkdir -p /usr/local/lib/pkgconfig
sudo tee /usr/local/lib/pkgconfig/libsobacas.pc > /dev/null <<EOF
prefix=/usr/local
libdir=/usr/local/lib
includedir=/usr/include
Name: libsobacas
Description: PCSC compatible ECM decoder library
Version: 0.0.0
Libs: -L\${libdir} -lsobacas
Cflags: -I\${includedir}/PCSC
EOF
cd ~/dtv
[ ! -d "recisdb-rs" ] && git clone --recursive https://github.com/kazuki0824/recisdb-rs.git
cd recisdb-rs
sed -i 's/pcsclite/sobacas/g' b25-sys/build.rs
cargo build -F dvb --release
sudo cp target/release/recisdb /usr/local/bin/
# ============================================================
# 5. キーの作成
# ============================================================
sudo mkdir -p /usr/local/etc
echo "$BCAS_CONTENT" | sudo tee /usr/local/etc/bcas_keys > /dev/null
# ============================================================
# 6. ISDBScanner 実行
# ============================================================
echo "=== 6/8: チャンネルスキャンと mirakc 設定 ==="
sudo wget -q https://github.com/tsukumijima/ISDBScanner/releases/download/v1.3.3/isdb-scanner -O /usr/local/bin/isdb-scanner
sudo chmod +x /usr/local/bin/isdb-scanner
mkdir -p ~/dtv/scanned
if [ -z "$(ls -A ~/dtv/scanned/)" ]; then
isdb-scanner ~/dtv/scanned/
fi
# ============================================================
# mirakc-custom セットアップ(Docker)
# ============================================================
mkdir -p ~/mirakc-custom
cd ~/mirakc-custom
cat > Dockerfile << 'DOCKERFILE'
FROM mirakc/mirakc:main-debian
RUN apt-get update && apt-get install -y --no-install-recommends \
wget \
pcscd \
pcsc-tools \
libpcsclite-dev \
&& rm -rf /var/lib/apt/lists/*
RUN wget https://github.com/CobaltCas/CobaltCas/raw/master/dist/libcobaltcas_1.0.0_amd64.deb && \
dpkg -i libcobaltcas_1.0.0_amd64.deb || apt-get install -f -y && \
rm libcobaltcas_1.0.0_amd64.deb
RUN wget https://github.com/kazuki0824/recisdb-rs/releases/download/1.2.4/recisdb_1.2.4-1_amd64.deb && \
apt install -y ./recisdb_1.2.4-1_amd64.deb && \
rm recisdb_1.2.4-1_amd64.deb
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
DOCKERFILE
cat > docker-compose.yml << 'DOCKERCOMPOSE'
version: '3.8'
services:
mirakc:
image: mirakc-custom:latest
container_name: mirakc
restart: unless-stopped
ports:
- "40772:40772"
volumes:
- ./config.yml:/etc/mirakc/config.yml:ro
- mirakc-epg:/var/lib/mirakc/epg
- /dev:/dev
privileged: true
cap_add:
- SYS_ADMIN
- SYS_RAWIO
volumes:
mirakc-epg:
DOCKERCOMPOSE
cp ~/dtv/scanned/mirakc/config.yml ~/mirakc-custom/
docker build -t mirakc-custom:latest .
sudo chmod 666 /dev/isdb2056video* || true
sudo mkdir -p /var/lib/mirakc/epg
docker compose up -d
# ============================================================
# 7. EDCB (EpgTimerSrv) のセットアップ
# ============================================================
echo "=== 7/8: EDCB セットアップ ==="
cd ~/dtv
[ ! -d "EDCB" ] && git clone https://github.com/xtne6f/EDCB
cd EDCB/Document/Unix
make -j"$(nproc)"
sudo make install
make extra
sudo make install_extra
sudo mkdir -p /var/local/edcb
sudo chown -R $USER:$USER /var/local/edcb
make setup_ini
# EMWUI
cd ~/dtv
[ ! -d "EDCB_Material_WebUI" ] && git clone https://github.com/EMWUI/EDCB_Material_WebUI
cp -r EDCB_Material_WebUI/HttpPublic /var/local/edcb/
cp -r EDCB_Material_WebUI/Setting /var/local/edcb/
# ============================================================
# BonDriver_LinuxMirakc ビルド
# (修正内容:mirakc 4.0はHTTP/1.1のHostヘッダーが必須のため追加)
# ============================================================
cd ~/dtv
[ ! -d "BonDriver_LinuxMirakc" ] && git clone https://github.com/matching/BonDriver_LinuxMirakc.git --recurse-submodules
cd BonDriver_LinuxMirakc
# HTTP/1.1 Host ヘッダー追加パッチ
python3 << 'PYEOF'
with open('src/BonDriver_LinuxMirakc.cpp', 'r') as f:
content = f.read()
# szHeaderバッファを256バイトに拡張(SetChannel内)
content = content.replace(
'char szHeader[ 64 ];',
'char szHeader[ 256 ];'
)
# szHeaderバッファを256バイトに拡張(SendRequest内)
import re
content = re.sub(r'char szHeader\[len\];', 'char szHeader[256];', content)
# HostヘッダーをHTTPリクエストに追加(両箇所)
old = 'sprintf(szHeader, "Connection: close\\r\\nX-Mirakurun-Priority: %d", g_Priority);'
new = 'sprintf(szHeader, "Host: %s:%d\\r\\nConnection: close\\r\\nX-Mirakurun-Priority: %d", g_ServerHost, g_ServerPort, g_Priority);'
content = content.replace(old, new)
with open('src/BonDriver_LinuxMirakc.cpp', 'w') as f:
f.write(content)
print("BonDriver_LinuxMirakc.cpp パッチ適用完了")
PYEOF
make -j"$(nproc)"
sudo cp BonDriver_LinuxMirakc.so /usr/local/lib/edcb/
# BonDriver ini(EpgDataCap_Bon と同じディレクトリから実行される前提)
sudo tee /usr/local/lib/edcb/BonDriver_LinuxMirakc.so.ini > /dev/null << 'EOT'
[GLOBAL]
SERVER_HOST="127.0.0.1"
SERVER_PORT=40772
SERVER_TYPE="http"
DECODE_B25=1
PRIORITY=10
SERVICE_SPLIT=0
EOT
# チャンネル設定コピー
cp ~/dtv/scanned/EDCB-Wine/ChSet5.txt /var/local/edcb/Setting/
cp ~/dtv/scanned/EDCB-Wine/BonDriver_mirakc\(BonDriver_mirakc\).ChSet4.txt \
"/var/local/edcb/Setting/BonDriver_LinuxMirakc(LinuxMirakc).ChSet4.txt"
# WebUI設定
sed -i -e 's/^ALLOW_SETTING=.*/ALLOW_SETTING=true/' /var/local/edcb/HttpPublic/legacy/util.lua
mkdir -p /var/local/edcb/HttpPublic/video
# チューナー数の自動検出
PX4_DEV_COUNT=$(ls /dev/px4video* 2>/dev/null | wc -l)
ISDB_DEV_COUNT=$(ls /dev/isdb2056video* 2>/dev/null | wc -l)
if [ "$ISDB_DEV_COUNT" -gt 0 ]; then
TUNER_COUNT="$ISDB_DEV_COUNT"
elif [ "$PX4_DEV_COUNT" -gt 0 ]; then
TUNER_COUNT=$(( PX4_DEV_COUNT / 4 ))
[ "$TUNER_COUNT" -eq 0 ] && TUNER_COUNT=1
else
TUNER_COUNT=1
fi
echo "検出チューナー数: ${TUNER_COUNT}"
tee /var/local/edcb/EpgTimerSrv.ini > /dev/null << EOT
[SET]
EnableHttpSrv=1
EnableTCPSrv=1
RecEndMode=0
Data=1
HttpAccessControlList=+127.0.0.0/8,+10.0.0.0/8,+172.16.0.0/12,+192.168.0.0/16,+169.254.0.0/16,+100.64.0.0/10
[BonDriver_LinuxMirakc.so]
Count=${TUNER_COUNT}
GetEpg=1
EPGCount=0
Priority=0
EOT
tee /var/local/edcb/Common.ini > /dev/null << 'EOT'
[SET]
RecFolderPath0=/var/local/edcb/HttpPublic/video
RecFolderNum=1
EOT
# EpgDataCap_Bon.ini(EpgDataCap_BonがBonDriverDllPathを参照するために必要)
tee /var/local/edcb/EpgDataCap_Bon.ini > /dev/null << 'EOT'
[SET]
BonDriverDllPath=/usr/local/lib/edcb
EOT
# systemd 登録
sudo tee /etc/systemd/system/edcb.service > /dev/null << EOT
[Unit]
Description=EpgTimerSrv
After=network-online.target docker.service
Requires=docker.service
[Service]
Type=simple
User=$USER
WorkingDirectory=/usr/local/lib/edcb
ExecStart=/usr/local/bin/EpgTimerSrv
Restart=always
[Install]
WantedBy=default.target
EOT
sudo systemctl daemon-reload
sudo systemctl enable edcb
sudo systemctl start edcb
# ============================================================
# 8. KonomiTV インストール
# ============================================================
echo "=== 8/8: KonomiTV インストール... ==="
sudo npm install -g pm2
cd ~/dtv
curl -LO https://github.com/tsukumijima/KonomiTV/releases/latest/download/KonomiTV-Installer.elf
chmod +x KonomiTV-Installer.elf
sudo ./KonomiTV-Installer.elf
KONOMI_CONFIG=$(find /opt /usr/local /home -name "config.yaml" -path "*/KonomiTV/*" 2>/dev/null | head -1)
if [ -z "$KONOMI_CONFIG" ]; then
echo "⚠ KonomiTV の config.yaml が見つかりませんでした。パスを確認してください。"
else
echo "KonomiTV config.yaml を更新中: $KONOMI_CONFIG"
sudo sed -i 's/always_receive_tv_from_mirakurun: false/always_receive_tv_from_mirakurun: true/' "$KONOMI_CONFIG"
echo "always_receive_tv_from_mirakurun: true に設定しました。"
sudo pm2 restart KonomiTV
fi
echo "環境構築が完了しました!"
以下はメモ
試していないですが修正したスクリプトです。一応。
#!/bin/bash
set -e
# ============================================================
# mirakc + EDCB + KonomiTV 環境構築スクリプト
#
# 前提条件:
# - Debian系Linux (Ubuntu/Debian)
# - ネット接続
# - TVチューナー (px4_drv対応デバイス) 接続済み
# ============================================================
REAL_USER="${SUDO_USER:-$(logname 2>/dev/null || id -un)}"
REAL_HOME=$(getent passwd "$REAL_USER" | cut -d: -f6)
DTV_DIR="$REAL_HOME/dtv"
# ============================================================
# 0. ユーザー入力
# ============================================================
echo "=== 1/10: キー設定 ==="
echo "キーの内容を貼り付けてください(入力後、Enterキーを2回押すと確定します):"
BCAS_CONTENT=$(sed '/^$/q')
# ============================================================
# 1. 依存パッケージ
# ============================================================
echo "=== 2/10: 依存パッケージをインストール中 ==="
sudo apt update
sudo apt install -y \
autoconf automake cmake libtool libpcsclite-dev git build-essential pkg-config \
curl wget libclang-dev libdvbv5-dev libudev-dev \
nodejs npm ffmpeg liblua5.2-dev lua-zlib g++ make gcc
# ============================================================
# 2. TVチューナードライバ (px4_drv)
# ============================================================
echo "=== 3/10: PX4 ドライバをセットアップ中 ==="
mkdir -p "$DTV_DIR"
cd "$DTV_DIR"
DRIVER_VERSION="0.5.5"
DRIVER_DEB="px4-drv-dkms_${DRIVER_VERSION}_all.deb"
DRIVER_URL="https://github.com/tsukumijima/px4_drv/releases/download/v${DRIVER_VERSION}/${DRIVER_DEB}"
if [ ! -f "${DRIVER_DEB}" ]; then
curl -L -o "${DRIVER_DEB}" "${DRIVER_URL}"
fi
sudo apt install -y "./${DRIVER_DEB}" || true
sudo modprobe px4_drv || true
# ============================================================
# 3. libyakisoba / libsobacas のビルド
# ============================================================
echo "=== 4/10: 復号ライブラリのビルド ==="
cd "$DTV_DIR"
for repo in "libyakisoba" "libsobacas"; do
if [ ! -d "$repo" ]; then
git clone "https://github.com/tsunoda14/${repo}.git"
fi
cd "$repo"
autoreconf -i
mkdir -p build && cd build
[ "$repo" == "libyakisoba" ] && ../configure --sysconfdir=/usr/local/etc || ../configure
make -j"$(nproc)"
sudo make install
cd "$DTV_DIR"
done
sudo ldconfig
# ============================================================
# 4. recisdbのビルド
# ============================================================
echo "=== 5/10: Rust と recisdb のビルド ==="
if ! command -v cargo &> /dev/null; then
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
fi
source "$HOME/.cargo/env" || export PATH="$HOME/.cargo/bin:$PATH"
sudo mkdir -p /usr/local/lib/pkgconfig
sudo tee /usr/local/lib/pkgconfig/libsobacas.pc > /dev/null <<EOF
prefix=/usr/local
libdir=/usr/local/lib
includedir=/usr/include
Name: libsobacas
Description: PCSC compatible ECM decoder library
Version: 0.0.0
Libs: -L\${libdir} -lsobacas
Cflags: -I\${includedir}/PCSC
EOF
cd "$DTV_DIR"
[ ! -d "recisdb-rs" ] && git clone --recursive https://github.com/kazuki0824/recisdb-rs.git
cd recisdb-rs
sed -i 's/pcsclite/sobacas/g' b25-sys/build.rs
cargo build -F dvb --release
sudo cp target/release/recisdb /usr/local/bin/
# ============================================================
# 5. キーの保存
# ============================================================
sudo mkdir -p /usr/local/etc
echo "$BCAS_CONTENT" | sudo tee /usr/local/etc/bcas_keys > /dev/null
# ============================================================
# 6. ISDBScanner 実行
# ============================================================
echo "=== 6/10: チャンネルスキャン ==="
sudo wget -q https://github.com/tsukumijima/ISDBScanner/releases/download/v1.3.3/isdb-scanner -O /usr/local/bin/isdb-scanner
sudo chmod +x /usr/local/bin/isdb-scanner
mkdir -p "$DTV_DIR/scanned"
if [ -z "$(ls -A "$DTV_DIR/scanned/" 2>/dev/null)" ]; then
isdb-scanner "$DTV_DIR/scanned/"
fi
# ============================================================
# 7. mirakc Docker
# ============================================================
echo "=== 7/10: mirakc Docker セットアップ ==="
MIRAKC_DIR="$REAL_HOME/mirakc-custom"
mkdir -p "$MIRAKC_DIR"
cd "$MIRAKC_DIR"
# entrypoint.sh: services.json の上書きループなし
cat > entrypoint.sh << 'ENTRYPOINT'
#!/bin/bash
set -e
mkdir -p /var/lib/mirakc/epg
exec /usr/local/bin/mirakc --config /etc/mirakc/config.yml
ENTRYPOINT
chmod +x entrypoint.sh
# Dockerfile: コンテナ内でライブラリとrecisdbをビルド
cat > Dockerfile << 'DOCKERFILE'
FROM mirakc/mirakc:main-debian
RUN apt-get update && apt-get install -y --no-install-recommends \
wget curl git autoconf automake cmake libtool build-essential pkg-config \
g++ make gcc libclang-dev libdvbv5-dev libudev-dev libpcsclite-dev \
&& rm -rf /var/lib/apt/lists/*
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
ENV PATH="/root/.cargo/bin:${PATH}"
RUN mkdir -p /tmp/build && cd /tmp/build && \
git clone https://github.com/tsunoda14/libyakisoba.git && \
git clone https://github.com/tsunoda14/libsobacas.git && \
cd libyakisoba && autoreconf -i && mkdir -p build && cd build && \
../configure --sysconfdir=/usr/local/etc && make -j$(nproc) && make install && \
cd /tmp/build/libsobacas && autoreconf -i && mkdir -p build && cd build && \
../configure && make -j$(nproc) && make install && \
ldconfig && cd / && rm -rf /tmp/build
RUN mkdir -p /usr/local/lib/pkgconfig && \
printf 'prefix=/usr/local\nlibdir=/usr/local/lib\nincludedir=/usr/include\nName: libsobacas\nDescription: PCSC compatible ECM decoder library\nVersion: 0.0.0\nLibs: -L${libdir} -lsobacas\nCflags: -I${includedir}/PCSC\n' \
> /usr/local/lib/pkgconfig/libsobacas.pc
RUN mkdir -p /tmp/recisdb && cd /tmp/recisdb && \
git clone --recursive https://github.com/kazuki0824/recisdb-rs.git && \
cd recisdb-rs && \
sed -i 's/pcsclite/sobacas/g' b25-sys/build.rs && \
cargo build -F dvb --release && \
cp target/release/recisdb /usr/local/bin/ && \
chmod +x /usr/local/bin/recisdb && \
cd / && rm -rf /tmp/recisdb
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /root/.cargo /root/.rustup
COPY entrypoint.sh /opt/entrypoint.sh
RUN chmod +x /opt/entrypoint.sh
DOCKERFILE
# docker-compose.yml
cat > docker-compose.yml << 'DOCKERCOMPOSE'
services:
mirakc:
image: mirakc-custom:latest
container_name: mirakc
restart: unless-stopped
entrypoint: /opt/entrypoint.sh
ports:
- "40772:40772"
volumes:
- ./config.yml:/etc/mirakc/config.yml:ro
- mirakc-epg:/var/lib/mirakc/epg
- /dev:/dev
- /usr/local/etc/bcas_keys:/usr/local/etc/bcas_keys:ro
privileged: true
cap_add:
- SYS_ADMIN
- SYS_RAWIO
volumes:
mirakc-epg:
DOCKERCOMPOSE
# config.yml: ISDBScannerの結果を元に生成
cp "$DTV_DIR/scanned/mirakc/config.yml" "$MIRAKC_DIR/config.yml"
# 初回起動時のみ scan-services を実行するため、最初は無効化しない
# sync-clocks / update-schedules は無効化 (手動スクリプトで更新)
cat >> "$MIRAKC_DIR/config.yml" << 'JOBSCONFIG'
jobs:
scan-services:
disabled: false
sync-clocks:
disabled: true
update-schedules:
disabled: true
JOBSCONFIG
# update-epg.sh: 番組情報の手動更新スクリプト
cat > "$REAL_HOME/update-epg.sh" << 'UPDATEEPG'
#!/bin/bash
# update-epg.sh - Manual EPG update script
# Run this when NOT watching TV (it will occupy the tuner for several minutes)
#
# Usage: sudo bash ~/update-epg.sh
set -e
echo "=== EPG Manual Update ==="
echo "WARNING: This will occupy the tuner for several minutes."
echo "Do NOT run this while watching TV."
echo ""
echo "[1/2] Syncing clocks..."
docker exec mirakc mirakc-arib sync-clocks 2>&1 | head -20
echo ""
echo "[2/2] Collecting EIT data (番組情報更新)..."
docker exec mirakc mirakc-arib collect-eits $(docker exec mirakc cat /var/lib/mirakc/epg/services.json 2>/dev/null | python3 -c "
import json,sys
d=json.load(sys.stdin)
if isinstance(d, list):
sids = [str(item[0] if isinstance(item, list) else item.get('id','')) for item in d[:200]]
print(' '.join(['--sids=' + s for s in sids[:50]]))
elif isinstance(d, dict):
sids = list(d.keys())[:50]
print(' '.join(['--sids=' + str(s) for s in sids]))
" 2>/dev/null) 2>&1 | tail -5
echo ""
echo "=== EPG Update Complete ==="
UPDATEEPG
chmod +x "$REAL_HOME/update-epg.sh"
echo "Dockerイメージをビルド中(Rustコンパイルで数分かかります)..."
docker build -t mirakc-custom:latest .
sudo chmod 666 /dev/isdb2056video* 2>/dev/null || true
sudo chmod 666 /dev/px4video* 2>/dev/null || true
docker compose up -d
echo "mirakc 起動待機中..."
for i in $(seq 1 30); do
if curl -s http://127.0.0.1:40772/api/tuners >/dev/null 2>&1; then
echo "mirakc API 応答OK"
break
fi
sleep 2
echo " 待機中... ($((i*2))秒経過)"
done
# ============================================================
# 初回サービススキャン (scan-services 完了を待機)
# ============================================================
echo "=== 初回サービススキャン実行中(数分かかります)==="
for i in $(seq 1 60); do
SVC_COUNT=$(curl -s http://127.0.0.1:40772/api/services 2>/dev/null | grep -c '"id"' || true)
if [ "$SVC_COUNT" -gt 0 ]; then
echo "サービススキャン完了: ${SVC_COUNT} 件のサービスを検出"
break
fi
sleep 5
echo " スキャン中... ($((i*5))秒経過)"
done
if [ "${SVC_COUNT:-0}" -eq 0 ]; then
echo "WARNING: サービススキャンがタイムアウトしました。"
echo "手動で実行: docker exec mirakc bash -c 'recisdb tune --device /dev/isdb2056video0 --channel T27 - 2>/dev/null | timeout 15 mirakc-arib scan-services'"
fi
# scan-services を無効化して再起動 (起動時のチューナー占有を防ぐ)
sed -i '/ scan-services:/,/ sync-clocks:/ s/disabled: false/disabled: true/' "$MIRAKC_DIR/config.yml"
docker compose restart
echo "mirakc 再起動完了 (scan-services 無効化)"
# ============================================================
# 8. EDCB (EpgTimerSrv) のセットアップ
# ============================================================
echo "=== 8/10: EDCB セットアップ ==="
cd "$DTV_DIR"
[ ! -d "EDCB" ] && git clone https://github.com/xtne6f/EDCB
cd EDCB/Document/Unix
make -j"$(nproc)"
sudo make install
make extra
sudo make install_extra
sudo mkdir -p /var/local/edcb
sudo chown -R "$REAL_USER:$REAL_USER" /var/local/edcb
make setup_ini
# EMWUI
cd "$DTV_DIR"
[ ! -d "EDCB_Material_WebUI" ] && git clone https://github.com/EMWUI/EDCB_Material_WebUI
cp -r EDCB_Material_WebUI/HttpPublic /var/local/edcb/
cp -r EDCB_Material_WebUI/Setting /var/local/edcb/
# BonDriver_LinuxMirakc
cd "$DTV_DIR"
[ ! -d "BonDriver_LinuxMirakc" ] && git clone https://github.com/matching/BonDriver_LinuxMirakc.git --recurse-submodules
cd BonDriver_LinuxMirakc
python3 << 'PYEOF'
with open('src/BonDriver_LinuxMirakc.cpp', 'r') as f:
content = f.read()
content = content.replace('char szHeader[ 64 ];', 'char szHeader[ 256 ];')
import re
content = re.sub(r'char szHeader\[len\];', 'char szHeader[256];', content)
old = 'sprintf(szHeader, "Connection: close\\r\\nX-Mirakurun-Priority: %d", g_Priority);'
new = 'sprintf(szHeader, "Host: %s:%d\\r\\nConnection: close\\r\\nX-Mirakurun-Priority: %d", g_ServerHost, g_ServerPort, g_Priority);'
content = content.replace(old, new)
with open('src/BonDriver_LinuxMirakc.cpp', 'w') as f:
f.write(content)
PYEOF
make -j"$(nproc)"
sudo cp BonDriver_LinuxMirakc.so /usr/local/lib/edcb/
sudo tee /usr/local/lib/edcb/BonDriver_LinuxMirakc.so.ini > /dev/null << 'EOT'
[GLOBAL]
SERVER_HOST="127.0.0.1"
SERVER_PORT=40772
SERVER_TYPE="http"
DECODE_B25=1
PRIORITY=10
SERVICE_SPLIT=0
EOT
cp "$DTV_DIR/scanned/EDCB-Wine/ChSet5.txt" /var/local/edcb/Setting/
cp "$DTV_DIR/scanned/EDCB-Wine/BonDriver_mirakc(BonDriver_mirakc).ChSet4.txt" \
"/var/local/edcb/Setting/BonDriver_LinuxMirakc(LinuxMirakc).ChSet4.txt"
sed -i -e 's/^ALLOW_SETTING=.*/ALLOW_SETTING=true/' /var/local/edcb/HttpPublic/legacy/util.lua
mkdir -p /var/local/edcb/HttpPublic/video
# チューナー数の自動検出
ISDB_DEV_COUNT=$(ls /dev/isdb2056video* 2>/dev/null | wc -l)
PX4_DEV_COUNT=$(ls /dev/px4video* 2>/dev/null | wc -l)
if [ "$ISDB_DEV_COUNT" -gt 0 ]; then
TUNER_COUNT="$ISDB_DEV_COUNT"
elif [ "$PX4_DEV_COUNT" -gt 0 ]; then
TUNER_COUNT=$(( PX4_DEV_COUNT / 4 ))
[ "$TUNER_COUNT" -eq 0 ] && TUNER_COUNT=1
else
TUNER_COUNT=1
fi
echo "検出チューナー数: ${TUNER_COUNT}"
sudo tee /var/local/edcb/EpgTimerSrv.ini > /dev/null << EOT
[SET]
EnableHttpSrv=1
EnableTCPSrv=1
RecEndMode=0
Data=1
HttpAccessControlList=+127.0.0.0/8,+10.0.0.0/8,+172.16.0.0/12,+192.168.0.0/16,+169.254.0.0/16,+100.64.0.0/10
[BonDriver_LinuxMirakc.so]
Count=${TUNER_COUNT}
GetEpg=1
EPGCount=0
Priority=0
EOT
sudo tee /var/local/edcb/Common.ini > /dev/null << 'EOT'
[SET]
RecFolderPath0=/var/local/edcb/HttpPublic/video
RecFolderNum=1
EOT
sudo tee /var/local/edcb/EpgDataCap_Bon.ini > /dev/null << 'EOT'
[SET]
BonDriverDllPath=/usr/local/lib/edcb
EOT
sudo tee /etc/systemd/system/edcb.service > /dev/null << EOT
[Unit]
Description=EpgTimerSrv
After=network-online.target docker.service
Requires=docker.service
[Service]
Type=simple
User=$REAL_USER
WorkingDirectory=/usr/local/lib/edcb
ExecStart=/usr/local/bin/EpgTimerSrv
Restart=always
[Install]
WantedBy=default.target
EOT
sudo systemctl daemon-reload
sudo systemctl enable edcb
sudo systemctl start edcb
# ============================================================
# 9. KonomiTV インストール
# ============================================================
echo "=== 9/10: KonomiTV インストール ==="
sudo npm install -g pm2
cd "$DTV_DIR"
curl -LO https://github.com/tsukumijima/KonomiTV/releases/latest/download/KonomiTV-Installer.elf
chmod +x KonomiTV-Installer.elf
sudo ./KonomiTV-Installer.elf
KONOMI_CONFIG=$(find /opt /usr/local /home -name "config.yaml" -path "*/KonomiTV/*" 2>/dev/null | head -1)
if [ -z "$KONOMI_CONFIG" ]; then
echo "KonomiTV の config.yaml が見つかりませんでした。パスを確認してください。"
else
echo "KonomiTV config.yaml を更新中: $KONOMI_CONFIG"
sudo sed -i 's/always_receive_tv_from_mirakurun: false/always_receive_tv_from_mirakurun: true/' "$KONOMI_CONFIG"
sudo pm2 restart KonomiTV
fi
# ============================================================
# 10. 完了
# ============================================================
echo ""
echo "============================================================"
echo " セットアップ完了"
echo "============================================================"
echo ""
echo " サービス:"
echo " mirakc: http://127.0.0.1:40772/"
echo " EDCB: http://127.0.0.1:5510/"
echo " KonomiTV: https://<ローカルIP>.local.konomi.tv:7000/"
echo ""
echo " サービス操作:"
echo " EDCB 再起動: systemctl restart edcb"
echo " KonomiTV 再起動: pm2 restart KonomiTV"
echo " mirakc 再起動: cd ~/mirakc-custom && docker compose restart"
echo ""
echo " 番組情報の更新 (視聴していない時に実行):"
echo " sudo bash ~/update-epg.sh"
echo ""
echo " 注意: 1チューナー環境では、scan-services ジョブが起動時に"
echo " チューナーを長時間占有するため無効化しています。"
echo " 番組情報を更新するには ~/update-epg.sh を手動で実行してください。"
echo "============================================================"


