181 lines
6.6 KiB
Python
181 lines
6.6 KiB
Python
"""
|
|
share_dialog.py — Forenklet del-dialog.
|
|
Kun ejer kan dele. Delte brugere får listen ved næste sync.
|
|
"""
|
|
from PyQt6.QtWidgets import (
|
|
QDialog, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit,
|
|
QPushButton, QComboBox, QFrame, QListWidget, QListWidgetItem,
|
|
QMessageBox,
|
|
)
|
|
from PyQt6.QtCore import Qt
|
|
|
|
|
|
class ShareDialog(QDialog):
|
|
def __init__(self, playlist_id: str, playlist_name: str,
|
|
server_url: str, token: str, parent=None):
|
|
super().__init__(parent)
|
|
self._playlist_id = playlist_id
|
|
self._playlist_name = playlist_name
|
|
self._server_url = server_url.rstrip("/")
|
|
self._token = token
|
|
|
|
self.setWindowTitle(f"Del — {playlist_name}")
|
|
self.setMinimumWidth(440)
|
|
self._build_ui()
|
|
self._load_shares()
|
|
self._load_visibility()
|
|
|
|
def _headers(self):
|
|
return {
|
|
"Content-Type": "application/json",
|
|
"Authorization": f"Bearer {self._token}",
|
|
}
|
|
|
|
def _build_ui(self):
|
|
layout = QVBoxLayout(self)
|
|
layout.setContentsMargins(12, 12, 12, 12)
|
|
layout.setSpacing(10)
|
|
|
|
# Synlighed
|
|
vis_frame = QFrame()
|
|
vis_frame.setObjectName("track_display")
|
|
vis_layout = QHBoxLayout(vis_frame)
|
|
vis_layout.setContentsMargins(10, 8, 10, 8)
|
|
vis_layout.addWidget(QLabel("Synlighed:"))
|
|
self._vis_combo = QComboBox()
|
|
self._vis_combo.addItem("Privat — kun dig", "private")
|
|
self._vis_combo.addItem("Delt — kun inviterede", "shared")
|
|
self._vis_combo.addItem("Public — hjemmesiden", "public")
|
|
vis_layout.addWidget(self._vis_combo, stretch=1)
|
|
btn_vis = QPushButton("Gem")
|
|
btn_vis.setFixedHeight(28)
|
|
btn_vis.clicked.connect(self._set_visibility)
|
|
vis_layout.addWidget(btn_vis)
|
|
layout.addWidget(vis_frame)
|
|
|
|
# Del med bruger
|
|
inv_frame = QFrame()
|
|
inv_frame.setObjectName("track_display")
|
|
inv_layout = QVBoxLayout(inv_frame)
|
|
inv_layout.setContentsMargins(10, 8, 10, 8)
|
|
inv_layout.setSpacing(6)
|
|
inv_layout.addWidget(QLabel("Del med (e-mail):"))
|
|
row = QHBoxLayout()
|
|
self._email_input = QLineEdit()
|
|
self._email_input.setPlaceholderText("bruger@eksempel.dk")
|
|
row.addWidget(self._email_input)
|
|
btn_inv = QPushButton("Del")
|
|
btn_inv.setFixedHeight(28)
|
|
btn_inv.clicked.connect(self._invite)
|
|
row.addWidget(btn_inv)
|
|
inv_layout.addLayout(row)
|
|
note = QLabel("Brugeren får listen ved næste synkronisering.\nKun du kan redigere listen.")
|
|
note.setObjectName("result_count")
|
|
note.setWordWrap(True)
|
|
inv_layout.addWidget(note)
|
|
layout.addWidget(inv_frame)
|
|
|
|
# Liste
|
|
lbl = QLabel("Delt med:")
|
|
lbl.setObjectName("track_meta")
|
|
layout.addWidget(lbl)
|
|
self._shares_list = QListWidget()
|
|
self._shares_list.setMaximumHeight(120)
|
|
layout.addWidget(self._shares_list)
|
|
|
|
btn_remove = QPushButton("✕ Fjern valgt deling")
|
|
btn_remove.clicked.connect(self._remove_share)
|
|
layout.addWidget(btn_remove)
|
|
|
|
self._status = QLabel("")
|
|
self._status.setObjectName("result_count")
|
|
self._status.setWordWrap(True)
|
|
layout.addWidget(self._status)
|
|
|
|
btn_close = QPushButton("Luk")
|
|
btn_close.clicked.connect(self.accept)
|
|
layout.addWidget(btn_close)
|
|
|
|
def _load_visibility(self):
|
|
try:
|
|
import urllib.request, json
|
|
req = urllib.request.Request(
|
|
f"{self._server_url}/sharing/playlists/{self._playlist_id}",
|
|
headers=self._headers()
|
|
)
|
|
with urllib.request.urlopen(req, timeout=8) as resp:
|
|
data = json.loads(resp.read())
|
|
vis = data.get("visibility", "private")
|
|
for i in range(self._vis_combo.count()):
|
|
if self._vis_combo.itemData(i) == vis:
|
|
self._vis_combo.setCurrentIndex(i)
|
|
break
|
|
except Exception:
|
|
pass
|
|
|
|
def _set_visibility(self):
|
|
vis = self._vis_combo.currentData()
|
|
try:
|
|
import urllib.request, json
|
|
req = urllib.request.Request(
|
|
f"{self._server_url}/sharing/playlists/{self._playlist_id}/visibility?visibility={vis}",
|
|
data=b"", headers=self._headers(), method="PATCH"
|
|
)
|
|
urllib.request.urlopen(req, timeout=8)
|
|
self._status.setText(f"✓ Synlighed gemt")
|
|
except Exception as e:
|
|
self._status.setText(f"⚠ {e}")
|
|
|
|
def _load_shares(self):
|
|
try:
|
|
import urllib.request, json
|
|
req = urllib.request.Request(
|
|
f"{self._server_url}/sharing/playlists/{self._playlist_id}/shares",
|
|
headers=self._headers()
|
|
)
|
|
with urllib.request.urlopen(req, timeout=8) as resp:
|
|
shares = json.loads(resp.read())
|
|
self._shares_list.clear()
|
|
for s in shares:
|
|
item = QListWidgetItem(s["email"])
|
|
item.setData(Qt.ItemDataRole.UserRole, s["id"])
|
|
self._shares_list.addItem(item)
|
|
except Exception as e:
|
|
self._status.setText(f"Kunne ikke hente delinger: {e}")
|
|
|
|
def _invite(self):
|
|
email = self._email_input.text().strip()
|
|
if not email or "@" not in email:
|
|
self._status.setText("⚠ Ugyldig e-mailadresse")
|
|
return
|
|
try:
|
|
import urllib.request, json
|
|
data = json.dumps({"email": email}).encode()
|
|
req = urllib.request.Request(
|
|
f"{self._server_url}/sharing/playlists/{self._playlist_id}/share",
|
|
data=data, headers=self._headers(), method="POST"
|
|
)
|
|
urllib.request.urlopen(req, timeout=8)
|
|
self._email_input.clear()
|
|
self._status.setText(f"✓ Delt med {email}")
|
|
self._load_shares()
|
|
except Exception as e:
|
|
self._status.setText(f"⚠ {e}")
|
|
|
|
def _remove_share(self):
|
|
item = self._shares_list.currentItem()
|
|
if not item:
|
|
return
|
|
share_id = item.data(Qt.ItemDataRole.UserRole)
|
|
try:
|
|
import urllib.request
|
|
req = urllib.request.Request(
|
|
f"{self._server_url}/sharing/playlists/{self._playlist_id}/share/{share_id}",
|
|
headers=self._headers(), method="DELETE"
|
|
)
|
|
urllib.request.urlopen(req, timeout=8)
|
|
self._status.setText("✓ Deling fjernet")
|
|
self._load_shares()
|
|
except Exception as e:
|
|
self._status.setText(f"⚠ {e}")
|