ICS → Discourse-Importeur über REST-API

Verhaltenshinweise aus Tests von ics_to_discourse.py

Ich habe eine Reihe von Tests mit diesem Skript durchgeführt (mit und ohne --time-only-dedupe) und dachte, es wäre nützlich, den Update-/Übernahmefluss im Detail zu dokumentieren.


1. Wie die Einzigartigkeit bestimmt wird

  • Standardmodus: Die Übernahme erfordert, dass Start + Ende + Ort exakt übereinstimmen.
  • Mit --time-only-dedupe: Die Übernahme erfordert nur Start + Ende; der Ort wird als „nahe genug“ behandelt.

Wenn kein vorhandenes Thema diesen Regeln entspricht, wird ein neues Thema erstellt.


2. Die Rolle des UID-Markers

  • Jedes Ereignisthema erhält einen versteckten HTML-Marker im ersten Beitrag:
  <!-- ICSUID:xxxxxxxxxxxxxxxx -->
  • Bei nachfolgenden Ausführungen sucht das Skript zuerst nach diesem Marker.
  • Wenn er gefunden wird, wird das Thema als UID-Übereinstimmung betrachtet und direkt aktualisiert, unabhängig davon, wie unübersichtlich oder veraltet der BESCHREIBUNGstext sein mag.
  • Dies macht die UID zum wahren Identitätsschlüssel. Sichtbare Beschreibungsfelder beeinflussen die Übereinstimmung nicht.

3. Update-Fluss mit UID-Übereinstimmung

  1. Das Skript ruft den ersten Beitrag ab und entfernt den Marker:
 old_clean = strip_marker(old_raw)
 fresh_clean = strip_marker(fresh_raw)
  1. Wenn old_clean == fresh_clean: kein Update (verhindert Änderungen).
  2. Wenn sie sich unterscheiden: Prüfen, ob die Änderung „bedeutsam“ ist:
meaningful = (
    _norm_time(old_attrs.get("start")) != _norm_time(new_attrs.get("start"))
    or _norm_time(old_attrs.get("end")) != _norm_time(new_attrs.get("end"))
    or _norm_loc(old_attrs.get("location")) != _norm_loc(new_attrs.get("location"))
)
  • Wenn meaningful = True → Update mit Bump (Thema steigt in „Neueste“ auf).
  • Wenn meaningful = False → Update leise (bypass_bump=True → nur Überarbeitung, kein Bump).
  1. Tags werden zusammengeführt (stellt sicher, dass statische/Standard-Tags vorhanden sind, entfernt niemals Moderator-/manuelle Tags).
  2. Titel und Kategorie werden bei einem Update niemals geändert.

  1. Update-Fluss ohne UID-Übereinstimmung
  2. Das Skript versucht die Übernahme:
    • Erstellt Kandidaten-Tripel aus Start/Ende/Ort (oder nur Start/Ende mit --time-only-dedupe).
    • Sucht in /search.json und /latest.json nach einem vorhandenen Ereignis mit übereinstimmenden Attributen.
    • Wenn gefunden → Übernimmt dieses Thema, rüstet es mit UID-Marker + Tags nach (Text bleibt in diesem Stadium unverändert).
    • Wenn nicht gefunden → Erstellt ein brandneues Thema mit dem Marker und den Tags.
  3. Sobald übernommen oder erstellt, werden alle zukünftigen Synchronisierungen direkt über die UID aufgelöst.

  1. Praktische Konsequenzen
    • Zeitänderungen
    • Standard: Übernahme schlägt fehl (Zeiten unterscheiden sich) → neues Thema wird erstellt.
    • Mit --time-only-dedupe: Übernahme schlägt auf die gleiche Weise fehl; neues Thema wird erstellt.
    • Ortsänderungen
    • Standard: Übernahme schlägt fehl (Ort unterscheidet sich) → neues Thema wird erstellt.
    • Mit --time-only-dedupe: Übernahme gelingt (Zeiten stimmen überein), aber die Ortsänderung wird als „bedeutsam“ gekennzeichnet → Update mit Bump.
    • Beschreibungsänderungen
    • Wenn sich der BESCHREIBUNGstext ändert, aber Start/Ende/Ort nicht:
    • Der Text wird leise aktualisiert (bypass_bump=True).
    • Eine Überarbeitung des Themas wird erstellt, aber kein Bump in „Neueste“.
    • Wenn die BESCHREIBUNG unverändert ist (oder nur Rauschen wie „Zuletzt aktualisiert:“ enthält, das normalisiert wird), erfolgt überhaupt keine Aktualisierung.
    • UID-Marker
    • Stellt eine zuverlässige Übereinstimmung bei zukünftigen Synchronisierungen sicher.
    • Bedeutet, dass unübersichtliche BESCHREIBUNGsfelder nicht beeinflussen, ob das richtige Thema gefunden wird.

  1. Warum die BESCHREIBUNG manchmal „gleich bleibt“
    Das Skript vergleicht den gesamten Text (abzüglich des UID-Markers).
    Wenn nur eine volatile Zeile wie „Zuletzt aktualisiert:“ unterschiedlich ist, diese aber normalisiert wird (z. B. Leerzeichen, Zeilenumbrüche, Unicode), erscheinen old_clean und fresh_clean identisch → es wird keine Aktualisierung vorgenommen.
    Dies ist beabsichtigt, um Änderungen durch Rauschen im Feed zu verhindern.

Zusammenfassung
• Zeit bestimmt die Einzigartigkeit (erstellt immer ein neues Thema, wenn sich die Zeiten ändern).
• Ortsänderungen → sichtbarer Bump (damit Benutzer Veranstaltungsort-Updates bemerken).
• Beschreibungsänderungen → leises Update (Überarbeitung, aber kein Bump).
• UID-Marker = zuverlässiger Identitätsschlüssel, stellt sicher, dass das richtige Thema immer gefunden wird, auch wenn die BESCHREIBUNG veraltet oder unübersichtlich ist.

Dies stellt eine gute Balance dar: wichtige Änderungen werden in „Neueste“ angezeigt, unwichtige Änderungen bleiben unsichtbar.