rettelser
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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()
|
||||
Reference in New Issue
Block a user