GuíasBiblioteca

Raíces y fuentes

Cómo ve Styx tus ficheros, qué es una raíz, y qué fuentes existen hoy y cuáles están especificadas.

Especificado, con una parte implementada (las raíces locales del daemon). La tabla de estado real separa lo que existe de lo que obliga.

Raíces

El daemon de medios no abre rutas arbitrarias. Sólo lee ficheros bajo una raíz, y el resto del sistema le habla con { rootId, relPath }, nunca con una ruta absoluta. Las raíces se declaran en STYX_MEDIA_ROOTS, separadas por comas, con la forma id=/ruta[:ro][:trusted]:

STYX_MEDIA_ROOTS=peliculas=/media/peliculas:ro,series=/media/series:ro
  • id: de 1 a 64 caracteres de [A-Za-z0-9._-].
  • Como máximo 16 raíces.
  • La apertura es relativa al descriptor de la raíz: .., enlaces simbólicos y rutas que se escapen se rechazan (dec-0117 I7).
  • Monta tus carpetas de sólo lectura. La única excepción diseñada son las raíces con metadatos incrustados, que el operador marca aparte (guía de metadatos).

Fuentes

Toda fuente implementa una interfaz de lectura con rangos (SeekableMediaSource) con cancelación por petición. Las fuentes previstas, y su estado:

FuenteEstado
Disco local bajo una raíz del daemonImplementado
HTTP con rangos (en TypeScript)Existe en el SDK de fuentes, pero no sirve vídeo: los bytes de vídeo no pasan por JS
SFTP / WebDAV / SMB (Storage Box)Especificado: Storage Box
S3, Jellyfin, Xtream, torrentEspecificado en el modelo de dominio, sin implementación en el daemon

El catálogo puntúa varias fuentes de una misma película y elige la mejor (dec-0025).

Estado real

PiezaEstado
Declarar raíces y leerlas fd-relativasImplementado
Escanear un fichero (POST /scan, Bearer de propietario)Implementado
Recorrer una raíz entera y crear obras por contenidoEspecificado (dec-0114), sin código
Una película, una obra: re-escanear no duplicaEspecificado: hoy cada escaneo sin id crea una obra nueva
Series, temporadas, episodiosEspecificado: hoy todo se registra como película

Mientras no exista el recorrido de raíces, la forma de dar de alta ficheros es subirlos o escanearlos uno a uno por la API.

Escanear un fichero por la API

La operación tal y como la publica el OpenAPI de catalog-svc (la misma que lista la referencia de la API):

POST
/scan

Authorization

bearerAuth
AuthorizationBearer <token>

Access token de identity-svc (JWT EdDSA, caducidad corta). Se verifica en local y después contra la sesión viva (revocation-aware).

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

editionId?string
path*string
Length1 <= length
workId?string

Response Body

application/json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

curl -X POST "https://example.com/scan" \  -H "Content-Type: application/json" \  -d '{    "path": "string"  }'
{  "asset": {    "container": "string",    "createdAt": 0,    "editionId": "string",    "fastHash": "string",    "id": "string",    "identification": "identified",    "kind": "logical-composition",    "layout": "file",    "path": "string",    "sizeBytes": 0,    "updatedAt": 0  },  "index": {    "assetId": "string",    "bitrateBps": 0,    "capabilities": [      "string"    ],    "container": "string",    "createdAt": 0,    "durationMs": 0,    "id": "string",    "indexVersion": 0,    "keyframesMs": [      0    ],    "streams": [      {        "bitRateBps": 0,        "channels": 0,        "codec": "string",        "defaultFlag": true,        "frameRate": 0,        "height": 0,        "index": 0,        "language": "string",        "sampleRate": 0,        "type": "video",        "width": 0      }    ]  },  "indexed": true}