ソラマメブログ

2008年05月16日

【スクリプト】土地で音楽を流し、曲目を表示する

以前に土地の音楽をインターネットラジオを設定し、現在流れている曲の情報をフローティングテキストで表示する「ラジオ」を見かけました。
で、曲情報をどのように取得するかいろいろと試してみたのですが、うまくいきませんでした。
SHOUTcastサーバーなどでストリーミングしている場合に、そのURLをブラウザで表示させるとサーバーの情報が表示されます。その中にSong Historyというページがあって、ここでストリーミングされた曲情報が見られます。

 
(ストリーミングURLを開く)


(Song Historyを開く)

スクリプトでこのページをllHTTPRequestして、情報を取得しようとしましたが、戻ってくるのは空の情報でした。

そこで、メディアの表示にWEBが使えるようになったので、このSong Historyを表示させてしまえば現在流れている曲情報が見られるなぁと思いつき、自宅用のラジオに組み込みました。

自宅用のラジオは、選択出来るストリーミングがSHOUTcastだけではなく、自分で設定しているストリーミングも選択できるようにしたので複雑になってしまいましたので、ここでは1局だけを選択し土地の音楽に設定し、メディアにそのSong Historyを表示させる部分だけを抜き出して紹介します。

まずオブジェクト(なんでもいいです。デフォルトのBOXでも可)に、スクリプトを入れます。
オブジェクトをタッチすれば、スクリプトで指定したストリーミングに切り替わり、メディア表示します。自分のSLビュワーのメディアボタンを押せば、オブジェクトのX軸の値の大きい方の面にWEBが表示されます。
再度タッチすれば、音楽設定を無しにして元のテクスチャに戻ります。
ストリーミングを設定するだけ、もしくはストリーミング設定を次々と切り替えられるようにするなら、元の設定を取得する必要はありませんので、touch_startイベントのelse{}内の設定部分だけあればよいです。

WEBの表示が小さいので、オブジェクトは大きくした方が見やすいです。

※スクリプト中で使用しているインターネットラジオ局は実在していますが、特に許可を得ているわけではありません。ごめんなさい。

//==================================================
// sasa_tuner
// ver 5.1.1
// 2008.05.15
// created by sasapy Beck

// Define (変数定義)
    string MESSAGE_ONAIR = "Now onair : "; // フローティングテキスト
    string MESSAGE_STANDBY = "TOUCH to listen RADIO"; // フローティングテキスト
    vector COLOR_WHITE = <1.0, 1.0, 1.0>; // 白
    float ALPHA_SOLID = 1.0; // 1.0 : 透過しない
    integer FACE = 2; // 表示面(X+)

// 元の設定値
    string original_texture = ""; // テクスチャー名
    vector original_color = ZERO_VECTOR; // 色
    float original_alpha = 0.0; // 透明度
    list original_media = []; // メディア設定

    key original_media_texture = NULL_KEY; // メディアテクスチャー
    string original_media_url = ""; // メディアURL
    string original_media_type = ""; // メディアタイプ

// メディアの設定
    string MEDIA_TEXTURE = "media_texture"; // メディア用
    key media_key = NULL_KEY; // テクスチャーのキー
    string MEDIA_TYPE = "text/html"; // メディアタイプ

    string RADIO_NAME = "Big R Radio - 80s Metal FM"; // ラジオ局名
    string RADIO_URL = "http://66.90.121.3:9000"; // ラジオ局ストリーミングURL
    string PAGE_NAME = "/played.html"; // ページ名

    integer now_onair = FALSE; // フラグ

    integer REFRESH_TIMER = 30.0; // 表示更新タイマー(秒)

//--------------------------------------------------
// Main
    default
    {
        state_entry()
        {
            media_key = llGetInventoryKey(MEDIA_TEXTURE); // メディアテクスチャのキー

// オリジナルの設定の取得
            original_texture = llGetTexture(FACE);
            original_color = llGetColor(FACE);
            original_alpha = llGetAlpha(FACE);

            original_media = llParcelMediaQuery([PARCEL_MEDIA_COMMAND_TEXTURE,
                                                             PARCEL_MEDIA_COMMAND_URL, 
                                                            PARCEL_MEDIA_COMMAND_TYPE]);
            original_media_texture = llList2Key(original_media, 0);
            original_media_url = llList2String(original_media, 1);
            original_media_type = llList2String(original_media, 2);
        }

// Rez Event
        on_rez(integer start_param)
        {
            llResetScript();
        }

// Touch Event
        touch_start(integer num_detected)
        {
// ストリーミングを設定中なら、オリジナルの設定に戻す
            if(now_onair)
            {
                llSetTexture(original_texture, FACE);
                llSetColor(original_color, FACE);
                llSetAlpha(original_alpha, FACE);

                llSetParcelMusicURL("");

                llParcelMediaCommandList([
                    PARCEL_MEDIA_COMMAND_TEXTURE, original_media_texture,
                    PARCEL_MEDIA_COMMAND_URL, original_media_url,
                    PARCEL_MEDIA_COMMAND_TYPE, original_media_type,
                    PARCEL_MEDIA_COMMAND_AUTO_ALIGN, TRUE,
                    PARCEL_MEDIA_COMMAND_PLAY
                ]);

                llSetText(MESSAGE_STANDBY, COLOR_WHITE, ALPHA_SOLID); // フローティングテキスト表示
                now_onair = FALSE;
                llSetTimerEvent(0.0); // タイマーの停止
            }
// ストリーミングが設定されていない場合は、ストリーミングの設定を行う
            else
            {
                llSetTexture(MEDIA_TEXTURE, FACE);
                llSetColor(COLOR_WHITE, FACE);
                llSetAlpha(ALPHA_SOLID, FACE);

                llSetParcelMusicURL(RADIO_URL);

                llParcelMediaCommandList([
                    PARCEL_MEDIA_COMMAND_TEXTURE, media_key,
                    PARCEL_MEDIA_COMMAND_URL, RADIO_URL + PAGE_NAME,
                    PARCEL_MEDIA_COMMAND_TYPE, MEDIA_TYPE,
                    PARCEL_MEDIA_COMMAND_AUTO_ALIGN, TRUE,
                    PARCEL_MEDIA_COMMAND_PLAY
                ]);

                llSetText(MESSAGE_ONAIR + RADIO_NAME, COLOR_WHITE, ALPHA_SOLID); // フローティングテキスト表示
                now_onair = TRUE;
                llSetTimerEvent(REFRESH_TIMER); // タイマー起動
            }
        }

// Timer Event
        timer()
        {
            llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_PLAY]);
        }
    }
//==================================================

私の土地に、自宅用のラジオが置いてあります(非売品)。どのように表示されるか見たい方はおいでください。
ちなみに選局できるチャンネルが多いので、後半の方のインターネットラジオっぽいの(笑)を選んでみてください。

<2008.05.19 修正>
WEBページ側が切り替わってもSL内では更新しないのでタイマーを使って一定間隔で表示を更新するようにしました。(ピンク太字部分)


この記事へのトラックバックURL

http://sasapy.slmame.com/t241929
この記事へのコメント
はじめまして^^

> スクリプトでこのページをllHTTPRequestして、情報を取得しようとしましたが、戻ってくるのは空の情報でした

HTTPリクエスト送信先は「http://〜」ではなく「udp://〜」でOKかと^^

あたしと同じ研究をなさっているようですし
よろしければ情報交換しませんか〜♪

よろしくお願い致します〜
Posted by arz Nitelyarz Nitely at 2008年06月11日 19:30
続けざまにすみません^^;

「udp://〜」ではなくて「tcp://〜」でした...
Posted by arz Nitelyarz Nitely at 2008年06月11日 19:33
arz Nitelyさん、こんばんは。

「tcp://~」を直接llHTTPRequestで指定して実行することは出来ませんでした。

リクエストが実行されるときに「HTTP URL does not start with http:// or https://」というエラーでした・・・。

それはそれとして、ブログを興味深く読まさせていただきました。というか、もっとじっくり読まさせていただきます。
Posted by ささぴ at 2008年06月11日 20:52
およよ...
そうなんですね〜...

よく調べもせず間違った情報を掲載してしまい申し訳ございません...
ご迷惑をおかけしました><
Posted by arz Nitelyarz Nitely at 2008年06月11日 21:29