晩ご飯が遅くて目が冴えてしまったので、ノリで「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を作ってみた。
つうか、みんなの叫びすぎ
■技術的なこと
まず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;ivarv=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”);
}
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;