.vault-tools (ohne trading-plattform-pruefung und watermarks-remover), .claude/agents, .claude/skills, .claude/workflows, .claude/settings.json. Co-Authored-By: Claude Opus 5.5 <[email protected]>
51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
"""Entscheidet je Notiz, ob sie angelegt, aktualisiert oder übersprungen wird."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import hashlib
|
|
from dataclasses import dataclass
|
|
from enum import Enum
|
|
|
|
from bookstack.notiz import Notiz
|
|
|
|
|
|
class Aktion(Enum):
|
|
ANLEGEN = "anlegen"
|
|
AKTUALISIEREN = "aktualisieren"
|
|
UEBERSPRINGEN = "überspringen"
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Entscheidung:
|
|
aktion: Aktion
|
|
seiten_id: int | None
|
|
pruefsumme: str
|
|
begruendung: str
|
|
|
|
|
|
def berechne_pruefsumme(
|
|
titel: str, markdown: str, buch_id: int, kapitel_id: int | None
|
|
) -> str:
|
|
"""Deckt Inhalt *und* Ablageort ab — ein verschobenes Ziel gilt als Änderung."""
|
|
roh = "\x00".join([titel, str(buch_id), str(kapitel_id or 0), markdown])
|
|
return "sha256:" + hashlib.sha256(roh.encode("utf-8")).hexdigest()
|
|
|
|
|
|
def entscheide(notiz: Notiz, pruefsumme: str) -> Entscheidung:
|
|
roh_id = notiz.frontmatter.get("bookstack_page_id", "").strip()
|
|
if not roh_id:
|
|
return Entscheidung(Aktion.ANLEGEN, None, pruefsumme, "noch nie hochgeladen")
|
|
|
|
try:
|
|
seiten_id = int(roh_id)
|
|
except ValueError:
|
|
return Entscheidung(
|
|
Aktion.ANLEGEN, None, pruefsumme, f"bookstack_page_id unlesbar: {roh_id!r}"
|
|
)
|
|
|
|
if notiz.frontmatter.get("bookstack_hash", "").strip() == pruefsumme:
|
|
return Entscheidung(
|
|
Aktion.UEBERSPRINGEN, seiten_id, pruefsumme, "unverändert seit letztem Upload"
|
|
)
|
|
return Entscheidung(Aktion.AKTUALISIEREN, seiten_id, pruefsumme, "Inhalt hat sich geändert")
|