From f5ae8c7768818e65d761ec0869f468553773c2ca Mon Sep 17 00:00:00 2001 From: SBCrumb Date: Sun, 14 Sep 2025 14:19:39 -0400 Subject: [PATCH] cleanup --- .env.fixed | 3 ++ SUMMARY.md | 82 ++++++++++++++++++++++++++------------------- VERSION | 2 +- core/path_mapper.py | 36 ++++++++++++++++++++ nfoguard.py | 4 +-- 5 files changed, 90 insertions(+), 37 deletions(-) diff --git a/.env.fixed b/.env.fixed index 5dc8cb3..ffef298 100644 --- a/.env.fixed +++ b/.env.fixed @@ -111,6 +111,9 @@ TIMEOUT_SECONDS=45 # Enable verbose logging (true/false) DEBUG=true +# Enable path mapping debug output (true/false) +PATH_DEBUG=false + # =========================================== # SERVER CONFIGURATION # =========================================== diff --git a/SUMMARY.md b/SUMMARY.md index a355427..45efa2c 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,43 +1,57 @@ # NFOGuard Development Summary -## Current Status: v1.4.4 - TV Webhooks Working! ๐ŸŽ‰ +## Current Status: v1.4.6 - Flexible Debug Controls! ๏ฟฝ๏ธ -### Latest Updates (v1.4.4) -- **โœ… SUCCESS**: TV webhook path mapping now working correctly! -- **๐ŸŽฏ FIXED**: Six Feet Under processing correctly (no more cross-processing) -- **๐Ÿ“บ WORKING**: Episode batch processing and database storage functional -- **๐Ÿ”ง MINOR**: Fixed remaining path typo in tv6 configuration +### Latest Updates (v1.4.6) +- **๐ŸŽ›๏ธ FLEXIBLE DEBUGGING**: Added `PATH_DEBUG` environment variable for path mapping debug control +- **๐Ÿงน PRODUCTION READY**: Can now disable path debug while keeping general logging +- **โš™๏ธ GRANULAR CONTROL**: Separate debug controls for different system components +- **โœ… CONFIGURABLE**: Debug output now completely controllable via .env settings -### Working TV Webhook Flow -``` -โœ… Webhook received: Six Feet Under -โœ… Path mapping: /mnt/unionfs/Media/TV/tv โ†’ /media/TV/tv -โœ… Series lookup: Found exact IMDb match (ID: 588) -โœ… Episode processing: S01E03 processed successfully -โœ… Database: Episode entry saved with timestamp -โœ… Result: 1/1 episodes processed -``` - -### Final Configuration Fix -**Your .env should have:** +### New Debug Control System ```bash -# All paths working correctly: -MOVIE_PATHS=/media/Movies/movies,/media/Movies/movies6 -TV_PATHS=/media/TV/tv,/media/TV/tv6 -RADARR_ROOT_FOLDERS=/mnt/unionfs/Media/Movies/movies,/mnt/unionfs/Media/Movies/movies6 -SONARR_ROOT_FOLDERS=/mnt/unionfs/Media/TV/tv,/mnt/unionfs/Media/TV/tv6 +# General application debugging (webhooks, processing, etc.) +DEBUG=true + +# Path mapping debugging (verbose path translation output) +PATH_DEBUG=false ``` -### Complete System Status -- โœ… **Movie Webhooks**: Working perfectly with path mapping -- โœ… **TV Webhooks**: Working perfectly with path mapping -- โœ… **NFO Management**: All media types preserve content and append fields -- โœ… **Database**: Clean schema with proper episode tracking -- โœ… **Path Mapping**: Both movies/movies6 and tv/tv6 handled correctly +### Debug Output Examples -### Minor Notes -- โš ๏ธ TVDB API warnings are normal (not all series support TVDB lookup) -- โœ… Episode processing completes successfully regardless -- โœ… IMDb-based series matching works reliably +**With PATH_DEBUG=false (Production):** +``` +INFO: Received Radarr webhook: Download +INFO: Batched movie webhook for movie:tt3322940 +INFO: Processing movie: Annabelle (2014) [tt3322940] +INFO: Completed processing movie: Annabelle (2014) [tt3322940] +``` -## ๐ŸŽฌ๐Ÿ“บ NFOGuard is now fully functional for both movies and TV shows! ๐ŸŽ‰ \ No newline at end of file +**With PATH_DEBUG=true (Troubleshooting):** +``` +PATH_DEBUG: PathMapper initialized with: +PATH_DEBUG: radarr_roots: ['/mnt/unionfs/Media/Movies/movies', '/mnt/unionfs/Media/Movies/movies6'] +PATH_DEBUG: radarr_path_to_container_path input: /mnt/unionfs/Media/Movies/movies6/Annabelle... +PATH_DEBUG: Checking radarr_root[1]: /mnt/unionfs/Media/Movies/movies6 +PATH_DEBUG: Match found! Index 1 +PATH_DEBUG: Mapped to: /media/Movies/movies6/Annabelle (2014) [tt3322940] +``` + +### Recommended Production Settings +```bash +# Optimal for production monitoring: +DEBUG=true # Keep application logging for monitoring +PATH_DEBUG=false # Disable verbose path mapping output + +# Minimal logging for high-performance: +DEBUG=false # Disable all debug output +PATH_DEBUG=false # Disable path mapping debug +``` + +### Debug Scenarios +- **โœ… Production**: `DEBUG=true, PATH_DEBUG=false` - Monitor without noise +- **๐Ÿ”ง Troubleshooting**: `DEBUG=true, PATH_DEBUG=true` - Full diagnostics +- **๐Ÿš€ High Performance**: `DEBUG=false, PATH_DEBUG=false` - Minimal logging +- **๐ŸŽฏ Path Issues**: `DEBUG=false, PATH_DEBUG=true` - Focus on path mapping only + +## ๐ŸŽ›๏ธ NFOGuard now offers complete control over debug output levels! ๐ŸŽ›๏ธ \ No newline at end of file diff --git a/VERSION b/VERSION index e516bb9..be05bba 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.4.5 +1.4.7 diff --git a/core/path_mapper.py b/core/path_mapper.py index 3e3e7a2..582a8db 100644 --- a/core/path_mapper.py +++ b/core/path_mapper.py @@ -16,42 +16,78 @@ class PathMapper: self.sonarr_roots = [path.strip() for path in config.sonarr_root_folders.split(',') if path.strip()] self.movie_paths = [path.strip() for path in config.movie_paths.split(',') if path.strip()] self.tv_paths = [path.strip() for path in config.tv_paths.split(',') if path.strip()] + + # Check if path debugging is enabled + self.path_debug = os.getenv('PATH_DEBUG', 'false').lower() == 'true' + + if self.path_debug: + print(f"PATH_DEBUG: PathMapper initialized with:") + print(f"PATH_DEBUG: radarr_roots: {self.radarr_roots}") + print(f"PATH_DEBUG: sonarr_roots: {self.sonarr_roots}") + print(f"PATH_DEBUG: movie_paths: {self.movie_paths}") + print(f"PATH_DEBUG: tv_paths: {self.tv_paths}") def sonarr_path_to_container_path(self, sonarr_path: str) -> str: """Convert Sonarr path to container path using environment mappings""" + if self.path_debug: + print(f"PATH_DEBUG: sonarr_path_to_container_path input: {sonarr_path}") + print(f"PATH_DEBUG: sonarr_roots: {self.sonarr_roots}") + print(f"PATH_DEBUG: tv_paths: {self.tv_paths}") + # Sort roots by length (longest first) to avoid substring matching issues indexed_roots = [(i, root) for i, root in enumerate(self.sonarr_roots)] indexed_roots.sort(key=lambda x: len(x[1]), reverse=True) # Try to match against configured Sonarr root folders (longest first) for original_index, sonarr_root in indexed_roots: + if self.path_debug: + print(f"PATH_DEBUG: Checking sonarr_root[{original_index}]: {sonarr_root}") if sonarr_path.startswith(sonarr_root + '/') or sonarr_path == sonarr_root: + if self.path_debug: + print(f"PATH_DEBUG: Match found! Index {original_index}") # Map to corresponding TV path if original_index < len(self.tv_paths): container_root = self.tv_paths[original_index] relative_path = sonarr_path[len(sonarr_root):].lstrip('/') result = str(Path(container_root) / relative_path) if relative_path else container_root + if self.path_debug: + print(f"PATH_DEBUG: Mapped to: {result}") return result + if self.path_debug: + print(f"PATH_DEBUG: No match found, returning original: {sonarr_path}") # 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""" + if self.path_debug: + print(f"PATH_DEBUG: radarr_path_to_container_path input: {radarr_path}") + print(f"PATH_DEBUG: radarr_roots: {self.radarr_roots}") + print(f"PATH_DEBUG: movie_paths: {self.movie_paths}") + # Sort roots by length (longest first) to avoid substring matching issues indexed_roots = [(i, root) for i, root in enumerate(self.radarr_roots)] indexed_roots.sort(key=lambda x: len(x[1]), reverse=True) # Try to match against configured Radarr root folders (longest first) for original_index, radarr_root in indexed_roots: + if self.path_debug: + print(f"PATH_DEBUG: Checking radarr_root[{original_index}]: {radarr_root}") if radarr_path.startswith(radarr_root + '/') or radarr_path == radarr_root: + if self.path_debug: + print(f"PATH_DEBUG: Match found! Index {original_index}") # Map to corresponding movie path if original_index < len(self.movie_paths): container_root = self.movie_paths[original_index] relative_path = radarr_path[len(radarr_root):].lstrip('/') result = str(Path(container_root) / relative_path) if relative_path else container_root + if self.path_debug: + print(f"PATH_DEBUG: Mapped to: {result}") return result + if self.path_debug: + print(f"PATH_DEBUG: No match found, returning original: {radarr_path}") # No fallback - if path mapping fails, return original and let validation catch it return radarr_path diff --git a/nfoguard.py b/nfoguard.py index 422f5ad..cb85d28 100644 --- a/nfoguard.py +++ b/nfoguard.py @@ -1392,7 +1392,7 @@ start_time = datetime.now(timezone.utc) # Initialize components db = NFOGuardDatabase(config.db_path) nfo_manager = NFOManager(config.manager_brand) -path_mapper = PathMapper() +path_mapper = PathMapper(config) # FIXED: Pass config to PathMapper tv_processor = TVProcessor(db, nfo_manager, path_mapper) movie_processor = MovieProcessor(db, nfo_manager, path_mapper) batcher = WebhookBatcher() @@ -1683,7 +1683,7 @@ async def debug_movie_import_date(imdb_id: str): "movie_digital_release": movie_obj.get("digitalRelease"), "movie_in_cinemas": movie_obj.get("inCinemas"), "movie_physical_release": movie_obj.get("physicalRelease"), - "movie_folder_path": movie_obj.get("folderPath") + "movie_folder_path": movie_obj.get("folderPath") } } else: