feat: Add dedicated failed movies debug log
- Create logs/failed_movies.log for movies with no_valid_date_source - Logs movie name, IMDb ID, failure reason, and timestamp - Helps users identify problematic movies needing manual attention - Useful for debugging API issues and monitoring system health - Documented in SUMMARY.md action items for troubleshooting workflow
This commit is contained in:
@@ -204,6 +204,7 @@ Co-Authored-By: Claude <noreply@anthropic.com> ❌
|
|||||||
- **API Debug Endpoints**: `/debug/movie/{imdb_id}` for troubleshooting specific movies
|
- **API Debug Endpoints**: `/debug/movie/{imdb_id}` for troubleshooting specific movies
|
||||||
- **IMDb ID Detection**: Comprehensive logging for directory/filename/NFO parsing
|
- **IMDb ID Detection**: Comprehensive logging for directory/filename/NFO parsing
|
||||||
- **Three-Tier Logging**: Shows which optimization tier is used for each movie
|
- **Three-Tier Logging**: Shows which optimization tier is used for each movie
|
||||||
|
- **Failed Movies Log**: Dedicated `logs/failed_movies.log` for movies with no_valid_date_source
|
||||||
|
|
||||||
### 🎯 PERFORMANCE TESTING SCENARIOS
|
### 🎯 PERFORMANCE TESTING SCENARIOS
|
||||||
- **Cold Database**: Test full processing with empty database (Tier 3 for all content)
|
- **Cold Database**: Test full processing with empty database (Tier 3 for all content)
|
||||||
@@ -252,6 +253,7 @@ Co-Authored-By: Claude <noreply@anthropic.com> ❌
|
|||||||
4. **TMDB FALLBACK TESTING**: Test movies with TMDB IDs but no IMDb IDs
|
4. **TMDB FALLBACK TESTING**: Test movies with TMDB IDs but no IMDb IDs
|
||||||
5. **MONITOR**: Database size should remain appropriate with new optimizations
|
5. **MONITOR**: Database size should remain appropriate with new optimizations
|
||||||
6. **BENCHMARK**: Compare scan times before/after optimization (should see 90%+ improvement)
|
6. **BENCHMARK**: Compare scan times before/after optimization (should see 90%+ improvement)
|
||||||
|
7. **DEBUG LOG**: Check `logs/failed_movies.log` for movies that couldn't get valid dates
|
||||||
|
|
||||||
---
|
---
|
||||||
**CONFIDENTIAL**: This file contains sensitive development information and remains on private Gitea only.
|
**CONFIDENTIAL**: This file contains sensitive development information and remains on private Gitea only.
|
||||||
+26
@@ -1281,6 +1281,10 @@ class MovieProcessor:
|
|||||||
return self._get_file_mtime_date(movie_path)
|
return self._get_file_mtime_date(movie_path)
|
||||||
else:
|
else:
|
||||||
_log("INFO", f"No valid dates found for {imdb_id} and file date fallback disabled - skipping NFO creation")
|
_log("INFO", f"No valid dates found for {imdb_id} and file date fallback disabled - skipping NFO creation")
|
||||||
|
|
||||||
|
# Log to failed movies debug file for troubleshooting
|
||||||
|
self._log_failed_movie(movie_path, imdb_id, "No import date, no release date, file date fallback disabled")
|
||||||
|
|
||||||
return None, "no_valid_date_source", None
|
return None, "no_valid_date_source", None
|
||||||
|
|
||||||
def _get_digital_release_date(self, imdb_id: str) -> Tuple[Optional[str], str]:
|
def _get_digital_release_date(self, imdb_id: str) -> Tuple[Optional[str], str]:
|
||||||
@@ -1334,6 +1338,28 @@ class MovieProcessor:
|
|||||||
_log("ERROR", f"Error reading Radarr NFO file: {e}")
|
_log("ERROR", f"Error reading Radarr NFO file: {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def _log_failed_movie(self, movie_path: Path, imdb_id: str, reason: str, available_countries: List[str] = None):
|
||||||
|
"""Log movies that failed to get valid dates to a debug file"""
|
||||||
|
try:
|
||||||
|
log_dir = Path("logs")
|
||||||
|
log_dir.mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
failed_log_path = log_dir / "failed_movies.log"
|
||||||
|
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
|
||||||
|
log_entry = f"[{timestamp}] {movie_path.name} | IMDb: {imdb_id} | Reason: {reason}"
|
||||||
|
if available_countries:
|
||||||
|
log_entry += f" | Available Countries: {', '.join(available_countries)}"
|
||||||
|
log_entry += "\n"
|
||||||
|
|
||||||
|
with open(failed_log_path, "a", encoding="utf-8") as f:
|
||||||
|
f.write(log_entry)
|
||||||
|
|
||||||
|
_log("INFO", f"📝 Logged failed movie to {failed_log_path}: {movie_path.name}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
_log("ERROR", f"Failed to write to failed movies log: {e}")
|
||||||
|
|
||||||
def _get_file_mtime_date(self, movie_path: Path) -> Tuple[str, str, Optional[str]]:
|
def _get_file_mtime_date(self, movie_path: Path) -> Tuple[str, str, Optional[str]]:
|
||||||
"""Get date from file modification time as last resort"""
|
"""Get date from file modification time as last resort"""
|
||||||
video_exts = (".mkv", ".mp4", ".avi", ".mov", ".m4v")
|
video_exts = (".mkv", ".mp4", ".avi", ".mov", ".m4v")
|
||||||
|
|||||||
Reference in New Issue
Block a user