rettelser

This commit is contained in:
2026-04-19 17:19:59 +02:00
parent c966d38f11
commit fb7622549c
7 changed files with 81 additions and 33 deletions

View File

@@ -304,11 +304,15 @@ MIGRATIONS: dict[int, list[str]] = {
12: [
# Tabel til at huske slettede playlister — til sync med serveren
"""CREATE TABLE IF NOT EXISTS deleted_playlists (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
deleted_at TEXT NOT NULL DEFAULT (datetime('now'))
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
deleted_at TEXT NOT NULL DEFAULT (datetime('now'))
)""",
],
13: [
# Tilføj api_project_id så serveren præcist ved hvilken playlist der skal slettes
"""ALTER TABLE deleted_playlists ADD COLUMN api_project_id TEXT""",
],
}
@@ -546,6 +550,24 @@ def create_playlist(name: str, description: str = "", tags: str = "") -> int:
return cur.lastrowid
def delete_playlist(playlist_id: int):
"""
Slet en playliste lokalt og registrér sletningen til næste sync.
Gemmer api_project_id så serveren præcist ved hvad der skal slettes.
"""
with get_db() as conn:
row = conn.execute(
"SELECT name, api_project_id FROM playlists WHERE id=?",
(playlist_id,)
).fetchone()
if row:
conn.execute(
"INSERT INTO deleted_playlists (name, api_project_id) VALUES (?,?)",
(row["name"], row["api_project_id"] or None)
)
conn.execute("DELETE FROM playlists WHERE id=?", (playlist_id,))
def create_linked_playlist(name: str, api_project_id: str,
permission: str = "view",
description: str = "", tags: str = "") -> int:

View File

@@ -110,19 +110,29 @@ class SyncManager:
try:
# 1. Push lokal data op — inkl. sletninger
payload = self._build_push_payload()
deleted = payload.get("deleted_playlists", [])
logger.info(f"Sync push — {len(payload['songs'])} sange, "
f"{len(payload['playlists'])} playlister, "
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}")
# Ryd deleted_playlists nu de er sendt
if payload.get("deleted_playlists"):
# 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.
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
if deleted:
conn = sqlite3.connect(self._db_path)
conn.execute("DELETE FROM deleted_playlists")
conn.commit()
conn.close()
# 2. Pull — nu er sletninger gennemført på serveren
pull_result = self._get("/sync/pull")
self._apply_pull(pull_result)
logger.info(f"deleted_playlists ryddet efter pull")
pl_count = len(pull_result.get("my_playlists", []))
logger.info(
@@ -240,11 +250,15 @@ class SyncManager:
"songs": pl_songs,
})
# Slettede playlister — skal fjernes fra serveren
# 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.
deleted = [
row["name"] for row in conn.execute(
"SELECT name FROM deleted_playlists"
row["api_project_id"]
for row in conn.execute(
"SELECT api_project_id FROM deleted_playlists"
).fetchall()
if row["api_project_id"]
]
conn.close()
@@ -282,14 +296,18 @@ class SyncManager:
d.get("stepsheet_url",""), existing["id"]))
# Importer/opdater egne playlister fra server — server er sandhed
# Hent navne på lokalt slettede playlister så vi ikke genskaber dem
# Hent både navne og server-IDs på lokalt slettede playlister
try:
deleted_names = set(
row["name"] for row in conn.execute(
"SELECT name FROM deleted_playlists"
).fetchall()
)
deleted_rows = conn.execute(
"SELECT name, api_project_id FROM deleted_playlists"
).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", []):
@@ -299,7 +317,10 @@ class SyncManager:
continue
# Spring over hvis listen er markeret som slettet lokalt
if name in deleted_names:
# Tjek på server-ID (præcist) og navn (fallback)
if server_id in deleted_server_ids:
continue
if name in deleted_names and not server_id:
continue
existing = conn.execute(
@@ -408,4 +429,4 @@ class SyncManager:
position += 1
conn.commit()
conn.close()
conn.close()