Stremio addons¶
Kino can install a Stremio addon without anyone writing a Kino plugin: it reads the addon's
manifest.json and generates, on the device, a Kino plugin that talks to the addon's server. This page
covers how people add one, how each Stremio resource maps, what is refused and how far it goes. It is
for you if you maintain an addon and want it to work well in Kino, or if you want to know why an addon
behaves differently from a hand-written plugin. You need none of it to write your own plugin.
How people add one¶
- In Kino, Ajustes ▸ Plugins (on a TV also through the "Plugins" button on Home), "Agregar plugin",
type Stremio, and paste the
manifest.jsonURL ("Pega la URL del manifest.json del addon de Stremio (o de una colección de addons)"). When the address is plainly an addon's, Kino picks the type by itself. - The address is normalized the way Stremio does it:
stremio://meanshttps://, a bare base address getsmanifest.json, and a public name overhttpis upgraded tohttps.httpis kept only for the person's own network (an IP, a single-label name,.local/.lan), so an addon on their home server is added by typing its address.localhost, loopback and link-local addresses are refused, and so is a path with.,..or encoded slashes. - An address on
github.comorraw.githubusercontent.comis read as a GitHub repository (a Kino plugin or a Nuvio repository), never as an addon. Serve yourmanifest.jsonfrom your own domain. - A
stremio://…/manifest.jsonlink the person taps (a "Install" button on an addon page) opens Kino on Plugins ▸ Agregar with the address filled in; Kino reads nothing until the person taps "Agregar", and a link may only name a public host. On Android 12 and later anhttps://…/manifest.jsonlink opens in the browser (Android hands a web link only to the app that verified that domain), so share thestremio://link or the address to paste. - Kino reads the manifest, generates the plugin and opens the usual consent sheet. Nothing of the addon is used before the person accepts.
The full address (which often carries the addon's configuration, a debrid key for instance) is never
written into the generated plugin or the logs: it lives in two of the plugin's settings, "Servidor del
addon" (addonUrl, the server) and "Configuración del addon" (addonPath, the rest of the path, kept
as a password in the Keystore). The consent sheet says so: "Guarda la configuración del addon (puede
incluir tu clave) solo en tus aparatos". That part may be at most 2,048 characters ("La configuración
de ese addon es demasiado larga para guardarla en Kino").
Title links. From Kino 0.9.51 a Stremio detail link opens the title in Kino
instead of being ignored: stremio:///detail/movie/<imdb> or
stremio:///detail/series/<imdb>[/<imdb>:<season>:<episode>] (a tracker's "Open in Stremio", like
Seenr's). Kino finds the title through TMDB and opens its sources -- the screen a Home card opens, phone
and TV; an episode opens its series. Only an IMDb id (tt and 5 to 10 digits) is accepted; another type
or id, an extra segment, a query or a link over 200 characters is ignored, and a title TMDB does not know
shows "No encontré ese título". Addon links (stremio://…/manifest.json) work as before.
What the conversion builds¶
- One plugin per addon, id
stremio-<name>-<hash>: the same on every device for the same address. In Plugins it carries the "Stremio" badge. version1.<converter revision>.0(today1.10.0),apiVersion4, or 6 when the addon uses something of 6 (search inside a row,meta, 18+ content).hosts:api.themoviedb.org(Kino uses TMDB to turn a TMDB id into an IMDb one) and the hosts your catalogs redirect to (below). The addon's server is not a declared host: it is reached as a server the person typed."streamHosts": "any"(and"liveStreamHosts": "any"with channels): your video may be on any public server. The sheet shows, in red, "Puede reproducir video desde cualquier servidor que indique".downloadwhen the addon plays movies or series, so they can be downloaded on phones (Downloads); live channels never.- The addon's
logois the plugin's icon (at most 128 KB, read within 5 s; one that is not a PNG is converted, or left out). - Kino writes the description: "Addon de Stremio. Ofrece: catálogo, streams, subtítulos, canales en vivo." depending on what you have.
Category chips¶
In the plugin store (Instalados, Recomendados, a collection) each addon falls under the category chips
by what its manifest declares: an addon with stream goes under Películas (movie, or when it says
nothing), Series (series), Anime (anime, or kitsu, mal, anilist, anidb ids), En
vivo (tv, channel) and Radio (radio, or a radio music catalog); an addon without stream
(lists, meta, collections) goes under Utilidades (and Anime when it is about anime); subtitles
adds Subtítulos and adult adds +18. Declare your types and idPrefixes accurately: that is
where they come from.
Kino's own Recomendados never suggest an addon that plays video (one with stream), except a few free,
legal channel addons checked by hand ("Gratis y legal"). People add yours by its address.
How each resource maps¶
| Stremio resource | In Kino |
|---|---|
catalog of movie, series, anime or another type |
Home rows with their "Ver más" (the first 20, 60 titles per row), the type in the title: "Popular · Películas", "Popular · Series". |
catalog of tv, channel, radio (or music with "radio" in its id or name) |
Channel categories in En vivo (at most 200), 500 channels per page. A radio one without "radio" in its name shows as "… · Radio". |
catalog with the search extra |
Typed search (up to 3 catalogs, 100 results) and the search inside that row's "Ver más". A tv/channel one answers the En vivo search (up to 3). |
catalog with search required |
Search only, never a row. |
catalog with another required extra (genre…) |
Left out: Kino cannot know which value to send. An optional genre is never sent. |
skip extra |
Paging of "Ver más" and of channels (below). |
meta |
Info page and episodes of your titles; it also describes other sources' titles when TMDB and AniList have nothing (below). |
stream |
What plays (Streams). |
subtitles |
The video's subtitles and the player's "Buscar subtítulos en línea" (Subtitles). |
addon_catalog |
An addon collection (below). |
An addon plays exactly where Stremio would ask it: the types and idPrefixes of its stream
resource (the resource object's own lists, else the manifest's). An id or type outside them is never
asked about (a kitsu: id to an addon that only takes tt). Kino treats anime as series, and an addon
that only declares anime (or only series) is asked with its own word.
Ids and matching¶
Kino knows a title by its IMDb id (tt…) and, when you give it, by its TMDB id (moviedb_id, as
Cinemeta does). With them your title lines up with the same title from other sources, gets TMDB's info
page and can look for subtitles. A title the person opens from a TMDB page is asked of your addon as
tt… (or tt…:season:episode), so declare tt in your stream idPrefixes if you want to be
asked about other sources' titles. Before offering your addon in that search, Kino confirms you have
the title with one request to your /stream (at most 3 titles per search).
Search¶
- Typed search: your catalogs with
search. With none (or when they return nothing), Kino searches the text on TMDB and offers only what yourstreamcan play by IMDb id. - A title's page ("Ver otras fuentes"): only when your
streamtakes IMDb ids for that type. A catalog-only addon (Cinemeta, Kitsu) or a channels-only one does not answer here. - Inside a "Ver más": when that row's catalog takes
search, the search goes to your addon withsearch=…and pages withskip.
Paging¶
Kino asks /catalog/<type>/<id>/skip=N.json with N = how many titles it already showed (at most 100 a
page). It stops on an empty page, when a different skip answers exactly the same page (an addon that
ignores skip), or past 20,000 titles.
meta¶
With meta, your catalog's titles get an info page and episodes (videos with season and episode
above 0; seasons up to 999). An addon with meta also describes other sources' titles (the
meta capability): when TMDB and AniList leave something empty on an info page,
Kino asks you with the id your meta resource covers (tt…, tmdb:, kitsu:, mal:, anilist:).
A meta-only addon is useful for that and installs too. From Kino 0.9.51 a meta's logo, its IMDb
rating (imdbRating, or the name of its imdb link, where AIOMetadata-style addons put it) and its
cast (app_extras.cast, else cast, else its Cast links) become the info page's
logo, ratings and cast.
Live channels¶
A tv, channel or radio catalog is an En vivo category; each meta is a channel (its logo, or
its poster). It plays in the live player, with no progress bar and no download. There is no program
guide. When a page of channels fails, the person reads "No pude cargar los canales de este addon".
Streams¶
Kino plays only direct http(s) links in the url field. Streams with infoHash (P2P/torrent),
nzbUrl (Usenet), rarUrls, zipUrls, tgzUrls, tarUrls, servers, ytId (YouTube) and
externalUrl are dropped.
Of the rest, Kino ranks best first: first those without behaviorHints.notWebReady; then by the
resolution your name, title or description names (1080p, 720p, unlabelled, and 2160p/4K last,
because most devices cannot decode it); within each tier .m3u8/.mp4 links win, HEVC with DTS/Dolby
audio is avoided and 8-bit is preferred over 10-bit (Hi10P). Ties keep your order, so list your best
stream first. The address never counts as evidence: only what the stream says about itself.
- Copies and automatic fallback. The best one plays and up to 8 more become
alternatives: when one cannot play on the device, Kino moves on to the next by itself. The player's Servidor menu lists them as "Opción 1", "Opción 2"…: Kino does not use the stream'snameortitleas a label. - Headers.
behaviorHints.proxyHeaders.requestis sent with the video (at most 20 headers, string values only).proxyHeaders.responseis ignored. notWebReadyis not refused: Kino needs no streaming server to play it, it only ranks it last.- Type. An address ending in
.m3u8is HLS and one ending in.mpdis DASH; the player detects the rest. - Time. Your
/streamgets 20 s, and the generated plugin'sresolve75 s in all (like a Nuvio scraper), the TMDB-to-IMDb lookup and the subtitles included.
Subtitles¶
A stream's subtitles and your subtitles resource's (asked within 5 s, for movies and episodes
only) are merged: at most 30, one per address, their three-letter language turned into two (spa →
es). A .vtt or .srt file is marked with its format.
An addon with subtitles also answers the player's "Buscar subtítulos en línea" for any title Kino
knows by IMDb or TMDB id, from any source (subtitles for any title): the
person's languages first, named by release (movieReleaseName or subtitleFileName). From Kino 0.9.51
the request carries what Kino knows of the playing file as Stremio's own extras,
/subtitles/{type}/{id}/videoHash=…&videoSize=…&filename=….json (each only when known, URL-encoded;
videoSize=0 beside a filename whose size is unknown; never the video's URL), so the addon can rank
the exact release first; with nothing known the path stays the plain one. An addon with
only subtitles (OpenSubtitles v3) installs as a subtitle provider: nothing on Home, in search or
En vivo, and its sheet says "Agrega subtítulos a tus películas y series".
A translator (its name or description says "translat" or "traduc", or the language carries the gt
mark, like GTSubs' esgt) shows the tracks from its own server as "Español (traducido)". GTSubs'
info: notice tracks are skipped. A translator is installed from its configured address (the one its
configure page gives, with the language in the path).
What Kino refuses¶
| What | What the person reads |
|---|---|
A torrent or P2P addon: behaviorHints.p2p, or "torrent", "magnet" or "p2p" in its id, name or description (from Kino 0.9.51 a description that names them only to deny them, "no incluye streams, torrents ni contenido P2P", does not count; the id and name stay strict). Also with debrid. |
"Kino no admite addons de torrents, ni siquiera con debrid" |
A manifest without id or name, or that is not JSON |
"Esto no es un addon de Stremio (no encontré su manifest.json)" |
An addon with no catalog, meta, stream or subtitles |
"Este addon no ofrece nada que Kino pueda usar" |
| An address that is not an addon's | "Esa dirección no es la de un addon de Stremio" |
| A manifest over 256 KB | "La respuesta del addon es demasiado grande: no parece un addon de Stremio" |
| A redirect to the device itself | "El addon redirige a una dirección de este mismo aparato, y Kino no la sigue" |
Kino never plays P2P, has no BitTorrent client and no local streaming server, and runs no server on the
device: whatever your addon can only deliver through Stremio's streaming server does not work here. A
torrent addon installed before this rule is switched off by its next update check and stays in
Instalados for the person to remove. When a title only has P2P links, the player says "
Configurable addons¶
behaviorHints.configurationRequired: Kino does not install it from its unconfigured address ("… necesita configurarse en su página antes de instalarlo") and offers "Configurar en su página", which opens<address>/configurein the phone's browser. That page's "Install" button hands back astremio://link with the configured address, which fills "Agregar" and installs normally. A TV never opens the page: it tells the person to do it on the phone, and the configuration reaches it through sync.behaviorHints.configurable(or an address that already carries a configuration): the installed plugin offers "Reconfigurar", which opens the same page with the current options. When the person installs the same addon from the same server with another configuration, Kino updates that plugin instead of adding another (unless two configurations are installed, or the new address has no configuration and the old one does: that never wipes their key).- For this to work, your configure page must end in a
stremio://…/manifest.jsonlink with the configuration in the path, as Stremio expects. - A TMDB key in the configuration (Kino 0.9.53): when the configuration carries a field whose name contains
"tmdb" with a TMDB key (a 32-character v3 key or a v4 read token; plain, JSON, base64 or URL-encoded), Kino offers
the person, once, to use it for
kino.tmdb("Usar la llave de TMDB de tu addon"). Only with their yes, and the key never leaves the device except toward TMDB. A configuration kept on your server (only an opaque id in the address) is simply not found.
18+ addons¶
An addon with behaviorHints.adult installs behind the person's 18+ code (the same one as in
Ajustes): Kino asks for it before the consent sheet, which says "Contenido para adultos (+18)".
Everything the addon gives is marked 18+ (18+ content): it shows only while the
code is unlocked on that device. While it is locked, the plugin is not shown in Plugins, in the search
filters or among the other devices' offers. If your addon is for adults, declare adult: an addon
that does not say so shows like any other.
Collections¶
An addon whose only use is listing other addons (addon_catalog, no catalog, meta or stream) is a
collection: it does not install ("… es una colección de addons: elige cuáles agregar"). Kino keeps it in
"Tus colecciones de Stremio" and shows its addons as cards, under the same rules as above: P2P ones,
ones that offer nothing and 18+ ones while the code is locked do not show. Each addon installs with its
own sheet. A collection is read only at a public https address with no configuration in the path; at
most 20 lists per collection and 300 addons per list. Kino ships and adds no collection on its own.
Catalog redirects¶
Some addons answer their catalogs with a redirect to another server (Cinemeta sends them to
cinemeta-catalogs.strem.io), and a plugin may follow a redirect from the person's server only to that
server or to a declared host. So at install Kino probes the catalog addresses it will use (each row's
first page and a later one, each search catalog, each live category: at most 30, about 10 s in all) and
declares every public https host they redirect to; the person sees them on the consent sheet. A
redirect to a local address or over http is never declared.
Only catalog redirects are discovered. If your /meta, /stream or /subtitles redirects to
another host, that request fails: answer those resources from the addon's server (the video itself may
live on any public host).
What syncs¶
The generated plugin and its settings travel both ways between the person's paired devices (sync): the server goes in the sync row and the configuration part goes sealed end to end. The other device reads the addon again by itself and generates the same plugin. "Tus colecciones de Stremio" sync too, and removing one removes it on both. So the person configures on the phone and the TV gets the addon ready, and "Ver en el TV" plays an addon title through the TV's own copy.
Updates¶
The version only moves with Kino's converter. "Buscar actualización" (and the background check) reads the addon again at the saved address, probes the redirects again, regenerates the plugin and compares it with the installed one: a change within what was already approved installs by itself; one that adds hosts, channels or downloads waits for the person's approval. When the address now belongs to another addon ("La dirección ahora es de otro addon") or can no longer be read, the installed plugin stays as it was.
Limits¶
| What | Limit |
|---|---|
Reading manifest.json |
256 KB, 15 s in all, at most 5 redirects |
| Catalogs kept | 200 (and when the generated script passes 1 MB, the last ones go and the description says "Aviso: el addon tiene demasiados catálogos; N quedaron fuera.") |
| Home rows | 20 catalogs, 60 titles each |
| A "Ver más" page | 100 titles; up to skip 20,000 |
A request to your catalog or meta |
12 s (6 s when describing other sources' titles) |
A request to your /stream |
20 s; the whole resolve 75 s |
A request to your /subtitles |
5 s |
| Responses | 5 MB per request, 60 requests per call (engine limits) |
| Streams used | the best + 8 alternatives |
| Subtitles | 30 |
| Declared redirect hosts | 20 |
When something fails¶
| What the person sees | What happened |
|---|---|
| "No encontré el addon en esa dirección" | manifest.json answered 404. |
| "El addon tardó demasiado en responder. Intenta de nuevo en un rato." | The manifest did not arrive within 15 s. |
| "No pude conectarme con el addon. Revisa la dirección y tu conexión." | The name does not resolve or the server does not answer. |
| "El servidor del addon respondió con un error (N)…" | An error status reading the manifest. |
| " |
The addon has no stream: it is catalog-only. |
| " |
The title's type or id is outside your stream's types/idPrefixes. |
| "Esta fuente ya no tiene este título ( |
Your /stream answered an empty list, or nothing playable. |
| " |
Every stream was P2P. |
| "Falta la dirección del addon: escríbela en Configurar" | On an update check, the "Servidor del addon" setting is empty. |
Diagnostics: each plugin's debug-mode switch, Stremio addons included, and the Registro page are in Logs and telemetry. The generated plugin logs only counts (how many streams came, how many were P2P, how many can play) and the host of a redirect it is not approved for, never your address or your links.
When to write a Kino plugin instead¶
A Stremio addon works with nothing to write, but a Kino plugin can do more:
- Named and lazy copies: "Latino · Servidor 1" in the Servidor menu, and copies resolved only when the person picks them (labelled copies).
- Its own settings form inside Kino, with status and actions, instead of an external web page (the settings form).
- Request-signed streams and server failover when a token expires (signing every request).
- The hidden browser, for servers that build the video with scripts (hidden browser).
- Live channels with a guide, M3U/XMLTV playlists and live search (live channels).
- Its own section, categories and colors (section, categories and colors),
Widevine (cookbook),
Stream.skipfor skipping intros, your own error sentences (userMessage), sessions withkino.storageandkino.cookies. - An author signature and a place in "De la comunidad" (signed plugins, get listed).