YouTube.redirect ver.2.0
//****************************************************
//* 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();
}
}
}