← Proyectos

ABR Offline Converter

Conversor de archivos que funciona entero en el navegador. Imágenes, vídeo, audio, PDF, fuentes, subtítulos, texto y datos, con 192 páginas de conversión, y un Taller del libro que monta un EPUB completo a partir de capítulos en Markdown. Sin servidores, instalable y usable sin conexión.

Cuatro imágenes PNG convertidas a WebP en la cola, con el formato, la calidad y el tamaño de salida
Comparación antes y después de una imagen convertida, con un deslizador en el centroUn vídeo WebM a punto de convertirse en GIF animado, con el panel de recorte abiertoEl Taller del libro con cuatro capítulos, la portada tipográfica, las páginas extra, el estilo y la vista previa de un capítuloEl listado de todas las conversiones, agrupadas por imágenes, vídeo, audio, PDF, fuentes, subtítulos, texto y datos
servidores
0
servidores
páginas de conversión
192
páginas de conversión
tipos de archivo
8
tipos de archivo
tests (Vitest)
305
tests (Vitest)

Qué hace

  • Imágenes. PNG, JPG, WebP, GIF, BMP, ICO y TIFF entre sí, y AVIF y fotos HEIC del iPhone como entrada. Calidad, ancho y alto con proporción bloqueada, y ajustes distintos para cada archivo si hace falta.
  • Vídeo y audio. MP4, WebM, AVI, MKV, MOV y OGV entre sí, vídeo a GIF animado, y sacar el audio de un vídeo a MP3, WAV, OGG, FLAC, AAC, M4A u Opus. Con recorte por inicio y fin.
  • PDF. Cada página a PNG, JPG o WebP, o varias imágenes a un PDF en A4, Carta o al tamaño de la imagen.
  • Fuentes, subtítulos, texto y datos. TTF, OTF, WOFF y WOFF2; SRT, VTT y ASS; Markdown, HTML, TXT y EPUB; CSV y JSON.
  • Comparar antes y después con un deslizador sobre la imagen convertida.
  • Por lotes. Sueltas o pegas (Ctrl+V) varios archivos y los descargas todos en un ZIP.
  • Taller del libro. Sueltas los capítulos de un libro en Markdown y sale un EPUB con portada, índice, dedicatoria, epígrafe, créditos, numeración automática y tipografía corregida.
  • Una página para cada conversión, de /convertir/jpg-a-png a /convertir/csv-a-json, en español e inglés.
  • Instalable y sin conexión, con tema claro u oscuro.

Cómo está hecho

Todo en el navegador

Nuxt 4 genera un sitio estático, y todo el trabajo lo hacen el navegador y WebAssembly. Ningún archivo sale del dispositivo. El motor de vídeo, ffmpeg.wasm, se descarga la primera vez que se usa y queda guardado en la caché de la PWA.

Un worker por tipo de trabajo

Las imágenes se convierten en un Web Worker con OffscreenCanvas, y el vídeo y el audio en otro con ffmpeg. La interfaz no se congela aunque conviertas un vídeo largo.

Codificadores a mano

El canvas del navegador sabe exportar PNG, JPG y WebP, pero no BMP, ICO ni TIFF. Esos tres los escribí yo, byte a byte, con sus tests.

EPUB3 sin pandoc

El Taller del libro genera el XHTML de cada capítulo, el índice navegable (nav y NCX), los metadatos y una portada dibujada en canvas, y lo empaqueta con client-zip.

Problemas que resolví

  • HEIC no funcionaba dentro del worker. La librería que decodifica HEIC necesita document, que no existe en un worker. La decodificación pasó al hilo principal y el resto sigue en el worker.
  • Las páginas por conversión no se generaban. Un await setLocale al principio de los componentes rompía el prerender de Nitro: fallaban unas 400 rutas que en desarrollo iban bien. Con un cambio de idioma síncrono se generan las 811.
  • CSV del mundo real. Saltos de línea al final, archivos de una sola columna y JSON con claves distintas en cada fila. Ahora se aprovechan todas las columnas y solo paran la conversión los errores de verdad.
  • ffmpeg acumulaba listeners. Cada conversión añadía otro listener de progreso. Ahora se guarda la referencia y se quita al acabar.
  • Un EPUB que valga para cualquier lector. mimetype primero y sin comprimir, NCX para lectores antiguos, portada marcada como tal y comillas latinas anidadas sin tocar el código y respetando los apóstrofos.

Stack

Nuxt 4Vue 3TypeScriptTailwind CSSPWAWeb WorkersOffscreenCanvasffmpeg.wasmgifencheic2anypdf.jspdf-libfonteditor-corePapa ParsemarkedTurndownclient-zipEPUB3Vitest