每天学一点flash(76)百度MP3音乐APi接口使用
2011-03-15 18:51
555 查看
百度MP3音乐API接口及应用
http://cloud21.javaeye.com/blog/611914这里有一篇关于百度MP3音乐APi接口的应用,写了一下关于这个百度接口的应用,他可以提供一小部分的搜索功能,将其使用在MP3搜索上还是有一点意思。只是提供的接口方式还是或多或少有一些缺陷。但是借助他能够使用在微博上还是挺有意思的,新浪微博在没有和官方合作的时候,这个搜索信息接口是不会提供的,只有合作的者才能使用到。 百度的搜索能力很强大,只是提供数据并不是对个人开放,因此只能借用这个小接口。
如上面作者所说的,既要歌曲名称 也要歌名,那么有我不记得歌手,那岂不是不能搜索。所以问题就在这里,搜索还是带来一点不方便性。
另外一个说法是,输入这两个关键字有利于定位,不过你需要记得歌手和歌曲名,返回的时间和是比较快的。
不过暂时使用也是可以的。
http://box.zhangmen.baidu.com/x?op=12&count=1&title=大约在冬季$$齐秦$$$$
利用这个接口,我们先改造一下
http://box.zhangmen.baidu.com/x?op=12&count=1&title=songName$$songAuthor$$$$
修改两个关键字,方便我们进行替换。
替换的时候使用字符串分割,以#号为标记进行区分。
这样就可以实现替换的目的,搜索的时候就可以换成想要的链接地址了。
var infoArray:Array=info.split("#"); var newStr:String=searAPIURL.replace("songName",infoArray[0]); newStr= newStr.replace("songAuthor",infoArray[1]);
替换的时候再把多余的空格去除,输入的时候就可以随意一些。
//去除空白 private function replacSpace(str:String):String { return str= str.replace(/(\s)*/gi , ""); }
远程调用这个接口 会返回一个小数量的歌曲链接,在这个时候进行拼接搜索时候的歌曲,由于我们只是需要mp3文件,那么对于的wma 和rm都不是我们需要的,因此在搜索返回结果的时候需要进行帅选,选择之后绑定一个数组里面进行绑定,我们希望得到歌词,同时的做法就是参考上一篇文章所说的做法 拼接lrc的地址,lrc的地址有可能会出现空的情况,所以制作的时候可以加一个条件进行选择。
//裁剪mp3地址 private function getSongAddress(url:String,songName:String):String { var end:int=url.lastIndexOf("/",url.length - 1 ); return url.substring(0,end+1)+songName; } //返回lrc 地址 private function getLRC(url:String):String { return lrcURL+int(int(url)/100).toString()+"/"+url+".lrc"; }
调用该接口返回的是一个xml文件:
如:
<?xml version="1.0" encoding="gb2312" ?> - <result> <count>5</count> - <url> <encode>http://zhangmenshiting.baidu.com/data/music/2322591/VndoWXZqXHloV3hrWnh4XXJoWHlqW3B7VnNrWXprXHBnV3R3WntsXXJ2WHVoZKSoZHGrl6SanHWTmJeamW1pcGZlamZoam9xZJVmaWWYa51imJlmZ25qazE$</encode> <decode>%E5%A4%A7%E7%BA%A6%E5%9C%A8%E5%86%AC%E5%AD%A3.mp3?xcode=bfdfd728537234893c350b4e1ff22833</decode> <type>1</type> <lrcid>14706</lrcid> </url> - <url> <encode>http://individual.utoronto.ca/xmc84/fpOslpp~pY-aoKeZpzY$.mp3</encode> <decode>MaybeInWinter.mp3</decode> <type>1</type> <lrcid>14706</lrcid> </url> - <url> <encode>http://vietnamese.cri.cn/mmsource/audio/2004/07/27/lZOsqZqwmKGVoaGbn583.rm</encode> <decode>dayuezaidongji.rm</decode> <type>2</type> <lrcid>14706</lrcid> </url> - <url> <encode>http://cnc.ycycedu.com/music/5SUH8AkQ7eTt8DM$.mp3</encode> <decode>大约在冬季.mp3</decode> <type>1</type> <lrcid>14706</lrcid> </url> - <url> <encode>http://120.35.4.23/data/mp3/VpRnWZtpXJxlV5WXWpprXZWTWJZrW5ibVpSWWZebNw$$.mp3</encode> <decode>%b4%f3%d4%bc%d4%da%b6%ac%bc%be.mp3</decode> <type>1</type> <lrcid>14706</lrcid> </url> - <p2p> <hash>5babc209cd096f0a3529a3dc8f66754bc58d0e29</hash> </p2p> </result>
利用xml的操作返回我们想要节点:
encode :歌曲地址路径
decode :歌曲名
type :类型
lrcid :lrc
返回的时候 需要进行 把encode 和
decode 节点数据 进行拼接,具体的方法 可以参考上面
http://cloud21.javaeye.com/blog/611914
这一篇文章介绍的方法。
基础的测试:
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" width="386" height="222" creationComplete="init()">
<s:TextInput id="msg" text="爱与诚#古巨基" x="14" y="22" width="255"/>
<s:Button x="296" y="23" label="搜索" click="searCh()"/>
<s:Label x="14" y="52" text="说明:搜索的时候使用歌名# 歌手名 " color="0xff0000"/>
<mx:DataGrid id="dg" x="5" y="72" width="380">
<mx:columns>
<mx:DataGridColumn headerText="地址" width="250" dataField="address" editable="true">
</mx:DataGridColumn>
<mx:DataGridColumn headerText="动作">
<mx:itemRenderer>
<fx:Component>
<mx:LinkButton label="试听" width="20" height="12" click="this.parentDocument.playSong(event)"/>
</fx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
<mx:DataGridColumn headerText="歌词" dataField="lrc">
<mx:itemRenderer>
<fx:Component>
<mx:LinkButton label="歌词" width="20" height="12" click="this.parentDocument.loadSongLRC(event)"/>
</fx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>
<s:Label x="252" y="52" id="alertMsg" text="" width="200" color="0xff0000"/>
<fx:Script>
<!--[CDATA[
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundLoaderContext;
import flash.media.SoundMixer;
import flash.net.*;
import flash.ui.Keyboard;
import flash.utils.ByteArray;
import mx.collections.ArrayCollection;
import mx.controls.*;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.core.UIComponent;
import spark.components.Window;
private var searAPIURL:String="http://box.zhangmen.baidu.com/x?op=12&count=1&title=songName$$songAuthor$$$$";
private var lrcURL:String="http://box.zhangmen.baidu.com/bdlrc/";//lrc
private var loader:URLLoader;
[Bindable]
private var songList:ArrayCollection=new ArrayCollection();
private var sound:Sound;
private var soundChannel:SoundChannel=new SoundChannel();
private function searCh():void
{
if(msg.text=="") return;
songList.removeAll();
var info:String= replacSpace(msg.text);
var infoArray:Array=info.split("#");
var newStr:String=searAPIURL.replace("songName",infoArray[0]);
newStr= newStr.replace("songAuthor",infoArray[1]);
loader.load(new URLRequest(newStr));
}
//去除空白 private function replacSpace(str:String):String { return str= str.replace(/(\s)*/gi , ""); }
//爱与诚#古巨基
private function init():void
{
loader=new URLLoader();
loader.addEventListener(Event.COMPLETE,onData);
msg.setFocus();
addEventListener(KeyboardEvent.KEY_DOWN,onKeyDownHandler);
this.addEventListener(Event.REMOVED_FROM_STAGE,onRemoveSelf);
}
private function onRemoveSelf(event:Event):void
{
removeEventListener(Event.REMOVED_FROM_STAGE,onRemoveSelf);
removeEventListener(KeyboardEvent.KEY_DOWN,onKeyDownHandler);
loader=null;
}
private function onKeyDownHandler(event:KeyboardEvent):void
{
if(event.keyCode==Keyboard.ENTER)
{
searCh();
}
}
private function onData(event:Event):void
{
var xml:XML=XML(loader.data);
trace(xml);
var count:int=int(xml.count);
for(var i:int=0;i<count;i++)
{
if(xml.url[i].type.toString()=="1")
{
var songUrl:String=getSongAddress(xml.url[i].encode,xml.url[i].decode);
var lrcURl:String=getLRC(xml.url[i].lrcid);//加载的lrc有可能不存在的情况
var item:Object={address:songUrl,lrc:lrcURl};
songList.addItem(item);
}
}
dg.dataProvider=songList;
}
//裁剪mp3地址 private function getSongAddress(url:String,songName:String):String { var end:int=url.lastIndexOf("/",url.length - 1 ); return url.substring(0,end+1)+songName; } //返回lrc 地址 private function getLRC(url:String):String { return lrcURL+int(int(url)/100).toString()+"/"+url+".lrc"; }
//播放声音
public function playSong(event:MouseEvent):void
{
var url:String=event.currentTarget.parentDocument.dg.selectedItem.address;
SoundMixer.stopAll();
loadSong(url);
}
//查看歌词
public function loadSongLRC(event:MouseEvent):void
{
var url:String=event.currentTarget.parentDocument.dg.selectedItem.lrc;
//trace(url);
var loader:URLLoader=new URLLoader();
loader.dataFormat=URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE,onLoadLRCCompleteHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR,onLoadLRcErrorHandler);
loader.load(new URLRequest(url));
}
private function onLoadLRCCompleteHandler(event:Event):void
{
event.currentTarget.removeEventListener(Event.COMPLETE,onLoadLRCCompleteHandler);
event.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR,onLoadLRcErrorHandler);
var bytes:ByteArray=ByteArray(event.currentTarget.data);
var stringLength:int = bytes.bytesAvailable;
var outputStr:String =bytes.readMultiByte( stringLength, "gb2312" );
trace(outputStr);
}
private function onLoadLRcErrorHandler(event:IOErrorEvent):void
{
alertMsg.text="加载失败";
}
//加载歌曲
private function loadSong(url:String):void
{
if(sound!=null)
{
soundChannel.stop();
sound=null;
}
sound=new Sound(null,new SoundLoaderContext(2000));
sound.addEventListener(Event.COMPLETE,loadSongComplete);
sound.addEventListener(IOErrorEvent.IO_ERROR,onLoadError);
sound.addEventListener(ProgressEvent.PROGRESS,onLoadProgress);
sound.load(new URLRequest(url));
alertMsg.text="正在加载";
}
private function onLoadError(event:Event):void
{
alertMsg.text="加载失败";
}
private function onLoadProgress(event:ProgressEvent):void
{
alertMsg.text="正在加载"+int(event.bytesLoaded/event.bytesTotal*100).toString()+"/%";
}
private function loadSongComplete(event:Event):void
{
event.currentTarget.removeEventListener(Event.COMPLETE,loadSongComplete);
soundChannel=event.currentTarget.play();
alertMsg.text="加载成功";
}
]]-->
</fx:Script>
</s:Group>
创建一个air的程序,然后把运行一下这个文件。
<?xml version="1.0" encoding="utf-8"?> <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:ns1="*"> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> <ns1:Mp3Serch x="0" y="77"> </ns1:Mp3Serch> </s:WindowedApplication>
编辑之后,可以加以进行这个实现,丰富搜索回来的数据使用。
经过整合到微博客户端里面去就可以实现分享歌曲,查看歌词的操作。
相关文章推荐
- 每天学一点flash(76)百度MP3音乐APi接口使用
- 每天学一点flash(4) 数组与xml配合使用
- 每天学一点flash(13) tree组件 与xml配合配合使用
- 每天学一点flash(4) 数组与xml配合使用
- 每天学一点flash(4) 数组与xml配合使用
- 每天学一点flash(68)使用Capabilities 类
- 每天学一点flash(13) tree组件 与xml配合配合使用
- 每天学一点flash(68)使用Capabilities 类
- 每天学一点flash(13) tree组件 与xml配合配合使用
- 每天学一点flash (29) addChild() 添加对象到容器
- 每天学习一点flash(33) as 3.0 游戏设计笔记(2)
- 每天学一点flash(65)cs4的旋转属性练习
- 每天学一点flash(34) as 3.0 游戏设计笔记(3)
- 每天学一点flash(10) flash 8外部加载文本
- 每天学一点flash(11) as3.0 与asp 通信 (1)
- 每天学一点flash(81) jsfl取消图片的导出类
- 每天学一点flash(40) 制作走马灯四
- 每天学一点flash (20) flash cs3.0 外部加载图片
- 每天学一点flash(50) 反余切的应用
- 每天学一点Flash(47) As3.0 删除容器所有子对象