summaryrefslogtreecommitdiff
path: root/tidal_dl_ng/cache.py
blob: e9e28dfe3e3c9914d27ce7da331e27c774134b1b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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)