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
これで聴くラジオには困らないだろう。むしろ聴く時間が足りなくなるかもしれない。