diff --git a/media/cache.py b/media/cache.py index b12b0b0..0202ca6 100644 --- a/media/cache.py +++ b/media/cache.py @@ -14,6 +14,10 @@ import util +class ItemNotCachedError(Exception): + pass + + class MusicCache(dict): def __init__(self, db: MusicDatabase): super().__init__() @@ -142,7 +146,7 @@ def item(self): if self.id in self.lib: return self.lib[self.id] else: - raise ValueError(f"Uncached item of id {self.id}, type {self.type}.") + raise ItemNotCachedError(f"Uncached item of id {self.id}, type {self.type}.") def to_dict(self): dict = self.item().to_dict() diff --git a/media/playlist.py b/media/playlist.py index 75c7fb7..2fc035e 100644 --- a/media/playlist.py +++ b/media/playlist.py @@ -5,7 +5,8 @@ import time import variables as var -from media.cache import CachedItemWrapper, get_cached_wrapper_from_dict, get_cached_wrapper_by_id +from media.cache import (CachedItemWrapper, ItemNotCachedError, + get_cached_wrapper_from_dict, get_cached_wrapper_by_id) from database import Condition from media.item import ValidationFailedError, PreparationFailedError @@ -224,6 +225,15 @@ def _check_valid(self): self.validating_thread_lock.acquire() while len(self.pending_items) > 0: item = self.pending_items.pop() + try: + item.item() + except ItemNotCachedError: + # In some very subtle case, items are removed and freed from + # the playlist and the cache, before validation even starts, + # causes, freed items remain in pending_items. + # Simply ignore these items here. + continue + self.log.debug("playlist: validating %s" % item.format_debug_string()) ver = item.version