progress.py setzt docs/progress-sync.md um (read_at in Serverzeit mit Uhrversatz, sent_at beim
Senden, force, Warteschlange je Buch, Neuanwendung nach dem Abgleich; dieselben Regeln wie
Ops.kt/ops.js). Der Reader speichert nur, was der Leser bewegt hat; wiederherstellen,
Umbruch und Sprünge schreiben nichts. Neuere Stellen anderer Geräte werden angeboten
("Auf X weitergelesen – springen?"), nie von allein angewendet; "w" springt zur weitesten
Stelle. Fortschritt als Textanteil in Zeichen statt 0.0.
Abgleich über GET /books/ (ohne Markierungs-Blobs), Bücher erst beim Öffnen geladen
(☁ in der Liste). `diora-tui login` meldet wie die Apps an, liest den vorhandenen Token,
leitet den Schlüssel aus dem Passwort ab und speichert beides geschützt (DPAPI).
DIORA_TUI_HOME legt alle Dateien in einen Ordner (platformdirs folgt unter Windows den
Umgebungsvariablen nicht). 35 Tests, tools/smoke_server.py gegen einen lokalen Server.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
30 lines
877 B
Python
30 lines
877 B
Python
"""Where the TUI keeps its files. `DIORA_TUI_HOME` moves all of it into one folder (tests, the
|
|
smoke script and anyone who wants a second account side by side use it); platformdirs' own
|
|
answer on Windows doesn't follow the LOCALAPPDATA/APPDATA environment variables."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
from pathlib import Path
|
|
|
|
from platformdirs import user_cache_dir, user_config_dir, user_data_dir
|
|
|
|
|
|
def _home() -> Path | None:
|
|
h = os.environ.get("DIORA_TUI_HOME")
|
|
return Path(h) if h else None
|
|
|
|
|
|
def data_dir() -> Path:
|
|
h = _home()
|
|
return h / "data" if h else Path(user_data_dir("diora-tui", "diora"))
|
|
|
|
|
|
def config_dir() -> Path:
|
|
h = _home()
|
|
return h / "config" if h else Path(user_config_dir("diora-tui", "diora"))
|
|
|
|
|
|
def cache_dir() -> Path:
|
|
h = _home()
|
|
return h / "cache" if h else Path(user_cache_dir("diora-tui", "diora"))
|