51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
"""Per-user notes, tags and favorites for sounds (user data folder, never the game folder)."""
|
|
import json
|
|
import os
|
|
|
|
from ackit.paths import user_dir
|
|
|
|
|
|
class UserData:
|
|
def __init__(self, path=None):
|
|
self.path = path or os.path.join(user_dir("data"), "sound_notes.json")
|
|
try:
|
|
self.data = json.load(open(self.path, encoding="utf-8"))
|
|
except (OSError, ValueError):
|
|
self.data = {}
|
|
|
|
def save(self):
|
|
tmp = self.path + ".tmp"
|
|
with open(tmp, "w", encoding="utf-8") as f:
|
|
json.dump(self.data, f, indent=1, ensure_ascii=False)
|
|
os.replace(tmp, self.path)
|
|
|
|
def _get(self, key):
|
|
return self.data.get(key, {})
|
|
|
|
def note(self, key):
|
|
return self._get(key).get("note", "")
|
|
|
|
def tags(self, key):
|
|
return self._get(key).get("tags", [])
|
|
|
|
def favorite(self, key):
|
|
return bool(self._get(key).get("fav"))
|
|
|
|
def update(self, key, note=None, tags=None, fav=None):
|
|
d = dict(self._get(key))
|
|
if note is not None:
|
|
d["note"] = note.strip()
|
|
if tags is not None:
|
|
d["tags"] = sorted({t.strip() for t in tags if t.strip()})
|
|
if fav is not None:
|
|
d["fav"] = bool(fav)
|
|
d = {k: v for k, v in d.items() if v}
|
|
if d:
|
|
self.data[key] = d
|
|
else:
|
|
self.data.pop(key, None)
|
|
self.save()
|
|
|
|
def all_tags(self):
|
|
return sorted({t for d in self.data.values() for t in d.get("tags", [])})
|