578472872e
- [ocr].timeout wird als tesseract_timeout (pro Seite) an ocrmypdf durchgereicht; Default 1800 -> 300, 0 = ocrmypdf-Default - Exceptions nach dem OCR zaehlen als Fehler, Datei wird nach error/ gerettet - Fehlgeschlagene Uploads zaehlen als Fehler und loesen Fehler-Mail aus - name_mode wird im Preflight geprueft, nicht erst pro Datei - Fehlende [paths]-Sektion -> ConfigError mit klarer Meldung statt KeyError - Stabilitaets-Timeout zaehlt als Fehler (--once liefert Exit 1) - upload_folder nutzt shutil.copyfile statt read_bytes/write_bytes - OcrConfig.pdfa_level Default "2" -> "" (Ghostscript-Bug, Issue #3) - 35 neue Tests (92 gesamt), pytest.ini - AI_AGENT_BRIEFING.md auf Stand 0.4.0 gebracht Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
68 lines
1.8 KiB
Python
68 lines
1.8 KiB
Python
"""CLI-Entrypoint."""
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import logging
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from . import __version__
|
|
from .config import ConfigError, load_config
|
|
from .service import HotfolderService, PreflightError
|
|
|
|
|
|
def _setup_logging(level: str) -> None:
|
|
logging.basicConfig(
|
|
level=getattr(logging, level.upper(), logging.INFO),
|
|
format="%(asctime)s %(levelname)-7s %(name)s: %(message)s",
|
|
datefmt="%Y-%m-%d %H:%M:%S",
|
|
)
|
|
|
|
|
|
def main() -> int:
|
|
parser = argparse.ArgumentParser(
|
|
prog="pdf-ocr-hotfolder",
|
|
description="Wandelt eingehende PDFs per OCR in durchsuchbare PDFs um.",
|
|
)
|
|
parser.add_argument("--config", "-c", default="/etc/pdf-ocr-hotfolder/config.toml",
|
|
help="Pfad zur Konfigurationsdatei (TOML)")
|
|
parser.add_argument("--version", action="version", version=f"%(prog)s {__version__}")
|
|
parser.add_argument("--once", action="store_true",
|
|
help="Nur bestehende Dateien verarbeiten und beenden")
|
|
args = parser.parse_args()
|
|
|
|
cfg_path = Path(args.config)
|
|
if not cfg_path.exists():
|
|
print(f"Config nicht gefunden: {cfg_path}", file=sys.stderr)
|
|
return 2
|
|
|
|
try:
|
|
cfg = load_config(cfg_path)
|
|
except ConfigError as e:
|
|
print(f"FEHLER: {e}", file=sys.stderr)
|
|
return 2
|
|
_setup_logging(cfg.log_level)
|
|
|
|
service = HotfolderService(cfg)
|
|
|
|
if args.once:
|
|
try:
|
|
errors = service.run_once()
|
|
except PreflightError as e:
|
|
print(f"FEHLER: {e}", file=sys.stderr)
|
|
return 2
|
|
return 1 if errors > 0 else 0
|
|
|
|
try:
|
|
service.run()
|
|
except PreflightError as e:
|
|
print(f"FEHLER: {e}", file=sys.stderr)
|
|
return 2
|
|
except KeyboardInterrupt:
|
|
pass
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|