🔈

Cloud Storage for Firebaseにある音声ファイルをReact Playerで再生する

2022/07/18に公開

概要

Cloud Storage for Firebaseに音声ファイル(wav 形式や mp3 形式など)を
react-playerで再生します。
音声ファイルはFirebase Authenticationでアクセスを制限しています。

リポジトリ

kubotama/react-player

前提条件

Next.js でサイトを構築しています。

  • node.js: 16.15.1
  • Next.js: 12.2.0

詳しくは上記リポジトリで確認して下さい。

事前の準備

  1. Firebase でプロジェクトを作成します。
  2. 作成したプロジェクトで Authentication を開始します。
  3. 開始した Authentication でメール/パスワードプロバイダを有効にします。
  4. Authentication にユーザーを追加します。
  5. 上記リポジトリをローカル環境にクローンします。
  6. 作成したプロジェクトにウェブアプリを追加して、「SDK の設定と構成」で「構成」を選択すると表示される「アプリのキーと ID が含まれている Firebase 構成オブジェクト:」をコピーして、ローカル環境にクローンしたリポジトリの./lib/firebase.js に貼り付けます。
  7. firebaseConfig の変数宣言の先頭に export を追加します。
  8. Cloud Storage for Firebase に音声ファイル(main.wav)をアップロードします。
  9. Cloud Storage for Firebase のルールで、Authentication に追加したユーザーのみアクセスを許可します。
// Grants a user access to a node matching their user ID
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null && request.auth.uid == "追加したユーザーのユーザーUID";
    }
  }
}

プログラムの説明

アクセス可能なユーザーが制限されているため、音声ファイルにアクセスする前にログインします。
ログインしていなければログイン画面(login.tsx)、ログインしていればメイン画面(index.tsx)を表示します。

Authentication でアクセスを制限をされている Cloud Storage for Firebase にあるファイルにアクセスするためには、ダウンロード URL を取得する必要があります。

  1. 上記リポジトリのディレクトリでyarn devを実行すると、ローカル環境で検証用の web サイトが立ち上がりますので、http://localhost:3000 にアクセスすると、ログインしていませんのでログイン画面が表示されます。

  2. 事前の準備で Authentication に追加したユーザーのメールアドレスとパスワードを入力してログインすると、メイン画面(index.tsx)にログインしたユーザーのメールアドレスと、音声ファイルのダウンロード URL が表示されます。表示された react-player の再生ボタンをクリックすると音声ファイルが再生されます。

index.tsx
const [downloadUrl, setDownloadUrl] = useState("");
  const filename = "main.wav";

  useEffect(() => {
    const authStateChanged = onAuthStateChanged(auth, async (user) => {
      if (user) {
        const storage = getStorage();
        getDownloadURL(ref(storage, filename)).then((url) => {
          setDownloadUrl(url);
        });
      }
      const email = user?.email || "no name";
      setName(email);
    });
    return () => {
      authStateChanged();
    };
  }, []);

GitHubで編集を提案

Discussion