//****************************************************
//* YouTube.redirect ver.2.0
//*
//* Kio Whitehead : 2009/02/15
//*
//* http://factory-k-lab.blogspot.com/2009/02/youtubesl-yahoo-pipes-2.html
//* http://pipes.yahoo.com/kiowhitehead
//****************************************************
string NULL_STRING = "";

key G_keyOwner;
//----< YouTube >----
string G_sYouTubeURL;
integer G_iFormat;

//----< Yahoo pipes >----
string PIPES_RUN_URL = "http://pipes.yahoo.com/pipes/pipe.run?_id=";
string PIPES_ID = "fe19de9501c96623e0175cdd076ea5c4";
string PIPES_PARAM_CSV = "&_render=csv";
string PIPES_PARAM_URL = "&url=";
//
string G_sPipesURL;
//
list G_listPipesResult;

//----< media >----
string MEDIA_YOUTUBE_URL = "http://www.youtube.com/get_video?";
string MEDIA_PARAM_ID = "video_id";
string MEDIA_PARAM_T = "t";
string MEDIA_PARAM_FMT = "fmt";
string MEDIA_TYPE_VIDEO = "video/*";
string G_sMediaURL;

//----< command >----
float TIMER_COMMAND = 20.0;
integer CHANNEL_COMMAND = 1;
integer G_iHandleCommand;
//
string MSG_COMMAND = "YouTubeのURLを \"/1 url\" とタイプしてください。";
string ERRMSG_TIMEOUT_COMMAND = "タイムアウトしました。もう一度Touchからやり直してください。";
string ERRMSG_WRONG_URL = "URLの指定が正しくないようです。もう一度Touchからやり直してください。";

//----< dialog >----
float TIMER_DIALOG = 20.0;
integer CHANNEL_DIALOG = -1;
integer G_iHandleDialog;
//
string DLG_CMD_NORMAL = "H.264/stereo";
string DLG_CMD_MOBILE = "mobile";
string DLG_CMD_HD = "HD";
list G_listDialogButtons;
//
string MSG_DIALOG = "ストリーミング品質を選択してください。";
string ERRMSG_TIMEOUT_DIALOG = "タイムアウトしました。もう一度Touchからやり直してください。";

//----< http >----
integer HTTP_STATUS_OK = 200;
key G_keyQueryHTTP;

//--------
list G_listMessage;
string G_sCommand;

list G_listTemp;
string G_sTemp;
integer G_iIndexList;

//----------------------------------------------------------
// Function : RemoveCommand()
//----------------------------------------------------------
RemoveCommand()
{
 llSetTimerEvent(TIMER_COMMAND);
 llListenControl(G_iHandleCommand, TRUE);
}
//----------------------------------------------------------
// Function : RemoveDialog()
//----------------------------------------------------------
RemoveDialog()
{
 llSetTimerEvent(0.0);
 llListenControl(G_iHandleDialog, FALSE);
}

//=====================================================
//= State : default
//=====================================================
default
{
 state_entry()
 {
 G_keyOwner = llGetOwner();
 //
 G_iHandleCommand = llListen(CHANNEL_COMMAND,
 NULL_STRING,
 G_keyOwner,
 NULL_STRING);
 llListenControl(G_iHandleCommand, FALSE);
 }
 state_exit()
 {
 llListenControl(G_iHandleCommand, FALSE);
 llListenRemove(G_iHandleCommand);
 }
 //---------------------------------------------------------------
 // Event : touch_start
 //---------------------------------------------------------------
 touch_start(integer num_detected)
 {
 llOwnerSay(MSG_COMMAND);
 llListenControl(G_iHandleCommand, TRUE);
 llSetTimerEvent(TIMER_COMMAND);
 }
 //---------------------------------------------------------------
 // Event : listen
 //---------------------------------------------------------------
 listen(integer channel, string name, key id, string message)
 {
 RemoveCommand();
 //
 G_listMessage = llCSV2List(message);
 G_sYouTubeURL = llList2String(G_listMessage, 0);
 if (llSubStringIndex(G_sYouTubeURL, "youtube") == -1) {
 llOwnerSay(ERRMSG_WRONG_URL);
 state default;
// return;
 }
 state run_pipes;
 }
 //---------------------------------------------------------------
 // Event : timer
 //---------------------------------------------------------------
 timer()
 {
 RemoveCommand();
 llOwnerSay(ERRMSG_TIMEOUT_COMMAND);
 }
 //---------------------------------------------------------------
 // Event : on_rez
 //---------------------------------------------------------------
 on_rez(integer start_param)
 {
 llResetScript();
 }
 //---------------------------------------------------------------
 // Event : changed
 //---------------------------------------------------------------
 changed(integer change)
 {
 if (change & CHANGED_OWNER) {
 llResetScript();
 }
 }
}
//=====================================================
//= State : run_pipes
//=====================================================
state run_pipes
{
 state_entry()
 {
 G_sPipesURL = PIPES_RUN_URL + PIPES_ID 
 + PIPES_PARAM_URL + G_sYouTubeURL
 + PIPES_PARAM_CSV;
 G_keyQueryHTTP
 = llHTTPRequest(G_sPipesURL, [HTTP_METHOD,"GET"], NULL_STRING);
 }
 state_exit()
 {
 }
 //---------------------------------------------------------------
 // Event : http_response
 //---------------------------------------------------------------
 http_response(key request_id, integer status, list metadata, string body)
 {
 if (request_id != G_keyQueryHTTP) {
 return;
 }
 if ( (status != HTTP_STATUS_OK) || (body == NULL_STRING) ) {
 return;
 }
 //
 G_listTemp = llParseStringKeepNulls(body, ["\n"], []);
 G_sTemp = llDumpList2String(G_listTemp, ",");
 G_listPipesResult = llCSV2List(G_sTemp);
 state select_format;
 }
 //---------------------------------------------------------------
 // Event : on_rez
 //---------------------------------------------------------------
 on_rez(integer start_param)
 {
 llResetScript();
 }
 //---------------------------------------------------------------
 // Event : changed
 //---------------------------------------------------------------
 changed(integer change)
 {
 if (change & CHANGED_OWNER) {
 llResetScript();
 }
 }
}
//=====================================================
//= State : select_format
//=====================================================
state select_format
{
 state_entry()
 {
 G_iIndexList = llListFindList(G_listPipesResult, [MEDIA_PARAM_FMT]);
 //
 G_listDialogButtons = [] + DLG_CMD_NORMAL + DLG_CMD_MOBILE;
 if (llList2Integer(G_listPipesResult, (G_iIndexList + 1) ) == 22) {
 G_listDialogButtons += DLG_CMD_HD;
 }
 //
 G_iHandleDialog = llListen(CHANNEL_DIALOG,
 NULL_STRING,
 G_keyOwner,
 NULL_STRING);
 llListenControl(G_iHandleDialog, TRUE);
 llSetTimerEvent(TIMER_DIALOG);
 llDialog(G_keyOwner, MSG_DIALOG, G_listDialogButtons, CHANNEL_DIALOG);
 }
 state_exit()
 {
 RemoveDialog();
 }
 //---------------------------------------------------------------
 // Event : listen
 //---------------------------------------------------------------
 listen(integer channel, string name, key id, string message)
 {
 RemoveDialog();
 //
 if (message == DLG_CMD_NORMAL) {
 G_iFormat = 18;
 }
 else if (message == DLG_CMD_MOBILE) {
 G_iFormat = 17;
 }
 else if (message == DLG_CMD_HD) {
 G_iFormat = 22;
 }
// else {
// G_iFormat = 18;
// }
 state set_media;
 }
 //---------------------------------------------------------------
 // Event : timer
 //---------------------------------------------------------------
 timer()
 {
 RemoveDialog();
 llOwnerSay(ERRMSG_TIMEOUT_DIALOG);
 state default;
 }
 //---------------------------------------------------------------
 // Event : on_rez
 //---------------------------------------------------------------
 on_rez(integer start_param)
 {
 llResetScript();
 }
 //---------------------------------------------------------------
 // Event : changed
 //---------------------------------------------------------------
 changed(integer change)
 {
 if (change & CHANGED_OWNER) {
 llResetScript();
 }
 }
}
//=====================================================
//= State : set_media
//=====================================================
state set_media
{
 state_entry()
 {
 G_sMediaURL = MEDIA_YOUTUBE_URL;
 //
 G_iIndexList = llListFindList(G_listPipesResult, [MEDIA_PARAM_ID]);
 G_sMediaURL = G_sMediaURL
 + MEDIA_PARAM_ID + "="
 + llList2String(G_listPipesResult, (G_iIndexList + 1));
 //
 G_iIndexList = llListFindList(G_listPipesResult, [MEDIA_PARAM_T]);
 G_sMediaURL = G_sMediaURL
 + "&" + MEDIA_PARAM_T + "="
 + llList2String(G_listPipesResult, (G_iIndexList + 1));
 //
 G_sMediaURL = G_sMediaURL
 + "&" + MEDIA_PARAM_FMT + "="
 + (string)G_iFormat;
 //
 llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_STOP,
 PARCEL_MEDIA_COMMAND_URL,G_sMediaURL,
 PARCEL_MEDIA_COMMAND_TYPE,MEDIA_TYPE_VIDEO]);
 llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);
 //
 state default;
 }
 state_exit()
 {
 }
 //---------------------------------------------------------------
 // Event : on_rez
 //---------------------------------------------------------------
 on_rez(integer start_param)
 {
 llResetScript();
 }
 //---------------------------------------------------------------
 // Event : changed
 //---------------------------------------------------------------
 changed(integer change)
 {
 if (change & CHANGED_OWNER) {
 llResetScript();
 }
 }
}