summaryrefslogtreecommitdiff
path: root/templates/var/www/html/index.html
blob: 7c45f1d1a0b43e5cd12b2e04dd667b9e3650d99f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
  <link rel="icon" href="data:," />
  <link rel="stylesheet" href="style.css" />
  <title>{{ radio_name }}</title>
</head>
<body>
  <video id="background" autoplay muted playsinline preload="auto"></video>
  <div id="fadeOverlay"></div>
  <div class="index-container">
    <div class="player-wrapper">
      <a id="radioButton" class="btn" href="#">play</a>
      <div id="info"></div>
      <a class="link" target="_blank" href="{{ radio_url }}/stream">direct stream url</a>
      <audio id="radioPlayer" hidden>
        <source src="/stream" type="audio/ogg" />
        Your browser does not support the audio element.
      </audio>
    </div>
  </div>

  <script>
    const player = document.getElementById('radioPlayer');
    const button = document.getElementById('radioButton');
    const infoEl = document.getElementById('info');

    button.addEventListener('click', () => {
      if (player.paused) {
        player.play();
        button.textContent = 'Stop';
      } else {
        player.pause();
        player.currentTime = 0;
        button.textContent = 'Play';
      }
    });

    let spinnerInterval;

    function startSpinner() {
      const spinnerChars = ['|', '/', '-', '\\'];
      let i = 0;
      spinnerInterval = setInterval(() => {
        infoEl.textContent = `${spinnerChars[i++ % spinnerChars.length]}`;
      }, 100);
    }

    function stopSpinner() {
      clearInterval(spinnerInterval);
    }

    let spinnerHasRun = false;

    async function fetchCurrentTrack() {
      if (!spinnerHasRun) {
        startSpinner();
        await new Promise(resolve => setTimeout(resolve, 3000));
      }

      try {
        const response = await fetch('/info');
        if (!response.ok) throw new Error('Network response was not ok');

        const data = await response.json();
        const source = data.icestats.source;

        const title = source.title || 'Unknown';
        const bitrate = source['ice-bitrate'] || 0;
        const listeners = source.listeners || 0;
        const listenerLabel = listeners === 1 ? 'listener' : 'listeners';

        stopSpinner();
        infoEl.textContent = `${title} | ${bitrate} kbps | ${listeners} ${listenerLabel}`;

        spinnerHasRun = true;

      } catch (error) {
        stopSpinner();
        infoEl.textContent = 'Error loading track info';
        console.error(error);
      }
    }

    fetchCurrentTrack();
    setInterval(fetchCurrentTrack, 10000);
  </script>
  <script src="video-background.js"></script>
</body>
</html>