Todos os projetos

App web local · em andamento

Estante virtual

Uma estante de livros e mangás que roda no seu computador. Cada volume é uma lombada desenhada em CSS, nas cores da própria capa; clicar abre um painel com capa, dados, status de leitura, progresso, nota e anotações.

Sem conta, sem nuvem, sem banco de dados: tudo fica em arquivos locais. A Estante deste site usa o mesmo formato de livro.

JavaScript · Node.js · Express · sharp · MangaDex API

github.com/wtuxen/estante_virtual

O que ele faz

Lombadas
Cor de fundo e de destaque tiradas da capa. A altura segue o formato (pocket, tankōbon, trade, capa dura, artbook) e a largura, o número de páginas. Mangás mostram o número do volume no pé.
Séries
Um volume por lombada, como na prateleira real, e volumes da mesma série dividem a cor. No modo Séries, cada uma vira um box, com progresso geral e grade de capas.
Leitura
Status (não lido, lendo, lido, abandonado), páginas lidas, nota de 1 a 5 e anotações que salvam sozinhas. Busca, filtro por status e ordenação mantêm as séries juntas.
Importação
Livros vêm de arquivos Markdown com os campos do Google Books; mangás, do export do MyAnimeList, com capas e títulos buscados no MangaDex.

Como os dados são guardados

Dois arquivos, ligados pelo id. O catálogo (títulos, autores, capas, cores) é gerado pelo import e pode ser recriado a qualquer momento. O estado (status, páginas, notas, datas e anotações) só a aplicação escreve, e é o que não pode ser perdido: ele é gravado de forma atômica, por um arquivo temporário e uma renomeação, e se um dia estiver corrompido o servidor se recusa a sobrescrevê-lo. Reimportar o catálogo nunca apaga uma anotação.

Decisões

  • Sem build: a interface é HTML, CSS e JavaScript puros, servidos por um Express pequeno que só escuta em 127.0.0.1.
  • As alterações vão ao servidor uma por vez, em ordem, com debounce nas anotações e nova tentativa quando falham. Uma nova tentativa nunca reenvia um valor antigo por cima de um mais novo.
  • A semeadura do histórico do MyAnimeList só preenche campos vazios, então pode rodar de novo sem desfazer o que foi editado na estante. Progresso guardado só em capítulos vira volumes pelo mapa de capítulos do MangaDex.
  • O import respeita o limite de requisições do MangaDex, envia um User-Agent próprio e baixa as capas localmente, sem hotlink.