Quick FruitDeepLinks update from tonight. Lots of small stuff, but a few big themes landed and it’s all working together way better now.
- Chrome Capture integration (main focus)
- Added new env knobs for Chrome Capture: CC_SERVER + CC_PORT (wired into compose env).
- fruit_export_lanes.py now generates Chrome Capture “stream proxy” URLs instead of pointing straight at an HTML deeplink page.
- It URL-encodes the FruitDeepLinks deeplink API URL and emits something like:
chrome://<CC_SERVER>:<CC_PORT>/stream?url=<encoded_deeplink_api_url>
- It URL-encodes the FruitDeepLinks deeplink API URL and emits something like:
- Added a new “tune-style” endpoint: GET /api/lane//launch
- Returns a 302 redirect to the resolved HTTP deeplink
- Includes no-store / no-cache headers (Chrome Capture behaves better with this)
- Tightened semantics after the initial version so it’s strict about “must be a real event” and doesn’t do sketchy fallbacks.
- Event Inspector + API helper improvements
- Added new Event Inspector UI pages (templates + dashboard wiring).
- Makes it way easier to browse events, drill into an event, and see why the system picked a specific playable/link.
- Updated the API helper page too so it’s easier to poke endpoints, flip filters, and verify lane + deeplink behavior without constantly rewriting curl/PowerShell.
- Filters + ADB lanes are now actually unified
- ADB lane builder now respects user preferences:
- enabled_services gates which ADB providers even build lanes
- disabled sports/leagues are applied while generating adb_lanes
- it clears + rebuilds adb_lanes each time so changes take effect immediately
- ADB deeplink endpoint is provider-locked and enforces enabled_services at request time.
- This prevents weird cross-provider results (like a sportscenter lane returning an aiv:// link).
- /api/apply-filters is now the “one button” sync point: it rebuilds multisource lanes and ADB provider lanes so everything stays consistent.
- Live logs got more reliable (SSE change)
- Log streaming switched from raw lines to JSON payloads like:
{"seq": , "log": ""} - Having a sequence number makes incremental rendering, reconnects, and de-dupe behave a lot better (less “logs froze” vibes).
- Kayo scraping + ingestion hardening
- Fixed Kayo fixtures scraping headers.
- If Kayo returns 403, the scraper stops instead of hammering the endpoint.
- Kayo import now carries cleaner metadata into DB rows:
- channel_name becomes “Kayo Sports”
- channel_provider_id uses Kayo’s linear provider/channel code when present (ex: fsa505)
- classification_json includes sport + league so filtering/inspection works like the other providers
- Apple import: progress visibility + skip optimization
- Apple import step is now more verbose / streamed so you see progress instead of “did it hang?”
- Added an Apple import stamp file (data/.apple_import_stamp.json) so --skip-scrape can skip Apple import if apple_events.db hasn’t changed (mtime/size signature).
Bonus: we also chased a weird ADB lane timing bug (API saying “No event scheduled” while DB showed a live event) and fixed the time parsing/selection so live lane lookups actually return the right event consistently.
I'd recommand this update if you are an ADB tester!



