您的位置:首页 > 其它

每天学一点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>


编辑之后,可以加以进行这个实现,丰富搜索回来的数据使用。

经过整合到微博客户端里面去就可以实现分享歌曲,查看歌词的操作。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: