Bedre sync
This commit is contained in:
@@ -756,28 +756,40 @@ class PlaylistPanel(QWidget):
|
||||
def _change_dance(self, idx: int, song: dict):
|
||||
"""Lad brugeren vælge/skrive hvilken dans der vises for dette nummer."""
|
||||
from ui.dance_picker_dialog import DancePickerDialog
|
||||
dances = song.get("dances", [])
|
||||
current = song.get("active_dance", "")
|
||||
if not current:
|
||||
dances = song.get("dances", [])
|
||||
current = dances[0] if dances else ""
|
||||
current_choreo = song.get("active_choreo", "")
|
||||
|
||||
# Afgør om valget er permanent eller midlertidigt
|
||||
# Permanent: ingen dans tagget, eller valgt dans er ikke i de taggede
|
||||
# Midlertidig: sangen har flere danse og brugeren vælger en af dem
|
||||
|
||||
dlg = DancePickerDialog(
|
||||
current_dance=current,
|
||||
current_choreo=current_choreo,
|
||||
song_title=song.get("title", ""),
|
||||
existing_dances=dances,
|
||||
parent=self.window()
|
||||
)
|
||||
if dlg.exec():
|
||||
chosen = dlg.get_dance()
|
||||
choreo = dlg.get_choreo()
|
||||
choreo = "" # Koreograf redigeres i tag-editoren, ikke her
|
||||
if chosen:
|
||||
song["active_dance"] = chosen
|
||||
song["active_choreo"] = choreo
|
||||
self._refresh()
|
||||
self._sync_dance_to_db(idx, song)
|
||||
|
||||
# Gem permanent hvis sangen ikke allerede har denne dans tagget
|
||||
already_tagged = chosen in dances
|
||||
if not already_tagged:
|
||||
self._save_dance_permanently(idx, song, chosen, choreo)
|
||||
else:
|
||||
# Midlertidigt — kun dance_override på listen
|
||||
self._sync_dance_to_db(idx, song)
|
||||
|
||||
def _sync_dance_to_db(self, idx: int, song: dict):
|
||||
"""Gem dance_override til playlist_songs."""
|
||||
"""Gem dance_override til playlist_songs (midlertidigt valg)."""
|
||||
if not self._named_playlist_id:
|
||||
return
|
||||
try:
|
||||
@@ -791,6 +803,82 @@ class PlaylistPanel(QWidget):
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def _save_dance_permanently(self, idx: int, song: dict, dance_name: str, choreo: str = ""):
|
||||
"""
|
||||
Gem dans permanent på sangen:
|
||||
1. song_dances tabellen
|
||||
2. ID3-tag i filen (hvis tilgængelig)
|
||||
3. Opdater sang-dict så listen vises korrekt
|
||||
"""
|
||||
import uuid
|
||||
song_id = song.get("id", "")
|
||||
local_path = song.get("local_path", "")
|
||||
|
||||
try:
|
||||
from local.local_db import get_db
|
||||
with get_db() as conn:
|
||||
# Find eller opret dans
|
||||
dance_row = conn.execute(
|
||||
"SELECT id FROM dances WHERE name=? COLLATE NOCASE LIMIT 1",
|
||||
(dance_name,)
|
||||
).fetchone()
|
||||
if dance_row:
|
||||
dance_id = dance_row["id"]
|
||||
if choreo:
|
||||
conn.execute(
|
||||
"UPDATE dances SET choreographer=? WHERE id=? AND choreographer=''",
|
||||
(choreo, dance_id)
|
||||
)
|
||||
else:
|
||||
cur = conn.execute(
|
||||
"INSERT INTO dances (name, choreographer) VALUES (?,?)",
|
||||
(dance_name, choreo or "")
|
||||
)
|
||||
dance_id = cur.lastrowid
|
||||
|
||||
# Tilføj til song_dances
|
||||
existing = conn.execute(
|
||||
"SELECT id FROM song_dances WHERE song_id=? AND dance_id=?",
|
||||
(song_id, dance_id)
|
||||
).fetchone()
|
||||
if not existing:
|
||||
# Find næste dance_order
|
||||
max_order = conn.execute(
|
||||
"SELECT MAX(dance_order) FROM song_dances WHERE song_id=?",
|
||||
(song_id,)
|
||||
).fetchone()[0] or 0
|
||||
conn.execute(
|
||||
"INSERT INTO song_dances (id, song_id, dance_id, dance_order) VALUES (?,?,?,?)",
|
||||
(str(uuid.uuid4()), song_id, dance_id, max_order + 1)
|
||||
)
|
||||
|
||||
# Opdater sang-dict
|
||||
dances = song.get("dances", [])
|
||||
if dance_name not in dances:
|
||||
dances.append(dance_name)
|
||||
song["dances"] = dances
|
||||
song["active_dance"] = dance_name
|
||||
|
||||
# Gem i ID3-tag hvis filen er tilgængelig
|
||||
if local_path:
|
||||
try:
|
||||
from local.tag_reader import write_dance_to_file
|
||||
write_dance_to_file(local_path, dances)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Opdater også dance_override på listen
|
||||
self._sync_dance_to_db(idx, song)
|
||||
|
||||
import logging
|
||||
logging.getLogger(__name__).info(
|
||||
f"Dans gemt permanent: '{dance_name}' → '{song.get('title','?')}'"
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
import logging
|
||||
logging.getLogger(__name__).warning(f"Kunne ikke gemme dans permanent: {e}")
|
||||
|
||||
def _sync_ws_to_db(self, idx: int, song: dict):
|
||||
"""Gem is_workshop til playlist_songs — både navngiven og aktiv liste."""
|
||||
pl_ids = []
|
||||
@@ -1267,11 +1355,11 @@ class PlaylistPanel(QWidget):
|
||||
status = self._statuses[i]
|
||||
icon = self.STATUS_ICON.get(status, " ")
|
||||
|
||||
# Vis active_dance (override eller første dans) eller alle danse
|
||||
# Dans er primær tekst, sang er sekundær
|
||||
active = song.get("active_dance", "")
|
||||
if not active:
|
||||
dances = song.get("dances", [])
|
||||
active = dances[0] if dances else "ingen dans tagget"
|
||||
active = dances[0] if dances else "— ingen dans —"
|
||||
ws_tag = " 🎓" if song.get("is_workshop") else ""
|
||||
|
||||
# Tilgængeligheds-dot til højre — kun hvis tjekket (ikke yellow)
|
||||
@@ -1279,8 +1367,8 @@ class PlaylistPanel(QWidget):
|
||||
avail_color = {"green": "#27ae60", "red": "#e74c3c"}.get(avail, None)
|
||||
avail_tip = {"green": "Tilgængelig lokalt", "red": "Ikke fundet lokalt"}.get(avail, "")
|
||||
|
||||
text = (f"{i+1:>2}. {song.get('title','—')}{ws_tag}\n"
|
||||
f" {song.get('artist','')} · {active}")
|
||||
text = (f"{i+1:>2}. {active}{ws_tag}\n"
|
||||
f" {song.get('title','—')} · {song.get('artist','')}")
|
||||
item = QListWidgetItem(f"{icon} {text}")
|
||||
item.setData(Qt.ItemDataRole.UserRole, i)
|
||||
item.setData(Qt.ItemDataRole.UserRole + 1, avail_color)
|
||||
|
||||
Reference in New Issue
Block a user