Skip to content

playse(playbgm)タグのstorageにdata-urlやblob-urlを指定したい。 #127

@Ouvill

Description

@Ouvill

要望

javascriptで動的に生成した音声をティラノスクリプトで再生させたいです。

playse(playbgm)タグのstorageにdata-urlやjavascriptのURL.createObjectURL(blob)で生成したオブジェクトurlを渡せるようにしたいです。

現状

ティラノスクリプトでは音楽を再生する方法として、playseやplaybgmタグが用意されています。
現在のコードを見ると、storageに音声ファイルのパス、もしくは、音声ファイルのhttpアドレスを指定できます。
ですが、バイナリデータをstorageに指定しても再生できません。

現在の実装は以下のようになっています。

playseのstorageに指定された文字列は、相対パスで指定されたものか、HTTPであるか判定されます。
HTTPであるかどうかは$.isHTTP()関数で判定しているようです。isHTTP関数では data-url形式かどうかをisBase64の関数で判定しています。

https://github.com/ShikemokuMK/tyranoscript/blob/c763ee2913307fd90f09461c98c2cc1efd2e481b/tyrano/libs.js#L15C1-L25C7

   $.isHTTP = function (str) {
        if ($.isBase64(str)) {
            return true;
        }

        if (str.substring(0, 4) === "http") {
            return true;
        } else {
            return false;
        }
    };

base64の判定は以下のような判定になっています。

https://github.com/ShikemokuMK/tyranoscript/blob/c763ee2913307fd90f09461c98c2cc1efd2e481b/tyrano/libs.js#L1302C3-L1310C7

    $.isBase64 = function (str) {
        if (!str) return false;

        if (str.substr(0, 10) == "data:image") {
            return true;
        } else {
            return false;
        }
    };

現在のこの実装では、data:imageのデータしか受け入れていないので、playbgmのタグでstorageにdata:audioで始まるbase64のバイナリデータを渡してもエラーになります。

修正案

以下のように修正すると動的に音声を再生できると思います。

  $.isBase64 = function (str) {
     if (!str || typeof str !== 'string') return false;
     
    return str.startsWith("data:image") || str.startsWith("data:audio") || str.startsWith("data:video")
  }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions