@gaulatti/giorgia 0.1.82 → 0.1.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gaulatti/giorgia",
3
3
  "description": "Server-side Handlebars renderer and templates for ModoItaliano pages.",
4
- "version": "0.1.82",
4
+ "version": "0.1.83",
5
5
  "license": "MIT",
6
6
  "author": "ModoItaliano",
7
7
  "repository": {
@@ -34,5 +34,5 @@
34
34
  </label>
35
35
  </div>
36
36
  </div>
37
- <audio data-stream-audio preload='none' src='https://palazzo.gaulatti.com'>Tu navegador no admite la reproducción de audio.</audio>
37
+ <audio data-stream-audio preload='none' crossorigin='anonymous' src='https://palazzo.gaulatti.com'>Tu navegador no admite la reproducción de audio.</audio>
38
38
  </section>
@@ -17,6 +17,10 @@
17
17
  var pauseIconPath = 'M7 5h4v14H7zM13 5h4v14h-4z';
18
18
  var nowPlaying = window.__brokawNowPlaying || null;
19
19
  var hasStartedPlayback = false;
20
+ var desiredVolume = Number(volume.value);
21
+ var audioContext = null;
22
+ var gainNode = null;
23
+ var sourceNode = null;
20
24
 
21
25
  function setControls(isPlaying) {
22
26
  toggles.forEach(function (toggle) {
@@ -61,10 +65,52 @@
61
65
  setControls(false);
62
66
  }
63
67
 
68
+ function getVolumeValue() {
69
+ var nextVolume = Number(volume.value);
70
+ if (!Number.isFinite(nextVolume)) return 0.85;
71
+ return Math.max(0, Math.min(1, nextVolume));
72
+ }
73
+
74
+ function applyVolume() {
75
+ audio.muted = desiredVolume <= 0;
76
+ audio.volume = desiredVolume;
77
+ if (gainNode) gainNode.gain.value = desiredVolume;
78
+ }
79
+
80
+ function ensureVolumePipeline() {
81
+ if (gainNode || sourceNode) {
82
+ if (audioContext && audioContext.state === 'suspended') void audioContext.resume();
83
+ applyVolume();
84
+ return;
85
+ }
86
+
87
+ var AudioContextConstructor = window.AudioContext || window.webkitAudioContext;
88
+ if (!AudioContextConstructor) {
89
+ applyVolume();
90
+ return;
91
+ }
92
+
93
+ try {
94
+ audioContext = new AudioContextConstructor();
95
+ sourceNode = audioContext.createMediaElementSource(audio);
96
+ gainNode = audioContext.createGain();
97
+ sourceNode.connect(gainNode);
98
+ gainNode.connect(audioContext.destination);
99
+ if (audioContext.state === 'suspended') void audioContext.resume();
100
+ } catch (_error) {
101
+ audioContext = null;
102
+ gainNode = null;
103
+ sourceNode = null;
104
+ }
105
+
106
+ applyVolume();
107
+ }
108
+
64
109
  async function togglePlayback() {
65
110
  if (audio.paused) {
66
111
  setControls(true);
67
112
  setMessage('Conectando…', 'Abriendo transmisión');
113
+ ensureVolumePipeline();
68
114
  try {
69
115
  await audio.play();
70
116
  } catch (_error) {
@@ -77,12 +123,13 @@
77
123
  }
78
124
  }
79
125
 
80
- audio.volume = Number(volume.value);
126
+ applyVolume();
81
127
  toggles.forEach(function (toggle) {
82
128
  if (toggle instanceof HTMLButtonElement) toggle.addEventListener('click', togglePlayback);
83
129
  });
84
130
  volume.addEventListener('input', function () {
85
- audio.volume = Number(volume.value);
131
+ desiredVolume = getVolumeValue();
132
+ applyVolume();
86
133
  });
87
134
  audio.addEventListener('play', setPlaying);
88
135
  audio.addEventListener('playing', setPlaying);