如果你和大多数人一样,你可能会有一大堆MP3放在硬盘的各个地方。如果你和大多数人一样,你可能还希望会有一种方法能够自动给这些MP3归一归类,并根据歌名和演唱者建立索引,以便更容易地查找。
那么,有了PHP和php扩展与应用库(php Extension and Application Repository,PEAR),实现这个任务就比你想象的要轻松了。PEAR的MP3_ID类提供了现成的工具用来读取和提取MP3文件里的元数据,这就使得识别MP3歌曲的歌名、演唱者和风格变得很容易。这一功能还能够与php的文件操控功能结合在一起,从而有效地(和自动地)创建所有音乐的索引。
第一步当然是下载和安装PEAR的MP3_ID工具包。这个现在由Alexander Werz维护的工具包提供的方法,能够根据ID3v1标准读取和写入MP3元数据。你很快就要用到这些方法能够从MP3文件里提取歌名和演唱者等信息。
你可以手动安装这个包,先下载它,把它解压到你的PEAR库的目录下,你也可以使用PEAR安装器进行安装。
然后,创建一个php脚本(列表A),把它保存到你的Web服务器的文档根目录下。注:列表A里的脚本可以从本文的可下载版本里复制和粘贴获得。
列表A
<html>
<head></head>
<body>
<?php
function searchMp3($dir) {
// declare global variables
global $data, $id3;
// open handle
$dh = opendir($dir) or die ("Cannot open directory '$dir'!");
// look for MP3s
while (($file = readdir($dh)) !== false) {
if ($file != "." && $file != "..") {
// if sub-directory: recursively process it
// if MP3 file: get descriptive info
if (is_dir($dir."/".$file)) {
searchMp3($dir."/".$file);
} else {
if (eregi(".mp3$", $file)) {
$id3->read($dir."/".$file);
$filename = $id3->getTag('file'); // file name
$artist = $id3->getTag('artists') ? $id3->getTag('artists') : "n/a"; // artist name
$title = $id3->getTag('name') ? $id3->getTag('name') : "n/a"; // track title
$genre = $id3->getTag('genre') ? $id3->getTag('genre') : "n/a"; // genre
$year = $id3->getTag('year') ? $id3->getTag('year') : "n/a"; // year of release
$data[] = array('file' => $filename, 'artist' => $artist, 'title' => $title, 'genre' => $genre, 'year' => $year);
}
}
}
}
// close handle
closedir($dh);
}
// import MP3 class
include("MP3/Id.php");
// create new MP3_ID() class
$id3 = &new MP3_Id();
// define MP3 directory
$dir = "/usr/local/share";
// start scanning for MP3s
// store extracted MP3 metadata in $data
searchMp3($dir);
?>
<table border=1>
<tr>
<td><b>File name</b></td>
<td><b>Title</b></td>
<td><b>Artist</b></td>
<td><b>Genre</b></td>
<td><b>Year</b></td>
</tr>
<?php
// print track data
foreach ($data as $d) {
echo "<tr>";
echo "<td>" . $d['file'] . "</td>";
echo "<td>" . $d['title'] . "</td>";
echo "<td>" . $d['artist'] . "</td>";
echo "<td>" . $d['genre'] . "</td>";
echo "<td>" . $d['year'] . "</td>";
echo "</tr>";
}
?>
</table>
</body>
</html>
脚本解析
这个脚本多少有点复杂,所以让我们一步步来看它是如何工作的:
第一步:这个脚本一开始是导入MP3_ID类文件,并初始化这个类的对象。它还会定义了一个基本目录,脚本就应该从这个目录开始搜索MP3文件(你应该把这个目录改为自己系统的文件目录)。它然后会调用searchMp3()函数,把基本目录作为输入传递给它。
第二步:searchMp3()函数是这个脚本的核心。它利用php的目录函数循环扫描所提供的目录(及其所有子目录),寻找以.mp3扩展名结尾的文件。一旦发现MP3文件,MP3_ID类的getTag()方法就会提取歌名、演唱者、风格,以及专辑等元数据。这信息然后就保存在全局$data数组里。要注意的是,如果某个元数据元素没有找到,那么对应的数组元素就是“n/a(不存在)”。
第三步:一旦所有的子目录都被扫描过,而且不再进行循环扫描,那么searchMp3()函数就会退出,并把控制权返回给主程序。现在,在$data数组里迭代和提取已经保存的数据并把它们以表格HTML格式显示出来就很简单了。这就是列表A里的脚本的后面一半所完成的任务。它输出的结果是一个5栏的表格:MP3文件的完整路径名、乐曲的标题、演唱者或者乐队名、音乐的风格,以及专辑发布的年份。你现在就可以把这个列表保存到硬盘上或者打印出来供参考。
你这就有了——一个自动生成的MP3目录!随着你增加新的音乐文件,只需要运行一下上面的脚本,它们就会出现在目录列表里。这不是很方便吗?
责任编辑:张琎