每天学一点flash 76 百度MP3音乐APi接口使用
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.****.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
百度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>
编辑之后,可以加以进行这个实现,丰富搜索回来的数据使用。
经过整合到微博客户端里面去就可以实现分享歌曲,查看歌词的操作。