SSブログ

kodi IPTV Simple PVR Addonのジャンル表示 [Raspberry Pi]

2022/01/19 追記
EPGStationではないのですが,Mirakurun 3.9.0 betaでジャンル情報を取得出来るようになり,小細工不要でジャンル表示が出来る様になりました。

先日,久々にラズパイレコーダーを弄っていて,気になる事が有ったので,調べてプチ対応してみました。

で,何が気になったかって言いますと… PVRの番組表にあるジャンルの表示……
またかよ,またしてもジャンルかよ orz
Tvmaidを改造の時も,散々,ジャンル周り,ガチャガチャにしたじゃね〜か。(ちなみにこれとか これ)

でも,まぁ,気になったてしまったのは,しようが無い…(笑

って事で…

今回のお題目:
  • EPGStation(v1)と,ラズパイでkodiのIPTV Simple addonで,ジャンル表示させてみる。

まず,現状は…

  • kodiは,apt installで入るv18.7 Leia
  • PVR IPTV Simple Clientは,3.8.8

です。

kodiは,v19 Matrixがリリースされましたが,aptで入れられるまで待ちです。
# v19は,試しにMBPへ入れてみたけど,正直よくわからん!!(笑

ザックリ調べてみたら…

  • EPGStationが渡すepg.xmlの内容に<category>を追加,ジャンルを渡せばkodiで表示されるっぽい。
  • EPGStationのepg.xmlを生成する処理内で,番組表情報全般(ジャンルも)を取り扱えるっぽい。

試しにEPGデータを覗いてみます。(見やすい様に改行入れてます)

$ sqlite3 ~/EPGStation/data/database.db
sqlite> .headers ON
sqlite> select * from Programs limit 1;
id|channelId|eventId|serviceId|networkId|startAt|endAt|startHour|week|duration|isFree|name|
shortName|description|extended
|genre1|genre2|genre3|genre4|genre5|genre6|channelType|channel|videoType|videoResolution|videoStreamContent|videoComponentType|audioSamplingRate|audioComponentType
40010111615|400101|11615|101|4|1614654000000|1614655500000|12|2|1500000|1|東京マーケット情報|
東京マーケット情報|▽マーケット指標,株式市況速報 ▽東証1部・2部前場市況 【キャスター】岸田彩加|
|0|4|||||BS|BS15_0|mpeg2|1080i|1|179|48000|3

genre1 〜 genre6って名称のカラムが,お目当てのジャンルの様です。

カラム 意味
genre1
genre3
genre5
ジャンル大分類(content_nibble_level1)
genre1 + genre2
genre3 + genre4
genre5 + genre6
ジャンル中分類(content_nibble_level2)

って感じで取り扱えば,行けそうです。
# セットされる値は,ARIB STD-B10「付録H(規定) コンテント記述子におけるジャンル指定」を参照の事。


とりあえず,直接 EPGStation/dist/server/Model/Api/IPTVModel.js を弄って対応。
動作したので,これで良しとしても良かったのですが,ソースの方を弄って,ちゃんとBuild出来る様にしてみました。
# と,言っても,いつも通りのヤッつけ実装です(笑

対策前: 全ての番組のジャンルが『その他/不明』になってます。
kodi_iptv_genre0.jpg

対策後: EPGに設定されているジャンルが表示されています。
kodi_iptv_genre1.jpg



適用方法は…

一旦,EPGStationを停止してから,以下のパッチを当てて,再度 npm run build します。

その後,kodiの方で

  1. 設定 →Live TV →ガイド →クリアデータを実施,キャッシュしているEPGデータをクリアします。
    * 実施すると,同時に,EPGデータがリロードされます。
  2. 「PVR & TV放送」を選んで,番組表などでジャンルが表示されている事を確認します。
注意:
  • 同じクリアデータでも「設定 →Live TV →一般 →クリアデータ」は,実施しない様に!!
    チャンネルのグルーピング設定など,設定全消ししてしまいます。

IPTVModel.ts.patch

--- /home/pi/EPGStation/src/server/Model/Api/IPTVModel.ts	2020-10-10 00:00:00.000000000 +0900
+++ /home/pi/EPGStation/src/server/Model/Api/IPTVModel.ts	2021-03-02 14:10:18.914086671 +0900
@@ -77,6 +77,64 @@ class IPTVModel extends ApiModel impleme
         const programs = await this.programsDB.findSchedule(now, now + 1000 * 60 * 60 * 24 * days);
         const channels = await this.servicesDB.findAll();
 
+        const genrel: { [key: number]: string } = {
+            0x0: 'ニュース/報道', 0x1: 'スポーツ', 0x2: '情報/ワイドショー', 0x3: 'ドラマ', 0x4: '音楽',
+            0x5: 'バラエティ', 0x6: '映画', 0x7: 'アニメ/特撮', 0x8: 'ドキュメンタリー/教養', 0x9: '劇場/公演',
+            0xA: '趣味/教育', 0xB: '福祉', 0xC: 'スポーツ(CS)', 0xD: '映画(CS)', 0xE: '拡張',
+            0xF: 'その他',
+        };
+
+        const genrem: { [key: number]: string }  = {
+            0x00: '定時・総合', 0x01: '天気', 0x02: '特集・ドキュメント', 0x03: '政治・国会', 0x04: '経済・市況',
+            0x05: '海外・国際', 0x06: '解説', 0x07: '討論・会談', 0x08: '報道特番', 0x09: 'ローカル・地域',
+            0x0A: '交通', 0x0F: 'その他',
+
+            0x10: 'ニュース', 0x11: '野球', 0x12: 'サッカー', 0x13: 'ゴルフ', 0x14: 'その他の球技',
+            0x15: '相撲・格闘技', 0x16: 'オリンピック・国際大会', 0x17: 'マラソン・陸上・水泳', 0x18: 'モータースポーツ',
+            0x19: 'マリン・ウィンタースポーツ', 0x1A: '競馬・公営競技', 0x1F: 'その他',
+
+            0x20: '芸能', 0x21: 'ファッション', 0x22: '暮らし・住まい', 0x23: '健康・医療', 0x24: 'ショッピング・通販',
+            0x25: 'グルメ・料理', 0x26: 'イベント', 0x27: '番組紹介・お知らせ', 0x2F: 'その他',
+
+            0x30: '国内', 0x31: '海外', 0x32: '時代劇', 0x3F: 'その他',
+
+            0x40: '国内ロック・ポップス', 0x41: '海外ロック・ポップス', 0x42: 'クラシック・オペラ', 0x43: 'ジャズ・フュージョン',
+            0x44: '歌謡曲・演歌', 0x45: 'ライブ・コンサート', 0x46: 'ランキング・リクエスト', 0x47: 'カラオケ・のど自慢',
+            0x48: '民謡・邦楽', 0x49: '童謡・キッズ', 0x4A: '民族音楽・ワールドミュージック', 0x4F: 'その他',
+
+            0x50: 'クイズ', 0x51: 'ゲーム', 0x52: 'トークバラエティ', 0x53: 'お笑い・コメディ', 0x54: '音楽バラエティ',
+            0x55: '旅バラエティ', 0x56: '料理バラエティ', 0x5F: 'その他',
+
+            0x60: '洋画', 0x61: '邦画', 0x62: 'アニメ', 0x6F: 'その他',
+
+            0x70: '国内', 0x71: '海外', 0x72: '特撮', 0x7F: 'その他',
+
+            0x80: '社会・時事', 0x81: '歴史・紀行', 0x82: '自然・動物・環境', 0x83: '宇宙・科学・医学', 0x84: 'カルチャー・伝統文化',
+            0x85: '文学・文芸', 0x86: 'スポーツ', 0x87: 'ドキュメンタリー全般', 0x88: 'インタビュー・討論', 0x8F: 'その他',
+
+            0x90: '現代劇・新劇', 0x91: 'ミュージカル', 0x92: 'ダンス・バレエ', 0x93: '落語・演芸', 0x94: '歌舞伎・古典',
+            0x9F: 'その他',
+
+            0xA0: '旅・釣り・アウトドア', 0xA1: '園芸・ペット・手芸', 0xA2: '音楽・美術・工芸', 0xA3: '囲碁・将棋', 0xA4: '麻雀・パチンコ',
+            0xA5: '車・オートバイ', 0xA6: 'コンピュータ・TVゲーム', 0xA7: '会話・語学', 0xA8: '幼児・小学生', 0xA9: '中学生・高校生',
+            0xAA: '大学生・受験', 0xAB: '生涯教育・資格', 0xAC: '教育問題', 0xAF: 'その他',
+
+            0xB0: '高齢者', 0xB1: '障害者', 0xB2: '社会福祉', 0xB3: 'ボランティア', 0xB4: '手話',
+            0xB5: '文字(字幕)', 0xB6: '音声解説', 0xBF: 'その他',
+
+            0xC0: 'テニス', 0xC1: 'バスケットボール', 0xC2: 'ラグビー', 0xC3: 'アメリカンフットボール', 0xC4: 'ボクシング',
+            0xC5: 'プロレス', 0xCF: 'その他',
+
+            0xD0: 'アクション', 0xD1: 'SF/ファンタジー', 0xD2: 'コメディー', 0xD3: 'サスペンス/ミステリー', 0xD4: '恋愛/ロマンス',
+            0xD5: 'ホラー/スリラー', 0xD6: 'ウエスタン', 0xD7: 'ドラマ/社会派ドラマ', 0xD8: 'アニメーション', 0xD9: 'ドキュメンタリー',
+            0xDA: 'アドベンチャー/冒険', 0xDB: 'ミュージカル/音楽映画', 0xDC: 'ホームドラマ', 0xDD: '青春/学園/アイドル',
+            0xDE: '任侠/時代劇', 0xDF: 'その他',
+
+            0xE0: '中止の可能性あり', 0xE1: '延長の可能性あり', 0xE2: '中断の可能性あり', 0xE3: '同一シリーズの別話数放送の可能性あり',
+            0xE4: '編成未定枠', 0xE5: '繰り上げの可能性あり', 0xE8: '中断ニュースあり', 0xE9: '当該イベントに関連する臨時サービスあり',
+            0xEF: 'NC',
+        };
+
         // channelId ごとに programs をまとめる
         const programsIndex: { [key: number]: DBSchema.ScheduleProgramItem[] } = {};
         for (const program of programs) {
@@ -109,6 +167,13 @@ class IPTVModel extends ApiModel impleme
                 str += ``;
                 str += `${ program.name }`;
                 if (program.description !== null) { str += `    ${ program.description }`; }
+                if (program.genre1 !== null) {
+                    str += '' + genrel[program.genre1];
+                    if (program.genre2 !== null) {
+                        str +=  '(' + genrem[(program.genre1 * 16 + program.genre2)] + ')';
+                    }
+                    str += '';
+                }
                 str += '';
             }
         }

注意事項:
  • 本来,EPGには,ジャンルを3セット(4セット?)まで設定出来ますが,この処理では,一つ目のジャンル(genre1,2)だけ,表示する様にしています。
  • ジャンルを正しく設定していない番組があります。
    その場合は,ジャンル表示が,おかしな事になるかもしれません。
  • 本パッチは,EPGStation v1用です。
    v2系で試したい場合,EPGStation/src/model/api/iptv/IPTVApiModel.ts 辺りを弄ってみて下さい。
  • 一部のサブジャンルは,修正を入れてます。
    表現が冗長なもの,例えば「国内ドラマ」→「国内」など。 表示は「ドラマ(国内)」となります。

TypeScript,初めて触りました(笑
正直,誰得?ネタですが,うまく表示できてスッキリです(笑
折角動いたのなら『GitHubでPRとかしないの?』って話も… ですが,ニーズ無さそうなので… しません(笑



コメント(0) 
共通テーマ:趣味・カルチャー

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。