# Debrid Integration in Unspooled

## How It Works (Already Built)

The app has a complete client-side debrid system — no server-side RD resolution needed:

```
User enters RD key → DebridTokenStorage → DebridService (RealDebridClient)
                          ↓
DebridService.resolveStream(stream.infoHash) 
  → addMagnet → selectFiles → unrestrict → playable URL
                          ↓
                     ExoPlayer plays it
```

## Key Files

| File | Purpose |
|------|---------|
| `data/debrid/DebridService.kt` | Orchestrates all providers, resolve streams |
| `data/debrid/RealDebridClient.kt` | Full RD API: addMagnet → selectFiles → unrestrict |
| `data/debrid/DebridTokenStorage.kt` | Secure key storage |
| `data/debrid/DebridAuthManager.kt` | OAuth/PIN flows |
| `data/debrid/DebridBudgetManager.kt` | Rate limiting |
| `data/debrid/RealDebridApi.kt` | Retrofit API interface |
| `data/debrid/AllDebridClient.kt` | AllDebrid support |
| `data/debrid/PremiumizeClient.kt` | Premiumize support |
| `data/debrid/TorBoxClient.kt` | TorBox support |

## Configuring the NexStream Scraper

The app has `nexstream_scraper` registered in `SystemAddonCatalog.kt` (line 132):

```kotlin
manifestUrl = "${BuildConfig.NEXSTREAM_SCRAPER_URL}/manifest.json"
```

Set the URL in `local.properties` at the project root:
```properties
NEXSTREAM_SCRAPER_URL=http://192.168.1.50:3091
```

Without this, the app can't reach the scraper → 0 streams → "no sources found".

## Scraper Returns

The nexstream-scraper at `:3091` returns Stremio-compatible streams:

```json
{
  "streams": [{
    "name": "⏳ Torrentio 4K REMUX",
    "infoHash": "11f7c6833b905c21985a4ba0912d72a175f505b1",
    "fileIdx": 0,
    "behaviorHints": { "notWebReady": true }
  }]
}
```

The app takes `infoHash` and resolves it via `DebridService.resolveStream()`.

## Multi-User RD Key Support

The nexstream-scraper supports per-request RD keys via `?rdKey=`:
```
GET /stream/movie/tt1375666.json?rdKey=USER_API_KEY
```

The scraper uses this key for cache checking instead of the server config key.
Returns streams with `cached: true/false` status enriched.

## Direct Play Endpoint (Server-Side Resolution)

The scraper has `/api/play/{infoHash}?rdKey=KEY` which does the full RD resolution server-side:
```json
{
  "url": "https://rd-cdn.com/video.mp4",
  "filename": "Inception.2010.mkv",
  "size": 71140082403
}
```

The app can either:
1. **Client-side** (recommended, already built): Use `DebridService.resolveStream(hash)` 
2. **Server-side**: Call `/api/play/{hash}?rdKey=KEY` and play the returned URL directly
