remove debug

This commit is contained in:
2025-09-14 14:15:19 -04:00
parent 2657729975
commit a9c90d2939
4 changed files with 45 additions and 93 deletions
+33 -63
View File
@@ -1,73 +1,43 @@
# NFOGuard Development Summary
## Current Status: v1.4.1 - Complete TV & Movie NFO Management
## Current Status: v1.4.4 - TV Webhooks Working! 🎉
### Latest Updates (v1.4.1)
- **📺 TV SHOW SUPPORT**: Extended preservation logic to tvshow.nfo, season.nfo, and episode.nfo
- **🎯 CONSISTENT BEHAVIOR**: All NFO types now preserve existing content and append NFOGuard fields
- **✅ COMPREHENSIVE**: Movies, TV shows, seasons, and episodes all handle field placement correctly
- **🧹 UNIFIED APPROACH**: Same preservation and bottom-placement logic across all media types
### 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
### Complete NFO Management Coverage
#### Movie NFO Structure
```xml
<movie>
<!-- All existing Radarr content preserved -->
<title>Movie Title</title>
<plot>Plot...</plot>
<actor>...</actor>
<!-- NFOGuard fields at bottom -->
<uniqueid type="imdb" default="true">tt8350360</uniqueid>
<premiered>2019-06-26</premiered>
<year>2019</year>
<dateadded>2025-09-14T13:50:34-04:00</dateadded>
<lockdata>true</lockdata>
</movie>
### 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
```
#### TV Show NFO Structure
```xml
<tvshow>
<!-- All existing Sonarr content preserved -->
<title>Show Title</title>
<plot>Show plot...</plot>
<actor>...</actor>
<!-- NFOGuard fields at bottom -->
<uniqueid type="imdb" default="true">tt1234567</uniqueid>
<uniqueid type="tvdb">12345</uniqueid>
<lockdata>true</lockdata>
</tvshow>
### Final Configuration Fix
**Your .env should have:**
```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
```
#### Episode NFO Structure
```xml
<episodedetails>
<!-- All existing Sonarr content preserved -->
<title>Episode Title</title>
<plot>Episode plot...</plot>
<director>...</director>
### 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
<!-- NFOGuard fields at bottom -->
<season>1</season>
<episode>5</episode>
<aired>2019-06-26</aired>
<dateadded>2025-09-14T13:50:34-04:00</dateadded>
<lockdata>true</lockdata>
</episodedetails>
```
### Minor Notes
- ⚠️ TVDB API warnings are normal (not all series support TVDB lookup)
- ✅ Episode processing completes successfully regardless
- ✅ IMDb-based series matching works reliably
### Preservation Features
-**Movies**: Preserves title, plot, actors, ratings, all existing metadata
-**TV Shows**: Preserves show metadata, existing uniqueid[tvdb], actor info
-**Episodes**: Preserves episode title, plot, director, existing aired dates
-**Seasons**: Preserves any existing season metadata
-**All Types**: Existing content stays in original order, NFOGuard fields at bottom
### Complete Path Processing Pipeline
-**Path Mapping**: Fixed substring matching (movies/movies6, tv/tv6)
-**Database Schema**: Clean migration with all required columns
-**NFO Preservation**: Existing metadata maintained with fields appended
- ✅ **Webhook Processing**: End-to-end processing working correctly
## 🎬📺 NFOGuard is now fully functional for both movies and TV shows! 🎉
+1 -1
View File
@@ -1 +1 @@
1.4.1
1.4.5
+6 -28
View File
@@ -10,70 +10,48 @@ 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 __init__(self, config):
"""Initialize path mapper with configuration"""
self.radarr_roots = [path.strip() for path in config.radarr_root_folders.split(',') if path.strip()]
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()]
def sonarr_path_to_container_path(self, sonarr_path: str) -> str:
"""Convert Sonarr path to container path using environment mappings"""
print(f"DEBUG: sonarr_path_to_container_path input: {sonarr_path}")
print(f"DEBUG: sonarr_roots: {self.sonarr_roots}")
print(f"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:
print(f"DEBUG: Checking sonarr_root[{original_index}]: {sonarr_root}")
if sonarr_path.startswith(sonarr_root + '/') or sonarr_path == sonarr_root:
print(f"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
print(f"DEBUG: Mapped to: {result}")
return result
print(f"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"""
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}")
# 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:
print(f"DEBUG: Checking radarr_root[{original_index}]: {radarr_root}")
if radarr_path.startswith(radarr_root + '/') or radarr_path == radarr_root:
print(f"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
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
+4
View File
@@ -188,6 +188,10 @@ def _load_environment_files():
# Load environment files at startup
_load_environment_files()
# Add debug logging near where configuration is loaded
print(f"DEBUG: Environment check - SONARR_ROOT_FOLDERS: {os.getenv('SONARR_ROOT_FOLDERS')}")
print(f"DEBUG: Environment check - TV_PATHS: {os.getenv('TV_PATHS')}")
def _bool_env(name: str, default: bool) -> bool:
v = os.environ.get(name)
if v is None: