Scripts para actualizar Navidrome

Publicado el Martes, 12 de mayo de 2026

Una de las responsabilidades de gestionar mi propio servidor personal de streaming de música Navidrome, es el mantenimiento. Siguiendo la línea de Scripts de mantenimiento para FreshRSS, comparto mis scripts para actualizar Navidrome.

Navidrome

Al igual que con FreshRSS, estoy suscripto al feed de lanzamientos. De esta forma me entero cuando se publica una versión nueva y necesito actualizar mi instalación. FreshRSS viene corriendo en Docker, pero Navidrome lo tengo instalado a nivel sistema. Y no hay un repositorio de dónde actualizarlo, así que hay que hacerlo a mano. Pero como soy vago, escribo scripts.

En primera instancia decidí escribir un script en Ruby:

#!/usr/bin/env ruby

require 'json'
require 'net/http'
require 'open-uri'

# La dirección del release más reciente en la API de GitHub:
url = 'https://api.github.com/repos/navidrome/navidrome/releases/latest'
# En esta línea anidada de cosas, primero uso URI para parsear el String url y crear el URI
# Eso se lo paso a net/http para que haga un pedido HTTP GET.
# La respuesta es en formato JSON, así que lo parseo con JSON.parse:
data = JSON.parse(Net::HTTP.get(URI(url)))

# Acá filtro la arquitectura arm64 de Raspberry Pi y el paquete .deb:
package = data['assets'].find { |a| a['name'].match?(/arm64\.deb/) }
# Aviso qué paquete encontré:
puts "Encontrado #{package['name']}"
# Obtengo la dirección para descargar el paquete, que está en el mismo JSON:
deb_file = package['browser_download_url']

filename = package['name']
# En estas líneas descargo el paquete .deb
# Lo guardo a un archivo con el mismo nombre (ej: navidrome_0.61.2_linux_arm64.deb)
File.open(filename, 'w') do |downloaded_file|
  URI.open(deb_file, 'rb') do |artifact_file|
  downloaded_file.write(artifact_file.read)
  end
end

#Después puedo usar dpkg -i para instalarlo:
`sudo dpkg -i #{filename}`

Obviamente no todo es tan fácil en la vida como escribir un script Ruby y ya está. En la Raspberry Pi tenía la versión de Ruby del sistema, que era bastante antigua. Creo que algo no anduvo de primera, y pensé "bueno, puedo editarlo para que funcione con un Ruby más viejo, tampoco es un código tan complejo". Pero decidí que era hora de tener un gestor de Rubíes en mi Raspberry Pi. La uso para tanta cosa, que quiero tener la libertad de escribirle scripts en Ruby cuando necesite.

Así que en eso me puse a instalar rbenv en la Raspberry Pi y ruby-build desde git para poder instalar Ruby 4. Mientras tanto, me puse a probar de implementar el mismo script con Bash. En algún momento me di por vencido porque sabía lo que necesitaba pero no sabía cómo hacerlo con jq.

jqes como sedpero para JSON. Se puede hacer un montón de cosas al estilo awk, grep y sedpero con JSON. El tema que no lograba encontrar el código exacto que me permitiera hacer el equivalente a package = data['assets'].find { |a| a['name'].match?(/arm64\.deb/) } en Ruby.

A todo esto estaba charlando con mi amigo Gonza, con el que siempre charlamos de éstas cosas, sobretodo cuando estamos haciendo algo copado. ¿Ustedes no hablan con sus amigues de los scripts que están escribiendo? ¿O de sus Raspberry Pis? ¿No usan XMPP? Bueno, problemas tenemos todos. En eso Gonza encuentra la sintaxis que preciso para que ande el jq y lo comento online. Lo comparto acá porque la respuesta que se mandó Gonza es digna de ser compartida: siempre distrayendo de lo que importa, estoy para trabajar en los medios (enlace, síganlo y denle "favorito").

Y con la pieza que faltaba, quedó el script en Bash:

#!/bin/bash

set -eo pipefail

# Primero descargo la información del release con curl
# Se la pipeo a jq que filtra el nombre del paquete de la arquitectura que preciso y .deb
# Lo guardo en la variable DATA
DATA=`curl 'https://api.github.com/repos/navidrome/navidrome/releases/latest' | jq -c '.assets[]|select(.name | contains("arm64.deb"))'`
# Saco el nombre del paquete
NAME=`echo $DATA | jq -r '.["name"]'`
echo "Found $NAME"
# Obtengo la dirección para descargar el paquete, que está en el mismo JSON:
PACKAGE=`echo $DATA | jq -r '.browser_download_url'`
echo "Downloading $PACKAGE"
# Descargo:
wget -q $PACKAGE

echo
read
-p "Install $NAME? [y/N] " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]
then
  
echo "Installing $NAME"
  sudo dpkg $NAME
fi

Ahí queda de referencia para quien le pueda venir bien (y para mí cuando me olvide cómo hacer alguna de estas cosas).

No hay comentarios en este post - Feed de comentarios

Dejar un comentario

Toasty!