# Jellyfin — integración de lectura

## API y autenticación

Fuentes oficiales consultadas: controladores [System](https://github.com/jellyfin/jellyfin/blob/master/Jellyfin.Api/Controllers/SystemController.cs), [LibraryStructure](https://github.com/jellyfin/jellyfin/blob/master/Jellyfin.Api/Controllers/LibraryStructureController.cs), [User](https://github.com/jellyfin/jellyfin/blob/master/Jellyfin.Api/Controllers/UserController.cs) y [Session](https://github.com/jellyfin/jellyfin/blob/master/Jellyfin.Api/Controllers/SessionController.cs). El cliente oficial [JellyCon](https://github.com/jellyfin/jellycon/blob/master/resources/lib/jellyfin.py) también documenta mediante su implementación el encabezado `Authorization: MediaBrowser`.

| GET | Uso | Respuesta |
| --- | --- | --- |
| `/System/Info` | Conexión, información y salud de acceso | `Id`, `ServerName`, `Version` |
| `/Library/VirtualFolders` | Bibliotecas | Array: `ItemId`, `Name`, `CollectionType` |
| `/Users` | Usuarios remotos | Array de usuarios |
| `/Sessions` | Reproducciones | Array de sesiones; se muestran las que contienen `NowPlayingItem` |

La API key sale únicamente en el encabezado `Authorization: MediaBrowser … Token="…"`. No se usa `/Users/Public` como sustituto de una consulta administrativa. Los permisos del token pueden producir 401/403 aunque la dirección responda.

## Formato legacy comprobado

`jellyfinservers.host` admite esquema explícito o host/IP con puerto incluido. En la copia se observaron una URL HTTPS y una IP con puerto sin esquema; `port` separado está vacío. Se conserva el puerto embebido. Para host sin esquema se utiliza HTTP; si existe el campo `port`, se agrega sin duplicarlo. Si ambos puertos existen y difieren, se bloquea la conexión. Se conserva un eventual prefijo de reverse proxy.

No se transforma ni escribe el host legacy. Se exige aprobación por ID y autorización de CIDR para LAN/VPN.

## Datos mostrados

Usuarios: ID, nombre, habilitación, privilegio administrador, reproducción/transcodificación y último acceso cuando estén presentes. Nunca se envía a Blade el JSON completo del usuario, su configuración, contraseña o token.

La comparación usa `jellyfincustomers.json_data.Id` y el servidor correspondiente. ID exacto único: Vinculado; sin coincidencia: No vinculado; identidad ambigua: No determinable. Los usuarios sin vínculo o ambiguos solo son visibles para roles de alcance global con permiso de clientes. Los revendedores ven únicamente coincidencias únicas de su alcance.

Sesiones: `PositionTicks`/`RunTimeTicks` se convierten a milisegundos; `PlayMethod` distingue Direct Play, Direct Stream y Transcode. Se conservan campos ausentes como null. La última actividad no se presenta como inicio de reproducción.

Endpoints verificados en fuentes oficiales y pruebas fake. Versión instalada, credenciales, certificado y comportamiento del servidor real siguen sin comprobar.
