3 Commits

Author SHA1 Message Date
042505d5a6 fix(media): Add MAX_CONTENT_LENGTH and debug file capture - v1.4.2
- Set Flask MAX_CONTENT_LENGTH to 50MB (matches MAX_FILE_SIZE)
- Save failed uploads to data/debug/ for analysis
- Log magic bytes when both Pillow and HEIC parsers fail

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 18:08:36 -07:00
72f3d4a55e fix(media): Save failed uploads to debug/ for analysis - v1.4.2
When an image fails both Pillow and HEIC parsing, save the file
to data/debug/ for manual analysis.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 18:06:51 -07:00
e8ff0a0dcb fix(media): Add debug logging for unrecognized image formats - v1.4.2
Logs magic bytes when both Pillow and HEIC parsers fail,
to help diagnose what format the file actually is.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 18:06:09 -07:00
2 changed files with 20 additions and 1 deletions

View File

@@ -86,6 +86,10 @@ def load_config(app, config_override=None):
app.config["FEED_CACHE_ENABLED"] = os.getenv("FEED_CACHE_ENABLED", "true").lower() == "true"
app.config["FEED_CACHE_MAX_SIZE"] = int(os.getenv("FEED_CACHE_MAX_SIZE", "50"))
# Upload limits (v1.4.2)
# Flask MAX_CONTENT_LENGTH limits request body size (matches media.py MAX_FILE_SIZE)
app.config["MAX_CONTENT_LENGTH"] = 50 * 1024 * 1024 # 50MB
# Metrics configuration (v1.1.2 Phase 1)
app.config["METRICS_ENABLED"] = os.getenv("METRICS_ENABLED", "true").lower() == "true"
app.config["METRICS_SLOW_QUERY_THRESHOLD"] = float(os.getenv("METRICS_SLOW_QUERY_THRESHOLD", "1.0"))

View File

@@ -121,7 +121,22 @@ def validate_image(file_data: bytes, filename: str) -> Tuple[bytes, str, int, in
)
# Mark as HEIF so conversion happens below
img.format = 'HEIF'
except Exception:
except Exception as heic_error:
# Log the magic bytes and save file for debugging (if in app context)
try:
magic = file_data[:12].hex() if len(file_data) >= 12 else file_data.hex()
current_app.logger.warning(
f'Media upload failed both Pillow and HEIC: filename="{filename}", '
f'magic_bytes={magic}, pillow_error="{e}", heic_error="{heic_error}"'
)
# Save failed file for analysis
debug_dir = Path(current_app.config.get('DATA_PATH', 'data')) / 'debug'
debug_dir.mkdir(parents=True, exist_ok=True)
debug_file = debug_dir / f"failed_{datetime.now().strftime('%Y%m%d_%H%M%S')}_{filename}"
debug_file.write_bytes(file_data)
current_app.logger.info(f'Saved failed upload for analysis: {debug_file}')
except RuntimeError:
pass # Outside app context (e.g., tests)
raise ValueError(f"Invalid or corrupted image: {e}")
else:
raise ValueError(f"Invalid or corrupted image: {e}")