#!/bin/bash # BL-uebergreifender Auto-Ingest fuer Plenarprotokolle (#106 / #126 Phase 3). # # Pro registriertem BL: liest letztes ingestetes Protokoll, probiert das # naechste, ingestet bei 200, wiederholt bis 404 (mit GAP_TOLERANCE). # Idempotent (Compound-PK in plenum_vote_results), kein State ausser DB. # # Wird via Cron taeglich morgens aufgerufen. Ausgabe nach # /var/log/gwoe-ingest-protocols.log. # # Usage: # auto-ingest-protocols.sh [CONTAINER] set -euo pipefail CONTAINER="${1:-gwoe-antragspruefer}" GAP_TOLERANCE=3 # 3 aufeinanderfolgende 404 → fertig fuer dieses BL # Pro BL: URL-Pattern + Wahlperiode-Auflistung. # WP-Liste ergibt sich aus aktiven Wahlperioden in BUNDESLAENDER. Hier # aktuell + Vorgaenger-WP, weil Plenum noch in der laufenden WP arbeitet # und alte Sitzungen gelegentlich nachtraeglich digitalisiert werden. # # Format: BL_CODE|WAHLPERIODE|URL_PATTERN_MIT_{n}_PLACEHOLDER PROTO_TARGETS=( "NRW|18|https://www.landtag.nrw.de/portal/WWW/dokumentenarchiv/Dokument/MMP18-{n}.pdf" "NRW|17|https://www.landtag.nrw.de/portal/WWW/dokumentenarchiv/Dokument/MMP17-{n}.pdf" ) echo "=== auto-ingest-protocols $(date -Iseconds) ===" for entry in "${PROTO_TARGETS[@]}"; do IFS='|' read -r bl wp pattern <<< "$entry" echo "--- ${bl} WP${wp} ---" # Hoechste bisher ingesete Sitzungs-Nr fuer diesen BL/WP-Praefix prefix="MMP${wp}-" # NRW-Konvention; andere BL liefern ihren eigenen Prefix last_n=$(docker exec "$CONTAINER" sqlite3 /app/data/gwoe-antraege.db \ "SELECT COALESCE(MAX(CAST(SUBSTR(quelle_protokoll, ${#prefix} + 1) AS INTEGER)), 0) \ FROM plenum_vote_results \ WHERE bundesland='${bl}' AND quelle_protokoll LIKE '${prefix}%'" 2>/dev/null || echo "0") start_n=$((last_n + 1)) echo "Letztes ingestes ${prefix}: ${last_n}, probiere ab ${start_n}" consecutive_404=0 for n in $(seq $start_n $((last_n + 50))); do url="${pattern//\{n\}/$n}" http=$(curl -sS -o /dev/null -w "%{http_code}" --max-time 15 "$url" || echo "000") if [ "$http" = "200" ]; then consecutive_404=0 pid="${prefix}${n}" echo " → ingest ${pid}" docker exec "$CONTAINER" python -m app.ingest_votes \ --url "$url" --bundesland "$bl" --protokoll-id "$pid" 2>&1 \ | tail -3 | sed 's/^/ /' || echo " !! ingest fehlgeschlagen" elif [ "$http" = "404" ]; then consecutive_404=$((consecutive_404 + 1)) if [ $consecutive_404 -ge $GAP_TOLERANCE ]; then break fi fi done done echo "=== auto-ingest done $(date -Iseconds) ==="