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();
}
}
}
}