简单音乐盒的实现
音乐盒的作用最主要就是能够在线听歌。这里我们使用的是简单下载方式,也就是直接发一个网址给客户端,让客户端使用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必须在最前面发送给客户端,所以在这之前不能有任何的输出。
如果要播放特定曲目,原理也是一样的
后记:我没有测试,中间也省略了很多很多地方,不能保证程序一定可用。希望能够对你有一点作用。