WEBブラウザで音楽再生_03

Last-modified: 2014-08-16 (土) 12:41:50 (2184d)

WEBブラウザで音楽再生

全曲リストから部分プレイリストを作成する

前回、音楽フォルダより全曲のプレイリストを作成したが、WEBから音楽再生を行うにあたり、このリストを読み込むのはいくつかの問題がある。

  • 全曲数によるだろうが、サイズがデカい。Webでアクセスする際は多くて数十曲程度聴ければよく、何千曲というリストは全く必要ない。
  • Windows Scripting Host にて各ファイルのパスを取得しているため、パスがWindowsシステムから見たものとなっている。実際はWebブラウザからアクセスするため、Webサーバが理解できるパス、つまりURL形式に書き換えないといけない。

そのため、このファイルの一部分を切り出し、別のファイルに保存するという機能を作成する。

動作要求は以下の通りだ。

出力ファイル形式は、asfとする。

最終的に、プレイヤーはWindows media player のActiveXブラウザプラグイン(以下WMPプラグイン)で行う(Flashで行う考えもあるが、それについては後記する)。WMPプラグインにファイルを読み込ませるにはこのような方法がある。

  • 音楽ファイルのURLを直接指定
  • 音楽ファイルのURLが書いてあるテキストファイル(asf)を読み込ませる
  • ストリーミングを受信する ストリーミングを受信する場合は専用のサーバ(サーバソフトウェア)が必要なため、今回は却下する。

ASFファイルを読み込ませる場合、ファイルをいくつも改行区切りで列挙することで、プレイリストのように扱うことが出来る。例えば、このような感じだ。

http://example.com/musicfolder/Puffy%20-%20Hi%20Hi%20Puffy%20AmiYumi.mp3/11-SUNRISE.mp3
http://example.com/musicfolder/YUI%20-%20Rolling%20Star/03%20I%20remember%20you%20〜YUI%20Acoustic%20Vers.mp3
http://example.com/musicfolder/スガ%20シカオ%20-%20ALL%20SINGLES%20BEST%20-%20DISC%201%20.mp3/01-午後のパレード.mp3
http://example.com/musicfolder/坂本真綾%20-%20夕凪LOOP/01%20Hello.mp3

半角スペースを%20に置き換え、日本語はそのままで、SJISエンコーディングで保存したらうまく動作した。(尚、WMPプラグインが配置されているHTTPページのエンコーディングはUTF-8である)

簡易フィルタリング機能を備える。

いくつかのプリセットフィルタを用意し、プルダウンで選択して使えるようにする。つまり、

┏━━━━━━━━━┯━┓
┃全曲       │▼┃
┠─────────┴─┨
┃全曲                  ┃
┃Linkin Park           ┃
┃Steely Dan            ┃
┃Jellyfish             ┃
┃John Frusciante       ┃
┗━━━━━━━━━━━┛

こんな感じのプルダウンメニューをWebブラウザに表示させ、選択してフォーム送信することで、そのフィルタを適用した曲リストを生成する、といった動作となるようにしたい。

フィルタといっても結局ファイルパスやファイル名を正規表現などで検索していくしかないので、ジャンル検索などは難しい(フォルダにジャンル名が記述されている場合は別だが)。

フリーワード検索は現状必要なし

必要があったら作ろう。ファイル名を検索するだけなら難しくはない。

ソースの一例

config.php

<?PHP
mb_http_output('UTF8');
mb_internal_encoding('UTF8');
mb_regex_encoding('UTF8');

define('SOURCE_FOLDER','X:/datadir/[PC内部から見たこのアプリケーションのあるディレクトリ]/');
define('DESTINATION_URL_HEADER','http://example.com/インターネットから見た音楽フォルダ/');

define('REMOVE_FILEHEADER',"Y:\\[音楽ファイルのあるディレクトリ]\\");

define('SOURCE_LIST','list_fullmusic.m3u'); //全曲リストファイル名

define('DESTINATION_LIST','list.asx'); //部分プレイリストファイル名

define('INT_SONG_NUM_DEFAULT',10);

define('ENCODING_SYSTEM','SJIS');
define('ENCODING_GET','EUC-JP');

$aryRegFilter = array(
	'mp3'        => '/\.mp3$/i',
	'Steely Dan' => '/STEELY DAN.*\.mp3/i',
);

$list_file = "list.asx?".time(); //部分プレイリストファイル名。キャッシュしない。
?>

make_playlist.php

<?PHP

include("config.php");

if($_GET['songnum']){
	$intSongNum = $_GET['songnum'];
}else{
	$intSongNum = INT_SONG_NUM_DEFAULT;
}

$aryFilelist = file(SOURCE_LIST);
$aryFilterdList = array();

if($_GET['filter']){
	$_GET['filter']=mb_convert_encoding($_GET['filter'],mb_internal_encoding(),ENCODING_GET);
	if(!isset($aryRegFilter[$_GET['filter']])) die("ERROR: no filter");
	foreach($aryFilelist as $line){
		$line = trim($line);
		$line = mb_convert_encoding($line,mb_internal_encoding(),ENCODING_SYSTEM);
		if(!preg_match($aryRegFilter[$_GET['filter']],$line)) continue;
		$aryFilterdList[] = $line;
	}
}else{
	foreach($aryFilelist as $line){
		$line = trim($line);
		$line = mb_convert_encoding($line,mb_internal_encoding(),ENCODING_SYSTEM);
		$aryFilterdList[] = $line;
	}
}

$aryOut = array();

for($i =0;$i<$intSongNum;$i++){
	$a = $aryFilterdList[array_rand($aryFilterdList)];
	$a = trim($a);
	$a = str_replace(REMOVE_FILEHEADER,"",$a);
	$a = str_replace("\\","/",$a);
	$a = str_replace(" ","%20",$a);
	$a = DESTINATION_URL_HEADER.$a;
	$a = mb_convert_encoding($a,'SJIS',mb_internal_encoding());
	$aryOut[] = $a;
}

file_put_contents(DESTINATION_LIST,join("\r\n",$aryOut));


header("Location: ./");
?>
ok
<A href="./">./</A>

make_playlist.php?songnum=10&filter=mp3

↑このようにアクセスし、部分プレイリストを作る。