ガラポンTVの録画済み動画を視聴中にtcpdumpとrtmpdumpで自動的にイロイロやるテスト
こういう記事を見つけたので、tcpdump の結果を perl のスクリプトに食わせれば自動で rtmpdump できるんじゃないかと思って試してみたら一応動くものができたので忘備録として記す。
自分の動作確認は macOS Sierra でしか行っていないので、他の環境のことは分かりません。またこのスクリプトについての動作を保証するものでもないので、自己責任でどうぞ。
ちなみにガラポンTVというのは、地上デジタル放送を最大で同時8チャンネルまで全部録画できるレコーダーで、2TB程度のHDDを使えばだいたい3ヶ月分くらいの番組を全部録画してくれるシロモノです。
実行例
sudo tcpdump -A -s 0 'host [ガラポンTVのIPアドレス] and tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | ./test.pl
macOS で上記の処理を実行しておくと、あとは適当なブラウザでガラポンTV端末自体に接続して番組視聴するか、またはガラポンTVサイトで動画視聴するだけで、裏で rtmpdump が自動的に起動するはず。使用するコマンド自体は汎用的なものだから Debian/Ubuntu/CentOS でもイケるだろうし、あるいは Windows10 上の Ubuntu on Windows でも動くとは思う。
そして上記のコマンドのうち test.pl というのは以下のスクリプトです。rtmpdump は apt-get などで別途インストールしておく必要があります。
perl のスクリプト
最低限のコメントは入っているので、解説は特に不要ですよね。ただしいくつかの箇所は初期値を入れておく必要があることに注意が必要です。
#!/usr/bin/perl use strict; use warnings; $| = 1; # garapon_deviceid はTVサイトとの通信から取れるけど、、 # 端末に直接ログインした場合に取得できるかどうかは未検証。 my $garapon_deviceid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-n"; # ここは初期値を正しく設定せねばならない。 my $garapon_host = "192.168.254.1"; my $moviepath = "~/Garapon"; # これは通信中の内容から自動的に取得決定する値。 my $garapon_gtvid = ""; my $garapon_authkey = ""; my $garapon_rtmp_cmd = ""; my $garapon_sessionid=""; while( <STDIN> ) { if ( $_ =~ /V([A-Z0-9]{18})-([A-Za-z0-9]{32})-([A-Za-z0-9]{32})-([A-Za-z0-9])/ ) { # garapon.tv サイトへのアクセスからイロイロ取得する。 $garapon_gtvid=$1; $garapon_authkey=$2; $garapon_deviceid="$3-$4"; $garapon_sessionid="$garapon_gtvid-$garapon_authkey-$garapon_deviceid"; } elsif ( $_ =~ /gtvid=([A-Za-z0-9]{18})/ ) { # ガラポンに直接ログインしているときの取得方法 $garapon_gtvid=$1; print "garapon_gtvid=$garapon_gtvid\n"; } elsif ( $_ =~ /GaraponAuthKey=([A-Za-z0-9]{32})/ ) { # ガラポンに直接ログインしているときの取得方法 $garapon_authkey=$1; print "garapon_authkey=$garapon_authkey\n"; } if ( $_ =~ /GET \/viewer\/player\.garapon/ ) { if ( length($garapon_gtvid) > 0 && length($garapon_authkey) > 0 && length($garapon_deviceid) > 0 ) { $garapon_sessionid="$garapon_gtvid-$garapon_authkey-$garapon_deviceid"; } } # gtvid, authkey, deviceid が揃っていたら、メインの処理を行う if ( length($garapon_sessionid) > 0 ) { my $moviefile = "$moviepath/$garapon_gtvid.flv"; # ファイルがない場合は rtmpdump を実行してファイルを取得する if ( ! -f $moviefile ) { $garapon_rtmp_cmd="rtmpdump -n $garapon_host -l 0 -y '$garapon_sessionid' -o '$moviefile'"; print "$garapon_rtmp_cmd\n"; system( "$garapon_rtmp_cmd &" ); # 同じファイルに対する多重処理発生防止のための時間調整 sleep 5; } else { print "$moviefile is exist.\n"; } # セッション情報(番組情報)を空にする。 $garapon_sessionid=""; } }