diff --git a/src/carddav_client.py b/src/carddav_client.py
index 03f1d81..6fb6fef 100644
--- a/src/carddav_client.py
+++ b/src/carddav_client.py
@@ -98,13 +98,11 @@ class CardDAVClient:
return self._absolute(href.text)
raise RuntimeError("Keine addressbook-Collection gefunden")
- def sync_collection(self, collection_url: str, sync_token: str | None):
+ def sync_collection(self, collection_url: str, sync_token: str | None, fetch_missing: bool = True):
"""
Führt REPORT sync-collection aus.
Gibt (changed_vcards, etags, deleted_hrefs, new_sync_token) zurück.
- changed_vcards: list[str] roher vCard-Text
- etags: list[str|None] ETag pro vCard (None wenn nicht vorhanden)
- deleted_hrefs: list[str] Hrefs von gelöschten Kontakten (status 404)
+ fetch_missing: Wenn True, werden Kontakte ohne address-data per GET nachgeholt.
"""
token_element = f"{sync_token}" if sync_token else ""
body = f"""
@@ -141,10 +139,12 @@ class CardDAVClient:
logger.debug(" UPSERT href=%s etag=%s (inline data)", href, etag)
vcards.append(data.text)
etags.append(etag)
- else:
+ elif fetch_missing:
logger.debug(" UPSERT href=%s etag=%s (keine Daten, hole per GET)", href, etag)
if href:
missing_hrefs.append((href, etag))
+ else:
+ logger.debug(" SKIP href=%s etag=%s (keine Daten, fetch_missing=False)", href, etag)
for href, etag in missing_hrefs:
vcard_text = self._get_vcard_by_href(collection_url, href)
diff --git a/src/sync.py b/src/sync.py
index 21f88db..2bc7675 100644
--- a/src/sync.py
+++ b/src/sync.py
@@ -38,6 +38,9 @@ def sync_account(conn, account, href_to_uid_cache: dict):
else:
logger.warning("[%s] vCard konnte nicht geparst werden, überspringe", account.name)
db.replace_all_contacts_for_account(conn, account.name, contacts, run_id)
+ _, _, _, new_token = client.sync_collection(collection_url, None, fetch_missing=False)
+ if new_token:
+ db.save_sync_token(conn, account.name, new_token)
db.finish_sync_run(conn, run_id, "success", upserted=len(contacts), deleted=0)
logger.info("[%s] Initialer Sync abgeschlossen: %d Kontakte", account.name, len(contacts))
return
@@ -56,6 +59,9 @@ def sync_account(conn, account, href_to_uid_cache: dict):
else:
logger.warning("[%s] vCard konnte nicht geparst werden, überspringe", account.name)
db.replace_all_contacts_for_account(conn, account.name, contacts, run_id)
+ _, _, _, new_token = client.sync_collection(collection_url, None, fetch_missing=False)
+ if new_token:
+ db.save_sync_token(conn, account.name, new_token)
db.finish_sync_run(conn, run_id, "success", upserted=len(contacts), deleted=0)
logger.info("[%s] Re-Sync abgeschlossen: %d Kontakte", account.name, len(contacts))
return