YaBooks Sync

Una aplicación no oficial para Garmin Connect IQ: descarga por Wi-Fi los capítulos de los audiolibros de Yandex Books al reloj y los reproduce sin conexión, sin teléfono. El reloj continúa donde se detuvo el teléfono, y lo escuchado en el reloj vuelve a Yandex Books.

APP PARA RELOJ · AUDIOLIBROS · GARMIN

Rol
Ciclo completo
Stack
Monkey C · FastAPI · ffmpeg
Plazo
3 días hasta la beta
Año
2026
YaBooks Sync
Análisis
01La tarea02La solución03Cómo fue el trabajo04Escollos05Con qué está hecho

La tarea

Los audiolibros se escuchan corriendo y de camino, donde no apetece llevar el teléfono, y el reloj Garmin sabe reproducir sonido por sí solo. No existe cliente de Yandex Books para Connect IQ. La posición es una dificultad aparte: se empieza el capítulo en el teléfono, se sigue en el reloj, se vuelve al teléfono, y en todas partes debe estar el mismo punto.

La solución

El reloj descarga los capítulos por Wi-Fi con reserva para varias horas por delante —de 1 a 12, por defecto 3— y los reproduce sin teléfono. La posición se sincroniza en ambos sentidos con precisión de un segundo y los capítulos ya escuchados se borran solos.

El acceso va por código mediante OAuth Device Flow: la contraseña no se teclea en el reloj; avance de 30 segundos y retroceso de 15, calidad de 64 o 192 kbps. Es la segunda aplicación de la línea tras YaMusic Sync: el mismo armazón y un logotipo del mismo amarillo.

Cómo fue el trabajo

Lo hice todo yo: desentrañé la API cerrada, escribí la aplicación en Monkey C y el proxy en FastAPI, preparé los gráficos y los textos para la tienda. Del primer commit a la beta funcional 0.1.6, unos 3 días y 6 builds beta; antes del primer lanzamiento el código pasó una revisión adversarial y se corrigieron 11 defectos.

Escollos

La respuesta en el reloj no pasa de unos 21 KB y el índice de «Guerra y paz» ocupa 475 KB para 321 capítulos: el proxy lo comprime hasta 7,8 KB. El CMAF se aceptaba en el simulador pero no sonaba en el reloj real: el servidor reempaqueta los capítulos con ffmpeg y un libro de 13 horas adelgaza de 378 a 201 MB. La escritura de la posición por REST respondía 200 pero no cambiaba nada: la posición solo la mueve una mutación GraphQL.

Con qué está hecho

En el reloj, Monkey C y Connect IQ SDK 9: Toybox.Media, SyncDelegate y acceso por OAuth 2.0 Device Flow. El servicio es Python 3.12 y FastAPI con httpx: consulta la API REST de Yandex Books, escribe el progreso con una mutación GraphQL, reempaqueta CMAF a MP4 (mono, 32 kbps) con ffmpeg y mantiene una caché LRU de hasta 2 GB. En el servidor, Docker, nginx y Let's Encrypt; 117 pruebas en pytest.

Resultado

Lo que salió de ahí

67
modelos de reloj Garminen el manifiesto de la aplicación
−47 %
de tráfico por librotras el reempaquetado: 378 → 201 MB para 13 horas
1 s
de precisión al reanudarel reloj y el teléfono continúan desde el mismo punto
Consulta

Treinta minutos para decidir si trabajamos juntos