2007年04月23日
マッシュアップ楽天CD検索(2)
rakutenCD links

昨日の楽天CD検索の続き。
ソースコードと考察です。

イチロー!
◆まず考察
lslでは複雑なテキストを処理しづらいのと
受信バイト数2048bytesの制限があることなどから
現状では直接webサービスAPIを叩かないで、
合間に適当なcgiなどをはさんで、サービスを利用したほうが良いように思います。
戻り値を2048バイトに収まり、解析しやすい形のテキストに変更してくれるとベストです。
(そういうメタサービス、探せばありそうですが。)
ところで、メディアテクスチャを使った作例は
気軽にいくつも組めないですね。
手持ちの土地に対して1つまでしかメディアテクスチャを設定できないと思うので。
分譲してグループ保持とかにすればいくつも作れるでしょうか。
◆ソースについて。
テキストの解析に苦労のあとが見えます…。
llHTTPRequestのレスポンスxmlがちょんぎれて
返ってくる不具合対応のため、仕様変更を繰り返したので
自分でもフローが妙になったままだと思うのですが
もはやなおす気力が無いです。
次にllHTTPRequestを使うときはそのあたりを考慮して組もうと思います。
楽天のAPIを利用するにはデベロッパーIDが必要なので
このソースを使ってみる際は、DEV_IDを自分のIDで置き換えてください。
※コードのハイライト(色分け)にはgoogle-code-prettifyをlsl対応するように
カスタマイズしたものを使っています。
便利そうなので正式に使い方の説明とともに公開したいのですが、
apacheライセンスという事でその詳細がわからないと公開できません…。
apacheライセンスのコードを利用して作ったコードは
必ずapacheライセンスである事とする…だったかなあ。

昨日の楽天CD検索の続き。
ソースコードと考察です。

イチロー!
◆まず考察
lslでは複雑なテキストを処理しづらいのと
受信バイト数2048bytesの制限があることなどから
現状では直接webサービスAPIを叩かないで、
合間に適当なcgiなどをはさんで、サービスを利用したほうが良いように思います。
戻り値を2048バイトに収まり、解析しやすい形のテキストに変更してくれるとベストです。
(そういうメタサービス、探せばありそうですが。)
ところで、メディアテクスチャを使った作例は
気軽にいくつも組めないですね。
手持ちの土地に対して1つまでしかメディアテクスチャを設定できないと思うので。
分譲してグループ保持とかにすればいくつも作れるでしょうか。
◆ソースについて。
テキストの解析に苦労のあとが見えます…。
llHTTPRequestのレスポンスxmlがちょんぎれて
返ってくる不具合対応のため、仕様変更を繰り返したので
自分でもフローが妙になったままだと思うのですが
もはやなおす気力が無いです。
次にllHTTPRequestを使うときはそのあたりを考慮して組もうと思います。
楽天のAPIを利用するにはデベロッパーIDが必要なので
このソースを使ってみる際は、DEV_IDを自分のIDで置き換えてください。
//lsl with Rakuten CD Search API sample ver 1.00
//by harayoki
key VIDEO_TEXTURE = "38092dd2-625d-dc66-3131-7356bd8d16c1";//harayoki's video texture
integer TEXTURE_SIDE = 2;
string API_BASE = "http://api.rakuten.co.jp/rws/1.7/rest";
string QUERY_BASE = "operation=CDSearch&version=2007-04-11&imageFlag=1&hits=1&sort=random&carrier=0";
string DEV_ID = "**************************";// your rakuten DEV ID!
//string MAX_RESPONCE_BODY_LENGTH = "40960";// not yet supported. only 2048 bytes are available.
string DEFAULT_IMAGE_URL = "http://www.geocities.jp/yokiimage/slmame/rakutenCDSearchTitle.jpg";
string PARSE_FAILED_IMAGE_URL = "http://www.geocities.jp/yokiimage/slmame/parseFailed.jpg";
string LOADING_IMAGE_URL = "http://www.geocities.jp/yokiimage/slmame/loadingImage.gif";
string NO_RESULT_IMAGE_URL = "http://www.geocities.jp/yokiimage/slmame/rakutenNoResult.jpg";
string POWERED_BY_BASE64 = "UG93ZXJlZCBieSDmpb3lpKlDROaknOe0okFQSQ==";
integer CHANNEL = 1;
float SHOW_INTERVAL = 8.0;
string _defaulttexture = "";
integer _bActive = FALSE;
key _requestKey;
integer _pageCount = 0;
integer _showCursor = 1;
string _imageURL = "";
string _itemName = "";
string _linkURL = "";
string _searchWord = "";
//
integer _debug = FALSE;
Init(){
//_debug = TRUE;
SetText("");
_defaulttexture = llGetTexture(TEXTURE_SIDE);
_bActive = TRUE;
SetActive(_bActive);
}
SetText(string s){
llSetText(s,<1,1,1>,1);
}
Trace(string s){
if(_debug) llOwnerSay(s);
}
SetActive(integer active){
SetTexture(active);
if(active){
SetText("say /1 \"searchword\"");
ShowImage(DEFAULT_IMAGE_URL);
}else{
SetText("Search END");
ShowImage(DEFAULT_IMAGE_URL);
llSetTimerEvent(0.0);
}
}
CallAPI(){
string s = _searchWord;
string url = API_BASE+"?"+QUERY_BASE;
url +="&keyword="+llEscapeURL(s);
url += "&developerId="+DEV_ID;
url += "&page="+(string)_showCursor;
list a = [];
a+=[HTTP_METHOD,"GET"];
a+=[HTTP_MIMETYPE,"text/plain;charset=UTF-8"];
//a+=[HTTP_BODY_MAXLENGTH,MAX_RESPONCE_BODY_LENGTH];
_requestKey = llHTTPRequest(url,a,"");
SetText("Searching CD about "+s);
ShowImage(LOADING_IMAGE_URL);
Trace(url);
}
ShowImage(string url){
llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_URL,url]);
llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);
llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AUTO_ALIGN,TRUE]);
}
SetTexture(integer bOn){
if(bOn){
key texture = llList2Key(llParcelMediaQuery( [PARCEL_MEDIA_COMMAND_TEXTURE]), 0);
if(texture == NULL_KEY){
texture = VIDEO_TEXTURE;
llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_TEXTURE, texture]);
}
llSetTexture(texture,TEXTURE_SIDE);
}else{
// llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_UNLOAD]);
//llSetTexture(_defaulttexture,TEXTURE_SIDE);
}
}
integer XML_PARSE_OK = 0;
integer XML_PARSE_ERROR_NOHITS = 1;
integer XML_PARSE_ERROR_NOPAGECOUNT = 2;
integer XML_PARSE_ERROR_NONAME = 3;
integer XML_PARSE_ERROR_NOIMAGE = 4;
integer ParseXML(string body){
//body = TrimString(body,"<Body>","</Body>");
integer hits = GetHits(body);
_itemName = "";
_imageURL = "";
_linkURL = "";
if(hits==0) return XML_PARSE_ERROR_NOHITS;
_pageCount = GetPageCount(body);
if(_pageCount==0) return XML_PARSE_ERROR_NOPAGECOUNT;
_itemName = GetItemName(body);
if(_itemName==""){
_itemName = "Could not parse item name...";
//return XML_PARSE_ERROR_NONAME;
}
_imageURL = GetImageURL(body);
if(_imageURL==""){
_imageURL = PARSE_FAILED_IMAGE_URL;
return XML_PARSE_ERROR_NOIMAGE;
}
_linkURL = GetLinkURL(body);
return XML_PARSE_OK;
}
string TrimString(string body,string key1,string key2){
integer index1 = llSubStringIndex(body,key1);
integer index2 = llSubStringIndex(body,key2);
if(index1==-1 || index2==-1) return "";
index1 += llStringLength(key1);
index2 -= 1;
string s = llGetSubString(body,index1,index2);
Trace(key1+"~ "+key2 +" trimed -> \""+s+"\"");
return s;
}
integer GetHits(string body){
string key1 = "<hits>";
string key2 = "</hits>";
string s = TrimString(body,key1,key2);
return (integer)s;
}
integer GetPageCount(string body){
string key1 = "<pageCount>";
string key2 = "</pageCount>";
string s = TrimString(body,key1,key2);
return (integer)s;
}
string GetImageURL(string body){
string key1 = "<smallImageUrl>";
string key2 = "?_ex=64x64</smallImageUrl>";
string s = TrimString(body,key1,key2);
return s;
}
string GetItemName(string body){
string key1 = "<itemName>";
string key2 = "</itemName>";
string s = TrimString(body,key1,key2);
return s;
}
string GetLinkURL(string body){
string key1 = "<itemUrl>";
string key2 = "</itemUrl>";
string s = TrimString(body,key1,key2);
return s;
}
NextLoad(){
_showCursor++;
if(_pageCount<_showCursor){
SetActive(FALSE);
}else{
CallAPI();
}
}
ShowInfo(){
integer cur = _showCursor;
string title = (_itemName);
string mes = "";
mes += "Found "+(string)_pageCount+" CD datas.\n";
mes += "#"+(string)cur+" "+title+"\n";
mes += llBase64ToString(POWERED_BY_BASE64);
SetText(mes);
ShowImage(_imageURL);
}
default{
state_entry(){
Init();
llListen(CHANNEL,"",NULL_KEY,"");
}
listen(integer channel, string name, key id, string mes){
if(mes==""){
return;// do something?
}
llSetTimerEvent(0);
Trace("-------------------------------");
_showCursor = 1;
_pageCount = 0;
_searchWord = mes;
CallAPI();
}
on_rez(integer num){
llResetScript();
}
touch_start(integer num){
_bActive = !_bActive;
SetActive(_bActive);
}
http_response(key id, integer status, list meta, string body){
Trace("http_response res:"+(string)status);
if (id == _requestKey){
if(status == 200) {
integer resCheck = ParseXML(body);
if(resCheck==XML_PARSE_ERROR_NOHITS) {
ShowImage(NO_RESULT_IMAGE_URL);
SetText("Search result is Nothing.");
return;
}else if(resCheck==XML_PARSE_ERROR_NOPAGECOUNT){
llSay(0,"XML Parse Error. Could not find pagecount.");
return;
}else if(resCheck==XML_PARSE_ERROR_NOIMAGE){
llSay(0,"XML Parse Error. Could not find image URL.");
//return;
}
//else if(resCheck == XML_PARSE_ERROR_NONAME){
//llSay(0,"XML Parse Error. Can not find Item Name.");
//return;
//}
llSetTimerEvent(SHOW_INTERVAL);
ShowInfo();
}else{
SetText("Some error has occurred . The error code is "+(string)status);
}
}
}
timer(){
NextLoad();
}
touch_start(integer num){
if(_linkURL!="" && _itemName!=""){
llLoadURL(llDetectedKey(0), _itemName, _linkURL);
}
}
}
※コードのハイライト(色分け)にはgoogle-code-prettifyをlsl対応するように
カスタマイズしたものを使っています。
便利そうなので正式に使い方の説明とともに公開したいのですが、
apacheライセンスという事でその詳細がわからないと公開できません…。
apacheライセンスのコードを利用して作ったコードは
必ずapacheライセンスである事とする…だったかなあ。
この記事へのトラックバックURL
この記事へのトラックバック
マッシュアップ楽天CD検索(2)で、楽天さんのマッシュアップ。 ソースも置かれて...
マッシュアップ 楽天【Second Life Watch! 【セカンドライフ ウォッチ】】at 2007年04月23日 14:02
この記事へのコメント
やっぱりHarayokiさんスゲー!
Posted by Nitaro at 2007年04月23日 17:11
またこんな長いコードをww
しかも色分けまでされてるし!
なんでもいけちゃいますね!
しかも色分けまでされてるし!
なんでもいけちゃいますね!
Posted by 5号 at 2007年04月23日 20:28
>Nitaroさん
ありがとうございます。
いろいろ作れはするものの、知らないことばかりなのでNitaroさんのブログで情報収集をさせてもらっているわけです。
家にもちょくちょくお邪魔いてるのですが、あまり見かけないですね。
ちなみにブログの購読は3人くらいまでにしてます。情報が多すぎると混乱してしまうので…。
ありがとうございます。
いろいろ作れはするものの、知らないことばかりなのでNitaroさんのブログで情報収集をさせてもらっているわけです。
家にもちょくちょくお邪魔いてるのですが、あまり見かけないですね。
ちなみにブログの購読は3人くらいまでにしてます。情報が多すぎると混乱してしまうので…。
Posted by harayoki at 2007年04月23日 20:49
>#5号さま
preタグの中に<br>が挿入されてしまうので長く見えてしまってますが、そんなでもないです。
…いや、やっぱり長いかな。
これ、SLMaMeのデフォルトの機能にしてくださいよ~。
一部の人は確実に喜びます。
preタグの中に<br>が挿入されてしまうので長く見えてしまってますが、そんなでもないです。
…いや、やっぱり長いかな。
これ、SLMaMeのデフォルトの機能にしてくださいよ~。
一部の人は確実に喜びます。
Posted by harayoki at 2007年04月23日 20:51
>harayokiさん
そうですねぇ・・・
これはあった方が便利かも♪
いい情報ありがとうございます!
そうですねぇ・・・
これはあった方が便利かも♪
いい情報ありがとうございます!
Posted by 5号 at 2007年04月24日 00:19
apacheライセンス2.0
ややこしいなあ。。
http://www.opensource.jp/licenses/apache2.0.html
ややこしいなあ。。
http://www.opensource.jp/licenses/apache2.0.html
Posted by harayoki at 2007年04月29日 15:55
ボクも格闘してますけど、よく分かりません。
ライセンスを残した上で、改編部分を明記すれば問題なさそうな気もしますが、うーん。
↓SLカラーに合わせてミマシタ
http://midgardsormr27.hp.infoseek.co.jp/prettify_lsl.html
ライセンスを残した上で、改編部分を明記すれば問題なさそうな気もしますが、うーん。
↓SLカラーに合わせてミマシタ
http://midgardsormr27.hp.infoseek.co.jp/prettify_lsl.html
Posted by Nitaro at 2007年04月29日 16:27
http://www.opensource.jp/licenses/apache2.0.html
邦訳。
まだ内容みてません。。
邦訳。
まだ内容みてません。。
Posted by Nitaro at 2007年04月29日 16:35
これは確かにSLカラー!
Nitaroさん、ナイスです。
ちなみに自分の物はSciTE-ezにあわせてあります。
http://sl.sdfjkl.org/secondlife/scite/
少数派かなあ。
apacheライセンス2.0、配布しなければ使う分にはいいんでしょうかね。詳しい人に聞いてみようかな。
Nitaroさん、ナイスです。
ちなみに自分の物はSciTE-ezにあわせてあります。
http://sl.sdfjkl.org/secondlife/scite/
少数派かなあ。
apacheライセンス2.0、配布しなければ使う分にはいいんでしょうかね。詳しい人に聞いてみようかな。
Posted by harayoki at 2007年04月29日 16:38
GIMPで色の取得しただけだったり。。w
ボクもAsuka Neelyさんのブログ見てから、SciTe-ezを使い始めてますので、Harayokiさんのカラーには違和感ありませんでしたよw
配布条件とかは面倒そうですが、
取り敢えず自分も使ってみる方向で。。w
ボクもAsuka Neelyさんのブログ見てから、SciTe-ezを使い始めてますので、Harayokiさんのカラーには違和感ありませんでしたよw
配布条件とかは面倒そうですが、
取り敢えず自分も使ってみる方向で。。w
Posted by Nitaro at 2007年04月29日 17:06
わたしも最近LSL色付けツールつくってました
もうつくってらしたんですね^^;
ででででも、高機能版です。
よかったらのぞいてみてください。
http://jvn.slmame.com/e144263.html
もうつくってらしたんですね^^;
ででででも、高機能版です。
よかったらのぞいてみてください。
http://jvn.slmame.com/e144263.html
Posted by Jvn Writer
at 2008年02月18日 17:19
at 2008年02月18日 17:19Jvnさんこんにちは。
更新しないブログにレスいただきどうもです^^
その場でリファレンスを見られるのはいいですねえ。
自分のはなんとなくインチキなので乗り換えさせてもらおうと思ってます。
次にlslソース貼り付ける際には正式公開されてるような予感w
更新しないブログにレスいただきどうもです^^
その場でリファレンスを見られるのはいいですねえ。
自分のはなんとなくインチキなので乗り換えさせてもらおうと思ってます。
次にlslソース貼り付ける際には正式公開されてるような予感w
Posted by harayoki at 2008年02月18日 22:20
更新たのしみにしてますよーw
わぁ ありがとうございます!
光栄です。
そんなに早く公開できませんw
きっとすぐ何かソース貼るでしょうから。。。
と遠回しなプレッシャーw
わぁ ありがとうございます!
光栄です。
そんなに早く公開できませんw
きっとすぐ何かソース貼るでしょうから。。。
と遠回しなプレッシャーw
Posted by Jvn Writer
at 2008年02月19日 14:48
at 2008年02月19日 14:48色つけできましたー
http://jvn.slmame.com/e151297.html
相変わらず関係ないコメントですみませんw
http://jvn.slmame.com/e151297.html
相変わらず関係ないコメントですみませんw
Posted by Jvn Writer
at 2008年02月23日 15:37
at 2008年02月23日 15:37
