Flickr APIについては、
Action Scirpt 2.0のラッパークラスのライブラリを作っている人がいて、
で公開されている。
おそらくすごくよくできているのだと思うが、利用したいところだけちょっと使いたい感じなので、とりあえず、前回のサンプルはAction Script 3.0で自分なりにコードを書いた。
書いたといっても、REST用にURLを生成するだけのこと。
Action Script 3.0の特徴としては、
・URLRequestやURLVariablesなどのデータロードに関するStringを適切なフォーマットにキャストしてくれるクラスがあること、
・E4Xが実装されていてXMLを簡単に扱えること
などで、コードがシンプルにまとまる点がある。
package com.kishineshiki.flickr{ import flash.net.*; import flash.display.*; public class MakeFlickrURLRequest{ private static var mykey:String="自分のキーを入れる"; private static var urlstr:String="http://api.flickr.com/services/rest"; public static function searchURL(taglist:Array):URLRequest{ var urlvar:URLVariables =new URLVariables(); urlvar.method="flickr.photos.search"; urlvar.api_key=mykey; urlvar.tags=taglist.toString(); var urlrequest:URLRequest=new URLRequest(urlstr); urlrequest.data=urlvar; return urlrequest; } private static function extractPhotoData(xml:XML):XMLList{ var photodatalist:XMLList=xml..photo; return photodatalist; } public static function thumbnailURL(xml:XML):Array{ var plist:XMLList=extractPhotoData(xml); var urlrequestlist:Array=new Array(); for(var i:Number=0;i<plist.length();i++){ var urlstr:String="http://farm" +plist[i].@farm +".static.flickr.com/" +plist[i].@server +"/"+plist[i].@id +"_"+plist[i].@secret +"_s.jpg"; urlrequestlist[i]={urlreq:new URLRequest(urlstr),width:75,height:75}; } return urlrequestlist; } public static function getLocationURL(xml:XML):Array{ var plist:XMLList=extractPhotoData(xml); var urlrequestlist:Array=new Array(); for(var i:Number=0;i<plist.length();i++){ var urlvar:URLVariables =new URLVariables(); urlvar.method="flickr.photos.geo.getLocation"; urlvar.api_key=mykey; urlvar.photo_id=plist[i].@id; var urlrequest:URLRequest=new URLRequest(urlstr); urlrequest.data=urlvar; urlrequestlist[i]=urlrequest; } return urlrequestlist; } } }
呼び出し側は以下のようになる。
Action Script 2.0のときは、XMLのロードと解析用に、カスタムクラスを作成したりしていたが、それらは不要になった。
[SWF(・・・)]の部分はFlexBuilder用のコマンドライン引数の代わりになるもの。
package{ import flash.display.*; import flash.text.*; import flash.events.*; import com.kishineshiki.xml.LoadXML; import com.kishineshiki.flickr.*; import com.kishineshiki.btn.*; import com.kishineshiki.txt.*; [SWF(width="600",height="1020",backgroundColor="#ffffff",frameRate="24")] public class FlickrImageSearchTest extends Sprite{ private var loadxml:LoadXML; private var textinput:TextInput; private var loaderlist:Array; public function FlickrImageSearchTest(){ loadxml=new LoadXML(); loadxml.addEventListener(onLoad); textinput=new TextInput(150,22); textinput.x=10; textinput.y=10; addChild(textinput); var searchbutton:ButtonBase=new ButtonBase("search",100,22); searchbutton.x=170; searchbutton.y=10; searchbutton.addEventListener(MouseEvent.CLICK,search); addChild(searchbutton); loaderlist=new Array(); } private function search(event:MouseEvent):void{ loadxml.load(MakeFlickrURLRequest.searchURL([textinput.text])); } private function onLoad(xml:XML):void{ loadSumbnail(xml); } private function loadSumbnail(xml:XML):void{ unloadSumbnail(); var currentx:Number=0; var currenty:Number=40; var maxy:Number=0; var requestlist:Array=MakeFlickrURLRequest.thumbnailURL(xml); for(var i:Number=0;i<requestlist.length;i++){ loaderlist[i]=new Loader(); addChild(loaderlist[i]); loaderlist[i].load(requestlist[i].urlreq); loaderlist[i].x=currentx; loaderlist[i].y=currenty; currentx+=Number(requestlist[i].width); if((i+1)<requestlist.length&¤tx+Number(requestlist[i+1].width)>600){ currentx=0; currenty+=maxy; maxy=0; } if(maxy<Number(requestlist[i].height)){ maxy=Number(requestlist[i].height); } } } private function unloadSumbnail():void{ for(var i:Number=0;i<loaderlist.length;i++){ loaderlist[i].unload(); } } } }