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.
- Rol
- Ciclo completo
- Stack
- Monkey C · FastAPI · ffmpeg
- Plazo
- 3 días hasta la beta
- Año
- 2026

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.





