ubuntu20.04上のEPGStationでNicojCatchを使う

NicojCatchはEDCBの予約からNicoJK用のログを取得するソフトです。EPGStationの予約更新に合わせてEDCBの予約ファイルを作るスクリプトを作りました。

NicojCatchの動作用にwineを使います。スクリプト用にPython3,nkfを使います

 

 

手順

・Wine 32bit、python3, nkfを入れます

   wine32を入れる
   wine32配下のアプリを32bit設定する
   winecfgで日本語対応フォントを入れる
   .net45を入れる

・NicoJCatchを入れます

<例> 

wineの設定で/home/share/がJ:ドライブとなるよう設定します

/home/share/nicoディレクトリを作り、中に以下のディレクトリを作ります

NicojCatch ..本体と設定ファイル格納先

Setting .. EDCB予約ファイル格納先

nicoJK .. nicoJKログ格納先

├── NicojCatch
│   ├── NicojCatch.exe
│   ├── NicojCatch.ini
│   ├── SuperSocket.ClientEngine.dll
│   ├── WebSocket4Net.dll
│   ├── ch_sid.txt
│   ├── jkl_on.txt
│   ├── official_jk.txt
│   └── readme.txt
├── Setting
│   └── Reserve.txt
├── nico.sh
├── nicoJK
├── nicojV2.py
└── nicojZ.py

 

NicojCatch.iniに下記のように設定します

 

; EDCBが生成するreserve.txtが存在するパス 例:"C:\Program Files\EpgDataCap_Bon\Setting\"
reservetxt_path = "J:\nico\Setting\"

; NicoJKのログが存在するパス 例:"C:\Program Files\TVTest\Plugins\NicoJK\"
nicojk_path = "J:\nico\nicoJK\"

 

※ログは別のwindowsPCから見えるようSAMBAを設定します

・予約ファイル作成スクリプトをEPGStationから見えるディレクトリに配置し、EPGStationのconfig.jsonを修正して予約更新と録画完了イベントで呼び出します


    "reservationAddedCommand": "/bin/bash /home/share/nico/nico.sh",
    "recordedEndCommand": "/bin/bash /home/share/nico/nico.sh",

 

シェルスクリプトnico.shの中身


#!/bin/bash
EDCB=/home/share/nico/Setting
CWD=$(cd $(dirname $0); pwd)

rm -f /tmp/reserve.tmp /tmp/Reserve.txt
python3 "$CWD"/nicojZ.py > /tmp/reserve.tmp
# UTF-8 -> UTF-8 with BOM, CRLF
nkf -w8 -c /tmp/reserve.tmp > /tmp/Reserve.txt
chmod 666 /tmp/Reserve.txt
mv -f /tmp/Reserve.txt "$EDCB"
rm -rf /tmp/reserve.tmp /tmp/Reserve.txt

 

変数EDCBには予約ファイル格納ディレクトリをセットします。スクリプト中ではpythonスクリプトを呼び出した後改行コードをWindows用に変換しています

 

pythonスクリプト EPGStation v1用(nicojZ.pyとします)


#!/usr/bin/env/python3
import sys
import json
import datetime
import requests
import codecs
#nicojZ.py
#EPGstationの予約更新時にEDCB形式Reserve.txtを更新する
#局名、TSIDなどはダミー

#######################################
# 予約1件分を変換する関数
#######################################
def mkLine(pg):
 stt = pg["startAt"]
 edt = pg["endAt"]
 dt =  datetime.datetime.fromtimestamp(stt//1000)
 ed =  datetime.datetime.fromtimestamp(edt//1000)
 sdate = '%d/%02d/%02d' %(dt.year,dt.month,dt.day)
 stime = '%02d:%02d:%02d'%(dt.hour,dt.minute,dt.second)

#開始日時
 rval = '%s\t%s\t' %(sdate, stime)
 pl = ed - dt
#長さ
 rval += '%02d:%02d:%02d\t' %(pl.seconds//3600,(pl.seconds//60)%60,pl.seconds %60) 
 rval += '%s\t' % pg["name"]
 rval += 'dmyChname\t'
#ネットワークID,ダミーTSID,サービスID,イベントID
 rval += '%d\t%d\t%d\t%d\t' %(pg["networkId"],1234,pg["serviceId"],pg["eventId"])
#ダミーで予約後bat,録画ルールなど
 rval += '1\t1\t1111\t1\t0\tc:\hoge.bat\t0\tstdRule\t'
#開始マージン、終了マージン
 rval += '\t0\t0\t\t0\t30\t5\t48\t' 
#予約時点の開始日時
 rval += '%s\t%s\t' %(sdate, stime)
 rval += '0\t0\t0\t0\t0\t0\t'
 return rval

#######################
# EPGStationのWebAPI
API_URI = "http://192.168.xxx.xx:8888/api"

headers = {
    'accept': 'application/json',
}
response = requests.get(API_URI + '/reserves', headers=headers)
rdata = response.json()
data = rdata["reserves"]

for idx in data:
  line = mkLine(idx["program"])
  print(line)


EPGStation v2の場合はnicojV2.pyと置き換えてください


#!/usr/bin/env python3
import json
import datetime
import requests

#EPGstationの予約更新時にEDCB形式Reserve.txtを更新する
#EPGstation V2用
#局名、TSIDなどはダミー


#######################################
# 予約1件分を変換する関数
#######################################
def mkLine(pg):
 stt = pg["startAt"]
 edt = pg["endAt"]
 dt =  datetime.datetime.fromtimestamp(stt/1000)
 ed =  datetime.datetime.fromtimestamp(edt/1000)
 sdate = '%d/%02d/%02d' %(dt.year,dt.month,dt.day)
 stime = '%02d:%02d:%02d'%(dt.hour,dt.minute,dt.second)

#開始日時
 rval = '%s\t%s\t' %(sdate, stime)
 pl = ed - dt
#長さ
 rval += '%02d:%02d:%02d	' %(pl.seconds//3600,(pl.seconds//60)%60,pl.seconds %60) 
 rval += '%s\t' % pg["name"]
 rval += 'dmyChname\t'
#ネットワークID,ダミーTSID,サービスID,イベントID
 nid = pg["channelId"] // 100000
 sid = pg["channelId"] % 100000
 eid = pg["programId"] % 100000
 rval += '%d\t%d\t%d\t%d\t' %(nid,1234,sid,eid)
#ダミーで予約後bat,録画ルールなど
 rval += '1\t1\t1111\t1\t0\tc:\hoge.bat\t0\tstdRule\t'
#開始マージン、終了マージン
 rval += '\t0\t0\t\t0	30	5	48\t' 
#予約時点の開始日時
 rval += '%s\t%s\t' %(sdate, stime)
 rval += '0	0	0	0	0	0	'
 return rval

#######################
# EPGStationのWebAPI
API_URI = "http://192.168.xx.xx:8888/api"

# EPGStationの予約取得
headers = {
    'accept': 'application/json',
}
#v2
response = requests.get(API_URI + '/reserves?offset=0&type=normal&isHalfWidth=false', headers=headers)
rdata = response.json()
data = rdata["reserves"]

for idx in data:
   line = mkLine(idx)
   print(line)

  

・録画PCの起動時にNicoJCatchが起動するようにします

  起動時にログインするようにした上で、~/.config/autostart/wine.desktopで自動起動しています

 

[Desktop Entry]
Type=Application
Exec=wine /home/share/nico/NicojCatch/NicojCatch.exe
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[ja_JP]=NicojCatch
Name=NicojCatch
Comment[ja_JP]=
Comment=

参考
Fushihara’s blog
EDCBのテキストファイルのフォーマットのメモ
https://fushihara.hatenadiary.jp/entry/2018/01/02/034508