fix: Bild-Endpoints fallen auf original zurueck fuer Sub-Sessions
Some checks failed
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-school (push) Successful in 30s
CI / test-go-edu-search (push) Successful in 28s
CI / test-python-klausur (push) Failing after 2m3s
CI / test-python-agent-core (push) Successful in 19s
CI / test-nodejs-website (push) Successful in 20s

Alle Bild-Endpoints (cropped, columns-overlay, rows-overlay,
words-overlay) suchten nur nach cropped/dewarped. Sub-Sessions haben
nur ein original-Bild. Neue Hilfsfunktion _get_base_image_png() mit
Fallback-Kette: cropped > dewarped > original.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-03-09 23:30:38 +01:00
parent ceaef9c6a6
commit 34adb437d0

View File

@@ -94,6 +94,15 @@ router = APIRouter(prefix="/api/v1/ocr-pipeline", tags=["ocr-pipeline"])
_cache: Dict[str, Dict[str, Any]] = {}
async def _get_base_image_png(session_id: str) -> Optional[bytes]:
"""Get the best available base image for a session (cropped > dewarped > original)."""
for img_type in ("cropped", "dewarped", "original"):
png_data = await get_session_image(session_id, img_type)
if png_data:
return png_data
return None
async def _load_session_to_cache(session_id: str) -> Dict[str, Any]:
"""Load session from DB into cache, decoding PNGs to BGR arrays."""
session = await get_session_db(session_id)
@@ -604,8 +613,11 @@ async def get_image(session_id: str, image_type: str):
if image_type == "binarized" and cached.get("binarized_png"):
return Response(content=cached["binarized_png"], media_type="image/png")
# Load from DB
data = await get_session_image(session_id, image_type)
# Load from DB — for cropped/dewarped, fall back through the chain
if image_type in ("cropped", "dewarped"):
data = await _get_base_image_png(session_id)
else:
data = await get_session_image(session_id, image_type)
if not data:
raise HTTPException(status_code=404, detail=f"Image '{image_type}' not available yet")
@@ -1398,12 +1410,10 @@ async def _get_columns_overlay(session_id: str) -> Response:
if not column_result or not column_result.get("columns"):
raise HTTPException(status_code=404, detail="No column data available")
# Load cropped image (preferred) or dewarped as fallback
base_png = await get_session_image(session_id, "cropped")
# Load best available base image (cropped > dewarped > original)
base_png = await _get_base_image_png(session_id)
if not base_png:
base_png = await get_session_image(session_id, "dewarped")
if not base_png:
raise HTTPException(status_code=404, detail="No base image available (cropped/dewarped)")
raise HTTPException(status_code=404, detail="No base image available")
arr = np.frombuffer(base_png, dtype=np.uint8)
img = cv2.imdecode(arr, cv2.IMREAD_COLOR)
@@ -3160,12 +3170,10 @@ async def _get_rows_overlay(session_id: str) -> Response:
if not row_result or not row_result.get("rows"):
raise HTTPException(status_code=404, detail="No row data available")
# Load cropped image (preferred) or dewarped as fallback
base_png = await get_session_image(session_id, "cropped")
# Load best available base image (cropped > dewarped > original)
base_png = await _get_base_image_png(session_id)
if not base_png:
base_png = await get_session_image(session_id, "dewarped")
if not base_png:
raise HTTPException(status_code=404, detail="No base image available (cropped/dewarped)")
raise HTTPException(status_code=404, detail="No base image available")
arr = np.frombuffer(base_png, dtype=np.uint8)
img = cv2.imdecode(arr, cv2.IMREAD_COLOR)
@@ -3247,12 +3255,10 @@ async def _get_words_overlay(session_id: str) -> Response:
if not cells and not word_result.get("entries"):
raise HTTPException(status_code=404, detail="No word data available")
# Load cropped image (preferred) or dewarped as fallback
base_png = await get_session_image(session_id, "cropped")
# Load best available base image (cropped > dewarped > original)
base_png = await _get_base_image_png(session_id)
if not base_png:
base_png = await get_session_image(session_id, "dewarped")
if not base_png:
raise HTTPException(status_code=404, detail="No base image available (cropped/dewarped)")
raise HTTPException(status_code=404, detail="No base image available")
arr = np.frombuffer(base_png, dtype=np.uint8)
img = cv2.imdecode(arr, cv2.IMREAD_COLOR)