Addons para Frunk.tv
Un addon lleva películas, series o canales a Frunk.tv: en Cine y Series y en TV, en la app de Android, en la web y en el coche. Cualquiera puede hacer uno. Es un conjunto de ficheros JSON que se piden por https: Frunk.tv los lee y los enseña, y nunca ejecuta código del addon. Esta página explica el formato. Para usar Cine y Series, mira su guía.
Cómo funciona
- El usuario abre el enlace de instalación del addon, o pega su dirección en Cine y Series («+»), en el coche o enviándola desde el móvil con un código QR.
- Frunk.tv le enseña el nombre, quién dice publicarlo, el dominio desde el que llega, su contacto y qué trae, y le pide confirmación.
- Mientras navega, el dispositivo pide al addon las listas, las fichas y los enlaces, directamente: nada pasa por el servidor de Frunk.tv. Las peticiones no llevan cookies ni nada de la cuenta del usuario.
- Las películas y series salen en Cine y Series. Los canales en directo salen en TV, junto a las listas IPTV, y son siempre gratis en Frunk.tv.
El manifiesto
Un JSON servido por https con Access-Control-Allow-Origin: * (la web lo pide desde frunk.tv). Las
demás rutas son relativas a la carpeta del manifiesto.
{
"frunk_addon": 1,
"id": "org.example.cine",
"name": "Cine de ejemplo",
"description": "Qué tiene, en una o dos frases.",
"version": "1.0.0",
"publisher": { "name": "Ejemplo", "url": "https://example.org", "contact": "[email protected]" },
"logo": "logo.png",
"types": ["movie", "series", "channel"],
"resources": ["catalog", "meta", "stream", "search", "live"],
"catalogs": [
{ "type": "movie", "id": "estrenos", "name": "Estrenos", "search": true,
"filters": [{ "key": "genre", "name": "Género", "options": ["Comedia", "Drama"] }] },
{ "type": "series", "id": "todas", "name": "Series" },
{ "type": "channel", "id": "canales", "name": "Canales", "live": true }
],
"settings": [],
"debrid": false
}
frunk_addon: la versión del formato,1.id: minúsculas y puntos, estable.name(hasta 60 caracteres),description(hasta 400) yversion(solo se enseña).publisher: obligatorio, connameycontact(un correo o una dirección https) para que un titular de derechos pueda escribirte.types:movie,seriesochannel.catalogs: tus listas.search: truesi admite búsqueda;filters, hasta tres;live: trueen una de canales en directo.debrid:truesi los enlaces se abren con la cuenta de AllDebrid del propio usuario.private(opcional):truemarca el addon como privado; la app no ofrece compartirlo.
Las rutas
Todas son GET, todas terminan en .json y todas contestan JSON. Por eso un addon puede ser
una carpeta de ficheros estáticos (GitHub Pages, por ejemplo); solo pierde la búsqueda y las páginas.
catalog/<tipo>/<catálogo>.json?skip=&search=&genre=
meta/<tipo>/<id>.json
stream/<tipo>/<id>.json
epg/<id del canal>.json?from=&to=
catalog:{"items": [{"id", "name", "year", "poster", "rating", "quality", "genres"}]}, hasta 100 por página.skipdice cuántos se han recibido ya; la lista se acaba con una página vacía o sin nada nuevo.meta:{"meta": {…, "description", "background", "ids": {"imdb", "tmdb"}, "videos": [{"id", "season", "episode", "name"}]}}. Un episodio es<serie>:<temporada>:<episodio>.epg:{"programmes": [{"start", "end", "title", "description"}]}, con las horas en segundos desde 1970.- Cada petición lleva
lang, el idioma del usuario, por si quieres contestar en él.
Los enlaces
stream se pide justo antes de reproducir, así que los enlaces pueden ser firmados y de corta duración:
{ "streams": [{
"url": "https://cdn.example.org/peli/master.m3u8",
"kind": "hls",
"name": "1080p · castellano",
"quality": "1080p",
"audio": ["es", "en"],
"subtitles": [{ "lang": "es", "url": "https://cdn.example.org/peli/es.vtt", "format": "vtt" }],
"headers": { "Referer": "https://example.org/" },
"drm": { "system": "widevine", "license": "https://license.example.org/wv" },
"live": false
}] }
url: siempre http(s). Nada de torrents ni de otros esquemas.kind:hls,dash,mp4ompegts.headersydrm(Widevine o ClearKey) solo funcionan en la app; la web y el coche descartan ese enlace. Lo mismo con DASH. Si quieres que se vea en el coche, da también un HLS sin cabeceras.- Los subtítulos en WebVTT se ven en todas partes; los SRT, solo en la app.
Ajustes
Si tu addon necesita algo del usuario (su región, su cuenta en tu servicio), decláralo en
settings y Frunk.tv pinta el formulario:
"settings": [
{ "key": "region", "type": "select", "name": "Región", "options": ["es", "mx"], "default": "es" },
{ "key": "user", "type": "text", "name": "Usuario", "required": true },
{ "key": "pass", "type": "password", "name": "Contraseña", "required": true }
]
Los valores se guardan en el dispositivo del usuario y te llegan en la ruta, antes del recurso:
c/<ajustes>/catalog/…, con <ajustes> el JSON de los valores en base64url.
Repositorios de addons
Si publicas varios addons, puedes reunirlos en un repositorio. Se instala con el mismo enlace que un addon, y añadirlo no instala nada: cada addon se instala aparte, con su propia confirmación.
{
"frunk_addon_repo": 1,
"id": "org.example.repo",
"name": "Addons de Ejemplo",
"publisher": { "name": "Ejemplo", "contact": "[email protected]" },
"addons": [
{ "manifest": "cine/manifest.json", "name": "Cine de ejemplo", "types": ["movie", "series"] }
]
}
El enlace de instalación
https://frunk.tv/#/addons/add/ seguido de la dirección del manifiesto (o del repositorio),
codificada con encodeURIComponent. Para abrirlo directamente en la app de Android, usa
https://frunk.tv/addon?m= con la misma dirección.
Un catálogo en un solo fichero (el formato de catálogos) también es un addon: un
manifiesto con "frunk_addon": 1 y "bundle" en lugar de rutas se trata como un catálogo,
y los manifiestos frunk_catalog siguen funcionando.
Reglas que pone Frunk.tv
- Los canales en directo de un addon salen en TV y son gratis en Frunk.tv: nunca van tras un pago.
- Nada de un addon va tras un pago en Frunk.tv, y Frunk.tv no vende, cobra ni promociona addons.
- Frunk.tv deja de abrir un addon o un repositorio a petición del titular de los derechos de lo que ofrece.