Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
Ouvill opened this issue Aug 18, 2024 · 0 comments
Open

Comments

@Ouvill
Copy link

Ouvill commented Aug 18, 2024

要望

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")
  }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant