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

@@ -304,13 +304,16 @@ 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
# Soft delete: is_deleted=1 i stedet for at slette rækken.
# Giver sync mulighed for at sende sletningen til serveren.
"""ALTER TABLE playlists ADD COLUMN is_deleted INTEGER NOT NULL DEFAULT 0""",
# api_project_id kolonne på deleted_playlists (hvis den mangler fra migration 12)
"""ALTER TABLE deleted_playlists ADD COLUMN api_project_id TEXT""",
],
}
@@ -550,24 +553,6 @@ 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:
@@ -614,7 +599,7 @@ def get_playlists(tag_filter: str | None = None) -> list[sqlite3.Row]:
SELECT p.*, COUNT(ps.id) as song_count
FROM playlists p
LEFT JOIN playlist_songs ps ON ps.playlist_id = p.id
WHERE p.name != ? AND (
WHERE p.name != ? AND p.is_deleted = 0 AND (
p.tags LIKE ? OR p.tags LIKE ? OR
p.tags LIKE ? OR p.tags = ?
)
@@ -632,13 +617,27 @@ def get_playlists(tag_filter: str | None = None) -> list[sqlite3.Row]:
SELECT p.*, COUNT(ps.id) as song_count
FROM playlists p
LEFT JOIN playlist_songs ps ON ps.playlist_id = p.id
WHERE p.name != ?
WHERE p.name != ? AND p.is_deleted = 0
GROUP BY p.id
ORDER BY p.created_at DESC
""", ("__aktiv__",)).fetchall()
return rows
def delete_playlist(playlist_id: int):
"""
Soft-slet en playliste: sæt is_deleted=1 i stedet for at fjerne rækken.
Sync kan derefter sende sletningen til serveren via api_project_id.
"""
with get_db() as conn:
conn.execute(
"UPDATE playlists SET is_deleted=1 WHERE id=?",
(playlist_id,)
)
def add_song_to_playlist(playlist_id: int, song_id: str, position: int | None = None) -> int:
with get_db() as conn:
if position is None:
@@ -895,6 +894,4 @@ def get_dance_name_suggestions(prefix: str, limit: int = 20) -> list[str]:
result.append(f"{s['name']} / {s['level_name']}")
else:
result.append(s["name"])
return result
return result