# newsletter-events-add-source > Add Instagram accounts or web aggregators to sources.yaml configuration - Author: Aniket Panjwani - Repository: aniketpanjwani/local_media_tools - Version: 20251226012256 - Stars: 39 - Forks: 0 - Last Updated: 2026-02-06 - Source: https://github.com/aniketpanjwani/local_media_tools - Web: https://mule.run/skillshub/@@aniketpanjwani/local_media_tools~newsletter-events-add-source:20251226012256 --- --- name: newsletter-events-add-source description: Add Instagram accounts or web aggregators to sources.yaml configuration --- STOP. Before doing ANYTHING else, you MUST read this entire file. This skill uses a dispatcher pattern with separate workflows: - For web URLs → Read `workflows/add-web-aggregator.md` (HAS MANDATORY PROFILING) - For Instagram → Read `workflows/add-instagram.md` DO NOT just edit sources.yaml directly. Follow the workflows. ## Configuration Location All sources are stored in `~/.config/local-media-tools/sources.yaml`. ## Source Types & Routing | Type | Detection | Workflow | |------|-----------|----------| | Instagram | `@handle` or alphanumeric handle | `workflows/add-instagram.md` | | Web Aggregator | `http://` or `https://` URL | `workflows/add-web-aggregator.md` | | Facebook | `facebook.com/events/*` | Not stored - use `/research` directly | ## Key Differences - **Instagram**: Simple add - no profiling needed - **Web Aggregator**: Requires profiling to discover optimal scraping strategy What sources do you want to add? **Examples:** - `@localvenue @musicbar` - Add Instagram accounts - `https://hudsonvalleyevents.com` - Add web aggregator (will be profiled) - `@venue1 and https://events.com` - Mix of sources **Note:** For Facebook events, use `/research https://facebook.com/events/123456` instead. Provide the source(s): ## Step 1: Parse and Classify Input Analyze user input and classify each source: ```python import re sources = {"instagram": [], "web": [], "facebook": []} for token in user_input.replace(",", " ").replace(" and ", " ").split(): token = token.strip() if not token: continue if "facebook.com/events/" in token: sources["facebook"].append(token) elif token.startswith("@") or re.match(r"^[a-zA-Z][a-zA-Z0-9_.]+$", token): sources["instagram"].append(token.lstrip("@").lower()) elif token.startswith("http://") or token.startswith("https://"): sources["web"].append(token) ``` ## Step 2: Handle Facebook URLs If any Facebook URLs detected, inform user: ``` Facebook events are not stored in configuration. Pass URLs directly to /research instead: /research https://facebook.com/events/123456 ``` Continue processing other sources. ## Step 3: Route to Workflows ### For Instagram handles: If `sources["instagram"]` is not empty: 1. Read `workflows/add-instagram.md` 2. Follow that workflow for all Instagram handles 3. Collect results ### For Web URLs: If `sources["web"]` is not empty: 1. Read `workflows/add-web-aggregator.md` 2. Follow that workflow for EACH web URL (profiling is per-source) 3. Collect results **IMPORTANT:** Process web sources one at a time since each requires interactive profiling. ## Step 4: Report Combined Results After both workflows complete, display combined summary: | Type | Source | Name | Status | |------|--------|------|--------| | Instagram | @localvenue | Local Venue | Added | | Instagram | @musicbar | Music Bar | Already exists | | Web | greatnortherncatskills.com | Great Northern Catskills | Added (profiled) | ``` Config saved to ~/.config/local-media-tools/sources.yaml Run /newsletter-events:research to scrape these sources. ``` - [ ] All sources parsed and classified by type - [ ] Facebook URLs identified with redirect message - [ ] Instagram sources processed via `workflows/add-instagram.md` - [ ] Web sources processed via `workflows/add-web-aggregator.md` (with profiling) - [ ] Combined results displayed to user