70 lines
2.1 KiB
Markdown
70 lines
2.1 KiB
Markdown
# EXIF Test — Agent Guide
|
|
|
|
EXIF + OCR test backend that validates GPS data survives the upload pipeline. Photo upload with metadata preservation, OCR machine ID reading, session management, and GPS proximity search.
|
|
|
|
## Stack
|
|
|
|
- **Python** 3.11+, **FastAPI**, **uvicorn**
|
|
- **Pillow**, **pillow-heif** — image processing (JPEG, HEIC/HEIF)
|
|
- **pytesseract** — Tesseract OCR
|
|
- **Optional LLM OCR** — OpenCode Go / Google Gemini
|
|
- **Frontend:** vanilla JS SPA, IndexedDB offline queue
|
|
- **Service worker** (`static/sw.js`) — offline photo queue
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
server.py # ~1.5K lines — ALL FastAPI routes in one file
|
|
new_endpoints.py # Placeholder for future endpoints
|
|
FEATURE_PLAN.md # ~629 lines — comprehensive roadmap (✅ done / 💡 proposed)
|
|
requirements.txt
|
|
test_e2e_smoke.sh # End-to-end smoke test
|
|
|
|
static/
|
|
index.html # SPA frontend (~79KB)
|
|
sw.js # Service worker for offline photo queue
|
|
```
|
|
|
|
## How to Run
|
|
|
|
```bash
|
|
# Dev (with reload)
|
|
uvicorn server:app --reload --host 0.0.0.0 --port 8903
|
|
|
|
# Production
|
|
python server.py
|
|
# or
|
|
uvicorn server:app --host 0.0.0.0 --port 8903
|
|
```
|
|
|
|
## Key Architecture
|
|
|
|
- **Single-file backend** — `server.py` has all routes
|
|
- Hotels dotenv from `~/.hermes/.env`
|
|
- Uses `photos.db` for photo/session metadata
|
|
- Loads machine data from `canteen-asset-tracker/assets.db`
|
|
- Supports Tesseract and optional LLM-based OCR (OpenCode Go, Google Gemini)
|
|
- Frontend has IndexedDB offline queue for uploading photos without connection
|
|
|
|
## Features
|
|
|
|
- Photo upload with EXIF metadata extraction
|
|
- OCR machine ID reading (ConnectID sticker)
|
|
- Session-based grouping
|
|
- GPS proximity search
|
|
- Export: CSV, KML, clipboard
|
|
- Bulk assign to machines
|
|
|
|
## Production
|
|
|
|
- **Port:** 8903
|
|
- **No systemd**
|
|
- **Dev only** — `--reload` in dev scripts
|
|
|
|
## Pitfalls
|
|
|
|
- **No requirements.txt committed** — dependencies inferred from imports
|
|
- **Single-file backend** — server.py is ~1.5K lines
|
|
- LLM-based OCR requires OpenCode Go or Gemini configured in environment
|
|
- HEIC support requires `pillow-heif` + system libheif
|