当前位置:Linux教程 - Php - 简单音乐盒的实现

简单音乐盒的实现

音乐盒的作用最主要就是能够在线听歌。这里我们使用的是简单下载方式,也就是直接发一个网址给客户端,让客户端使用winamp等工具连接,从而实现在线听歌。这里的关键在于发送的m3u文件的内容。

首先建立数据库。

建立歌曲表music_song


  Code: [Copy to clipboard]   
CREATE TABLE `music_song` (
  `id` smallint(6) NOT NULL auto_increment,
  `songname` varchar(100) NOT NULL default '',
  `filesize` int(11) NOT NULL default '0',
  `albumid` smallint(6) NOT NULL default '0',
  `lyric` text,
  PRIMARY KEY  (`id`)
) TYPE=MyISAM;



建立歌手表music_singer


  Code: [Copy to clipboard]   
CREATE TABLE `music_singer` (
  `id` smallint(6) unsigned NOT NULL auto_increment,
  `name` varchar(100) NOT NULL default '',
  `gender` enum('male','female','group','others') default 'male',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM



建立专辑表music_album


  Code: [Copy to clipboard]   
CREATE TABLE `music_album` (
  `id` smallint(6) unsigned NOT NULL auto_increment,
  `name` varchar(100) NOT NULL default '',
  `songpath` varchar(150) NOT NULL default '',
  `singerid` smallint(6) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM



由于这里只是做一个例子,我省略了一些字段,例如歌手介绍,地区等等,可以根据需要加上。

下面我们一个页面一个页面来做。
(注:我省略了所有的表单页,这些东西很容易写出来的,我觉得没有必要重复)

添加歌手(addsinger.php)


  Code: [Copy to clipboard]   
//首先对变量初始化,使用$_POST数组得到$name,$gender
$strsql="select id from music_singer where name='$name' and gender='$gender'";
$res=mysql_query($strsql,$conn);
$resa=mysql_fetch_array($res);
if($resa["id"])
{
    echo "歌手已经存在";
    exit();
}
$strsql="insert into music_singer(name,gender) values('$name','$gender')";
mysql_query($strsql,$conn);
echo "歌手添加完毕";



添加歌曲。
我们假设网站的URL为http://www.zhiyuange.net/,而歌曲放在http://www.zhiyuange.net/songs/目录下,结构为:http://www.zhiyuange.net/songs/歌手/专辑/歌曲.mp3,网站在硬盘上的实际路径是/home/pal/web,所以歌曲的实际路径就是/home/pal/web/songs/歌手/专辑/歌曲.mp3


  Code: [Copy to clipboard]   
//$songpath,歌曲所在的路径,例如songs/王菲/天空/
//$albumname,这个是这些歌曲所在的专辑名称,这里是天空
//$singerid,歌手编号,这是music_singer表中id字段的值
//$filedir,这个是一个预设的量,你可以做成常量,这里的值是/home/pal/web/
$strsql="select id from music_album where name='$albumname'";
$res=mysql_query($strsql,$conn);
$resa=mysql_fetch_array($res);
if($resa["id"])
{
    $albumid=$resa["id"];
}
else
{
    $strsql="insert into music_album(name,songpath,singerid) values('$albumname','$songpath',$singerid)";
    $res=mysql_query($strsql,$conn);
    $strsql="select id from music_album order by id desc limit 1";
    $res=mysql_query($strsql,$conn);
    $resa=mysql_fetch_array($res);
    $albumid=$resa["id"];
}
//上面这段代码的作用就是得到专辑的id,这个是music_song中的一个字段


//下面插入歌曲,这里需要用到几个file函数
$handle=opendir($songpath);
while (FALSE !== ($filename = readdir($handle)))
{
    clearstatcache();
    if($filename=="." || $filename=="..") continue;
    $filepath=$filedir.$filename;
    if( is_dir($filepath) ) continue;//目录就跳过
    $filepart=explode(".",$filename);
    if( $filepart[sizeof($filepart)-1]!="mp3") continue;//扩展名不是mp3就跳过
    $songname=substr($filename,0,strlen($filename)-4);
    $strsql="insert into music_song(songname,filesize,albumid) values('".$songname."',".filesize($filepath).",".$albumid.")";
    mysql_query($strsql,$conn);
}
//这样一张专辑就添加完了



察看专辑


  Code: [Copy to clipboard]   
$strsql="select a.name as albumname,s.name as singername from music_album as a inner join music_singer as s on a.singerid=s.id where a.id=$albumid";
//这样得到专辑名称和歌手名称
$strsql="select id as songid,songname from album_song where albumid=$albumid";
//通过一个while循环,即可取得这张专辑的所有歌曲的名称和编号



播放歌曲
这里实际上就是生成一个m3u文件发送给客户端
这里以播放一张专辑为例


  Code: [Copy to clipboard]   
$filecontent="#EXTM3U\n";
$strsql="select a.songpath,s.name as singername from music_album as a inner join music_singer as s on a.singerid=s.id where a.id=$albumid";
//取得$songpath,例如songs/王菲/天空/
//歌手名称$singername,王菲
$strsql="select songame,filesize from music_song where albumid=$albumid";
$res=mysql_query($strsql,$conn);
while($resa=mysql_fetch_array($res))
{
    $filecontent.="#EXTINF:";
    $filecontent.=(int)($resa["filesize"]/128/1024*8).",".$resa["songname"]."\n";
    $filecontent.="http://www.zhiyuange.net/".$songpath.$songname.".mp3\n";
}
//这样一个m3u文件就成功生成了,现在把它发送到客户端去
/*典型的内容为
#EXTM3U
#EXTINF:405,矜持
http://www.zhiyuange.net/songs/王菲/天空/矜持.mp3
#EXTINF:424,棋子
http://www.zhiyuange.net/songs/王菲/天空/棋子.mp3
#EXTINF:476,影子
http://www.zhiyuange.net/songs/王菲/天空/影子.mp3
#EXTINF:388,天空
http://www.zhiyuange.net/songs/王菲/天空/天空.mp3
*/
//使用如下语句将m3u文件送出

header('Content-type: audio/x-mpegurl;');
header('Content-Disposition: inline; filename=zhiyuange.m3u');
echo $filecontent;
//注意这个inline,这样才能保证直接打开而不提示下载。
//header必须在最前面发送给客户端,所以在这之前不能有任何的输出。



如果要播放特定曲目,原理也是一样的

后记:我没有测试,中间也省略了很多很多地方,不能保证程序一定可用。希望能够对你有一点作用。