Escribir un plugin de Kino¶
Un plugin de Kino es una fuente de video que cualquiera puede publicar como un repositorio pequeño
de GitHub: un manifiesto JSON y un archivo JavaScript. Una persona escribe owner/repo en Kino, ve
con qué sitios va a hablar el plugin, acepta, y desde ese momento el plugin es una fuente más: sus
resultados salen en la búsqueda y en Inicio, y sus títulos se abren, listan capítulos, se reproducen
en el reproductor de Kino, guardan el progreso y aparecen en "Continuar viendo" y en la biblioteca
como cualquier otro título.
Puedes escribir, ejecutar y probar un plugin en tu computador con Node antes de tocar la app. Esta guía tiene todo lo que necesitas: la estructura de archivos, el manifiesto, el contrato que tu código debe cumplir, la API que Kino te da, cada límite, las particularidades del motor de JavaScript y cómo publicar.
La demo completa de la API es kinotvapp/kino-plugin-own-server
("Tu servidor" 1.5.0: cada función hasta apiVersion 7 funcionando de punta a punta); kinotvapp/kino-plugin-archive
(Internet Archive) es la plantilla de arranque más simple. Los dos traen la carpeta sdk/, el kit de
Node. Otros dos archivos describen el contrato para máquinas (los dos están en la página
Referencia): contract.json guarda cada número y cada regla que la app hace
cumplir (las tablas de esta guía salen de él, y las pruebas de la app amarran sus propias constantes
a él), y kino.d.ts declara toda la API kino para tu editor
(/// <reference path="./kino.d.ts" /> al comienzo de plugin.js).
El camino de 5 minutos¶
- Parte de la plantilla. Crea tu repositorio desde
kinotvapp/kino-plugin-archive -- la más
simple -- o desde kinotvapp/kino-plugin-own-server
si necesitas ajustes, sesión, descargas o canales en vivo ("Use this template" en cualquiera de
los dos, o clónalo y copia
sdk/). No le hagas fork: la búsqueda de la comunidad de Kino deja los forks por fuera (Hazte encontrar). O deja que el kit te escriba un esqueleto:node sdk/init.mjs mi-plugin --host example.com. - Declara lo que necesitas en
kino-plugin.json: unid, loshostsa los que vas a llamar y lascapabilitiesque exportas (Manifiesto). - Escribe las funciones en
plugin.js:searchohome(o las dos), y como mínimoresolve(Contrato, APIkino). - Revísalo como lo hace Kino:
node sdk/validate.mjs .y luegonode sdk/run.mjs . search "algo"(Probar en local). - Publícalo como repositorio público con el topic
kino-plugin(obligatorio: sin él Kino no lo encuentra), e instálalo en Kino desde Ajustes > Plugins escribiendoowner/repoo pegando la URL de sukino-plugin.json(Publicar). - Haz que Kino lo muestre solo en "De la comunidad": topic, nombre y descripción, y cómo comprobarlo, en Aparecer en Kino.
¿Usas un asistente de IA? Dale el prompt listo: lee toda esta guía desde llms-full.txt y
sigue AGENTS.md.
Qué es un plugin¶
Un repositorio público de GitHub, o una carpeta dentro de uno, con:
kino-plugin.json el manifiesto (obligatorio)
plugin.js el código: un solo módulo ES (obligatorio; su nombre lo fija "entry")
icon.png opcional, cuadrado, máximo 128 KB
README.md para humanos
Kino ejecuta tu código en un sandbox: sin sistema de archivos, sin temporizadores, sin otros plugins,
sin acceso a los datos de la persona. La única salida es kino.fetch, que solo llega a los hosts que
declara tu manifiesto y que la persona aprobó en pantalla, más los servidores que la persona escribió
en los ajustes de tu plugin (mira Manifiesto).
Kino carga exactamente un archivo JavaScript, así que no hay nada a lo que un import pueda
resolverse. Si usas un paso de compilación o una librería, empaqueta todo en ese único archivo --
mira Dividir tu código en varios archivos para un ejemplo completo.
Cómo lo instala la gente. En Kino, Ajustes > Plugins, escriben la dirección de tu repositorio:
| Escriben | Kino lee |
|---|---|
owner/repo |
la raíz del repositorio, rama por defecto |
owner/repo/sub/dir |
una carpeta dentro del repositorio |
owner/repo@v1.2.0 |
una rama, tag o commit (el nombre no puede tener /); también sirve con una carpeta |
https://github.com/owner/repo o .../tree/<ref>/<path> |
lo mismo, pegado desde el navegador |
https://raw.githubusercontent.com/owner/repo/<ref>/<path>/kino-plugin.json (o un github.com/.../blob/<ref>/.../kino-plugin.json, también /raw/) |
la carpeta donde está ese .json, en esa ref; cualquier otro tipo de archivo se rechaza |
https://cdn.jsdelivr.net/gh/owner/repo[@<ref>]/<path>/kino-plugin.json (también fastly, gcore, testingcf y quantil.jsdelivr.net) |
la misma carpeta del repositorio, leída desde GitHub: sin @ref o con @latest es la rama por defecto; la ref tiene que ser una rama, tag o commit exactos (@main, @v1.2.0), así que un rango de versiones (@1, @^1.2, @1.x) se rechaza |
https://<cualquier servidor público>/<path>/kino-plugin.json |
un plugin alojado fuera de GitHub: mira Instalar desde la URL del manifiesto |
El campo de Kino dice "Escribe usuario/repositorio de GitHub o pega la URL del manifest
(kino-plugin.json)". Un ?query o un #fragmento en una URL pegada se ignora. Una ref que solo viene
de una URL pegada (tree, blob, raw, raw.githubusercontent.com o el @ref de jsDelivr) no es un
pin: un plugin con secretos sellados pegado así se instala desde la rama
principal.
Con una dirección de repositorio, Kino descarga kino-plugin.json, tu archivo de entrada y el ícono
desde raw.githubusercontent.com; por eso el repositorio tiene que ser público. Una URL del
kino-plugin.json de un repositorio (en GitHub, raw.githubusercontent.com o jsDelivr) siempre se
convierte en la dirección de ese repositorio, así que los secretos sellados, la firma y la búsqueda de
la comunidad le siguen funcionando.
Instalar desde la URL del manifiesto¶
Tu plugin no tiene que vivir en GitHub (nuevo en la versión de Kino que sigue a la 0.9.49). La gente
puede pegar la URL https de su kino-plugin.json en cualquier servidor público: tu propio sitio,
GitHub Pages, un CDN como el npm/ de jsDelivr. Kino la guarda como la dirección
url:https://…/kino-plugin.json (esquema y host en minúsculas, puerto por defecto, sin query ni
fragmento): esa URL es la identidad del plugin, y viaja tal cual a los otros aparatos de la persona con
la sincronización de plugins.
entryeiconse leen relativos a la URL del manifiesto:"entry": "plugin.js"al lado dehttps://example.com/kino/kino-plugin.jsoneshttps://example.com/kino/plugin.js.- Solo
https(http://se rechaza con "Kino solo instala plugins desde direcciones https…"), en un nombre público: nada de direcciones IP,localhost, nombres de una sola etiqueta o.local/.lan, ni usuario:contraseña en la URL, y el archivo tiene que llamarse exactamentekino-plugin.json. También se rechazan un nombre que resuelve a una dirección privada y una redirección que sale dehttpso va a un host así. - Sin secretos sellados: los sellos van amarrados a un repositorio de GitHub, así que un
manifiesto con
secretsinstalado desde una URL se rechaza ("Este plugin trae datos sellados, y esos solo funcionan si lo instalas desde su repositorio de GitHub…"). Publica ese plugin en GitHub. - Sin firma: una
signatureva amarrada aowner/repo, así que no se revisa y el plugin se instala (y se muestra) como no firmado. - Todo lo demás es igual que con un repositorio: la hoja de consentimiento, los
hostsy cada regla de aprobación, y las actualizaciones: Kino vuelve a leer la misma URL y aplica unaversionmás alta, y pregunta otra vez cuando necesita más de lo aprobado. La búsqueda de la comunidad nunca lo lista (solo encuentra repositorios de GitHub con el topickino-plugin).
Los addons de Stremio son una función de Kino para la gente, no algo que tú escribes: en el mismo
campo una persona puede pegar la dirección del manifest.json de un addon de Stremio (o un enlace
stremio://) y Kino genera un plugin para él. Nada de esta guía cambia para tu plugin.
La guía, página por página¶
| Página | Qué tiene |
|---|---|
| Primer plugin | Dos archivos que buscan y reproducen, y cómo ejecutarlos |
| Plugins firmados | Firma tu plugin con tu propia clave para que la gente sepa que cada actualización es tuya (apiVersion 5, Kino 0.9.45+) |
| Novedades | Qué cambió para quienes escriben plugins, por versión de Kino |
| Manifiesto | Cada campo y regla de kino-plugin.json, ajustes, streamHosts, secretos sellados, los servidores propios de la persona, insecureHttp, descargas |
| Contrato | Las funciones que exportas, sus argumentos, lo que devuelves, las preguntas de host y el permiso amplio de video, y los errores que la gente entiende |
| API kino | fetch, cookies, secret, crypto, sleep, config, HTML, storage, log, rank |
| Canales en vivo | Ítems live, la pestaña En vivo, listas M3U/XMLTV, guías, liveStreamHosts, tres recetas |
| Personaliza tu plugin | Todo lo que tu plugin puede cambiar de cómo lo muestra Kino, en una tabla: ícono, color, ajustes, sección, categorías, colores, filas de Inicio, menú Servidor, tus propias frases |
| Formulario de ajustes | Todos los tipos de campo y sus atributos, section, status y action, clearSettings, validateSettings, un ejemplo completo, la pestaña propia y la sincronización |
| Firma por petición | Streams HLS firmados en cada petición: signing, sign, reintentos y alternateHosts (apiVersion 6) |
| Navegador oculto | "browser": true / "pages", kino.browser.capture y kino.browser.page: cuándo usarlos, el modelo de seguridad, nunca un captcha, tiempos y fallas (apiVersion 6) |
| Pasar lo guardado | migrate: pasar a tu plugin lo que la persona tenía guardado (apiVersion 6) |
| Sección, categorías y colores | section, categories y theme (apiVersion 6) |
| Registro y telemetría | debug, la página Registro, telemetry, kino.log.report, logcat y las métricas de reproducción (apiVersion 6) |
| Límites y trampas del motor | Todos los números en un solo lugar, cómo vive tu código, lo que le falta a QuickJS, la trampa del rechazo |
| Probar en local | El kit de Node: run.mjs, validate.mjs, grabar y reproducir, canales en vivo |
| Aparecer en Kino | Los cinco pasos para salir en "De la comunidad", cuánto tarda y cómo comprobarlo |
| Publicar | Versiones, actualizaciones y aprobaciones, y cómo aparecer en "De la comunidad" |
| Lo que ve la persona | La hoja de consentimiento, los diálogos de host, los mensajes del reproductor, Configurar, estados, desactivar y desinstalar |
| Recetario | Un sitio HTML con login, una API JSON con token, el servidor propio de la persona, Widevine, http plano |
| Scrapers de Nuvio | Cómo instala la gente los scrapers de Nuvio, qué arma la conversión y sus límites |
| Addons de Stremio | Cómo instala la gente un addon de Stremio, cómo se traduce cada recurso, qué se rechaza y sus límites |
| Plugins de ejemplo | Los dos ejemplos publicados, y cómo está hecho el plugin de referencia |
| Reclamos y retiro de plugins | Cómo pedir que un plugin de la comunidad salga del índice, qué hace Kino y cómo apelar |
| Referencia | contract.json y kino.d.ts, para leer o descargar |