以前こんな記事を書いた事がありました。
Big Sky :: ブラウザを全く使わずにustream.tvを楽しむ方法
映像/音声ですが、Linux版に用意されているスタンドアローン版flashplayerを使っています。ネット上にあるFLVもコマンドラインから起動して閲覧出来ます。
http://mattn.kaoriya.net/web/ustream/20071018005843.htm
その後、ustream.tvで何か変更があり、そのままでは使えなくなってしまったのですが、もういっかいチャレンジしたら見れる事が分かりました。
答えは簡単でobjectタグのパラメータ値を全て足せば再生出来るURLになるという事。
たとえばさっきまで見ていたVimMの動画。
<object
id="viewer"
name="viewer"
width="480"
height="386"
allowfullscreen="true"
codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
ここから
<param name="movie" value="http://cdn1.ustream.tv/swf/4/viewer.137.swf?varnish=true" />
<param name="flashvars" value="loc=/&cid=19118&channelid=19118&share=false&group=channel19118&imu=medrect&autoResize=false&localid=4398457344a3f82bac4140&varnish=true&vrsl=c.4.158&" />
ここまで
</object>
これを結合して出来上がったURLにflashplayerスタンドアローン版でアクセスすれば良いのです。
これをshellスクリプトにすると以下の様になりました。
GFLASHPLAYER=/usr/bin/flashplayer
if [ "x$1" == "x" ]; then
echo "usage: `basename $0` [channel]"
exit
fi
TMP=`mktemp /tmp/XXXXXX`
curl -s "http://www.ustream.tv/channel/$1" | grep "<param" > $TMP
URL=''
while read -r line; do
if [ ! -z $URL ]; then
URL="$URL&"
fi
URL="$URL`echo \"$line\" | sed 's/^.* value=\"\([^\"]\+\)\".*$/\1/'`"
done < $TMP
rm $TMP
if [ "x$URL" == "x" ]; then
echo "currently offline?"
exit
fi
echo playing $URL
$GFLASHPLAYER "$URL"
これでまたブラウザが楽になりました。
アナウンスしてなかったですが、先日書いた「
VimからFastLadderを扱えるスクリプトFastLadder.vim書いた。」ですが、
LivedoorReaderに対応させています。
let g:fastladder_server = 'http://reader.livedoor.com'
とvimrcに書いておくと
:FastLadder
でLivedoorReaderのフィードが見れます。
今後はFastLadderやLivedoorReaderの様にフォルダ単位の閲覧が出来る様に改良して行く予定です。
VCだとビルド出来るらしいけど、strawberry perlとかだとコンパイル出来ない。
まずCoro側のpatch。
diff -ur Coro-5.132.orig/Coro/libcoro/coro.c Coro-5.132/Coro/libcoro/coro.c
--- Coro-5.132.orig/Coro/libcoro/coro.c 2008-11-19 11:50:13.000000000 +0900
+++ Coro-5.132/Coro/libcoro/coro.c 2009-06-19 15:01:16.140625000 +0900
@@ -228,6 +228,9 @@
#if __CYGWIN__
ctx->env[7] = (long)((char *)sptr + ssize) - sizeof (long);
ctx->env[8] = (long)coro_init;
+ #elif defined(__MINGW32__)
+ ctx->env[4] = (int)((unsigned char *)sptr + ssize);
+ ctx->env[5] = (long)coro_init;
#elif defined(_M_IX86)
((_JUMP_BUFFER *)&ctx->env)->Eip = (long)coro_init;
((_JUMP_BUFFER *)&ctx->env)->Esp = (long)STACK_ADJUST_PTR (sptr, ssize) - sizeof (long);
mingw32のjumpbufは4番目がEipで5番目がEspだったはず。
一応手元で動いてます。
あとこのままでも駄目で、ExtUtils::MakeMakerがgccの時に付けてしまう--image-baseオプションがまずい。
アドレスの作り方が Coro::Event であれば Event という文字列に対して上位4バイト、下位4バイトで分けてunpackとかやってござる。
if ($GCC) {
my $dllname = $self->{BASEEXT} . "." . $self->{DLEXT};
$dllname =~ /(....)(.{0,4})/;
my $baseaddr = unpack("n", $1 ^ $2);
$otherldflags .= sprintf("-Wl,--image-base,0x%x0000 ", $baseaddr);
}
なので、Coro::Event が使っている Event というモジュールと --image-base がバッティングして起動時にメモリロケーション不正参照のエラーが起きる。
こちらについては、ExtUtils::MakeMakerに含まれる MM_Win32.pm を修正する。最近の gcc は勝手に --image-base 作ってくれるので、そちらに任せる。
--- MM_Win32.pm.orig 2009-06-22 17:48:43.906250000 +0900
+++ MM_Win32.pm 2009-06-22 17:49:05.703125000 +0900
@@ -307,12 +307,12 @@
# we try to overcome non-relocateable-DLL problems by generating
# a (hopefully unique) image-base from the dll's name
# -- BKS, 10-19-1999
- if ($GCC) {
- my $dllname = $self->{BASEEXT} . "." . $self->{DLEXT};
- $dllname =~ /(....)(.{0,4})/;
- my $baseaddr = unpack("n", $1 ^ $2);
- $otherldflags .= sprintf("-Wl,--image-base,0x%x0000 ", $baseaddr);
- }
+# if ($GCC) {
+# my $dllname = $self->{BASEEXT} . "." . $self->{DLEXT};
+# $dllname =~ /(....)(.{0,4})/;
+# my $baseaddr = unpack("n", $1 ^ $2);
+# $otherldflags .= sprintf("-Wl,--image-base,0x%x0000 ", $baseaddr);
+# }
push(@m,'
# This section creates the dynamically loadable $(INST_DYNAMIC)
SYNOPSISの例でもちゃんと動きます。
あとはバグ報告から上手く修正されれば...