晩ご飯が遅くて目が冴えてしまったので、ノリで「TagTube」というのを作った。

サービスとしては動いてませんが、ソースコード公開しておきます。

YouTubeのflvファイルのURIは動的に変わるので、以前がんばって取得するcgiをperlで作ったのだけどまたYouTubeの仕様が変わったのでしばらくやってなかった。

んで、昨日の夜に和田さんが、「WebService::YouTube::UtilでflvのURI取れるよ」と言ってたので、朝2時に始めて4時にとりあえず完成した。たくさんのflvを再生したらどれぐらい重くなるかとか、YouTubeとのやりとりの速度が大体わかってきた。

まずインストール

cpan> install WebService::YouTube

そしてYouTubeのDeveloper IDも取っておく

せっかくだからタグ検索して、20個のflvを同時に(重いので順番に、になってしまったが)並べて再生するFlashを作ってみた。



つうか、みんなの叫びすぎ

画面はこんな感じ

TagTube

■技術的なこと

まずFlashにMiniPlayerというクラスを20個敷き詰める。そして、”oklab”や”shokai”でYouTubeのREST-APIをタグ検索して、サムネイル(jpg)とvideo_idを取ってくる。サムネイルだけとりあえずMiniPlayerの中のLoaderに表示する。

最後にCGIにvideo_idを渡すと、flvのURLが返ってくるのでMiniPlayerの中のMediaDisplayに表示する。

おわり。もう一回やる時は再起動してください。

■コード

SourceCode – .fla, .swf, .as (Flash8 ActionScript2.0)

あとXPath4AS2を使ってます。→使い方



CGIはcoLinuxの中で動かしたので、このflaの中で参照しているURLを適当に直してくだしあ

TagTube.fla

importcom.xfactorstudio.xml.xpath.*;

vardev_id=”your-own-id”;

//initalize

varplayers:Array=newArray();

vartag:String=””;

varrest:XML=newXML();

varvideos:Array=newArray();

rest.ignoreWhite=true;//空白無視

gui_init();

//players[0].setContentPath(“test.flv”);

functiongui_init(){

for(vari:Number=0;i<20;i++){

vardepth:Number=this.getNextHighestDepth();

varp:MovieClip=attachMovie(“MiniPlayer”,”p”+depth,depth);

p._width=120;//配置

p._height=80;

p._x=120*(i%5);

p._y=80*Math.floor(i/5);

players.push(p);

}

}

/*デバッグメッセージ表示*/

functionshowMessage(str:Object){

trace(str);

resultTextArea.text=str+”¥n”+resultTextArea.text;

}

clearLogButton.onRelease=function(){

resultTextArea.text=””;

}

loadButton.onRelease=function(){

tag=tagLabel.text;

rest.load(“http://www.youtube.com/api2_rest?dev_id=”+dev_id+”&method=youtube.videos.list_by_tag&tag=”+tag);

}

rest.onLoad=function(success:Boolean){

if(!success){//失敗

showMessage(“restloaderror!!”);

}

else{//成功

showMessage(“restloadsuccess!!”);

videos=XPath.selectNodes(rest,”ut_response/video_list/video”);

showMessage(videos.length);

for(i=0;i varv=videos[i];

varp=players[i];

varvideo_id=XPath.selectNodes(v,”id/text()”);

varthumb_img=XPath.selectNodes(v,”thumbnail_url/text()”);

p.setThumb(thumb_img);

load_flv(video_id,p);

}

}

}

functionload_flv(video_id:String,player:MovieClip){

showMessage(“load_flv:”+video_id);

varlv:LoadVars=newLoadVars();

varresultXml:XML=newXML();

resultXml.onLoad=function(success:Boolean){

if(!success){

showMessage(“load_flverror!!”);

}

else{

showMessage(“load_flvsuccess!!”);

showMessage(resultXml.toString().split(“&”).join(“&”));//urldecode

player.setContentPath(resultXml.toString().split(“&”).join(“&”));

}

}

lv.id=video_id;

lv.sendAndLoad(“http://colinux/perl/061211_webservice-youtube/get-video-uri.cgi”,resultXml,”POST”);

}

MiniPlayer.as

classMiniPlayerextendsMovieClip{

varvideo:MovieClip;

varthumb:MovieClip;

functionMiniPlayer(){

trace(“create:miniPlayer”);

}

functionsetContentPath(uri:String){

this.video.contentPath=uri;

trace(“path:”+uri);

}

functionsetThumb(uri:String){

this.thumb.contentPath=uri;

trace(“thumb:”+uri);

}



}

get-video-uri.cgi

#!/usr/bin/perl

usestrict;

usewarnings;

useutf8;

useEncode;

useWebService::YouTube::Util;

#HTTP-header出力

useCGI;

useCGI::Carpqw(fatalsToBrowser);

my$cgi=newCGI;

print$cgi->header(-type=>”text/plain”,

-charset=>”UTF-8″);

my$video_id=$cgi->param(‘id’);

my$uri=WebService::YouTube::Util->get_video_uri($video_id);

print$uri;