Alcides Oliveira

Engenheiro de software full-stack

Todos os projetos

Unboxd

Projeto pessoal · jan 2026 · Abrir site · Repositório privado

O Unboxd é um complemento para o Stremio. Você digita um usuário do Letterboxd e a watchlist pública dele aparece no Stremio como catálogo, com pôsteres e detalhes do TMDB.

Fiz sozinho.

Unboxd, captura de tela 1
Página de configuração: digite um usuário do Letterboxd (a watchlist precisa ser pública) e instale o complemento no Stremio.

Muita gente monta a lista de filmes para ver no Letterboxd, mas assiste pelo Stremio. Os dois apps não se conversam, então cada título da lista precisa ser buscado na mão dentro do Stremio. O Letterboxd não oferece uma API aberta para isso, então qualquer ponte entre os dois precisa ler a watchlist nas páginas públicas do site.

O usuário fica na URL de instalação

Usei o manifesto configurável do Stremio em vez de guardar usuários. O nome vai junto em cada requisição, então não há banco nem login para manter. Em troca, o servidor não lembra de nada entre um cold start e outro, e cada instância nova refaz o scraping da watchlist.

Resultado parcial em vez de timeout

Watchlists grandes deixavam o primeiro carregamento lento. Passei a buscar o ID do IMDb junto com os detalhes do filme via append_to_response, dei 5 segundos de timeout para cada chamada ao TMDB, subi o paralelismo de 20 para 30 e parei de abrir lotes novos depois de 25 segundos, com folga dentro do limite de 60 segundos da Vercel. Assim o Stremio recebe os filmes encontrados até ali em vez de uma requisição que estoura o tempo.

Cache em memória, sem serviço externo

Deixei os caches na memória da função. Em serverless eles duram enquanto a instância está quente e somem depois, mas visitas repetidas nesse intervalo não voltam ao Letterboxd nem ao TMDB, e o projeto não depende de nenhum serviço extra.

  • Um scraper do Letterboxd em Node.js com Axios e Cheerio que segue a paginação da watchlist e espera um segundo entre as páginas.
  • A etapa de correspondência com o TMDB: uma busca por título e ano e depois uma requisição de detalhes que já traz o ID do IMDb via append_to_response. O Stremio precisa desse ID para achar os streams.
  • O handler do catálogo com o Stremio Addon SDK: manifesto, configuração por usuário e páginas de 100 itens.
  • Uma classe de cache pequena (um Map com prazo de expiração por chave) usada em três níveis: watchlist, resultados do TMDB e catálogo pronto.
  • Uma página de configuração estática em HTML e JavaScript puro que monta a URL do manifesto e abre a tela de instalação do Stremio.
  • O deploy na Vercel: um rewrite manda / para a página de configuração e todo o resto para uma única função serverless com o router do SDK, com limite de 60 segundos.

A página de configuração pede um usuário do Letterboxd e um clique em instalar. Ela coloca o usuário, em JSON codificado, dentro da URL do manifesto e abre essa URL pelo protocolo stremio://. A partir daí o Stremio manda essa configuração em cada pedido de catálogo, e o servidor não guarda contas nem usa banco de dados.

Quando o Stremio pede o catálogo, o servidor percorre as páginas da watchlist no Letterboxd com Axios e Cheerio e lê o nome de cada filme no HTML dos pôsteres. O ano sai do fim desse nome, quando ele aparece ali. Depois o servidor busca cada título no TMDB em lotes de 30 requisições paralelas e monta itens do Stremio identificados pelo ID do IMDb, com pôster, imagem de fundo, sinopse e ano. Filmes sem ID do IMDb ficam de fora. O Stremio recebe esses itens de 100 em 100 pelo parâmetro skip.

Os resultados ficam em caches em memória com expiração: 15 minutos para a watchlist, 24 horas para as buscas no TMDB e 10 minutos para o catálogo pronto. Em produção o complemento inteiro roda como uma função serverless na Vercel; na minha máquina, roda em Express.

Back-end
Node.js, Stremio Addon SDK, Express (servidor local), Axios, Cheerio, dotenv
Front-end
HTML, CSS, JavaScript puro
Dados externos
Páginas públicas do Letterboxd (via scraping), API do TMDB
Infraestrutura
Funções serverless da Vercel