podcastの自動取得(5)

podcastの自動取得にはもっと楽な方法があるのだと思うが、ちょっと探して出てきた中ではなかなか良い方法が見つからなかったのでじたばたしてみた。

自分でコードを書かなくても、例えば castget を使えば通常は大丈夫だ。.castgetrc に、ほんの少し設定すればファイルをダウンロードしてくれる。少なくとも キラ☆キラは大丈夫だ。ところがゴールデンラジオだと表示用のjpegファイルしかダウンロードしてくれなかった。また、wgetと異なり、タイムスタンプを保存してくれないので、再生するMP3プレイヤーによっては若干不便である。

他に YouTube 用の youtube_dl という便利ツールもあった。今のところ出番はそれほど無いが、そのうち使い道が分かるかもしれない。

これらのツールは cron で自動起動して、取得したデータをサーバに保存しておく。保存ディレクトリを samba で参照できるようにすれば、出がけに MP3 プレーヤーに簡単に転送できる。USBメモリ状のプレイヤーなら、サーバにコンソールをつけておいて、直接送り込んでも良い。

次の課題はファイルの整理だ。昔のラジオ番組などとあわせてうまく整理する方法を考えている。

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

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

 

podcastの自動取得(3)

「ありがとう浜村淳です」は毎日更新されるので、これこそ毎日サーバで自動的にダウンロードしたい。ところが 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 起動だと上手く行くのだが。

podcastの自動取得(2)

せっかく自動取得できると思ったら、サーバ上では上手く動かない。困った。

エラーには’simplexml_load_file’という関数はない、と書いてある。CentOS5.6にはphp53パッケージをベースに関連パッケージを色々入れているのだが、FreeBSDの方にはphp5本体とDBモジュールだけしか入れていないのではなかったか。portsから入れた時に確かに設定項目が少ない気はしてはいた。

php -info

にて表示させてみると、FreeBSD側にはそもそも SimpleXML と出てこない。CentOS5.6の方では出る。
というわけで話は簡単。探してみた。textproc/php5-simplexml というパッケージがあって、導入されていない。
早速導入する。

portinstall php5-simplexml

試してみるとちゃんと動作した。これでキラ☆キラが電車の中でも良い音で聴ける。ついでにゴールデンラジオも聴ける。めでたしめでたし。

ここまで出来たら欲が出てきた。radiko登場以前によく聴いていた「ありがとう浜村淳です」も聴きたい。「ありがとう浜村淳です」は基本当日のみ公開で翌日消されてしまうが自動取得しておけば聞き逃しもなくなる。何とかならないだろうか。

podcastの自動取得(1)

おそらく世間では iTunes で自動取得しているのだと思うが、私としては最近あまり役に立っていないサーバに仕事させたいので、取得スクリプトを書くことにした。

とりあえずお手軽にPHPで。

ざっと調べてみると、podcastのフィードを拾って音声または動画ファイルを普通にHTTP で取り込めば良いらしい。そこで

  1. URI決め打ちでフィード取得
  2. メディアだけをダウンロード

という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のパスなどを軽く修正。その後、シェルスクリプトの方を実行してみた。

が、なんと、上手く行かない。困った。

ようやくWordPress3.1を入れられた

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に注意深く更新(ここのサイトではほとんど吊しの状態で使っているので自動アップデート)。

今のところ問題はない。

W-Zero3の使い道

残念ながら完全出稼ぎモードで仕事をしなければならなくなった。

電子メールは携帯に転送しているが添付付きなどが来るとどうにもならない。そこで、そろそろ引退させようと思っていたサイボウズをまたぞろ引っ張り出してきた。さすがにバージョンアップして最新版にするつもりはない。サイボウズには普通にパソコンでアクセスできるが、外出先ではスマートフォンが欲しい。

幸いW-Zero3 Advanced/ES ならある。近頃は、短距離移動時はちーたんでtwitter、長距離移動時はパソコンのモデムとしての出番しかなくなっている。ちーたんを入れるためにOperaをアンインストールしてあり、ある意味抜け殻状態である。事情が事情なので新しいスマートフォンを入手している場合でもない。何とかスマートフォンとして利用できないものだろうかと少々じたばたしてみた。

以下本題である。

自分の用途には次の方法で何とかなりそうである。

  1. Operaは、純正(?)の8.7とOperaMini5.1の両方を使う
  2. メールはWebメールだけにして、W-Zero3メールは極力使わない。
  3. 余裕が出来たら有償のツールでタブレットも繋ぐ。

まずはWebブラウザである。

Operaのサイズが大きく、Twetterクライアントとしても今ひとつなので削していた。今回はまずサイズの小さいOperaMini5.1を導入した。これは快適である。勢い付けてスクロールできるようになったのと画面サイズがやや大きく使えるのが良い。他のアプリケーションへの切り替えがとても難しいのが欠点だが、Webだけで完結させるつもりなので問題はない。

ところが、ウィルコムの公式メニューにはアクセスできないようだ。タイムアウトになってしまう。他にもAdvanced/ESではW+Infoというサービスが利用できるはずなのだが、Operaをアンインストールすると消えてしまう。

そこでOpera Mobile 8.7を復活させた。もっと新しい版も存在しているのだが、やはり公式メニューにアクセスできないので専用の8.7を入れる。どうせ普段はOperaMiniだけを使うので問題はない。両方同時にインストールしておいても大丈夫だし、同時に起動してもやはり問題無いようだ。

OperaMiniと違ってOperaMobileはサイズが大きい。なぜか本体メモリが一杯で入れられなかったのだが、その理由の半分はメールをため込んでいたせいだった。メールはPHSにも転送するのだが、手入れをしていないのでため込み放題になっていた。全部削除して、転送も止めた。残りの半分は以前ダウンロードしたインストーラー。これで8.7を復活させることができた。公式メニューにもアクセスできる。

久々に公式メニューにアクセスしたのでコンテンツを見て回ったところ、W-Zero3と他の無線LANの機器をAd-hocモードで接続してインターネットに出て行けるツールが有償で存在していた。お試しで一ヶ月程使えることになっている。これに対応できるタブレットがあれば検討してみたい(パソコンはW-SIM抜いて使えば良いので対象外だ)。

これで必要最低限の装備は揃った。flashに対応していないのでradikoが聴けないが、そこはしばらく我慢しよう。普段聴いている番組のほとんどにはpodcastがあるので聴けなくなるわけでもない。

podcastは別のコンピュータで寝ている間にダウンロードすることにした。それについては別エントリーで。

XBeeのアンテナ

前の仕事でXBeeを試していた。

ちょっとしたメッセージを送るのに便利なので提案したのだが、実際に設置したら電波が届かない事があるという。

設置場所は地上と、そこから上100m前後。試しに同程度のビルの上と下でXBee-PROでレンジテストしてみたところ、特に問題は無さそうだった。この時は、ビルの上ではXBeeのループバックを手で持ち、下からはパソコンでX-CTUでチェックだったと思う。ところが実際に設置して上下で試すと30mも届かないという。違いはアンテナがチップアンテナからダイポールアンテナに変わったことと、手持ちではなく、あるところに固定で設置された事だ。

代替品を求めて他の製品のメーカーに訊ねたり、電波に詳しい代理店の方に伺ったりしたところ、次のような原因が考えられるとのこと。

  1. マルチパスがあるのではないか。
  2. ダイポールアンテナでは指向性がおおむねドーナツ型になるので、上下の配置では両方とも穴にあたり、電波が非常に弱くなっているのではないか。
  3. そもそもホイップアンテナやダイポールアンテナでは片一方に地面があることを仮定している。上の方に設置したXBeeでは地面がないのでアンテナとして機能していないのではないか。

その後深くは追っていないが、twitterで距離が出なくて困っている方をお見かけした。私だけがこういう現象に遭遇しているのではなさそうだ。

なお、地面がないので上手く動作しない場合の対策として、18cm程度の長さ(2.4GHzの波長に相当)の金属板を指向性の軸に対して下にしたら、もしかしたら上手く行くかも、というアドバイスを得た。試せていないのであくまでメモとして記述しておきたい。

さらについでに、アンテナ毎の指向性についての説明と実測値については次の文書が参考になる。

XST-AN019a_XBeeAntennas.pdf

twitterのプラグインを追加してみた

長らくtwitterばかりに投稿していたが、仕事の内容が変わるので、当サイトの内容を修正した。

ついでにtwitterの投稿を表示するプラグインを追加した。WordPressのプラグイン追加は非常に簡単である。欲しいプラグインを名前で検索して選べば良い。

今回はTwitter Goodiesというプラグインを入れてみた。どんなもんだろうか。

手抜き水出しコーヒーの作り方

ためしてガッテン流パック麦茶の出し方をみて、コーヒーに適用してみた。

  • 用意するもの

茶パック。ジャスコで60枚入り126円のTOPVALUブランドのもの
500ml位入る耐熱ガラスポット
ブルックスのブラジル豆。挽きを買っても良いが、豆で購入して粗挽きにするとなお可。

  1. 茶パックにコーヒーをぱっつんぱっつんに入れる。
  2. 熱湯で1分蒸らす
  3. ガラスポットに水を入れ、蒸らしたコーヒー豆入り茶パックを浮かべる。
  4. ポットを冷蔵庫に入れ3時間以上、できれば6時間ほど待つ。
  5. 茶パックを取り出し、レンジで温めて飲む。

夏は暖めずにそのまま飲む事が多い。