Skip to content

Avisa en la ventana cuando hay una versión nueva en GitHub - #2

Merged
Dathinel merged 1 commit into
mainfrom
claude/sharp-clarke-rf46tv
Nov 1, 2026
Merged

Dathinel merged 1 commit into
mainfrom
claude/sharp-clarke-rf46tv

Conversation

@Dathinel

@Dathinel Dathinel commented Nov 1, 2026

Copy link
Copy Markdown
Owner

Qué hace

Al arrancar, como mucho una vez cada 24 h (última consulta en preferencias.json), la ventana consulta https://api.github.com/repos/Dathinel/subtitular/releases/latest sin cuenta, con User-Agent «Subtitular/<versión>», 5 s de tiempo límite y en el grupo de hilos (la consulta arranca después del primer cuadro, así que no retrasa el arranque). Sin red o con una respuesta rara, calla.

Si tag_name (vX.Y.Z) es mayor que la versión de la app, sale una franja discreta arriba de la ventana, encima de la cabecera, con los colores del acento de la app: «Subtitular 1.1.0 disponible» con:

  • Ver novedades: abre la release en el navegador (solo se abren páginas https://github.com/…; si html_url trae otra cosa, la lista de releases).
  • Abrir el Lanzador: solo si está instalado en el PC.
  • Más tarde: la franja se va y no se vuelve a avisar de esa versión (sí de la siguiente).

En la tarjeta Ajustes: la casilla «Avisar cuando haya una versión nueva» (activada de fábrica) y el enlace «Buscar actualizaciones», que consulta al momento (aunque no hayan pasado 24 h, aunque la casilla esté apagada y aunque la versión esté descartada) y dice en la barra de abajo cuando no hay nada nuevo o cuando no se pudo consultar.

Dónde está la lógica

Todo en Subtitular.Core (UpdateCheck.cs), detrás de la interfaz IReleaseFeed:

  • GitHubReleaseFeed: la red de verdad (HttpClient, 5 s, User-Agent, 1 MB de respuesta como mucho).
  • ReleaseInfo.Parse: JSON con generador de fuente (GitHubJsonContext, sin reflexión: compatible con AOT); TagVersion solo acepta tres números con o sin v.
  • UpdateCheck.CheckAsync: las 24 h, la versión descartada, el forzado; nunca lanza por la red (devuelve Failed), solo propaga la cancelación del que llama.
  • Launcher.Find: SUBTITULAR_LANZADOR (el exe o su carpeta) y %LOCALAPPDATA%\Dathinel\Lanzador\Lanzador.exe (ahí mismo o en la subcarpeta de versión más nueva, como los módulos de Dathinel\Comun).
  • Preferences suma checkUpdates, lastUpdateCheck y skippedVersion; un archivo viejo deja el aviso activado.

Pruebas

UpdateCheckTests y LauncherTests, con JSON falso y sin red: nuevo, igual, menor (y versión de cuatro partes), tag raro (v1.1.0-rc1, 1.1, latest, vacío), cuerpo raro (roto, [], {"message":"Not Found"}, null), error de red (HTTP, tiempo límite, E/S) que cuenta como la consulta del día, cancelación del que llama, descartada (y que «Buscar actualizaciones» la vuelve a ofrecer), 24 h no cumplidas, reloj atrasado, aviso apagado, filtrado de html_url, y el Lanzador en carpetas temporales. PreferencesTests cubre los campos nuevos.

Compilado con -warnaserror y 28 pruebas de Core en verde en Linux (las que necesitan ffmpeg.exe, powershell o los módulos .exe solo corren en la CI de Windows, que también compila la ventana). La respuesta real de la API se comprobó a mano: tag_name v1.0.0, html_url de la release.

Para decidir Daniel

  • Ruta del Lanzador. No hay nada en el repositorio ni en Rodaje que diga dónde se instala el Lanzador, así que Launcher.Find supone %LOCALAPPDATA%\Dathinel\Lanzador\Lanzador.exe (plano o <versión>\) más SUBTITULAR_LANZADOR. Si la ruta o el nombre del exe son otros, es un cambio de una línea en Launcher, con su prueba.
  • Fallo de red. La consulta fallida también cuenta como la del día (literal «como mucho una vez cada 24 h»); si prefieres reintentar en el siguiente arranque, basta con no apuntar la hora en Failed.

Documentación

CHANGELOG.md («Sin publicar»), README.md y una sección nueva en docs/pruebas-a-mano.md (incluye cómo ver la franja bajando <Version> a 0.9.0).


Generated by Claude Code

Al arrancar, como mucho una vez cada 24 h (última consulta en preferencias.json), la ventana consulta releases/latest de Dathinel/subtitular en la API pública de GitHub (User-Agent «Subtitular/<versión>», 5 s de límite, fuera del hilo de UI); sin red o con respuesta rara, calla. Si el tag vX.Y.Z es mayor que la versión de la app, una franja discreta arriba dice «Subtitular X.Y.Z disponible» con «Ver novedades», «Abrir el Lanzador» (si está en %LOCALAPPDATA%\Dathinel\Lanzador o SUBTITULAR_LANZADOR) y «Más tarde» (no vuelve a avisar de esa versión). En Ajustes: la casilla «Avisar cuando haya una versión nueva» (activada de fábrica) y «Buscar actualizaciones», que consulta al momento y también dice cuando no hay nada nuevo.

La lógica va en Subtitular.Core detrás de IReleaseFeed: ReleaseInfo (parseo con generador de fuente, solo páginas de github.com), UpdateCheck (24 h, versión descartada, forzado) y Launcher; Preferences suma checkUpdates, lastUpdateCheck y skippedVersion. Pruebas UpdateCheckTests y LauncherTests con JSON falso (nuevo, igual, menor, tag raro, error de red, descartada, 24 h no cumplidas, apagado, forzado). CHANGELOG, README y docs/pruebas-a-mano.md al día.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CfAg5zbUpNWh89d1GNxvHF
@Dathinel
Dathinel merged commit 56a83c9 into main Nov 1, 2026
1 check passed
@Dathinel
Dathinel deleted the claude/sharp-clarke-rf46tv branch November 1, 2026 01:22
Dathinel added a commit that referenced this pull request Nov 1, 2026
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants