homeへのリンクです。

Flickr APIを利用する 2

2007年04月19日

Flickr APIについては、
Action Scirpt 2.0のラッパークラスのライブラリを作っている人がいて、

http://flashr.kelvinluck.com/

で公開されている。
おそらくすごくよくできているのだと思うが、利用したいところだけちょっと使いたい感じなので、とりあえず、前回のサンプルは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();
			}
		}
	}
}