CRITICAL: Fix database upsert bug preventing manual scan date persistence
**Root Cause**: upsert_movie_dates() was UPDATE-only, not proper upsert - Manual scans failed to save dateadded to database (NULL values) - Webhooks found database entries but with NULL dateadded - Fell back to current timestamp instead of using proper import dates **Database Fix**: - Changed core/database.py upsert_movie_dates() from UPDATE to INSERT OR REPLACE - Now properly saves dateadded during manual scans - Preserves existing path with COALESCE fallback **Webhook Enhancement**: - Added comprehensive debug logging for database lookups - Enhanced webhook date decision logic with proper fallback chain - Only uses current timestamp as absolute last resort **Impact**: - Movies: Manual scans now persist dates, webhooks find existing entries ✅ - TV Shows: Not affected - already using proper INSERT OR REPLACE ✅ - Version: 1.5.5
This commit is contained in:
+17
-13
@@ -970,26 +970,30 @@ class MovieProcessor:
|
||||
|
||||
# Get existing dates
|
||||
existing = self.db.get_movie_dates(imdb_id)
|
||||
_log("DEBUG", f"Database lookup for {imdb_id}: {existing}")
|
||||
|
||||
# Handle webhook mode - prioritize database, then use current timestamp
|
||||
# Handle webhook mode - prioritize database, then use proper date logic
|
||||
if webhook_mode:
|
||||
_log("DEBUG", f"Webhook mode: existing={bool(existing)}, has_dateadded={bool(existing and existing.get('dateadded')) if existing else 'N/A'}")
|
||||
if existing and existing.get("dateadded"):
|
||||
_log("INFO", f"Webhook processing - using existing database entry: {existing['dateadded']} (source: {existing.get('source', 'unknown')})")
|
||||
dateadded, source, released = existing["dateadded"], existing["source"], existing.get("released")
|
||||
else:
|
||||
# Use current timestamp as source of truth for webhooks
|
||||
local_tz = _get_local_timezone()
|
||||
current_time = datetime.now(local_tz).isoformat(timespec="seconds")
|
||||
_log("INFO", f"Webhook processing - using current timestamp as source of truth: {current_time}")
|
||||
if existing:
|
||||
_log("INFO", f"Webhook processing - database entry exists but no dateadded field: {existing}")
|
||||
else:
|
||||
_log("INFO", f"Webhook processing - no database entry found for {imdb_id}")
|
||||
_log("INFO", f"Using full date decision logic")
|
||||
# Use same logic as manual scan to check Radarr import dates, release dates, etc.
|
||||
should_query = True # Always query for webhooks when no database entry exists
|
||||
dateadded, source, released = self._decide_movie_dates(imdb_id, movie_path, should_query, existing)
|
||||
|
||||
# Still get release date for reference
|
||||
released = None
|
||||
if config.movie_poll_mode != "never":
|
||||
radarr_movie = self.radarr.movie_by_imdb(imdb_id) if self.radarr.api_key else None
|
||||
if radarr_movie:
|
||||
released = self._parse_date_to_iso(radarr_movie.get("inCinemas"))
|
||||
|
||||
dateadded, source = current_time, "webhook:first_seen"
|
||||
# Only if ALL date sources fail, fall back to current timestamp
|
||||
if dateadded is None:
|
||||
local_tz = _get_local_timezone()
|
||||
current_time = datetime.now(local_tz).isoformat(timespec="seconds")
|
||||
_log("INFO", f"Webhook processing - all date sources failed, using current timestamp as last resort: {current_time}")
|
||||
dateadded, source = current_time, "webhook:fallback_timestamp"
|
||||
else:
|
||||
# Manual scan mode - determine if we should query APIs
|
||||
should_query = (
|
||||
|
||||
Reference in New Issue
Block a user