savetv: Hetzner-Speicherindikator im Archiv, Datumssortierung Downloads
This commit is contained in:
parent
06ab806030
commit
53b63ee8fe
1 changed files with 27 additions and 2 deletions
|
|
@ -486,15 +486,24 @@ function buildDetails(d) {
|
||||||
return metaLine + descLine + crewLine;
|
return metaLine + descLine + crewLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var storedSet = new Set();
|
||||||
|
|
||||||
|
function normTitle(s) {
|
||||||
|
return s.replace(/[^\w\s]/g, ' ').replace(/\s+/g, ' ').trim().toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
async function loadFilms() {
|
async function loadFilms() {
|
||||||
var resp = await fetch('/api/films');
|
var resp = await fetch('/api/films');
|
||||||
var data = await resp.json();
|
var data = await resp.json();
|
||||||
allFilms = data.films;
|
allFilms = data.films;
|
||||||
downloads = data.downloads || {};
|
downloads = data.downloads || {};
|
||||||
|
(data.stored_titles || []).forEach(function(t) { storedSet.add(t); });
|
||||||
document.getElementById('loading').style.display = 'none';
|
document.getElementById('loading').style.display = 'none';
|
||||||
document.getElementById('content').style.display = 'block';
|
document.getElementById('content').style.display = 'block';
|
||||||
|
var storedCount = 0;
|
||||||
|
allFilms.forEach(function(f) { if (storedSet.has(normTitle(f.title))) storedCount++; });
|
||||||
document.getElementById('header-stats').textContent =
|
document.getElementById('header-stats').textContent =
|
||||||
data.total + ' Aufnahmen \u00b7 ' + data.kino + ' Kino \u00b7 ' + data.urgent + ' dringend';
|
data.total + ' Aufnahmen \u00b7 ' + data.kino + ' Kino \u00b7 ' + data.urgent + ' dringend \u00b7 ' + storedCount + ' gespeichert';
|
||||||
renderFilms();
|
renderFilms();
|
||||||
var hasRunning = Object.values(downloads).some(function(v) { return v === 'running'; });
|
var hasRunning = Object.values(downloads).some(function(v) { return v === 'running'; });
|
||||||
if (hasRunning) startPolling();
|
if (hasRunning) startPolling();
|
||||||
|
|
@ -546,13 +555,18 @@ function filmCard(f) {
|
||||||
var daysClass = f.days_left <= 3 ? 'days-urgent' : 'days-ok';
|
var daysClass = f.days_left <= 3 ? 'days-urgent' : 'days-ok';
|
||||||
var daysLabel = f.days_left === 0 ? 'heute' : f.days_left === 1 ? '1 Tag' : f.days_left + ' Tage';
|
var daysLabel = f.days_left === 0 ? 'heute' : f.days_left === 1 ? '1 Tag' : f.days_left + ' Tage';
|
||||||
|
|
||||||
|
var isStored = storedSet.has(normTitle(f.title));
|
||||||
|
|
||||||
var cardClass = 'film-card';
|
var cardClass = 'film-card';
|
||||||
if (sel) cardClass += ' selected';
|
if (sel) cardClass += ' selected';
|
||||||
if (dlState === 'done') cardClass += ' downloaded';
|
if (dlState === 'done' || isStored) cardClass += ' downloaded';
|
||||||
if (dlState === 'running') cardClass += ' downloading';
|
if (dlState === 'running') cardClass += ' downloading';
|
||||||
|
|
||||||
var statusEl = '<div class="checkbox-indicator">' + (sel ? '\u2713' : '') + '</div>';
|
var statusEl = '<div class="checkbox-indicator">' + (sel ? '\u2713' : '') + '</div>';
|
||||||
var extraLine = '';
|
var extraLine = '';
|
||||||
|
if (isStored && dlState !== 'running') {
|
||||||
|
statusEl = '<div class="status-icon" title="Auf Hetzner gespeichert">\ud83d\udcbe</div>';
|
||||||
|
}
|
||||||
if (dlState === 'running') {
|
if (dlState === 'running') {
|
||||||
var prog = dlProgress[String(f.tid)];
|
var prog = dlProgress[String(f.tid)];
|
||||||
statusEl = '<div class="status-icon">\u2b07</div>';
|
statusEl = '<div class="status-icon">\u2b07</div>';
|
||||||
|
|
@ -733,12 +747,23 @@ def api_films():
|
||||||
films = sorted(seen_titles.values(), key=lambda x: x.get("start_date", ""), reverse=True)
|
films = sorted(seen_titles.values(), key=lambda x: x.get("start_date", ""), reverse=True)
|
||||||
dl_log = _load_download_log()
|
dl_log = _load_download_log()
|
||||||
|
|
||||||
|
import re as _re
|
||||||
|
def _norm_title(s):
|
||||||
|
return _re.sub(r'\s+', ' ', _re.sub(r'[^\w\s]', ' ', s)).strip().lower()
|
||||||
|
|
||||||
|
stored_norms = set()
|
||||||
|
for fp in DOWNLOAD_DIR.iterdir():
|
||||||
|
if fp.suffix == ".mp4" and fp.stat().st_size > 1_000_000:
|
||||||
|
raw = fp.stem.rsplit(" (", 1)[0]
|
||||||
|
stored_norms.add(_norm_title(raw))
|
||||||
|
|
||||||
return jsonify({
|
return jsonify({
|
||||||
"films": films,
|
"films": films,
|
||||||
"total": len(entries),
|
"total": len(entries),
|
||||||
"kino": sum(1 for f in films if f["cinema"]),
|
"kino": sum(1 for f in films if f["cinema"]),
|
||||||
"urgent": sum(1 for f in films if f["days_left"] <= 7),
|
"urgent": sum(1 for f in films if f["days_left"] <= 7),
|
||||||
"downloads": dl_log,
|
"downloads": dl_log,
|
||||||
|
"stored_titles": list(stored_norms),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue