diff --git a/app.py b/app.py index 0f3fecf..2b1c48a 100644 --- a/app.py +++ b/app.py @@ -1534,43 +1534,47 @@ def r_storage_info(): devs = usb_devices() result = [] + src_ports = {sp['port'] for sp in _resolve_source_ports(cfg)} + dst_port = cfg.get('dest_port') + def _du_for_dev(dev): mp, owned = ensure_mount(dev) if not mp: - return dict(mounted=False, total=None, used=None, free=None, pct=None) + return dict(total=None, used=None, free=None, pct=None) try: du = shutil.disk_usage(mp) - return dict(mounted=True, total=du.total, used=du.used, free=du.free, + return dict(total=du.total, used=du.used, free=du.free, pct=round(du.used / du.total * 100) if du.total else 0) except Exception: - return dict(mounted=False, total=None, used=None, free=None, pct=None) + return dict(total=None, used=None, free=None, pct=None) finally: if owned: subprocess.run(['umount', mp], capture_output=True) - for sp in _resolve_source_ports(cfg): - dev = next((d for d in devs if d['usb_port'] == sp['port']), None) - entry = dict(type='source', label=sp.get('label') or f"Port {sp['port']}", - port=sp['port'], mounted=False, - total=None, used=None, free=None, pct=None) - if dev: - entry.update(_du_for_dev(dev)) + for dev in devs: + port = dev['usb_port'] + if port in src_ports: + role = 'source' + elif port == dst_port: + role = 'dest' + else: + role = 'other' + entry = dict( + role=role, + label=dev.get('label') or dev.get('device') or f'Port {port}', + port=port, + device=dev.get('device', ''), + size_str=dev.get('size', ''), + ) + entry.update(_du_for_dev(dev)) result.append(entry) if cfg.get('dest_type') == 'internal': - entry = dict(type='dest', + entry = dict(role='dest', label=cfg.get('internal_dest_label') or 'Interner Speicher', - port='__internal__') + port='__internal__', device='internal', size_str='') entry.update(_du_for_dev({'internal': True})) result.append(entry) - elif cfg.get('dest_port'): - dev = next((d for d in devs if d['usb_port'] == cfg['dest_port']), None) - entry = dict(type='dest', label=cfg.get('dest_label') or f"Port {cfg['dest_port']}", - port=cfg['dest_port'], mounted=False, - total=None, used=None, free=None, pct=None) - if dev: - entry.update(_du_for_dev(dev)) - result.append(entry) return jsonify(result) @@ -2503,8 +2507,7 @@ body{background:var(--bg);color:var(--txt);font-family:-apple-system,BlinkMacSys
USB Ports & Datei-Explorer - - +
@@ -2618,17 +2621,6 @@ body{background:var(--bg);color:var(--txt);font-family:-apple-system,BlinkMacSys
- - -
+
@@ -3874,60 +3867,47 @@ async function pollSysinfo(){ db.className='si-fill '+(s.disk_pct>=90?'hot':s.disk_pct>=75?'warn':'ok'); } }catch(e){} + loadStorageInfo(); } -// -- Speicher-Panel ----------------------------------------------------------- -function fmtBytes(b){ - if(b==null) return '–'; - if(b<1024**3) return (b/1024**2).toFixed(1)+' MB'; - return (b/1024**3).toFixed(2)+' GB'; -} -let storagePanelOpen=false; -function toggleStoragePanel(){ - storagePanelOpen=!storagePanelOpen; - const p=$('storage-panel'); - p.style.display=storagePanelOpen?'block':'none'; - if(storagePanelOpen) loadStorageInfo(); -} +// -- Speicher (System-Karte) -------------------------------------------------- async function loadStorageInfo(){ const list=$('storage-list'); - list.innerHTML='
Wird geladen…
'; + if(!list) return; try{ const items=await api('/storage-info'); - if(!items||!items.length){ - list.innerHTML='
Keine Geräte konfiguriert.
'; - return; - } + if(!items||!items.length){ list.innerHTML=''; return; } list.innerHTML=items.map(it=>{ - const icon=it.type==='source'?'▲':'▼'; - const typeLabel=it.type==='source'?'Quelle':'Ziel'; - const color=it.type==='source'?'var(--grn)':'var(--acc)'; - if(!it.mounted||it.total==null){ - return `
- ${icon} + const roleColor=it.role==='source'?'var(--grn)':it.role==='dest'?'var(--acc)':'var(--sub)'; + const roleIcon=it.role==='source'?'▲':it.role==='dest'?'▼':'■'; + const roleLabel=it.role==='source'?'Quelle':it.role==='dest'?'Ziel':'Gerät'; + const portStr=it.port==='__internal__'?'intern':'Port '+it.port; + if(it.total==null){ + const fallback=it.size_str?it.size_str:'–'; + return `
+ ${roleIcon}
-
${it.label}
-
${typeLabel} · Port ${it.port==='__internal__'?'intern':it.port} · nicht verbunden
+
${it.label}
+
${roleLabel} · ${portStr} · ${fallback}
`; } const pct=it.pct||0; const barCls=pct>=90?'hot':pct>=75?'warn':'ok'; - return `
-
- ${icon} + const barColor=barCls==='hot'?'var(--red)':barCls==='warn'?'var(--ylw)':'var(--grn)'; + return `
+
+ ${roleIcon}
-
${it.label}
-
${typeLabel} · ${fmtBytes(it.used)} belegt · ${fmtBytes(it.free)} frei · ${fmtBytes(it.total)} gesamt
+
${it.label}
+
${roleLabel} · ${portStr} · ${fmtBytes(it.used)} / ${fmtBytes(it.total)} · ${fmtBytes(it.free)} frei
- ${pct}% + ${pct}%
`; }).join(''); - }catch(e){ - list.innerHTML='
Fehler beim Laden.
'; - } + }catch(e){} } // -- Kopier-Verlauf ----------------------------------------------------------- diff --git a/version.txt b/version.txt index 3116087..9d8637c 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.0.69 +1.0.70