用PHP和专用PEAR类自动生成MP3曲目

ZDNet软件频道 时间:2006-02-09 作者:BUILDER.COM |  我要评论()
本文关键词:php
PEAR的MP3_ID类提供了现成的工具用来读取和提取MP3文件里的元数据,这就使得识别MP3歌曲的歌名、演唱者和风格变得很容易。

如果你和大多数人一样,你可能会有一大堆MP3放在硬盘的各个地方。如果你和大多数人一样,你可能还希望会有一种方法能够自动给这些MP3归一归类,并根据歌名和演唱者建立索引,以便更容易地查找。

那么,有了PHPphp扩展与应用库(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目录!随着你增加新的音乐文件,只需要运行一下上面的脚本,它们就会出现在目录列表里。这不是很方便吗?

责任编辑:张琎

查看本文的国际来源

 

 

 


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134