Skip to content

feat: add Browse page with agenda view#23

Open
fsargent wants to merge 4 commits into
bellingcat:mainfrom
fsargent:add-meeting-browser
Open

feat: add Browse page with agenda view#23
fsargent wants to merge 4 commits into
bellingcat:mainfrom
fsargent:add-meeting-browser

Conversation

@fsargent

Copy link
Copy Markdown

Summary

⚠️ Depends on #22 (Civico provider). Until #22 merges, this PR's diff shows both PRs' commits combined; after merge GitHub will auto-rebase and the diff will collapse to just this PR's work. Please review and merge #22 first.

  • Adds GET /meetings/browse — paginated list of meetings without a search query, with filters for authority, date range, transcript availability, and sort. Useful for spotting meetings that have been ingested but lack transcripts.
  • Adds GET /meetings/{uid}/agenda — reads the existing agenda table (populated on ingest but previously unreadable from the API).
  • Extends the Civico provider to scrape #agenda_data li.agenda from each meeting's HTML page. Civico has no agenda JSON endpoint, but the agenda is rendered server-side. Scraping runs in a ThreadPoolExecutor; per-page failures degrade to an empty agenda rather than aborting ingest.
  • Adds a new /browse Vue page with an expandable "Show agenda" section per meeting card, plus a Search/Browse tab bar in App.vue.

Why

The existing Search view requires a query and only ranks transcripts, so meetings without a transcript (which is currently 100% of Westminster's Civico meetings) are invisible. This adds a way to browse the corpus, see ingest coverage gaps, and read agendas even when no transcript exists.

Test plan

  • GET /meetings/browse with each has_transcript value (true/false/omitted) returns the expected counts.
  • GET /meetings/{uid}/agenda returns 6 items for civico-westminster-18872, matching the Civico page.
  • Civico agenda scrape against 24 Westminster meetings → 216 agenda rows in agenda table, no errors.
  • Frontend: Browse page loads, filters work, "Show agenda" lazy-loads and caches per meeting, Search/Browse tabs navigate correctly.
  • Reviewer: confirm UX on mobile widths.

🤖 Generated with Claude Code

fsargent and others added 4 commits May 21, 2026 12:00
Adds a new `civico` provider class that paginates Civico's
archived-meetings JSON API (www.civico.net/api/{authority}/{offset}/archived)
and ingests meeting metadata.

UIDs are prefixed (civico-{authority}-{id}) to stay globally unique
across authorities, since Civico's integer id is only per-tenant.
`get_meetings` is currently a pass-through: Westminster's Civico tenant
publishes no captions (live_transcription is 0; no subtitle track in
DASH/HLS manifests), so transcript search will return no Westminster
results until a future ASR pipeline is added.

To register Westminster after deploy:
  POST /meetings/add_provider?provider=civico
  POST /meetings/add_authority?authority=westminster&provider=civico&nice_name=Westminster

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per-authority INFO logs (build index, fetch transcripts, store) plus
top-level start/complete, so 'tail -f' shows clear ingest progress.
Per-authority try/except + logger.exception so one provider's failure
doesn't terminate the whole batch silently.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds GET /meetings/browse for listing meetings without a search query, with
filters for authority, date range, transcript availability, and sort. Useful
for spotting meetings that have been ingested but not yet transcribed.

Adds GET /meetings/{uid}/agenda that reads the existing `agenda` table
(populated by add_meetings_to_db but never exposed). Returns ordered agenda
items.

Extends the Civico provider to scrape #agenda_data li.agenda from each
meeting's HTML page, since Civico publishes no machine-readable agenda
endpoint. Agenda fetching runs in a ThreadPoolExecutor like PublicI's
transcript fetch, and a single failed page degrades to an empty agenda
rather than aborting the whole ingest.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds /browse: a paginated list view of every meeting in the DB, with the
same authority/date filters as Search plus a "Transcript availability"
selector so users can see which meetings have not been transcribed yet.
Each card has a "Show agenda" toggle that lazily fetches /meetings/{uid}/agenda
and renders it inline.

Wraps the app in a v-app-bar with Search/Browse tabs so users can switch
between the two views.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant