"""Channel loading and path configuration.""" import json import re from pathlib import Path from .config import CHANNELS_FILE, MOVIES_ROOT, SERIES_ROOT def resolve_path(path_key: str) -> Path | None: """Resolve a channel path key to an absolute Path. Returns None if invalid.""" path_key = path_key.strip("/") if path_key == "movies": return MOVIES_ROOT if path_key.startswith("series/"): subpath = path_key[7:] return SERIES_ROOT / subpath return None def normalize_path_config(entry) -> dict: """ Normalize a path entry from channels.json. Entry can be: - String: "series/W817" -> {path_key, display_name, tmdb_search, tmdb_id} - Object: {"path": "series/W817", "display_name": "...", "tmdb_search": "...", "tmdb_id": ...} """ if isinstance(entry, str): return {"path_key": entry.strip(), "display_name": None, "tmdb_search": None, "tmdb_id": None} if isinstance(entry, dict): path_key = (entry.get("path") or entry.get("path_key") or "").strip() if not path_key: return {"path_key": "", "display_name": None, "tmdb_search": None, "tmdb_id": None} raw_id = entry.get("tmdb_id") tmdb_id = None if raw_id is not None: if isinstance(raw_id, int) and raw_id > 0: tmdb_id = raw_id else: m = re.match(r"^(\d+)", str(raw_id).strip()) if m: tmdb_id = int(m.group(1)) return { "path_key": path_key, "display_name": (entry.get("display_name") or "").strip() or None, "tmdb_search": (entry.get("tmdb_search") or "").strip() or None, "tmdb_id": tmdb_id, } return {"path_key": "", "display_name": None, "tmdb_search": None, "tmdb_id": None} class ChannelRepository: """Loads and provides channel configuration from channels.json.""" def __init__(self, channels_file: Path = CHANNELS_FILE): self._channels_file = channels_file def get_all(self) -> list[dict]: """Load and return all channels.""" if not self._channels_file.exists(): return [] with open(self._channels_file, encoding="utf-8") as f: data = json.load(f) return data.get("channels", []) def get_by_id(self, channel_id: str) -> dict | None: """Return the channel with the given id, or None.""" for ch in self.get_all(): if ch.get("id") == channel_id: return ch return None