Script en bash que utiliza un reproductor en línea de comandos, para reproducir una lista de emisoras por streaming.
Utilizo screen, ya que estoy con wayland y a veces explota el escritorio. Inicio al arrancar una sesión de screen para el trabajo y así me aseguro de no perder la terminal si peta la sesión de escritorio. Creo una sesión aparte en screen para él
screen -dmS streaming ~/.script.sh si estás empezando en bash puede serte educativo
utiliza
tput y como reproductor
mpv, aunque con otros funcionará igual, es muy simple arranca el reproductor o lo para.
#!/bin/bash
# Variables
STREAM_FILE="$HOME/.streamurls"
LAST_FILE="$HOME/.streamurls.last"
MIN_COLS=60
MIN_LINES=17
# Final normal del script
function atrapar {
echo; echo "Finalizando el script ..."
stop_stream # Detenemos el reproductor si está en marcha.
echo "Finalizado"; echo
}
# Interceptamos SIFTERM y volvemos a dibujar e iniciar el bucleGestor
trap "show_menu; bucleGestor" SIGINT SIGTERM
trap atrapar EXIT
# Comprobar tamaño de terminal
check_terminal_size() {
cols=$(tput cols)
lines=$(tput lines)
if (( cols < MIN_COLS || lines < MIN_LINES )); then
echo "La terminal es demasiado pequeña. Mínimo ${MIN_COLS}x${MIN_LINES}."
exit 1
fi
}
# Cargar lista
load_streams() {
mapfile -t streams < "$STREAM_FILE"
}
# Mostrar menú
show_menu() {
clear
echo "Selecciona una emisora para reproducir:"
echo
for i in "${!streams[@]}"; do
IFS='|' read -r name url <<< "${streams[$i]}"
if [[ "$url" == "$last_url" ]]; then
echo " [$((i+1))] ▶ $name"
else
echo " [$((i+1))] $name"
fi
done
echo
echo " [a] Añadir nueva emisora"
echo " [d] Detener reproducción"
echo " [q] Salir"
echo
}
# Añadir emisora
add_stream() {
read -p "Nombre: " name
read -p "URL: " url
echo "$name|$url" >> "$STREAM_FILE"
}
# Detener reproducción
stop_stream() {
pkill -f "mpv --no-video"
}
# Reproducir emisora
play_stream() {
IFS='|' read -r name url <<< "${streams[$1]}"
echo "$url" > "$LAST_FILE"
stop_stream
last_url=$(<"$LAST_FILE")
nohup mpv --no-video "$url" > /dev/null 2>&1 &
}
# Cargar última reproducción
last_url=""
[[ -f "$LAST_FILE" ]] && last_url=$(<"$LAST_FILE")
# Crear archivo si no existe
[[ ! -f "$STREAM_FILE" ]] && touch "$STREAM_FILE"
# Bucle gestor
bucleGestor() {
read -n1 -p "Opción: " option
echo
case "$option" in
[1-9])
index=$((option-1))
if [[ ${streams[$index]} ]]; then
play_stream $index
fi
;;
a|A) add_stream ;;
d|D) stop_stream ;;
q|Q) clear; exit 0 ;;
esac
}
# Main
check_terminal_size
while true; do
load_streams
show_menu
bucleGestor
done
Como me limita a 9 registros pues me dispuse a actualizarlo, aún estoy en ello, le estoy haciendo un popup para que se añadan nuevas entradas o se editen las actuales, estoy domando el flujo. Utiliza un buffer para la lista y la guarda en un buffer, para poder preparar su salida por la pantalla, para sólo escribir en una zona de la terminal. Podeis echarle un vistazo si quereis
https://sf.net/p/sistreamanager/code/ci/master/tree/1.0/sistreamanager.shSaludOS