Archive for 4月, 2011
4月 25th, 2011 by owatanabe
podcastの自動取得にはもっと楽な方法があるのだと思うが、ちょっと探して出てきた中ではなかなか良い方法が見つからなかったのでじたばたしてみた。
自分でコードを書かなくても、例えば castget を使えば通常は大丈夫だ。.castgetrc に、ほんの少し設定すればファイルをダウンロードしてくれる。少なくとも キラ☆キラは大丈夫だ。ところがゴールデンラジオだと表示用のjpegファイルしかダウンロードしてくれなかった。また、wgetと異なり、タイムスタンプを保存してくれないので、再生するMP3プレイヤーによっては若干不便である。
他に YouTube 用の youtube_dl という便利ツールもあった。今のところ出番はそれほど無いが、そのうち使い道が分かるかもしれない。
これらのツールは cron で自動起動して、取得したデータをサーバに保存しておく。保存ディレクトリを samba で参照できるようにすれば、出がけに MP3 プレーヤーに簡単に転送できる。USBメモリ状のプレイヤーなら、サーバにコンソールをつけておいて、直接送り込んでも良い。
次の課題はファイルの整理だ。昔のラジオ番組などとあわせてうまく整理する方法を考えている。
4月 25th, 2011 by owatanabe
Windows Media ファイルが取れない。というより asx ファイルを上手く開けない。
先のスクリプトでは、やはり simplexml_load_file 関数でエラーになる。特定のエレメントで読み込みエラーになる。ググってみると、SimpleXML は Shift-JIS に弱いようだ。 良く見ると該当 asx ファイルには文字コードの記述がなく、日本語は Shift_JIS で書いてある。
php実行時の内部文字コードはUTF-8にしてあると思うが、念のため UTF-8 に設定し、asx ファイルは取込後に UTF-8 に変更してから SimpleXML にかけるようにしてみる。
が、やはり上手く行かない。値にエスケープされていない & があるせいらしい。ad-hoc に & を & に置換して試してみたら、やっと上手く行った。
他にも若干考慮することがあって、最終的に落ち着いたのはこういうスクリプトである。
<?php
if($argc <= 1) {
exit(1);
}
$fRename = false;
if($argc > 2) {
if(strncasecmp("ren", $argv[2], 3) == 0) {
$fRename = true;
}
}
ini_set("user_agent","Mozilla/2.0 (compatible; get-mbs.php)");
date_default_timezone_set("Asia/Tokyo");
$file = file_get_contents($argv[1]);
if(!$file) {
exit(2);
}
$file1 = mb_convert_encoding($file, "UTF-8", "Shift_JIS");
$file = str_replace("&", "&", $file1);
$xml = simplexml_load_string($file);
if(!$xml) {
exit(3);
}
$result = $xml->xpath('/ASX/Entry/Ref');
$cmd = "/usr/local/bin/mimms -r -q -b 131072 ";
$dts = date("Ymd");
foreach($result as $elm) {
if(is_null($elm["href"])) {
continue;
}
$dirs = explode("/", $elm["href"]);
if(is_null($dirs)) {
continue;
}
$n = count($dirs);
$basename = $dirs[$n-1];
$filename = $dts . $basename;
if(file_exists($basename)) {
if($fRename && file_exists($filename)) {
unlink($filename);
}
}
else if($fRename && file_exists($filename)) {
rename($filename, $basename);
}
exec($cmd . $elm["href"]);
if($fRename && file_exists($basename)) {
rename($basename, $filename);
}
//print $cmd . $elm["href"];
//print "\n" . $filename . "\n";
}
exit(0);
?>
こんな感じで実行すると .wma ファイルとしてダウンロードしてくれるようになった。
php get-mbs.php http://mbs.co.jp/radio_bar/asx/arigatou/arigatou_intro.asx
これで聴くラジオには困らないだろう。むしろ聴く時間が足りなくなるかもしれない。
4月 25th, 2011 by owatanabe
「ありがとう浜村淳です」は毎日更新されるので、これこそ毎日サーバで自動的にダウンロードしたい。ところが Windows Media なので、便利ツールは大抵 Windows で手動取得である。なんとかFreeBSDでダウンロードできないだろうか。ということで探してみると mimms という大変便利なツールの有ることがわかった。早速導入。
portinstall multimedia/mimms
試しにPR音声を取得してみたい。使い方は? …
$ mimms --help
Usage: mimms [options] [filename]
mimms is an mms (e.g. mms://) stream downloader
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-c, --clobber automatically overwrite an existing file
-r, --resume attempt to resume a partially downloaded stream
-b BANDWIDTH, --bandwidth=BANDWIDTH
the desired bandwidth for stream selection in
BANDWIDTH bytes/s
-t TIME, --time=TIME stop downloading after TIME minutes
-v, --verbose print verbose debug messages to stderr
-q, --quiet don't print progress messages to stdout
実は元々、mms: って何?状態だった。知っているURIは http: で始まって asx で終わるのだ。そこで asx ファイルの中身を見てみると、XMLっぽいテキストファイル。この中に mms: で始まる URI 発見。なるほどそれでツールの名称にも mms が含まれるのだと納得。試しにその URI を指定して実行したら、時間はかかるけれどもファイルは取得できた。
mimms mms://mbs.sswmt1.smartstream.ne.jp/mbs/arigatou/ari_intro.wma
ディレクトリを掘ったりはしないらしい。
というわけで、この mimms を呼び出すスクリプトを、podcast用のを改造して書いてみた。
<?php
// 起動パラメータがなければ異常終了
if($argc <= 1) {
exit(1);
}
// 適当なUser-Agentを設定
ini_set("user_agent","Mozilla/2.0 (compatible; get-mbs.php)");
// 指定されたパラメーターをXMLだと思って開く
$file = simplexml_load_file($argv[1]);
// falseが返ってきたら異常終了。
if(!$file) {
exit(2);
}
// 直接欲しいエレメントを取ってくる。SimpleXMLは便利。
$result = $file->xpath('/ASX/Entry/Ref');
foreach($result as $elm) {
if(is_null($elm["href"])) {
continue;
}
// URIっぽいものを指定して mimms で取得
$cmd = "/usr/local/bin/mimms -r -q -b 131072 ";
//print $cmd . $elm["href"] . "\n";
exec($cmd . $elm["href"]);
}
exit(0);
?>
これでどうかな、と実行してみたら、やっぱり上手く行かない。がっくし。URIを直接指定して mimms 起動だと上手く行くのだが。
4月 25th, 2011 by owatanabe
せっかく自動取得できると思ったら、サーバ上では上手く動かない。困った。
エラーには’simplexml_load_file’という関数はない、と書いてある。CentOS5.6にはphp53パッケージをベースに関連パッケージを色々入れているのだが、FreeBSDの方にはphp5本体とDBモジュールだけしか入れていないのではなかったか。portsから入れた時に確かに設定項目が少ない気はしてはいた。
php -info
にて表示させてみると、FreeBSD側にはそもそも SimpleXML と出てこない。CentOS5.6の方では出る。
というわけで話は簡単。探してみた。textproc/php5-simplexml というパッケージがあって、導入されていない。
早速導入する。
portinstall php5-simplexml
試してみるとちゃんと動作した。これでキラ☆キラが電車の中でも良い音で聴ける。ついでにゴールデンラジオも聴ける。めでたしめでたし。
ここまで出来たら欲が出てきた。radiko登場以前によく聴いていた「ありがとう浜村淳です」も聴きたい。「ありがとう浜村淳です」は基本当日のみ公開で翌日消されてしまうが自動取得しておけば聞き逃しもなくなる。何とかならないだろうか。
4月 25th, 2011 by owatanabe
おそらく世間では iTunes で自動取得しているのだと思うが、私としては最近あまり役に立っていないサーバに仕事させたいので、取得スクリプトを書くことにした。
とりあえずお手軽にPHPで。
ざっと調べてみると、podcastのフィードを拾って音声または動画ファイルを普通にHTTP で取り込めば良いらしい。そこで
- URI決め打ちでフィード取得
- メディアだけをダウンロード
というPHPスクリプトを書く。
まずは開発用のCentOS5.6環境で次のようなスクリプトが動作することをまずは確認する(した)。
<?php
// パラメーターがなければ異常終了
if($argc <= 1) {
exit(1);
}
// それらしいUser-Agetに設定
ini_set("user_agent","Mozilla/2.0 (compatible; get-cast.php)");
// 指定されたパラメーターをXMLだと思って開く
$xml = simplexml_load_file($argv[1]);
// 失敗したら異常終了
if(!$xml) {
exit(2);
}
// 直接欲しいエレメントを取ってくる。SimpleXMLは便利。
$result = $xml->xpath('/rss/channel/item/enclosure');
foreach($result as $elm) {
if(is_null($elm["type"])) {
continue;
}
if(is_null($elm["url"])) {
continue;
}
// メディアファイルがあれば
if( (strncasecmp($elm["type"], "audio", 5) == 0)
|| (strncasecmp($elm["type"], "video", 5) == 0) ) {
// wgetコマンドでダウンロードする
$cmd = "/usr/bin/wget -q -c -nd ";
//print $cmd . $elm["url"];
exec($cmd . $elm["url"]);
}
}
exit(0);
?>
上のスクリプトを呼び出すシェルスクリプトを書く。指定ディレクトリに変更してファイルをがばっと取ってくるようにする。例は自分ちでキラキラのpodcastを定期取得する場合のもの。ファイルが存在するとダウンロードしないで終了してしまう(wgetの起動オプション参照)ので毎日実行しても大丈夫。
#!/bin/sh -
#
HOMEDIR=/home/myhome
PHPCMD="/usr/local/bin/php ${HOMEDIR}/get-cast.php"
# kirakira
cd ${HOMEDIR}/Kirakira
${PHPCMD} http://www.tbsradio.jp/kirakira/index.xml
cronに登録する。
$ crontab -l
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
#
#minute hour mday month wday command
55 3 * * 2-6 /bin/sh /home/myhome/get-cast.sh
これで、寝ている間にダウンロード完了だ。設置先のサーバはFreeBSD8.2なのでwgetのパスなどを軽く修正。その後、シェルスクリプトの方を実行してみた。
が、なんと、上手く行かない。困った。
4月 9th, 2011 by owatanabe
WordPress3.1がphp5.2未満に対応しないということで当サイトはアップデートを見合わせていた。自前ビルドや自前パッケージの作成は最近では荷が重く感じていて、CentOSが6になるまで待つかいっそUbuntuにするか悩んでいたのだ。
さて、今日CentOS5.6公開のアナウンスがあり、とりあえず一カ所アップデートしてみたら5.5からはあっさり完了。落ち着いたところでphpに関連するパッケージをみてみるとphp53というパッケージが並んでいる。これを使わない手はないので総入れ替えしてみた。手順は簡単で、yumで導入済みのphp-*のモジュールを一覧を出し、該当のものに相当するパッケージをphp53-*にする。手順としては次の通り。
1.httpdを止める。
service httpd stop
2.phpパッケージを消す。このサイトではこういう感じだった。
yum remove php php-cli php-common php-devel php-mbstring php-mysql php-pdo
このときphp-pearも削除されてしまうので注意。
3.php53パッケージに入れ替える。一緒にphp-pearも再導入。
yum install php53 php53-cli php53-common php53-devel php53-mbstring php53-mysql php53-pdo php-pear
4. httpdをあげる。
service httpd start
この後Wordpressを3.0から3.1に注意深く更新(ここのサイトではほとんど吊しの状態で使っているので自動アップデート)。
今のところ問題はない。