gwoe-antragspruefer/scripts/auto-ingest-protocols.sh

66 lines
2.5 KiB
Bash
Raw Normal View History

#!/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) ==="