PSPを使ってネットワーク経由で音楽を聴く

私はPSPで音楽を聴くことがあります。持ち運びに便利なので、寝るときとかに聞きます。しかし、大容量のメモリースティックを買うことが難しい(金銭的な面で!)私にとっては、メモリースティックの容量だけでは聞きたい曲が全部入りません!そこで、ネットワーク経由で聞こうと思ったのです。

調べてみたらあるんですね!PSPのRSSチャンネル機能を使って、iTunesのデータを聞くことができるというものが。
しかーし、iTunesの入っているパソコンは寝るときは切ってしまう。どうにかして、常時稼働しているサーバでできないものか、ということでPHPでちょっと作ってみたのが続きに。

どうせなら、音楽データのID3タグを読み込みたい、というか都合上ファイル名にマルチバイト文字を使用したくなかったので、日本語のタイトルを表示するにはID3タグを取得するしかなかったのですね。
ちょっと調べてみたら、getID3()というものがありました。というわけで今回はこれを使用します。

そして、完成したPHPソース。

<?php
define('DATA_DIR', 'data/');
define('GETID3_DIR', 'getid3/');
define('BASE_URI', 'http://'.$_SERVER["SERVER_NAME"].'/');
define('SCRIPT_NAME', 'MP3 RSS Server');

$list = $_GET['list'];
if ($list == '') {
  echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\" lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n<title>".SCRIPT_NAME."</title>\n</head>\n<body>\n<h1>".SCRIPT_NAME."</h1>\n<ul>\n";
  if ($handle = opendir(DATA_DIR)) {
    unset($files);
    while (false !== ($file = readdir($handle))) {
      if (ereg('[0-9a-zA-Z]*', $file)) {
        if (is_dir(DATA_DIR.$file) && ($file!=".") && ($file!="..")) {
          if (file_exists(DATA_DIR.$file."/info")) {
            $files[] = $file;
          }
        }
      }
    }
    closedir($handle);
    sort($files);
    if (isset($files)) {
      foreach ($files as $file) {
        $info = file(DATA_DIR.$file.'/info');
        $list_title = $info[0];
        $list_title = ereg_replace("\n", '', $list_title);
        $list_title = ereg_replace("\r", '', $list_title);
        echo '<li><a href="'.BASE_URI.'?list='.$file.'">'.$list_title.'</a></li>'."\n";
      }
    }
  }
  echo "</ul>\n<p>\n<a href=\"".BASE_URI."\">Reload</a><br />\n</p>\n</body>\n</html>\n";
} else {
  require_once(GETID3_DIR.'getid3.php');
  if (is_dir(DATA_DIR.$list) && ($list!='.') && ($list!='..')) {
    if (file_exists(DATA_DIR.$list.'/info')) {
      $info = file(DATA_DIR.$list.'/info');
      $list_title = $info[0];
      $list_title = ereg_replace("\n", '', $list_title);
      $list_title = ereg_replace("\r", '', $list_title);

      header ('Content-Type: text/xml; charset=utf-8');
      echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss xmlns:itunes=\"http://www.itunes.com/DTDs/Podcast-1.0.dtd\" version=\"2.0\">\n<channel>\n<title>$list_title</title>\n";
      echo "<description>RSS 2.0 feed created by ".SCRIPT_NAME."</description>\n<link>".BASE_URI."</link>\n";
      if ($handle = opendir(DATA_DIR.$list.'/')) {
        unset($files);
        while (false !== ($file = readdir($handle))) {
          if (ereg('[0-9a-zA-Z]*\.mp3', $file)) {
            if (!(is_dir(DATA_DIR.$list.'/'.$file)) && ($file!='.') && ($file!='..')) {
              $files[] = $file;
            }
          }
        }
        closedir($handle);
        sort($files);
        if (isset($files)) {
          foreach ($files as $file) {
            $getID3 = new getID3;
            $getID3->encoding = 'UTF-8';
            $ThisFileInfo = $getID3->analyze(DATA_DIR.$list.'/'.$file);
            getid3_lib::CopyTagsToComments($ThisFileInfo);
            $artist = $ThisFileInfo['comments_html']['artist'][0];
            if ($artist == '') { $artist = '不明なアーティスト'; }
            $title = $ThisFileInfo['comments_html']['title'][0];
            if ($title == '') { $title = ereg_replace('\.mp3', '', $file); }
            echo "<item>\n<title>".$artist." - ".$title."</title>\n<link>".BASE_URI.DATA_DIR.$list."/".$file."</link>\n<pubDate>".gmdate('D, j M Y H:i:s')." GMT</pubDate>\n<enclosure url=\"".BASE_URI.DATA_DIR.$list."/".$file."\" length=\"".filesize(DATA_DIR.$list."/".$file)."\" type=\"audio/mp3\" />\n</item>\n";
          }
        }
      }
      echo "</channel>\n</rss>\n";
    }
  } else {
    header('HTTP/1.0 404 Not Found');
    echo '404 Not Found';
  }
}
?>

こんな長いものをここに書くなって感じですが(笑)。まあ、面倒だったので。
使い方はソースをみて分かってほしいなーとも思いますが、そんなことは面倒だと思うので軽く説明します。
まず、getID3()を取得して、ソースのGETID3_DIRで指定している場所に置きます。この指定はソースからの相対パスです。最後はスラッシュで。
次に、音楽データの置場を用意します。場所はDATA_DIRで指定します。GETID3_DIRと同じくソースの設置場所からの相対パスで、最後はスラッシュです。DATA_DIRの中には作りたいプレイリストごとにディレクトリを作ります。名前は適当につけてもらえればOKです。そして、その中にinfoというファイルを用意して、そのファイルにプレイリストの名前を書きます。文字コードはUTF-8で!infoと同じディレクトリにそのプレイリストに入れたいMP3の音楽ファイルを入れてもらえればOKです。
最後に、ソースの設置場所のURLをBASE_URIに入れて、そのソースをindex.phpなどで保存します。文字コードはUTF-8で!
設置方法の説明はこんな感じでしょうか。

その次にPSPでこのプレイリストを登録する必要があります。PSPのインターネットブラウザーから設置したURLへアクセスし、登録したいプレイリスト名を選択します。そうすると、「RSSチャンネルに登録しますか?」と聞かれるので「はい」を選ぶと、RSSチャンネルに登録され、再生の準備が完了します。
再生するときは、XMBのネットワークのRSSチャンネルから登録したプレイリストを選択すると、曲の一覧が表示されます。
使い方の説明はこんな感じでしょうか。

現在のところの問題点はAAC(m4a)ではうまく曲名などが取得できない(文字化けする、マルチバイト文字じゃなければ大丈夫)くらいだと思います。なので、今はMP3しか読み込まないようにしています。もし改善方法などがわかりましたら教えてくださると幸いです。
その他バグなどは・・・あるかもしれません。何かあったら教えていただけると幸いです。

これで、サーバのHDDが許す限りの音楽データが楽しめます。使用する際はくれぐれも様々な法律を遵守してくださいね。

え?Webサーバの構築してないと使えないじゃないかって?その通りです!


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です