#!/usr/bin/env python3 """ Path mapping utilities for NFOGuard Handles conversion between external service paths and container paths """ import os import re from pathlib import Path class PathMapper: """Handles path mapping between different environments""" def __init__(self): # Load path mappings from environment variables self.radarr_roots = self._parse_path_list(os.environ.get("RADARR_ROOT_FOLDERS", "")) self.sonarr_roots = self._parse_path_list(os.environ.get("SONARR_ROOT_FOLDERS", "")) self.movie_paths = self._parse_path_list(os.environ.get("MOVIE_PATHS", "")) self.tv_paths = self._parse_path_list(os.environ.get("TV_PATHS", "")) def _parse_path_list(self, path_string: str) -> list: """Parse comma-separated path string into list""" if not path_string: return [] return [p.strip() for p in path_string.split(",") if p.strip()] def sonarr_path_to_container_path(self, sonarr_path: str) -> str: """Convert Sonarr path to container path using environment mappings""" # Try to match against configured Sonarr root folders for i, sonarr_root in enumerate(self.sonarr_roots): if sonarr_path.startswith(sonarr_root): # Map to corresponding TV path if i < len(self.tv_paths): container_root = self.tv_paths[i] relative_path = sonarr_path[len(sonarr_root):].lstrip('/') return str(Path(container_root) / relative_path) if relative_path else container_root # No fallback - if path mapping fails, return original and let validation catch it return sonarr_path def radarr_path_to_container_path(self, radarr_path: str) -> str: """Convert Radarr path to container path using environment mappings""" print(f"DEBUG: radarr_path_to_container_path input: {radarr_path}") print(f"DEBUG: radarr_roots: {self.radarr_roots}") print(f"DEBUG: movie_paths: {self.movie_paths}") # Try to match against configured Radarr root folders for i, radarr_root in enumerate(self.radarr_roots): print(f"DEBUG: Checking radarr_root[{i}]: {radarr_root}") if radarr_path.startswith(radarr_root): print(f"DEBUG: Match found! Index {i}") # Map to corresponding movie path if i < len(self.movie_paths): container_root = self.movie_paths[i] relative_path = radarr_path[len(radarr_root):].lstrip('/') result = str(Path(container_root) / relative_path) if relative_path else container_root print(f"DEBUG: Mapped to: {result}") return result print(f"DEBUG: No match found, returning original: {radarr_path}") # No fallback - if path mapping fails, return original and let validation catch it return radarr_path def container_path_to_host_path(self, container_path: str) -> str: """Convert container path back to host path if needed""" # This might be needed for file operations return container_path