fix(events): Eventbrite provider — switch from dead API to web scraping

Eventbrite shut down their public Event Search API (/v3/events/search)
in 2023. The provider now uses the website extractor pipeline
(mana-research + LLM) to scrape Eventbrite's public search pages.
No API key needed — same pipeline as any website source.

Also adds mana-events to generate-env.mjs for automatic .env generation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-04-18 16:51:58 +02:00
parent 536fc89050
commit 97abd251e3
5 changed files with 60 additions and 155 deletions

View file

@ -42,7 +42,6 @@ const TEST_CONFIG: Config = {
},
manaResearchUrl: 'http://localhost:3068',
manaLlmUrl: 'http://localhost:3025',
eventbriteApiKey: null,
meetupApiKey: null,
};

View file

@ -29,7 +29,14 @@ describe('Provider registry', () => {
});
describe('Eventbrite provider', () => {
it('returns empty with error when API key is not set', async () => {
it('requires a region label', async () => {
const provider = getProvider('eventbrite')!;
const result = await provider.fetchEvents('', 'Test');
expect(result.events).toHaveLength(0);
expect(result.error).toContain('Region label');
});
it('requires external service config', async () => {
const provider = getProvider('eventbrite')!;
const result = await provider.fetchEvents('', 'Test', {
lat: 47.997,
@ -38,15 +45,7 @@ describe('Eventbrite provider', () => {
regionLabel: 'Freiburg',
});
expect(result.events).toHaveLength(0);
expect(result.error).toContain('EVENTBRITE_API_KEY');
});
it('gracefully handles missing coordinates (after API key check)', async () => {
// Without API key, the key check fires first — that's the expected behavior
const provider = getProvider('eventbrite')!;
const result = await provider.fetchEvents('', 'Test');
expect(result.events).toHaveLength(0);
expect(result.error).toBeTruthy();
expect(result.error).toContain('config');
});
});