Files
grzegorz/grzegorz/playlist_data.py

50 lines
1.8 KiB
Python

from .metadatafetch import get_metadata
from . import nyasync
#Used in api.playlist_get() and api.loadfile()
class PlaylistDataCache:
def __init__(self, auto_fetch_data = False):
self.filepath_data_map = {}
self.auto_fetch_data = auto_fetch_data
self.jobs = None
def add_data(self, filepath, data=None):
if data:
self.filepath_data_map[filepath] = data
async def run(self):
if not self.auto_fetch_data: return
self.jobs = nyasync.Queue()
async for filename in self.jobs:
print("Fetching metadata for ", repr(filename))
data = await get_metadata(filename)
#might already be gone by this point:
if filename in self.filepath_data_map:
self.filepath_data_map[filename].update(data)
del self.filepath_data_map[filename]["fetching"]
def add_data_to_playlist(self, playlist):
seen = set()
for item in playlist:
if "filename" in item:
seen.add(item["filename"])
if item["filename"] in self.filepath_data_map:
new_item = item.copy()
new_item["data"] = self.filepath_data_map[item["filename"]]
yield new_item
continue
elif self.auto_fetch_data:
self.filepath_data_map[item["filename"]] = {"fetching": True}
self.jobs.put_nowait(item["filename"])
new_item = item.copy()
new_item["data"] = {"fetching": True}
yield new_item
continue
yield item
not_seen = set(self.filepath_data_map.keys()) - seen
for name in not_seen:
del self.filepath_data_map[name]