🎯 Problem Fixed: - TV episodes downloaded today showed historical air dates (1951) as dateadded - Episodes appeared as old content instead of "recently added" in media servers - Incorrect fallback logic used air dates instead of actual download times ⚡ Revolutionary Changes: - Webhook-first processing: When Sonarr webhook fires → use current timestamp - Database priority: Existing NFOguard entries preserved (no re-processing) - Smart backfill: Manual scans check Sonarr import history first - Clear separation: Webhook vs backfill use different logic paths 🔧 Technical Implementation: - New method: _get_webhook_episode_date() for webhook-specific handling - Enhanced method: _get_single_episode_date() for proper backfill priority - Database-first approach: Always check NFOguard DB before external APIs 📋 Correct Processing Flow: 1. New episode download → Sonarr webhook → current time as dateadded 2. Re-download same episode → use existing stored date (preserve original) 3. Backfill scan → NFOguard DB → Sonarr history → air dates (last resort) 4. No bulk import - database populated through webhooks and manual scans 🏆 Results: - Episodes downloaded today now show today's date as dateadded - Historical air dates preserved in aired field for accuracy - "Recently Added" functionality restored in media servers - No regression for existing properly-dated episodes 🐛 Bug Fixes: - Fixed f-string syntax error in core/nfo_manager.py:324 - Resolved backslash escaping issue preventing startup
7.2 KiB
NFOGuard Project Summary
📋 Current Status: v0.6.1 (Latest Improvements)
🎯 Project Goal
Preserve movie and TV import dates in Emby/Jellyfin/Plex by preventing upgraded files from appearing as "recently added". NFOGuard listens to Radarr/Sonarr webhooks and manages .nfo files and file timestamps to maintain chronological consistency.
🚀 Major Achievements
Database-Only Architecture (v0.5.0+)
- Performance: 10x faster than API-based approach
- Reliability: Direct PostgreSQL database queries eliminate API limitations
- Scalability: Handles 1500+ movies without pagination issues
🎯 Configurable Release Date Priority System (v0.6.0)
- Three-Tier Priority System: Digital → Physical → Theatrical (fully configurable)
- Smart Fallbacks: "The Craft (1996)" gets 1996 theatrical, "Top Gun Maverick (2022)" gets digital
- Per-Movie Intelligence: Automatically adapts to movie era and available release data
- Source Tracking: NFO files annotated with chosen date source (tmdb:theatrical, tmdb:digital, etc.)
- Quality Control: Prevents unrealistic dates through smart comparison logic
🏗 Current Architecture
Core Components:
nfoguard.py- Main FastAPI webhook serverclients/radarr_db_client.py- Direct database access clientclients/external_clients.py- TMDB/OMDb integrationcore/nfo_manager.py- NFO file creation and managementbulk_update_movies.py- Mass movie processing
Data Flow:
- Radarr webhook → NFOGuard processes → Database queries for import dates
- Smart fallback logic for manual imports → TMDB digital release dates
- NFO file creation with preserved dates → File timestamp updates
🔧 Configuration Management
Environment-Based Setup:
.env.template- Generic configuration templatedocker-compose.yml- Production deployment configuration- Supports multiple media paths and database types
Key Settings:
MOVIE_PRIORITY=import_then_digital- Prioritizes real import historyPREFER_RELEASE_DATES_OVER_FILE_DATES=true- Smart fallback for manual importsRELEASE_DATE_PRIORITY=digital,physical,theatrical- Configurable fallback order- Database connection parameters for PostgreSQL/SQLite
📊 Performance Metrics
Before (API-based):
- Took 30+ seconds for complex movies
- Failed on movies with extensive history
- API pagination caused timeouts
After (Database-only):
- Sub-second response times
- Handles any history size
- Reliable July 2025 date detection maintained
🧪 Testing Infrastructure
Comprehensive Test Suite:
test_bulk_update.py- Database connection validationtest_movie_scan.py- Directory scanning logic testingtest_end_to_end.py- Complete workflow validation
Debug Endpoints:
/debug/movie/{imdb_id}- Import date analysis/debug/movie/{imdb_id}/priority- Date selection logic/debug/movie/{imdb_id}/history- Complete import history
🎉 Success Metrics
Production Results:
- ✅ Correct July 2025 dates preserved for legitimate imports
- ✅ Manual imports now use intelligent release date selection:
- "The Craft (1996)" → 1996 theatrical date (not 2025 file date)
- "Top Gun Maverick (2022)" → digital release date per user preference
- ✅ Zero API timeout issues with database-only approach
- ✅ Complete webhook-based operation (no manual CLI required)
- ✅ NFO source annotations for full transparency
🚧 Current Development Focus
Completed (v0.6.0):
- ✅ Revolutionary Priority System: Configurable digital/physical/theatrical fallbacks
- ✅ Per-Movie Intelligence: Adapts to movie era and available release data
- ✅ Complete Documentation: README, testing guides, troubleshooting
- ✅ Source Transparency: NFO annotations show exactly which source was used
Next Priorities:
- TV series processing optimization
- Additional external API integrations (OMDb, Jellyseerr)
- Advanced configuration options
- Community feedback integration
📈 Project Maturity
Ready for Production:
- ✅ Stable database architecture
- ✅ Comprehensive error handling
- ✅ Docker deployment ready
- ✅ Extensive testing coverage
- ✅ Complete documentation
Community Ready:
- ✅ Environment-based configuration
- ✅ Portable Docker setup
- ✅ Detailed API documentation
- ✅ Troubleshooting guides
🆕 v0.6.1 Recent Improvements (September 2025)
🔧 Enhanced Radarr History Detection:
- Smart Upgrade Detection: Detects movies where first event is
movieFileRenamed(upgrade scenarios) - Improved Logic: For movies like The Matrix (1999), prefer digital release dates over recent upgrade dates
- True Import Preservation: Still honors actual import dates when they exist - only enhances edge cases
🎯 Improved IMDb ID Extraction:
- Flexible Regex: Now supports both
[imdb-tt123]and[tt123]formats - NFO Fallback: Scans
.nfofiles when path extraction fails (handles Radarr auto-generated files) - Broader Compatibility: Works with various folder naming conventions
🧠 Enhanced Priority Logic:
- Movies with rename→upgrade history now get better chronological dates
- True import dates always take precedence (no regression)
- Smart fallbacks only engage when appropriate
🆕 v0.6.2 TV Episode Date Handling Revolution (September 2025)
🎯 Problem Identified:
- TV episodes downloaded today were showing historical air dates (1951) as
dateadded - Episodes appeared as old content instead of "recently added" in Plex/Jellyfin
- Incorrect fallback logic was using air dates instead of actual download times
⚡ Revolutionary Webhook-First Processing:
- Webhook = Truth: When Sonarr webhook fires, episode was just downloaded → use current timestamp
- Database Priority: Existing NFOguard entries preserved (no re-processing of same episode)
- Smart Backfill: Manual scans check Sonarr import history, only fall back to air dates when no history exists
🔧 Technical Implementation:
- New Method:
_get_webhook_episode_date()- webhook-specific date handling - Enhanced Method:
_get_single_episode_date()- proper backfill scan priority - Clear Separation: Webhook processing vs. backfill scanning use different logic paths
- Database-First: Always check NFOguard database before external APIs
📋 Correct Processing Flow:
- New Episode Download → Sonarr webhook → NFOguard stores current time as
dateadded - Same Episode Re-download → NFOguard sees existing entry → uses stored date (preserves original)
- Backfill Scan → Check NFOguard DB → Check Sonarr import history → Fall back to air dates only if needed
- First Time Setup → No bulk import - database populated only through webhooks and manual scans
🏆 Results:
- Episodes downloaded today now correctly show today's date as
dateadded - Historical air dates preserved in
airedfield for accuracy - "Recently Added" functionality restored in media servers
- No regression for existing properly-dated episodes
🐛 Bug Fixes:
- Fixed f-string syntax error in
core/nfo_manager.py:324 - Resolved backslash escaping issue preventing startup
Last Updated: September 13, 2025
Version: v0.6.2-dev
Status: Enhanced Production Ready