2026-04-28 22:23:51 +02:00
#!/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 } --- "
2026-04-28 22:29:36 +02:00
# Hoechste bisher ingestete Sitzungs-Nr fuer diesen BL/WP-Praefix
# python statt sqlite3 — Container hat kein CLI-sqlite3, aber das Python-Modul
prefix = " MMP ${ wp } - "
last_n = $( docker exec " $CONTAINER " python -c "
import sqlite3
c = sqlite3.connect( '/app/data/gwoe-antraege.db' ) .cursor( )
c.execute( \" SELECT COALESCE( MAX( CAST( SUBSTR( quelle_protokoll, ${# prefix } +1) AS INTEGER) ) , 0) FROM plenum_vote_results WHERE bundesland = ? AND quelle_protokoll LIKE ?\" , ( '${bl}' , '${prefix}%' ) )
print( c.fetchone( ) [ 0] )
" 2>/dev/null || echo " 0" )
# Sanity: numeric check
if ! [ [ " $last_n " = ~ ^[ 0-9] +$ ] ] ; then last_n = 0; fi
2026-04-28 22:23:51 +02:00
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) === "