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.
Código
#!/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.sh
SaludOS