おれおれDLNAサーバその3

Kodiのコンテンツ一覧表示で、すべて1905/06/06になって日付ソートが効かないの、xmbcのソース追いかけてようやく直った。これでひとまず常用できそう。トリックプレイしまくると再生位置表示がおかしくなるのはまあ、しまくらなければいいや。

で原因は日付フォーマットでした。さもありなん。

2018-09-27T00:59:25

はダメで、

2018-09-27T00:59:25Z

ならOK。Braviaさんはそのへん融通が利いてたのね。。

おれおれDLNAサーバその2

5月にいじったおれおれサーバで、REGZAのメディアプレイヤーから見てたのだけど、1つ再生終わって停止するたびにTV画面まで戻っちゃって、またメディアプレイヤー起動>サーバ選択>タイトル選択>ファイル選択、とやるのに疲れた。。
再生停止でタイトル選択に戻るだろ普通。。もしかするとおれおれサーバが何らか期待値を返していないのかもしれんが、わからーん。
というわけで、FireTVにKodi入れてみたら、こいつがまた、これまでのサーバにない挙動をするので手間取ったけど、なんとか再生できるようになったー。

  • Kodi以外:browseでフォルダをリクエストしてきて、ファイルをHEAD/GETする
  • Kodi:フォルダと、その中のファイルをbrowseしてきて、ファイルをGETする

どうもSortCriteriaがおかしいのと、タイムスタンプをちゃんと拾ってくれないのはREGZAと同じ。これはこっちがおかしいんだろうなあ。たぶん。

recpt1更新その2

先週の続き。

BSの周波数変更を取り込んだrecpt1、チェックしたらいきなりひっかかった。NHKBSプレミアムが映らない。
ぐぐっても周波数変更後にトラブった話が出てこないので、おま環?と久しぶりにPT1/2とPT3のドライバソース読んだりしたけど、最終的にrecpt1だった。。

というか、わたしのせいです。ごめんなさい。元のLinux chardev版がioctl制御だったのを、なんとなくsysctl制御に変えたせい。recpt1のFreeBSDパッチを作られた方が対応されてたのだけど、ioctlの引数(struct FREQUENCY {int freqno, int slot})を、sysctlの引数(int)にそのまま渡してるので、slotが消えちゃう。

ただ、これだとBSプレミアムは移動前から映ってなかったはずや。。とりあえず貼っときます。

続きを読む

recpt1更新

FreeBSDでPT2/PT3を使う [努力したWiki] からいただいた、FreeBSD版recpt1 2017/05/14を使わせてもらってます。
そのベースのSTZ版
https://github.com/stz2012/recpt1 で対応されている周波数変更を取り込みたかったのだけど、毎度手パッチするの面倒なので、git環境を作っとこうかということでメモ。

$ git clone https://github.com/stz2012/recpt1.git
Cloning into 'recpt1'...
remote: Counting objects: 203, done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 203 (delta 9), reused 22 (delta 9), pack-reused 178
Receiving objects: 100% (203/203), 144.01 KiB | 556.00 KiB/s, done.
Resolving deltas: 100% (96/96), done.
$ cd recpt1

recpt1 2017/05/14は「Latest commit 00df64e への差分適用」だそうなので、FreeBSDブランチ作って、その状態を再現。

$ git checkout -b freebsd 00df64e
Switched to a new branch 'freebsd'
$ git branch
 * freebsd
  master
$ tar xzf ../../../work/recpt1/freebsd-019-recpt1_20170514.tar.gz
$ git status
On branch freebsd
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   recpt1/checksignal.c
        modified:   recpt1/pt1_dev.h
        modified:   recpt1/recpt1.c
        modified:   recpt1/recpt1core.c
        modified:   recpt1/recpt1core.h

no changes added to commit (use "git add" and/or "git commit -a")
$ git add -u
$ git commit -m 'apply freebsd patch'
[freebsd 9655703] apply freebsd patch
 5 files changed, 200 insertions(+), 90 deletions(-)

STZ版最新(本日時点で 36a3f40)を取り込み

$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: apply freebsd patch
Using index info to reconstruct a base tree...
M       recpt1/pt1_dev.h
M       recpt1/recpt1.c
M       recpt1/recpt1core.c
M       recpt1/recpt1core.h
.git/rebase-apply/patch:266: trailing whitespace.

warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging recpt1/recpt1core.h
Auto-merging recpt1/recpt1core.c
Auto-merging recpt1/recpt1.c
Auto-merging recpt1/pt1_dev.h

最後にbuild。gitになったのでversion.hで怒られなくなった。

$ ./autogen.sh
Generating configure script and Makefiles for recpt1.
Running aclocal ...
Running autoheader ...
Running autoconf ...
$ LDFLAGS=-L/usr/local/lib ./configure --enable-b25
checking for gcc... no
checking for cc... cc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether cc accepts -g... yes
checking for cc option to accept ISO C89... none needed
checking for create_arib_std_b25 in -larib25... yes
checking for log10 in -lm... yes
checking for pthread_kill in -lpthread... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: config.h is unchanged
$ gmake CPPFLAGS='-I../driver -I/usr/local/include' LDFLAGS=-L/usr/local/lib
revh="`git rev-list HEAD | wc -l 2> /dev/null`"; \
if [ -n "$revh" ] && [ "$revh" != "0" ] ; then \
        echo "const char *version = \"rev.$revh by stz2012\";" > version.h; \
else \
        echo "const char *version = \""c8688d7d6382_with_http_server_RC4 by stz2012"\";" > version.h; \
fi
cc -MM recpt1.c decoder.c mkpath.c tssplitter_lite.c recpt1core.c recpt1ctl.c recpt1core.c -I../driver -I/usr/local/include > .deps
cc -O2 -g -pthread -I../driver -I/usr/local/include  -c -o recpt1.o recpt1.c
cc -O2 -g -pthread -I../driver -I/usr/local/include  -c -o decoder.o decoder.c
cc -O2 -g -pthread -I../driver -I/usr/local/include  -c -o mkpath.o mkpath.c
cc -O2 -g -pthread -I../driver -I/usr/local/include  -c -o tssplitter_lite.o tssplitter_lite.c
cc -O2 -g -pthread -I../driver -I/usr/local/include  -c -o recpt1core.o recpt1core.c
cc -L/usr/local/lib -o recpt1 recpt1.o decoder.o mkpath.o tssplitter_lite.o recpt1core.o -lpthread -lm -larib25
cc -O2 -g -pthread -I../driver -I/usr/local/include  -c -o recpt1ctl.o recpt1ctl.c
recpt1ctl.c:86:43: warning: format specifies type 'int' but the argument has type 'key_t'
      (aka 'long') [-Wformat]
            fprintf(stderr, "Pid = %d\n", key);
                                   ~~     ^~~
                                   %ld
1 warning generated.
cc -L/usr/local/lib -o recpt1ctl recpt1ctl.o recpt1core.o -lm
cc -O2 -g -pthread -I../driver -I/usr/local/include  -c -o checksignal.o checksignal.c
cc -L/usr/local/lib -o checksignal checksignal.o recpt1core.o -lpthread -lm

おれおれDLNAサーバその2

うーん、細かいところがいろいろおかしい。

REGZA

突然browseで「コンテンツ情報取得中にエラーが発生しました」と出て、アクセスできなくなってしまった。メディアプレイヤーを起動するとM-SEARCHが飛んできて、機器選択はできるけど、選択してもMediaServerへのリクエストが飛んでこずに、いきなり上のエラー画面。

MediaServer側はちくちく変えてるけど、SSDPの内容は変えてなくて、なんでリクエストが飛んでこないのかわからん。。MiniSSDPDの再起動でもだめ。

エラーになる前は普通に、ブラッククローバーを観てたのだけど。次のを見ようとして止めたらおかしくなった。TVをリセットしないとだめかなあ。

VidON

ソート順を指定しても再リクエストが飛んでこないので、内部でリストをソートしてるっぽい。タイトル順はよさそうだが、日付順が効いてない。dc:dateの中身を間違ってるのか、dc:date以外の何かが要るのか?

おれおれDLNAサーバ

最後にcommitしたのが2016/9/10だったので、いじるの2年近くぶりかー。

ずーっとfoltia+PT2でTS録画、2018/01からはPT2をPT3に変えた。
これを観るのはBravia KDL-40ZX1で、ここに自家製DLNAサーバで配信。たまにKindleのVidON Player HDも使うけど、DLNAサーバは特にいじらなくても見えてた。

先日、REGZA 50Z810Xをお迎えしたので、こいつのメディアサーバからアクセスしてみると、「このコンテンツは再生できません」。。なにー。
というわけで、REGZAに対応してるというPMS for REGZAの通信を真似ながらいじって、ようやくうまくいった気がするのでメモ。

res@protocolInfo

BraviaとVidON

video/mpeg:DLNA.ORG_PN=MPEG_TS_HD_60_L2_ISO

REGZA

video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC

PMSはvideo/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA
なんてのも返してるけど、これが無くても見えてる。

おまけ

BraviaREGZAは1つのprotocolInfoにカンマ区切りで並べて書いてもOK、VidONは別のにしないとダメだった。

30秒スキップ

Bravia

res@protocolInfoでDNLA.ORG_OP=11;DLNA.ORG_FLAGS=61100000000000000000000000000000 として、さらにHEAD/GETのgetcontentFeatures.dlna.org: 1 に応じてcontentFeatures.dlna.org: DLNA.ORG_PN=MPEG_TS_HD_60_L2_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=61100000000000000000000000000000 を返してやると、再生中に上キーが押せるようになる。

押すと、GETでTimeSeekRange.dlna.org: npt=30.773- みたいなのが飛んでくるので、これに合わせて30.773秒あたりからのデータを返してやればOK。

REGZA

Braviaと同じres@protocolInfoを返しても、TimeSeekRange.dlna.orgじゃなくRangeリクエストで来る。getcontentFeatures.dlna.org: 1は付いてない。まあこっちのほうが簡単なのでOK。

VidON

30秒スキップがないのでシークバーの適当なところをtapすると、GETアクセスは来るけどRangeの値がおかしい。その通りのデータを返すと、以降の再生が壊れる。
bitrateからbyte rangeの計算するとこがoverflowしてるんじゃないかなあ。TimeSeekでくればいいのに。

ソート

これがいけてない。。

Bravia

SortCriteriaを -dc:date みたいに指定してくるので、結果をソートして返してやればOK。

REGZAとVidON

SortCriteriaが空で、日付ソートして返しても表示はばらばらになる。。見づらい。。

そのほか

Bravia

コンテンツを選択するたびにHEADが1回、GETが2回飛んでくる。HEADはともかく、30分で4GB近くなるファイルを2つ開かなくてもよかろうに。。

REGZA

HEADの代わりに先頭1443040byteのRange付きGET1つと、普通のGET2つが飛んでくる。
しかもタイトルをフォーカスすると画面左上に小さいサイズのpreviewが出るけど、ここについてもコンテンツアクセスが来るので、タイトル選択を上下に動かすたびにGETが3回くる。。

VidON

コンテンツ選択ごとにGET1回だけ。しかもKeep-Aliveでくる。エコだ。

サーバ更新その3

foltiaのインストール先/home/foltiaはまるごとrestoreしたけど、周りがいろいろ足りてない。。次にやるときのメモ。

pkg

# pkg install apache24 php72 php72-extensions mod_php72 
# pkg install ja-p5-jcode p5-dbd-sqlite p5-schedule-at p5-libwww

smartyは、php56と紐づいちゃってたので、portsからインストール。

# cd /usr/ports/www/smarty ; make install

epgdump

# pkg install cmake

$ git clone https://github.com/Piro77/epgdump.git
$ cd epgdump
$ cmake .
$ gmake

mediainfo

なぜかpkg/portsは、MediaInfoDLL_Static.hをインストールしてくれないので、手で叩く。

# cd /usr/ports/multimedia/libmediainfo
# make
# cd work/MediaInfo_CLI_GNU_FromSource/MediaInfoLib/Project/GNU/Library
# game install
# cd /usr/ports/multimedia/libmediainfo
# make install

at

起動間隔を1分ごとに

# vi /etc/crontab

*/1     *       *       *       *       root    /usr/libexec/at-run