File size: 1,892 Bytes
18f4899
 
c37ed28
18f4899
c37ed28
 
cfbe21c
 
 
18f4899
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cfbe21c
 
 
 
 
 
 
 
 
 
 
c37ed28
18f4899
 
 
 
 
 
 
c37ed28
 
 
18f4899
 
 
 
c37ed28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
from __future__ import annotations

import logging
import shutil

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import FileResponse
from fastapi.staticfiles import StaticFiles

from app.config import settings
from app.routes.verify_image import router as verify_image_router
from app.services.image_detector import image_detector

logging.basicConfig(
    level=getattr(logging, settings.log_level.upper(), logging.INFO),
    format="%(asctime)s %(levelname)s %(name)s - %(message)s",
)

app = FastAPI(
    title="BitCheck Image Verification API",
    description="Risk-based image authenticity and provenance verification backend.",
    version="0.1.0",
)

app.add_middleware(
    CORSMiddleware,
    allow_origins=settings.cors_origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

app.include_router(verify_image_router)
app.mount("/outputs", StaticFiles(directory=str(settings.outputs_dir)), name="outputs")


@app.on_event("startup")
def startup() -> None:
    image_detector.load()


@app.get("/")
def root() -> dict[str, str]:
    return {"service": "BitCheck Image Verification API", "status": "running"}


@app.get("/test-client", include_in_schema=False)
def test_client() -> FileResponse:
    return FileResponse("test-client.html")


@app.get("/health")
def health() -> dict[str, object]:
    try:
        import pytesseract

        pytesseract.get_tesseract_version()
        ocr_available = True
    except Exception:
        ocr_available = False
    return {
        "status": "ok",
        "service": "BitCheck Image Verification API",
        "classifier_loaded": image_detector.is_loaded,
        "ocr_available": ocr_available,
        "c2pa_available": shutil.which("c2patool") is not None,
        "device": str(image_detector.device),
    }