88 lines
3 KiB
Python
88 lines
3 KiB
Python
import json
|
|
import uuid
|
|
from pathlib import Path
|
|
from typing import List, Dict, Optional
|
|
|
|
DATA_FILE = Path("backend/data/user_playlists.json")
|
|
|
|
class PlaylistManager:
|
|
def __init__(self):
|
|
DATA_FILE.parent.mkdir(parents=True, exist_ok=True)
|
|
if not DATA_FILE.exists():
|
|
self._save_data([])
|
|
|
|
def _load_data(self) -> List[Dict]:
|
|
try:
|
|
with open(DATA_FILE, "r") as f:
|
|
return json.load(f)
|
|
except (json.JSONDecodeError, OSError):
|
|
return []
|
|
|
|
def _save_data(self, data: List[Dict]):
|
|
with open(DATA_FILE, "w") as f:
|
|
json.dump(data, f, indent=4)
|
|
|
|
def get_all(self) -> List[Dict]:
|
|
return self._load_data()
|
|
|
|
def get_by_id(self, playlist_id: str) -> Optional[Dict]:
|
|
playlists = self._load_data()
|
|
for p in playlists:
|
|
if p["id"] == playlist_id:
|
|
return p
|
|
return None
|
|
|
|
def create(self, name: str, description: str = "") -> Dict:
|
|
playlists = self._load_data()
|
|
new_playlist = {
|
|
"id": str(uuid.uuid4()),
|
|
"title": name,
|
|
"description": description,
|
|
"tracks": [],
|
|
"cover_url": "https://placehold.co/400?text=Playlist", # Default placeholder
|
|
"is_user_created": True
|
|
}
|
|
playlists.append(new_playlist)
|
|
self._save_data(playlists)
|
|
return new_playlist
|
|
|
|
def update(self, playlist_id: str, name: str = None, description: str = None) -> Optional[Dict]:
|
|
playlists = self._load_data()
|
|
for p in playlists:
|
|
if p["id"] == playlist_id:
|
|
if name: p["title"] = name
|
|
if description: p["description"] = description
|
|
self._save_data(playlists)
|
|
return p
|
|
return None
|
|
|
|
def delete(self, playlist_id: str) -> bool:
|
|
playlists = self._load_data()
|
|
initial_len = len(playlists)
|
|
playlists = [p for p in playlists if p["id"] != playlist_id]
|
|
if len(playlists) < initial_len:
|
|
self._save_data(playlists)
|
|
return True
|
|
return False
|
|
|
|
def add_track(self, playlist_id: str, track: Dict) -> bool:
|
|
playlists = self._load_data()
|
|
for p in playlists:
|
|
if p["id"] == playlist_id:
|
|
# Check for duplicates? For now allow.
|
|
p["tracks"].append(track)
|
|
# Update cover if it's the first track
|
|
if len(p["tracks"]) == 1 and track.get("cover_url"):
|
|
p["cover_url"] = track["cover_url"]
|
|
self._save_data(playlists)
|
|
return True
|
|
return False
|
|
|
|
def remove_track(self, playlist_id: str, track_id: str) -> bool:
|
|
playlists = self._load_data()
|
|
for p in playlists:
|
|
if p["id"] == playlist_id:
|
|
p["tracks"] = [t for t in p["tracks"] if t.get("id") != track_id]
|
|
self._save_data(playlists)
|
|
return True
|
|
return False
|