Bedre sync

This commit is contained in:
2026-04-19 19:15:16 +02:00
parent fb7622549c
commit 9e5ddec184
3 changed files with 53 additions and 58 deletions

View File

@@ -57,10 +57,12 @@ class SyncManager:
logger.info(f"Push OK: {len(payload['songs'])} sange")
result = self._post("/sync/push", payload)
self._save_playlist_ids(result.get("playlist_id_map", {}))
# Ryd deleted_playlists nu de er sendt til serveren
# Fjern soft-slettede playlister permanent efter succesfuld push
if payload.get("deleted_playlists"):
conn = sqlite3.connect(self._db_path)
conn.execute("DELETE FROM deleted_playlists")
conn.execute(
"DELETE FROM playlists WHERE is_deleted=1 AND api_project_id IS NOT NULL"
)
conn.commit()
conn.close()
logger.info(f"Push OK: {result.get('songs_synced', '?')} sange synkroniseret")
@@ -116,23 +118,26 @@ class SyncManager:
f"sletter {len(deleted)}: {deleted}")
push_result = self._post("/sync/push", payload)
self._save_playlist_ids(push_result.get("playlist_id_map", {}))
logger.info(f"Push svar: {push_result}")
logger.info(f"Push svar: status={push_result.get('status')}, "
f"sange={push_result.get('songs_synced', 0)}, "
f"playlister={push_result.get('playlists_synced', 0)}")
# 2. Pull — sletninger er nu gennemført på serveren.
# VIGTIGT: ryd deleted_playlists EFTER pull, så _apply_pull
# stadig kan filtrere de slettede lister fra.
# _apply_pull filtrerer is_deleted=1 rækker fra automatisk.
pull_result = self._get("/sync/pull")
pl_names = [p.get("name") for p in pull_result.get("my_playlists", [])]
logger.info(f"Pull modtog {len(pl_names)} playlister: {pl_names}")
self._apply_pull(pull_result)
# Ryd deleted_playlists nu pull er kørt og filtreringen er sket
# Fjern soft-slettede playlister permanent nu serveren er opdateret
if deleted:
conn = sqlite3.connect(self._db_path)
conn.execute("DELETE FROM deleted_playlists")
conn.execute(
"DELETE FROM playlists WHERE is_deleted=1 AND api_project_id IS NOT NULL"
)
conn.commit()
conn.close()
logger.info(f"deleted_playlists ryddet efter pull")
logger.info(f"Soft-slettede playlister fjernet lokalt efter sync")
pl_count = len(pull_result.get("my_playlists", []))
logger.info(
@@ -252,13 +257,13 @@ class SyncManager:
# Slettede playlister — skal fjernes fra serveren.
# Serveren forventer en liste af strings (api_project_id).
# Playlister uden api_project_id har aldrig nået serveren — ignorer dem.
# Kun playlister der faktisk er nået serveren (har api_project_id).
deleted = [
row["api_project_id"]
for row in conn.execute(
"SELECT api_project_id FROM deleted_playlists"
"SELECT api_project_id FROM playlists "
"WHERE is_deleted=1 AND api_project_id IS NOT NULL AND api_project_id != ''"
).fetchall()
if row["api_project_id"]
]
conn.close()
@@ -296,19 +301,14 @@ class SyncManager:
d.get("stepsheet_url",""), existing["id"]))
# Importer/opdater egne playlister fra server — server er sandhed
# Hent både navne og server-IDs på lokalt slettede playlister
try:
deleted_rows = conn.execute(
"SELECT name, api_project_id FROM deleted_playlists"
# Hent server-IDs på soft-slettede playlister så vi springer dem over
deleted_server_ids = {
row["api_project_id"]
for row in conn.execute(
"SELECT api_project_id FROM playlists "
"WHERE is_deleted=1 AND api_project_id IS NOT NULL"
).fetchall()
deleted_server_ids = {
row["api_project_id"] for row in deleted_rows
if row["api_project_id"]
}
deleted_names = {row["name"] for row in deleted_rows}
except Exception:
deleted_server_ids = set()
deleted_names = set()
}
for pl in data.get("my_playlists", []):
server_id = pl.get("server_id")
@@ -316,12 +316,9 @@ class SyncManager:
if not server_id or not name:
continue
# Spring over hvis listen er markeret som slettet lokalt
# Tjek på server-ID (præcist) og navn (fallback)
# Spring over hvis listen er soft-slettet lokalt
if server_id in deleted_server_ids:
continue
if name in deleted_names and not server_id:
continue
existing = conn.execute(
"SELECT id FROM playlists WHERE api_project_id=?", (server_id,)