Commit graph buzz-rss/buzzrss/bot.py
Author SHA1 Message Date
Eddy de Vink
086d808dc7 v1.9.7: station-samenstellingen medium i.p.v. sterk/whitelist; geen dubbeltelling bus-/metrostation
Gebruikersbesluit 2026-09-11 n.a.v. Omroep West-artikel 'Restaurant weg, pand
staat te verloederen': één 'busstation'-hit in de samenvatting ('pand naast
busstation') is geen OV-nieuws en mocht niet doorgelaten worden.

- Familie station-samenstellingen (trein/bus/metro-station): gewicht 3 -> 2
  (medium). In de samenvatting moet nu een tweede OV-woord bijkomen; in de
  titel volstaat het anker nog (2x2=4).
- 'busstation'/'metrostation' van de whitelist af (whitelist = altijd door).
- 'station' uit de voertuig-samenstelling-familie verwijderd: 'busstation'
  telde dubbel mee (via 'bus' én 'station', 2x3=6).
- validate_filter.py: 6 nieuwe regressie-cases + invariant 2-aanpassing.
2026-09-11 09:07:43 +02:00
Eddy de Vink
1f168b2f54 v1.9.6: pendelbus/shuttlebus naar zwak + zwak-alleen moet titel-anker hebben
Aanleiding: Omroep Brabant-golfbericht (Solheim Cup Cromvoirt, 11-09-2026) kwam door
het filter. 'pendelbus' stond op de whitelist (evenementpendel vanaf station Den Bosch),
en 'station'+'bus'+'pendelbus' in de samenvatting was samen al drempel 3.

- pendelbus/shuttlebus: whitelist + medium -> zwak (1), één familie (synoniemen tellen
  niet als twee onafhankelijke signalen).
- _filter_passes: bij uitsluitend zwakke hits moet minstens één zwak woord in de TITEL
  staan; zwakke woorden alleen in de samenvatting zijn geen bewijs.
- validate_filter.py: invariant 1 uitgebreid + 3 regressiecases (golfbericht, zwak-alleen
  samenvatting, positieve controle met titel-anker).
- _filter_summary()/docstrings gelijkgetrokken met de werkelijke gewichten.
2026-09-11 07:49:05 +02:00
Eddy de Vink
3cdc02aebe v1.9.5: fix chipkaart/reisproduct zwakke familie (chipkaart(?:en)?), plus blijvend validate_filter.py + AGENTS.md (beleid wordt automatisch geladen en afdwingbaar) 2026-09-10 23:17:21 +02:00
Eddy de Vink
2dd1328473 v1.9.4 docs: classificatiebeleid (precision-first) vastgelegd boven MATCH_FILTER_FAMILIES — richtlijn voor toekomstige filteraanpassingen 2026-09-10 23:15:43 +02:00
Eddy de Vink
8e9f450d46 v1.9.4: precision-first audit — dubbelzinnige termen (dienstregeling, chipkaart, reisproduct, vervoer(s)bewijs, ontsporen, sprinter, vervoerder, reiziger) naar zwak + whitelist-verkleining; triage met drie externe taalmodellen 2026-09-10 23:12:22 +02:00
Eddy de Vink
72c575ceb9 v1.9.3: los 'station(s)' naar zwak — tv/radio/omroepstations zijn geen OV; station-samenstellingen (treinstation/metrostation/busstation) blijven sterk 2026-09-10 23:04:21 +02:00
Eddy de Vink
6e9f9b1b0f v1.9.2: whitelist-laag (onmiskenbare OV-termen als altijd-door-signaal) + inchecken/uitchecken naar zwak (Schiphol-inchecken is geen OV) 2026-09-10 20:43:13 +02:00
Eddy de Vink
3f0711345e v1.9.1: losse 'trein' is zwak (moet combineren), trein-jargon-samenstellingen sterk, conducteur als medium-familie — weert niet-OV met een toevallige 'trein' in de tekst 2026-09-10 20:31:34 +02:00
Eddy de Vink
59f927b038 v1.9.0: filter-recall (meervoud/vervoeging, ProRail/intercity/veerdienst/buurtbus) + vijf fixes (ETag na parse, WhatsApp-check, paywall JSON, start-guard, dedup op posted_at) 2026-09-10 19:04:05 +02:00
Eddy de Vink
eab249ea57 v1.8.3: OV-matchfilter weert gewone-woord-botsingen (breng/overweg/sein/opwaarderen)
'NOS | Oldambt weigert Leninbeeld' kwam door het filter via het werkwoord
'breng je het gesprek op gang' (familie vervoerders, gewicht 3). Audit over
30 dagen productiedata toonde dezelfde klasse: 'sein brandmeester'
(brandweer) 3x, 'overwegen' (werkwoord) 2x, idioom 'overweg kunnen' 1x.

- breng/overweg/overwegen/sein/opwaarderen van sterk(3)/medium(2) naar
  zwak(1): dubbelzinnige woorden combineren nu met een ander OV-woord
  (bushalte/trein/spoor/NS blijven gewoon scoren)
- _filter_passes eist sindsdien: alleen zwakke hits -> minimaal twee
  verschillende families (zelfde zwakke familie in titel+samenvatting is
  geen combinatie); voorkomt 'overwegen' in beide velden alsnog doorlaten
- trein-familie matst nu ook samenstellingen (stoptrein/goederentrein/
  sprinttrein) zodat overweg-demotie geen echte spoorincidenten verliest
- blacklist + stationair/stationeren/stationeel (geen OV-waarde, matchen
  wel via \bstation\w*\b)
- docs: module-commentaar en _filter_summary/_filter_passes bijgewerkt

Verificatie: exacte storingscode-herhaling op de gemelde NOS-entry (nu
gefilterd), 12 echte 30-dagen-entries (9 FP's eruit, 3 echte OV-berichten
blijven), 10/10 echte OV-regressiegevallen doorlaten, 11/11 FP-vormen
geweerd.
2026-09-10 12:27:17 +02:00
Eddy de Vink
f4ea969f33 v1.8.2: blacklist straatnamen rond stations in OV-matchfilter
'de Stationsstraat afsluiten voor een festival' is geen OV-nieuws, maar
scored wel (familie \bstation\w*\b, gewicht 3; via `stations`+suffix
dingt `station\w*\b` op 'stationsstraat'). Regex-uitbreiding faalt op de
dubbele s (stations+straat): elke naamvorm vraagt opnieuw regex-herrie.

Daarom MATCH_FILTER_BLACKLIST: exact gematchte woorden die geen OV-waarde
hebben (straatnamen rond stations: stationsstraat/weg/laan/plein/... plus
treinstraat/treinweg) tellen niet meer mee. De genitief-s-vorm dekt zowel
'Stationsstraat' als 'Stationsweg' etc. Zwartgelijste woorden blokkeren de
familie niet: een echt station-/trein-woord ernaast scoort gewoon.
2026-09-10 08:42:33 +02:00
Eddy de Vink
c13ec81379 v1.8.1: idempotente start() — guard voorkomt dubbele poll-loop bij maubot double-start 2026-09-09 23:46:22 +02:00
Eddy de Vink
6264e73441 v1.8.0: titel-dedup over feeds (zelfde artikel, andere url) 2026-09-09 23:39:15 +02:00
Eddy de Vink
d7ba8a06de v1.7.0: gewogen OV-families-filter vervangt match_filter-regex
Filter is nu vast in code (MATCH_FILTER_FAMILIES + MATCH_FILTER_THRESHOLD):
doorlaten als 2x(titelfamiliescore) + 1x(samenvattingscore) >= 3.
Sterk(3): vervoerders, spoorinfra, station, voertuig-samenstellingen, trein.
Medium(2): tram, metro, dienst, vervoersbewijs/staking/pont.
Zwak(1): losse bus/kaartje/rails - moet combineren met ander OV-woord.
Weert 'VW-bus'/'schoolbus', woningbrand-leads met 'bussen rijden om' en
figuratief 'op de rails', zonder bushalte/overweg/NS/trein-berichten te raken.
Gewogen per familie ipv per cluster dicht ook het 'bus x3 in lead'-gat.
!rss set-filter en !rss filter zijn read-only geworden (tonen het vaste filter);
config-keys match_filter/allow_filter verwijderd uit do_update.
V1.7.0 gedeployed op nextcloud (instance rss, enabled+started, run-log actief).
2026-09-08 20:50:52 +02:00
Eddy de Vink
aa3965dcba v1.5.4: fix run-log handler-lek bij reload
_setup_run_log ruimde handlers alleen op via het instance-attribuut
self._run_logger; bij een maubot-reload is dat op de nieuwe instance weer
None, terwijl de geregistreerde logger (zelfde naam) de oude handler behield.
Elke reload voegde zo een handler toe, waardoor elke poll-run N× werd
gelogd. Fix: logger altijd op naam opruimen.
2026-09-08 14:47:48 +02:00
Eddy de Vink
cb6d00e707 v1.5.3: filter vereist titel-match of totaalscore >= 3
Regel C: doorlaten bij (titel-match >= 1) of (totaalscore >= 3).
Een treffer in de titel is een sterke OV-intentie (score 2 volstaat);
treffers alleen in de samenvatting moeten dubbel bevestigd worden.
Weert bv. woningbrand-berichten die via 'bussen rijden om'/'busverkeer'
in de lead binnenkwamen, zonder de 112/trein/staking-berichten te raken.
Gevalideerd op 30d kamerhistorie: 96 doorlaat -> 7 geblokkeerd (allemaal ruis).
2026-09-08 14:11:46 +02:00
Eddy de Vink
aa4f7144be v1.5.2: filter DPG premium-artikelen via /ps/ url-path (Parool/VK/Trouw)
Deze feeds dragen geen paywall-marker (<premium>/<dpp:paid>); premium-artikelen
leven onder /ps/. Gedeelde helper _is_paywalled_link voor RSS- en JSON-parsing.
2026-09-07 20:31:47 +02:00
Eddy de Vink
cbb9c2e55d v1.5.1: detecteer DPG paywall-marker (dpp:paid) naast Telegraaf premium 2026-09-07 20:16:42 +02:00
Eddy de Vink
a03f76ca83 v1.5.0: entry-dedup in één query + conditional get (ETag/Last-Modified)
- filter_entries: één SELECT per feed i.p.v. per-entry EXISTS (1082 queries → 20)
- feed.etag/last_modified (migratie v9); parse_feed stuurt If-None-Match/If-Modified-Since, 304 → None
- _poll_once telt unchanged (304-feeds); summary-regel uitgebreid met unchanged
- _poll_feeds re-raised CancelledError (reload-stapeling duplicaten) + handler-cleanup
2026-09-06 00:11:22 +02:00
Eddy de Vink
1f92b38ba6 v1.4.1: per-run summary log (feeds/evaluated/selected/filtered/failed)
- _broadcast checks match filter and returns (placed, filtered, failed)
- _poll_once accumulates per-run counters, logs one summary line per run
- run_log_file config writes to /data/buzzrss-runs.log (persistent mount)
- _poll_feeds re-raises CancelledError so reloads stop old poll loops
- _setup_run_log fully resets handlers; empty config disables logging
2026-09-05 23:54:09 +02:00
eddy
dff304ba56 v1.3.1: filter-score (titel 2x + summary 1x, drempel 2)
- losse 1-hit in summary volstaat niet meer: 'ns-trein' in een
  rechtszaak-artikel (stenengooier) telt als 1 cluster en wordt geblokkeerd
- cluster-aware teller: aaneengesloten matches (NS-trein, openbaar vervoer,
  pdf) samenvoegen
- bus(?:sen)? suffix: 'Meer bussen naar TU' komt terug
- root-cause config-corruptie: re.sub-replacement de-escaped \\b naar \b
  (YAML-backspace); nu regel-bewerking zonder escape-processing
2026-09-05 20:32:20 +02:00
eddy
5d75f490fc v1.3.0: paywall-filter (Telegraaf/NHD premium) + staking-fix
- exclude_paywalled config (default true): verwijdert feedparser-entries met
  <premium>true</premium> vóór opslag (Telegraaf en NHD markeren dit; AD/
  Parool/Trouw/VK/NRC niet)
- v8-migratie: entry.paywalled BOOLEAN
- staking-fix (v1.2.3): losse 'staking/stakingen' uit filter; alleen ov-
  specifiek: ov-staking, bus/tram/metro/spoor/conducteurs-staking,
  'openbaar vervoer'
- config-proof: match_filter altijd enkelregelig YAML
2026-09-05 20:18:13 +02:00
eddy
79a8d0bc71 v1.2.2: fetch-timeout 20s + poll_parallelism_limit 0 config
- parse_feed: expliciete aiohttp ClientTimeout(total=20) zodat een hangende
  feed nooit de poll blokkeert (sessie had geen total-timeout; feeds bleven
  open en semaphore-sloten raakten bezet)
- poll_parallelism_limit: 0 in instance-config (alle feeds parallel)
- RTV Oost-feed vervangen door directe URL (rss/index.xml, geen redirect)
2026-09-05 18:14:04 +02:00
eddy
f17bfe5c89 v1.2.1: ov-chipkaart/ovpay trefwoorden aan filter
- ov-chipkaart, chipkaart, ovpay, ov-pay
- reisproduct, studentenreisproduct
- vervoersbewijs, vervoerbewijs
- opwaarderen (saldo opwaarderen, ov-chipkaart context)
- bewust NIET: bankpas/saldo/contactloos/overstappen (vals-positief in
  historie: oplichting, wereldkaart, thuisbatterij)
2026-09-05 17:39:25 +02:00
eddy
38e9a151bc v1.2.0: filter uitgebreid voor betere ov-recall
- vervoerders: ns, arriva, qbuzz, syntus, breng, u-ov, allgo, flixbus,
  blauwnet, r-net, valleilijn, waterbus, eurostar, thalys, randstadrail
- samenstellingen: bus/tram/metro + halte(s)/lijn(en)/station(s)/verkeer/net
  (ving 'tramhaltes lijn 26' dat voorheen mistte)
- trein-uitbreiding: reizigers/station
- infrastructuur: spoorweg/-baan/-lijn/-verkeer/-wegovergang/-storing,
  perron(s), overweg(en), sein(storing), wisselstoring, ontsporing
- concepten: dienstregeling, reizigers, inchecken/uitchecken, pont(en),
  lightrail, pendelbus/shuttlebus
- getest op 1445 historische entries: 25 matches (was 22), 2 vals-positieven
  verwijderd (havenstaking, zwemwater), tramhaltes-gap gedicht
2026-09-05 17:32:13 +02:00
eddy
dbb4e027af v1.1.2: set-filter alleen wissen met expliciet 'clear'
- lege !rss set-filter wist NOOIT het filter, toont usage + huidig filter
- verwijderen vereist expliciet: !rss set-filter clear|none|off|remove
- voorkomt onbedoeld filterverlies
2026-09-05 17:25:30 +02:00
eddy
8c5e5a083e v1.1.1: !rss filter toont het huidige globale filter 2026-09-05 17:23:02 +02:00
eddy
676f999cce v1.1.0: enkel globaal filter (config) in plaats van per-subscription
- match_filter is nu instance-config (geldt voor ALLE feeds), niet per
  subscription: !rss set-filter <regex> zet het globale filter en slaat
  config op; !rss subscriptions toont het globale filter
- v7-migratie: per-subscription kolom match_filter verwijderd
- filter scant titel + HTML-ontdaan summary
2026-09-05 17:19:10 +02:00
eddy
0628776469 Fork xyz.maubot.rss v0.4.1: whitelist match-filter op titel+summary
- plugin id nl.eddydevink.rss, module buzzrss (uniek, voorkomt botsing met
  xyz.maubot.rss die dezelfde 'rss'-module importeert)
- match_filter (v6-migratie, hernoemd van title_exclude_filter): post wordt
  alleen verstuurd als de regex matcht op titel OF (HTML-ontdaan) summary
- config-default whitelist voor ov-only: gvb/ebs/connexxion/transdev/keolis/
  ret/gvu/bus/metro/tram/trein(verwanten)/ov/ov-staking/staking
- set-filter: lege filter valt terug op config-default
2026-09-05 17:13:39 +02:00