# Clean Addon-Only Architecture — 2026-05-31

## What Changed

The multi-tier source architecture (embed URLs → direct link scrapers → debrid) and the
Go scraper proxy were **removed** from Unspooled. The app now uses only Stremio addon-based
debrid sources — no web scraping, no hardcoded embed URLs, no Free Tier.

### Removed: System Debrid Addon Providers (2026-11-30)

In addition to the scraper proxy, three hardcoded addon providers were removed from the
app's internal registry — users now install addons by URL only:

| Provider | Status |
|----------|--------|
| `data/addon/CometProvider.kt` | ❌ Deleted |
| `data/addon/MediaFusionProvider.kt` | ❌ Deleted |
| `data/addon/TorrentioProvider.kt` | ❌ Deleted |

**Why:** Hardcoded system addon providers create maintenance burden — URLs change, API
requirements change (Comet now needs a private API key), and they clutter the UI with
addons the user didn't choose.

**What's left:**
- `AIOStreamsProvider.kt` — kept as recommended preset, auto-configures with debrid
- `SystemAddonCatalog.DEBRID_ENGINES` — now empty
- Old system addon IDs added to `REMOVED_SYSTEM_IDS` so they don't reappear
- Users install Comet/MediaFusion/Torrentio by URL via QR code flow (see Section 10)
- Presets "balanced" / "max" removed from `AddonRegistryRepository`

## Files Removed

| File | Purpose |
|------|---------|
| `data/provider/EmbedSourceProvider.kt` | SmashyStream, VidSrc, AutoEmbed, VidSrc.me |
| `data/provider/DirectLinkProvider.kt` | Scraper proxy client (AllMovieLand, SwiftStreamz) |
| `service/RemoteInputService.kt` | Android AccessibilityService for web remote |
| `res/xml/remote_input_service_config.xml` | AccessibilityService config |
| `data/addon/CometProvider.kt` | Comet Stremio addon (system provider) |
| `data/addon/MediaFusionProvider.kt` | MediaFusion Stremio addon (system provider) |
| `data/addon/TorrentioProvider.kt` | Torrentio Stremio addon (system provider) |
| `~/scraper-proxy/` (entire Go project) | Go + Fiber + Colly scraper proxy |
| Nginx `/api/scraper/`, `/remote`, `/api/remote/` routes | All scraper/remote proxy routes |
| Docker container `scraper-proxy` | Go proxy container |

## Files Modified

| File | Change |
|------|--------|
| `data/provider/ProviderRegistry.kt` | Removed `alwaysEnabled` section (embed + direct providers); only `debridRequired` remains |
| `AndroidManifest.xml` | Removed BIND_ACCESSIBILITY_SERVICE, FOREGROUND_SERVICE, POST_NOTIFICATIONS permissions; removed RemoteInputService declaration |
| `strings.xml` | Removed remote input service description |
| `/etc/nginx/sites-enabled/default` | Purged all scraper/remote blocks; clean nginx config |
| `SystemAddonCatalog.kt` | `DEBRID_ENGINES` list emptied |
| `AddonRegistryRepository.kt` | Comet/MediaFusion/Torrentio/Jackettio entries removed; "balanced"/"max" presets removed |
| `data/addon/AIOStreamsProvider.kt` | Kept as recommended preset (not removed) |

## Archive Location

The entire scraper-proxy project is archived at:

```
~/Unspooled-archive/scraper-proxy/
```

Includes:
- `main.go` — Go server with Fiber routes (embed resolver, scraper, web remote)
- `embed_resolver.go` — Site-specific resolvers (SmashyStream, VidSrc, AutoEmbed, etc.)
- `Dockerfile` — Multi-stage Go build
- `compose.yml` — Docker Compose config
- `go.mod` / `go.sum` — Dependencies

## Test — Provider Registry Cleanliness

File: `app/src/test/java/com/unspooled/app/data/provider/ProviderRegistryProvidedSourcesTest.kt`

```kotlin
class ProviderRegistryProvidedSourcesTest {
    private val bannedProviderIds = listOf(
        "embed-sources", "direct-links", "smashystream", "vidsrc",
        "autoembed", "allmovieland", "swiftstreamz", "xprime",
        "vidlink", "hdo-box", "123movies", "dood", "gogoanime",
        "cloudnestra", "flixvision",
    )

    @Test fun `providers list contains NO embed or direct-link scrapers`() { ... }
    @Test fun `no providers available without debrid connection`() { ... }
    @Test fun `only debrid scraper provider registered when debrid connected`() { ... }
    @Test fun `no embed source URLs or scraper proxy URLs in any provider config`() { ... }
    @Test fun `provider registry has no alwaysEnabled free-tier providers`() { ... }
}
```

5 tests, all pass. Prove that: banned scraper IDs never appear, no free tier exists,
only debrid providers appear when debrid connected, no scraper proxy URLs remain.

## Source Priority (Current)

1. AIOStreams configuredManifestUrl (auto-configured with debrid tokens)
2. User-installed Stremio addons (via URL/QR code)
3. Debrid Search / user debrid library
4. *(No embed/webpage/direct/system-addon fallback)*
