podcastの自動取得(4)

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("&", "&amp;", $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

これで聴くラジオには困らないだろう。むしろ聴く時間が足りなくなるかもしれない。

 

投稿日:
カテゴリー: 未分類