hoge diary - March 12, 2007

[雑記] Pitchfork を試す

出先で好きな曲をいつでも再生できるように,ということで,Icecast+MPD+Pitchfork を導入しました.

Icecast と MPD の導入手順は他のサイトに任せてここでは省略します.ただし,Pitchfork だけは多少手を加えましたので,説明します.

手を加えるのは basename 関数の置き換えです.既にご存知の方もいらっしゃるでしょうが,PHP の basename 関数には,ファイル名の先頭が 8 ビットの文字の場合に誤動作する問題 (PHP Bugs: #29542)があります.

PHP Bugs: #29542 のレスポンスによれば,PHP 5.0.1 では修正されていたということらしいのですが,私の環境 (PHP 5.1.6) で,以下の PHP ファイル (ファイルのエンコーディングは EUC-JP) を使って実際に試してみると,ファイル名の先頭が 8 ビット文字の場合に正しく動作しませんでした.

<?php
  echo basename("dir/theファイル.txt");  echo <br>;    // 結果: theファイル.txt (正しい)
  echo basename("dir/ファイル1.txt");    echo <br>;    // 結果: 1.txt (間違い)
  echo basename("dir/ファイル.txt");     echo <br>;    // 結果: .txt (間違い)
  echo basename("dir/file.txt");                        // 結果: file.txt (正しい)
?>

類似した別のバグ報告 (PHP Bugs #37738) によれば,Won't fix in PHP 5. This will be implemented for PHP 6. ということですので,私は以下のように,strrpos による basename の代替関数を適当に作りました.

function basename2($filename) {
  $pos = @strrpos($filename, "/");
  if ($pos === false)
    return $filename;
  return @substr($filename, $pos + 1);
}

あとは Pitchfork/player/metadata.phpPitchfork/player/metadata_cover.php 内の basename() を basename2() の呼び出しに置き換えればとりあえず動きました.

コメント

名前(何でも可):

テキスト(http:// を含む内容は投稿できません):

トラックバック

トラックバック URI: https://www.pakunet.jp/hoge/trackback/2007031201

トラックバックはありません.


Valid XHTML 1.1! Valid CSS!
© 2004-2009 ぱくちゃん.
Last modified: Thu Nov 01 01:17:18 JST 2007