:lightning: comics cache
This commit is contained in:
@@ -1,25 +1,28 @@
|
||||
"""
|
||||
Comic data loader for YAML-based comic management.
|
||||
Comic data loader for YAML-based comic management with caching.
|
||||
|
||||
This module scans the data/comics/ directory for .yaml files,
|
||||
loads each comic's configuration, and builds the COMICS list.
|
||||
Caching is used to speed up subsequent loads.
|
||||
"""
|
||||
|
||||
import os
|
||||
import pickle
|
||||
import yaml
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def load_comics_from_yaml(comics_dir='data/comics'):
|
||||
def load_comics_from_yaml(comics_dir='data/comics', use_cache=True):
|
||||
"""
|
||||
Load all comic data from YAML files in the specified directory.
|
||||
Load all comic data from YAML files with optional caching.
|
||||
|
||||
Args:
|
||||
comics_dir: Path to directory containing comic YAML files
|
||||
use_cache: Whether to use cache (set to False to force reload)
|
||||
|
||||
Returns:
|
||||
List of comic dictionaries, sorted by comic number
|
||||
"""
|
||||
comics = []
|
||||
comics_path = Path(comics_dir)
|
||||
|
||||
if not comics_path.exists():
|
||||
@@ -27,6 +30,13 @@ def load_comics_from_yaml(comics_dir='data/comics'):
|
||||
comics_path.mkdir(parents=True, exist_ok=True)
|
||||
return []
|
||||
|
||||
# Cache file location
|
||||
cache_file = comics_path / '.comics_cache.pkl'
|
||||
|
||||
# Check if caching is disabled via environment variable
|
||||
if os.getenv('DISABLE_COMIC_CACHE') == 'true':
|
||||
use_cache = False
|
||||
|
||||
# Find all .yaml and .yml files
|
||||
yaml_files = list(comics_path.glob('*.yaml')) + list(comics_path.glob('*.yml'))
|
||||
|
||||
@@ -37,6 +47,28 @@ def load_comics_from_yaml(comics_dir='data/comics'):
|
||||
print(f"Warning: No YAML files found in '{comics_dir}'")
|
||||
return []
|
||||
|
||||
# Check if we can use cache
|
||||
if use_cache and cache_file.exists():
|
||||
cache_mtime = cache_file.stat().st_mtime
|
||||
|
||||
# Get the newest YAML file modification time
|
||||
newest_yaml_mtime = max(f.stat().st_mtime for f in yaml_files)
|
||||
|
||||
# If cache is newer than all YAML files, use it
|
||||
if cache_mtime >= newest_yaml_mtime:
|
||||
try:
|
||||
with open(cache_file, 'rb') as f:
|
||||
comics = pickle.load(f)
|
||||
print(f"Loaded {len(comics)} comics from cache")
|
||||
return comics
|
||||
except Exception as e:
|
||||
print(f"Warning: Failed to load cache: {e}")
|
||||
# Fall through to reload from YAML
|
||||
|
||||
# Load from YAML files (cache miss or disabled)
|
||||
print(f"Loading {len(yaml_files)} comic files from YAML...")
|
||||
comics = []
|
||||
|
||||
for yaml_file in yaml_files:
|
||||
try:
|
||||
with open(yaml_file, 'r', encoding='utf-8') as f:
|
||||
@@ -74,9 +106,35 @@ def load_comics_from_yaml(comics_dir='data/comics'):
|
||||
# Sort by comic number
|
||||
comics.sort(key=lambda c: c['number'])
|
||||
|
||||
# Save to cache
|
||||
if use_cache:
|
||||
try:
|
||||
with open(cache_file, 'wb') as f:
|
||||
pickle.dump(comics, f)
|
||||
print(f"Saved {len(comics)} comics to cache")
|
||||
except Exception as e:
|
||||
print(f"Warning: Failed to save cache: {e}")
|
||||
|
||||
return comics
|
||||
|
||||
|
||||
def clear_cache(comics_dir='data/comics'):
|
||||
"""
|
||||
Clear the comics cache file.
|
||||
|
||||
Args:
|
||||
comics_dir: Path to directory containing comic YAML files
|
||||
"""
|
||||
cache_file = Path(comics_dir) / '.comics_cache.pkl'
|
||||
if cache_file.exists():
|
||||
cache_file.unlink()
|
||||
print("Cache cleared")
|
||||
return True
|
||||
else:
|
||||
print("No cache file found")
|
||||
return False
|
||||
|
||||
|
||||
def validate_comics(comics):
|
||||
"""
|
||||
Validate the loaded comics for common issues.
|
||||
|
||||
Reference in New Issue
Block a user