Commit inicial: G Radio Player
Sistema de automatización de radio en Rust (GTK4 + GStreamer): reproductor principal con crossfade y ducking, scheduler de comerciales, refill de playlist, y herramientas auxiliares (pautaje, parrilla, botonera, visor, buscador, playlist, grabador, reportes). Incluye sistema de skins y modos de Players (paneles de reproducción configurables).
This commit is contained in:
Executable
+221
@@ -0,0 +1,221 @@
|
||||
#!/bin/bash
|
||||
# ─── G Radio Player — instalador del sistema ─────────────────────────────────
|
||||
set -e
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
INSTALL_DIR="$HOME/.local/share/radio-player"
|
||||
BIN_DIR="$HOME/.local/bin"
|
||||
DESKTOP_DIR="$HOME/.local/share/applications"
|
||||
|
||||
# ── 1. Verificar dependencias del sistema ─────────────────────────────────────
|
||||
echo "==> Verificando dependencias..."
|
||||
MISSING=()
|
||||
|
||||
check() {
|
||||
if ! dpkg -l "$1" &>/dev/null 2>&1 && ! rpm -q "$1" &>/dev/null 2>&1; then
|
||||
MISSING+=("$1")
|
||||
fi
|
||||
}
|
||||
|
||||
# Detectar gestor de paquetes
|
||||
if command -v apt &>/dev/null; then
|
||||
PKG_MGR="apt"
|
||||
PKGS=(
|
||||
gstreamer1.0-plugins-base
|
||||
gstreamer1.0-plugins-good
|
||||
gstreamer1.0-plugins-bad
|
||||
gstreamer1.0-plugins-ugly
|
||||
gstreamer1.0-libav
|
||||
gstreamer1.0-pulseaudio
|
||||
gstreamer1.0-alsa
|
||||
libgstreamer1.0-0
|
||||
libgstreamer-plugins-base1.0-0
|
||||
ffmpeg
|
||||
)
|
||||
MISSING_CHECK=$(dpkg -l "${PKGS[@]}" 2>&1 | grep "^un\|no packages" | awk '{print $2}' || true)
|
||||
elif command -v dnf &>/dev/null; then
|
||||
PKG_MGR="dnf"
|
||||
PKGS=(
|
||||
gstreamer1-plugins-base
|
||||
gstreamer1-plugins-good
|
||||
gstreamer1-plugins-bad-free
|
||||
gstreamer1-plugins-ugly-free
|
||||
gstreamer1-libav
|
||||
ffmpeg
|
||||
)
|
||||
else
|
||||
PKG_MGR="unknown"
|
||||
PKGS=()
|
||||
fi
|
||||
|
||||
if [ ${#PKGS[@]} -gt 0 ] && [ -n "$MISSING_CHECK" ]; then
|
||||
echo ""
|
||||
echo " Faltan dependencias GStreamer. Instalando..."
|
||||
if [ "$PKG_MGR" = "apt" ]; then
|
||||
sudo apt install -y "${PKGS[@]}"
|
||||
elif [ "$PKG_MGR" = "dnf" ]; then
|
||||
sudo dnf install -y "${PKGS[@]}"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Verificar ffmpeg/ffprobe
|
||||
if ! command -v ffprobe &>/dev/null; then
|
||||
echo " ffprobe no encontrado. Instalando ffmpeg..."
|
||||
if [ "$PKG_MGR" = "apt" ]; then
|
||||
sudo apt install -y ffmpeg
|
||||
elif [ "$PKG_MGR" = "dnf" ]; then
|
||||
sudo dnf install -y ffmpeg
|
||||
else
|
||||
echo " AVISO: instala ffmpeg manualmente (necesario para playlist-refill)"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ── 2. Instalar binarios ──────────────────────────────────────────────────────
|
||||
echo "==> Instalando binarios en $BIN_DIR..."
|
||||
BINS=(
|
||||
radio-player
|
||||
comercial-scheduler
|
||||
playlist-refill
|
||||
gr-visor
|
||||
gr-botonera
|
||||
gr-buscador
|
||||
gr-parrilla
|
||||
gr-pautaje
|
||||
gr-playlist
|
||||
gr-record
|
||||
gr-reportes
|
||||
)
|
||||
for bin in "${BINS[@]}"; do
|
||||
if [ ! -f "target/release/$bin" ]; then
|
||||
echo "ERROR: binario no encontrado: target/release/$bin"
|
||||
echo " Compila el proyecto antes de instalar (cargo build --release)"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
mkdir -p "$BIN_DIR"
|
||||
for bin in "${BINS[@]}"; do
|
||||
cp "target/release/$bin" "$BIN_DIR/$bin"
|
||||
chmod +x "$BIN_DIR/$bin"
|
||||
done
|
||||
|
||||
# ── 3. Instalar assets ───────────────────────────────────────────────────────
|
||||
echo "==> Instalando assets..."
|
||||
if [ -d "assets/Time" ]; then
|
||||
TIME_SRC="assets/Time"
|
||||
elif [ -d "target/data/panel/Time" ]; then
|
||||
TIME_SRC="target/data/panel/Time"
|
||||
else
|
||||
echo "ERROR: carpeta 'Time' no encontrada (se buscó en assets/Time y target/data/panel/Time)"
|
||||
exit 1
|
||||
fi
|
||||
mkdir -p "$HOME/.gradio/data/panel"
|
||||
cp -r "$TIME_SRC" "$HOME/.gradio/data/panel/Time"
|
||||
|
||||
# ── Instalar contexto de IA (opencode) ───────────────────────────────────────
|
||||
OPENCODE_CTX_SRC=""
|
||||
if [ -d "assets/opencode" ]; then
|
||||
OPENCODE_CTX_SRC="assets/opencode"
|
||||
elif [ -d "target/data/opencode" ]; then
|
||||
OPENCODE_CTX_SRC="target/data/opencode"
|
||||
fi
|
||||
if [ -n "$OPENCODE_CTX_SRC" ]; then
|
||||
echo "==> Instalando contexto IA en ~/.gradio/data/opencode/..."
|
||||
mkdir -p "$HOME/.gradio/data/opencode/agents"
|
||||
mkdir -p "$HOME/.gradio/data/opencode/context"
|
||||
cp -r "$OPENCODE_CTX_SRC/"* "$HOME/.gradio/data/opencode/" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# ── Instalar skins de ejemplo ──────────────────────────────────────────────────
|
||||
# Solo copia skins que aún no existan en destino, para no pisar los que el
|
||||
# usuario haya instalado/personalizado en una reinstalación o actualización.
|
||||
SKINS_SRC=""
|
||||
if [ -d "assets/skins" ]; then
|
||||
SKINS_SRC="assets/skins"
|
||||
elif [ -d "target/data/skins" ]; then
|
||||
SKINS_SRC="target/data/skins"
|
||||
fi
|
||||
if [ -n "$SKINS_SRC" ]; then
|
||||
echo "==> Instalando skins de ejemplo en ~/.gradio/data/skins/..."
|
||||
mkdir -p "$HOME/.gradio/data/skins"
|
||||
for skin_dir in "$SKINS_SRC"/*/; do
|
||||
[ -d "$skin_dir" ] || continue
|
||||
skin_name=$(basename "$skin_dir")
|
||||
if [ ! -d "$HOME/.gradio/data/skins/$skin_name" ]; then
|
||||
cp -r "$skin_dir" "$HOME/.gradio/data/skins/$skin_name"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# ── 4. Crear lanzador principal ───────────────────────────────────────────────
|
||||
echo "==> Creando lanzador..."
|
||||
mkdir -p "$INSTALL_DIR"
|
||||
cat > "$INSTALL_DIR/gradio.sh" << 'LAUNCHER'
|
||||
#!/bin/bash
|
||||
BIN="$HOME/.local/bin"
|
||||
|
||||
# Crear directorios de configuración
|
||||
mkdir -p "$HOME/.gradio/data/tmp"
|
||||
mkdir -p "$HOME/.gradio/data/parrilla"
|
||||
mkdir -p "$HOME/.gradio/data/comerciales"
|
||||
mkdir -p "$HOME/.gradio/data/eventos-espera"
|
||||
mkdir -p "$HOME/.gradio/data/eventos"
|
||||
mkdir -p "$HOME/.gradio/data/reporte"
|
||||
mkdir -p "$HOME/G Radio/inicio-espacio-pub"
|
||||
mkdir -p "$HOME/G Radio/fin-espacio-pub"
|
||||
|
||||
# Iniciar auxiliares
|
||||
"$BIN/comercial-scheduler" &
|
||||
SCHED_PID=$!
|
||||
"$BIN/playlist-refill" &
|
||||
REFILL_PID=$!
|
||||
|
||||
# Iniciar UI
|
||||
"$BIN/radio-player" "$@"
|
||||
EXIT_CODE=$?
|
||||
|
||||
# Apagar auxiliares
|
||||
kill $SCHED_PID $REFILL_PID 2>/dev/null
|
||||
wait $SCHED_PID $REFILL_PID 2>/dev/null
|
||||
exit $EXIT_CODE
|
||||
LAUNCHER
|
||||
chmod +x "$INSTALL_DIR/gradio.sh"
|
||||
ln -sf "$INSTALL_DIR/gradio.sh" "$BIN_DIR/gradio"
|
||||
|
||||
# ── 5. Entrada de menú de escritorio ─────────────────────────────────────────
|
||||
echo "==> Registrando en el menú de aplicaciones..."
|
||||
mkdir -p "$DESKTOP_DIR"
|
||||
# Limpiar entrada de versiones antiguas (nombre no coincidía con el app_id)
|
||||
rm -f "$DESKTOP_DIR/gradio-player.desktop"
|
||||
cat > "$DESKTOP_DIR/com.gradio.radio-player.desktop" << DESKTOP
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=G Radio Player
|
||||
GenericName=Radio Player
|
||||
Comment=Reproductor de radio profesional
|
||||
Exec=$INSTALL_DIR/gradio.sh
|
||||
Icon=gradio-player
|
||||
Categories=AudioVideo;Audio;Player;
|
||||
Terminal=false
|
||||
StartupNotify=true
|
||||
DESKTOP
|
||||
|
||||
# Actualizar base de datos de aplicaciones
|
||||
update-desktop-database "$DESKTOP_DIR" 2>/dev/null || true
|
||||
|
||||
# ── 6. Agregar ~/.local/bin al PATH si no está ────────────────────────────────
|
||||
if [[ ":$PATH:" != *":$HOME/.local/bin:"* ]]; then
|
||||
echo ""
|
||||
echo " AVISO: $HOME/.local/bin no está en tu PATH."
|
||||
echo " Agrega esta línea a tu ~/.bashrc o ~/.zshrc:"
|
||||
echo ""
|
||||
echo ' export PATH="$HOME/.local/bin:$PATH"'
|
||||
echo ""
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ Instalación completa."
|
||||
echo ""
|
||||
echo " Ejecutar desde terminal: $INSTALL_DIR/gradio.sh"
|
||||
echo " Ejecutar desde el menú: busca 'G Radio Player'"
|
||||
echo ""
|
||||
echo " Para desinstalar: ./uninstall.sh"
|
||||
Reference in New Issue
Block a user