bugfixes
This commit is contained in:
@@ -1,25 +1,35 @@
|
||||
async function load(){
|
||||
const r = await fetch('/api/streams');
|
||||
const data = await r.json();
|
||||
let data;
|
||||
try {
|
||||
const r = await fetch('/api/streams', { cache: 'no-store' });
|
||||
if (!r.ok) throw new Error('api '+r.status);
|
||||
data = await r.json();
|
||||
} catch (e) {
|
||||
console.warn('streams api error:', e);
|
||||
// UI freundlich degradieren
|
||||
document.getElementById('list').innerHTML =
|
||||
'<div class="card"><div class="muted">Keine Daten (API-Fehler)</div></div>';
|
||||
return;
|
||||
}
|
||||
const q = (document.getElementById('filter').value||'').toLowerCase();
|
||||
const list = document.getElementById('list');
|
||||
list.innerHTML = '';
|
||||
data.items
|
||||
.filter(it => !q || it.name.toLowerCase().includes(q))
|
||||
.forEach(it => {
|
||||
const a = document.createElement('a');
|
||||
a.href = '/' + encodeURIComponent(it.name);
|
||||
a.className = 'card';
|
||||
a.innerHTML = `
|
||||
<div class="row space-between">
|
||||
<div>
|
||||
<div class="title-strong">${it.name}</div>
|
||||
<div class="muted">Zuschauer: ${it.viewers}</div>
|
||||
</div>
|
||||
<div class="pill ${it.live ? 'live':'off'}">${it.live ? 'LIVE' : 'Offline'}</div>
|
||||
</div>`;
|
||||
list.appendChild(a);
|
||||
});
|
||||
data.items.filter(it => !q || it.name.toLowerCase().includes(q)).forEach(it => {
|
||||
const a = document.createElement('a');
|
||||
a.href = '/' + encodeURIComponent(it.name);
|
||||
a.className = 'card';
|
||||
a.innerHTML = `
|
||||
<div class="row space-between">
|
||||
<div>
|
||||
<div class="title-strong">${it.name}</div>
|
||||
<div class="muted">Zuschauer: ${it.viewers}</div>
|
||||
</div>
|
||||
<div class="pill ${it.live ? 'live':'off'}">${it.live ? 'LIVE' : 'Offline'}</div>
|
||||
</div>`;
|
||||
list.appendChild(a);
|
||||
});
|
||||
}
|
||||
document.getElementById('filter').addEventListener('input', load);
|
||||
load(); setInterval(load, 3000);
|
||||
document.getElementById('reload').addEventListener('click', load);
|
||||
load();
|
||||
setInterval(load, 3000);
|
||||
|
||||
@@ -11,6 +11,17 @@
|
||||
}
|
||||
|
||||
async function refresh(){
|
||||
let data;
|
||||
try{
|
||||
const r = await fetch('/api/streams', { cache: 'no-store' });
|
||||
if (!r.ok) throw new Error('api '+r.status);
|
||||
data = await r.json();
|
||||
}catch(e){
|
||||
console.warn('streams api error:', e);
|
||||
setLive(false);
|
||||
viewersEl.textContent = 'Zuschauer: –';
|
||||
return;
|
||||
}
|
||||
const r = await fetch('/api/streams');
|
||||
const d = await r.json();
|
||||
const it = d.items.find(x=>x.name===name);
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<h1 class="title-no-margin">🎬 Streams</h1>
|
||||
<div class="row">
|
||||
<input id="filter" placeholder="Filter (z. B. stream1)">
|
||||
<a href="/refresh" class="pill">Neu laden</a>
|
||||
<button id="reload" class="pill" type="button">Neu laden</button>
|
||||
</div>
|
||||
</div>
|
||||
<p class="muted">RTMP Ingest: <code>rtmp://HOST/<name></code> · HLS: <code>http(s)://HOST/hls/<name></code></p>
|
||||
|
||||
Reference in New Issue
Block a user