summaryrefslogtreecommitdiff
path: root/tidal_dl_ng/cache.py
diff options
context:
space:
mode:
authorWarry <FunWarry@users.noreply.github.com>2025-12-03 09:40:49 +0100
committerWarry <FunWarry@users.noreply.github.com>2025-12-03 09:40:49 +0100
commit85f7e33b28985afd62a99d64b3e7a6883d62b072 (patch)
tree07d59dae4ed8be7b03cc2058eefdcf73d69596f6 /tidal_dl_ng/cache.py
parent0facd232dc089b164acd7255983f8f078aaaa462 (diff)
parentc077e2b4977ea3219bce9a0f7c4518e0838baf87 (diff)
downloadtidal-dl-ng-85f7e33b28985afd62a99d64b3e7a6883d62b072.tar.gz
Merge branch 'feature/informations-window' into fusion-refafac-setings
# Conflicts: # .gitignore
Diffstat (limited to 'tidal_dl_ng/cache.py')
-rw-r--r--tidal_dl_ng/cache.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/tidal_dl_ng/cache.py b/tidal_dl_ng/cache.py
new file mode 100644
index 0000000..e9e28df
--- /dev/null
+++ b/tidal_dl_ng/cache.py
@@ -0,0 +1,55 @@
+"""Cache management for GUI - LRU caches for performance optimization."""
+
+from PySide6 import QtCore, QtGui
+
+
+class TrackExtrasCache:
+ """Thread-safe LRU cache for track extra metadata."""
+
+ def __init__(self, max_size: int = 256):
+ self._lock = QtCore.QReadWriteLock()
+ self._data: dict[str, dict] = {}
+ self._order: list[str] = []
+ self._max_size = max_size
+
+ def get(self, track_id: str) -> dict | None:
+ """Get cached extras for a track ID."""
+ with QtCore.QReadLocker(self._lock):
+ return self._data.get(track_id)
+
+ def set(self, track_id: str, extras: dict) -> None:
+ """Cache extras for a track ID with LRU eviction."""
+ with QtCore.QWriteLocker(self._lock):
+ if track_id in self._data:
+ self._order.remove(track_id)
+ self._data[track_id] = extras
+ self._order.append(track_id)
+ if len(self._order) > self._max_size:
+ oldest = self._order.pop(0)
+ self._data.pop(oldest, None)
+
+
+class CoverPixmapCache:
+ """Thread-safe LRU cache for cover pixmaps to avoid re-downloading."""
+
+ def __init__(self, max_size: int = 100):
+ self._lock = QtCore.QReadWriteLock()
+ self._pixmaps: dict[str, QtGui.QPixmap] = {}
+ self._order: list[str] = []
+ self._max_size = max_size
+
+ def get(self, cover_url: str) -> QtGui.QPixmap | None:
+ """Get cached pixmap for a cover URL."""
+ with QtCore.QReadLocker(self._lock):
+ return self._pixmaps.get(cover_url)
+
+ def set(self, cover_url: str, pixmap: QtGui.QPixmap) -> None:
+ """Cache a pixmap with LRU eviction."""
+ with QtCore.QWriteLocker(self._lock):
+ if cover_url in self._pixmaps:
+ self._order.remove(cover_url)
+ self._pixmaps[cover_url] = pixmap
+ self._order.append(cover_url)
+ if len(self._order) > self._max_size:
+ oldest = self._order.pop(0)
+ self._pixmaps.pop(oldest, None)