Yet another DVR Tuner Server for Japanese TV.
- Mirakurun互換のAPI
- Go言語で書かれていてシングルバイナリで動作
- 分かりやすいダッシュボード
- リアルタイム番組表更新
- ケーブルテレビの再送信など複数経路のTSを統合
- OpenTelemetryによる高い可観測性
- データ放送API
- ISDB-S3の実験的サポート
リリースより最新のバージョンをダウンロードするか、コンテナイメージをpullしてください。
mainブランチの最新ビルドを試す場合は、CIの実行履歴からバイナリのartifactをダウンロードできます。コンテナイメージは ghcr.io/rokoucha/mahiron:nightly でpullできます。日時指定の YYYY.MMDD.HHMMSS-nightly や、特定のコミットを直接指定する sha-<短縮コミットSHA> タグもあります。
設定はサンプルを参考に、実行ファイルと同じディレクトリの config フォルダ内に配置してください。別なフォルダにする場合は、実行時に -config-dir <path> オプションを指定してください。
起動すると、自動的に放送サービスをスキャンし、EPGやロゴを取得します。
既定は対象ごとの期限を確認する常駐方式です。epgRefreshInterval(ミリ秒、既定1800000)を更新目標とし、未取得・期限超過のストリームから取得します。視聴が優先されるため、混雑時の期限内取得は保証されません。
常駐取得では、基本EPGと拡張確認の期限を分けます。拡張の送出が不明な対象は、初回とepgExtendedProbeInterval(既定21600000ms=6時間)ごとに受信上限まで調査します。それ以外は基本EPG完了後、対象の進展がepgUnknownExtendedIdleTime(既定30000ms)止まれば部分保存して枠を返します。0を指定すると短縮を無効にできます。この時間は運用上の受信予算で、非送出の判定値ではありません。拡張を観測済み、またはBIT等が送出を明示した対象は短縮しません。
epgReadyは全モードで基本EPGが揃えば有効になり、epgUpdatedAtは引き続き完全取得の成功時刻です。APIのepgBasicUpdatedAt・epgExtendedProbeAt・epgExtendedObserved・epgPartialAtで基本更新、長めの確認、拡張観測、部分取得を区別できます。部分取得はepg_partialとして記録し、基本の更新期限または拡張の確認期限に再取得します。状態はDBに保存します。
epgGatheringMode: continuous を設定する場合、jobs から epg-gatherer のcronを削除してください。明示された旧cronは scheduled モードとして従来どおり動作します。jobs を指定しEPGを省いた既存設定では自動取得を開始しません。明示的に止める場合は epgGatheringMode: disabled を使います。
EPG受信はスキャン・ロゴ取得などと maxConcurrentJobs の共通枠を使い、外部の保存済みEPG同期だけを別枠で1件まで実行します。受信できた部分は保存しますが、基本・詳細の対象sectionが揃わない取得は最終成功時刻を更新せず、間隔を広げて再試行します。詳細の非送出はBIT/MH-BITの適用中の運用情報で確認します。地上波のサービス所属は実際のSDTと照合します。番組名欠落などの品質警告は完全性と区別し、sectionが揃っていれば成功時刻を更新します。他ストリームの基本情報だけでは詳細取得を省略しません。epgRetrievalTime は1候補の受信時間の上限であり、上限到達を取得完了とは見なしません。
ジョブ画面の continuous 行から再評価を要求でき、個々の取得は従来どおり履歴の確認・中止・再実行が可能です。期限切れ番組の削除は常駐処理から1時間ごとに実行します。
代表的な差分です。これ以外にも非互換な部分があります。
- 設定の変更などには対応していません
- APIによる設定の参照・変更
PUT /restart
- ChannelTypeは好きな文字列を指定できます
- Serviceに以下のフィールドを追加しています
- transportStreamId
- eitScheduleFlag
- eitPresentFollowing
- epgLastAttemptAt
- epgLastError
- Channelに以下のフィールドを追加しています
- routes
- TunerDeviceに以下のフィールドを追加しています
- currentChannel*
- tunedChannel*
- リモートチューナーの
typesは、有効なroutesに対応するローカルの種類を返しますcurrentChannelType/currentChannelはローカルの対応先が一意の場合は変換した値を、それ以外の場合はリモートが報告した値を返しますtunedChannelType/tunedChannelはリモートで実際に選局しているチャンネルの種類と番号を返します
/api/versionにserverフィールドを追加しています- 値は常に
mahironです
- 値は常に
- JobItemに以下のフィールドを追加しています
- nextRunAt
- result
- RelatedItemに以下のフィールドを追加しています
- transportStreamId
/api/services/{id}/data-broadcast/bmlでデータ放送(ARIB STD-B24)用のAPIを実装しています- 詳細はAPIドキュメントを参照してください
- チャンネル設定(
channels.yml)は互換です- ケーブルテレビの再送信などで複数経路で同じTSを受信できる場合の設定フィールド(
routes)を追加しています - TSMFの設定はローカルのみ反映されます
- ケーブルテレビの再送信などで複数経路で同じTSを受信できる場合の設定フィールド(
- チューナー設定(
tuners.yml)はリモートMirakurunを除いて互換です - サーバー設定(
server.yml)は非互換です - リモートMirakurun機能はありませんが、Mirakurun互換サーバーに接続する機能があります(
remotes.yml)
Copyright (c) 2026 Rokoucha
Licensed under the Apache License, Version 2.0.
Mahiron's logo is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.