Newer
Older
Intro-Q-2025-ver2 / public / music / music_player.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>音楽プレイヤー</title>
  <link rel="stylesheet" href="music_player.css">
</head>
<body>

  <div class="container">
    <h1>音楽プレイヤー</h1>
    <p id="nowPlaying">選択された曲: なし</p>
    <button id="initBtn">🎵 音楽再生を有効にする</button>
    <audio id="audioPlayer" controls></audio>
  </div>

  <script>
    const audioPlayer = document.getElementById("audioPlayer");
    const nowPlaying = document.getElementById("nowPlaying");
    const initBtn = document.getElementById("initBtn");

    const sePlayer = new Audio();
    // ★★★ 音楽サーバーのIPアドレスは、当日のあなたのPCのIPに合わせてください ★★★
    const musicServerHost = 'http://192.168.0.145:8890';
    
    // ▼▼▼【変更】WebSocket接続先を公開URLに固定 ▼▼▼
    const conn = new WebSocket('wss://www.koeki-prj.org/hayahosi/');

    let currentFileUrl = "";

    const silentMp3 = "data:audio/mp3;base64,//uQxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAACcQCA//////////8AAA==";
    initBtn.addEventListener("click", () => {
      audioPlayer.src = silentMp3;
      audioPlayer.play().then(() => {
          console.log("Autoplayが許可されました");
          audioPlayer.pause(); audioPlayer.src = "";
          initBtn.disabled = true; initBtn.style.display = "none";
        }).catch(err => console.error("初期再生失敗", err));
    });

    conn.onmessage = ev => {
      let msg;
      try { msg = JSON.parse(ev.data); } catch { return; }

      switch (msg.type) {
        case "select":
          currentFileUrl = msg.url;
          audioPlayer.src = currentFileUrl;
          nowPlaying.textContent = "曲選択中...";
          console.log("曲読み込み:", currentFileUrl);
          break;
        case "play":
          if (!currentFileUrl) return;
          audioPlayer.play().catch(err => console.error("再生失敗:", err));
          nowPlaying.textContent = "▶ 再生中...";
          break;
        case "pause":
          audioPlayer.pause();
          nowPlaying.textContent = "⏸ 一時停止中";
          break;
        case "stop":
          audioPlayer.pause();
          audioPlayer.currentTime = 0;
          nowPlaying.textContent = "⏹ 停止中";
          break;
        case "announce":
          if (!audioPlayer.paused) {
            audioPlayer.pause();
            console.log("挙手があったため再生を一時停止しました。");
          }
          if (msg.queue && msg.queue.length > 0) {
            const firstRaiser = msg.queue[0];
            nowPlaying.innerHTML = `🤚<br>${firstRaiser.group} の ${firstRaiser.name}さんの回答です!`;
          } else {
            if (nowPlaying.textContent.includes("不正解")) {
              nowPlaying.textContent = "▶ 再生中...";
            }
          }
          break;
        case "correct":
          audioPlayer.pause();
          audioPlayer.currentTime = 0;
          sePlayer.src = `${musicServerHost}/SE/correct.mp3`;
          sePlayer.play();
          
          const rawFilename = decodeURIComponent(msg.answer);
          const cleanTitle = rawFilename.replace(/^\d+_/, '').replace(/\.\w+$/, '');
          
          nowPlaying.innerHTML = `⭕ 正解!<br>答え: ${cleanTitle}`;
          break;
        case "incorrect":
          audioPlayer.pause();
          sePlayer.src = `${musicServerHost}/SE/incorrect.mp3`;
          sePlayer.play();
          nowPlaying.textContent = `❌ 不正解...`;
          break;
      }
    };

    conn.onopen = () => console.log("WebSocket 接続成功!");
    conn.onerror = (e) => console.error("WebSocket エラー", e);
    conn.onclose = () => {
        nowPlaying.textContent = "サーバーとの接続が切れました";
        console.log("WebSocket 切断");
    };
  </script>
</body>
</html>