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:
2026-08-23 00:57:40 -05:00
commit 03084e2d5a
231 changed files with 31055 additions and 0 deletions
+57
View File
@@ -0,0 +1,57 @@
/* Skin "cyan" — paleta moderna azul-marino/turquesa. Solo colores:
mantiene el layout de G Radio Player intacto.
NOTA GTK4: los overrides de color de fondo usan background-image: image()
en vez de background-color, porque el tema del sistema puede pisar
background-color pero no background-image (ver LEEME.txt en ejemplo/). */
window { background-image: image(#0e1420); color: #dbe6f0; }
.header-bar { background-image: image(#131a28); border-bottom: 2px solid #1f2c3d; }
.clock-label { color: #22d3c5; }
.station-name-lbl { color: #22d3c5; }
.now-playing-bar { background-image: image(#161f30); }
.now-playing-label { color: #22d3c5; }
.version-lbl { color: #5c7a9c; }
.deck-frame { background-image: image(#131a28); border: 1px solid #22d3c5; }
.deck-frame > label { background-image: image(#1c2740); color: #22d3c5; }
.track-title { background-image: image(#1f2c46); }
.time-label { color: #22d3c5; }
scale trough { background-image: image(#1c2740); }
scale highlight { background-image: image(#22d3c5); }
scale slider { background-image: image(#22d3c5); border-color: #1aa89c; }
.control-btn { background-image: image(#22d3c5); color: #0b1622; border-color: #1aa89c; }
.control-btn:hover { background-image: image(#1aa89c); color: #ffffff; }
.control-btn:active { background-image: image(#12857c); color: #ffffff; }
button.deck-icon-btn { background-image: image(#1c2740); border-color: #22d3c5; }
button.deck-icon-btn:hover { background-image: image(#22364f); border-color: #4ee0d4; }
button.deck-icon-btn:active { background-image: image(#0f1928); }
button.global-icon-btn { background-image: image(#1c2740); border-color: #22d3c5; }
button.global-icon-btn:hover { background-image: image(#22364f); border-color: #4ee0d4; }
button.global-icon-btn:active { background-image: image(#0f1928); }
button.global-icon-btn:checked { background-image: image(#12857c); border-color: #22d3c5; }
.ext-sq-btn { background-image: image(#1c2740); color: #22d3c5; border-color: #1aa89c; }
.ext-sq-btn:hover { background-image: image(#1aa89c); color: #ffffff; }
.duck-btn { background-image: image(#22d3c5); color: #0b1622; border-color: #1aa89c; }
.duck-btn:checked, .duck-btn:hover { background-image: image(#1aa89c); color: #ffffff; }
.list-frame { background-image: image(#0f1522); border-color: #1f2c3d; }
.list-frame > label { background-image: image(#1c2740); }
.queue-list row { background-image: image(#0f1522); }
.queue-list row:nth-child(even) { background-image: image(#141c2c); }
.queue-list row:hover { background-image: image(#1c2740); }
.playing-row { background-image: image(#12857c); }
button.queue-idx-btn { background-image: image(#7c6fe0); }
+66
View File
@@ -0,0 +1,66 @@
G Radio Player — cómo crear un skin
====================================
Un skin es una carpeta dentro de ~/.gradio/data/skins/ que reemplaza iconos,
colores y/o el fondo de las ventanas, sin tocar el programa. Para crear uno
nuevo, copiá esta carpeta "ejemplo" con otro nombre (o creá una carpeta
nueva) y agregá dentro lo que quieras personalizar. Todo es opcional: un
skin puede traer solo iconos, solo colores, solo un fondo, o cualquier
combinación.
Estructura:
~/.gradio/data/skins/<nombre-del-skin>/
iconos/<archivo>.png ← reemplazo de un ícono puntual
fondo.png (o .jpg) ← imagen de fondo de las ventanas
estilo.css ← reglas CSS adicionales (GTK4 CSS)
LEEME.txt ← notas propias, opcional
Iconos reemplazables
---------------------
Dentro de iconos/ podés colocar cualquiera de estos archivos (incluí solo
los que quieras cambiar; el resto sigue usando el ícono original del
programa). El nombre debe ser exactamente igual al de la lista:
24-Lopp-off.png 24-Lopp-on.png botonera48x48.png
busqueda.png config48x48.png detener-siguiente.png
down.png fadeout-off.png fadeout-on.png
GR-Off.png GR-On.png grabar48x48.png
gradio.png hora-off.png hora-on.png
parrilla48x48.png pausa.png pautaje48x48.png
play-off.png play-on.png playlist.png
playlist48x48.png processor-config.png processor-off.png
processor-on.png rec-off.png rec-on.png
repetir.png reportes.png robot.png
sello.png siguiente.png stop.png
trash.png up.png vaciar.png
visor48x48.png
Fondo
-----
Si agregás fondo.png, fondo.jpg o fondo.jpeg, se usa como fondo de cada
ventana (imagen escalada para cubrir toda la ventana).
CSS adicional
-------------
estilo.css se agrega por encima de todo el CSS del programa, así que
cualquier regla que pongas ahí (colores, bordes, tipografías) tiene
prioridad.
IMPORTANTE — bug conocido de GTK4: el tema del sistema pisa "background-color"
y "background" en los selectores comunes (window, box, button), pero NO pisa
"background-image". Por eso, para poner un color de fondo sólido hay que
usar siempre background-image con la función image(), nunca background-color:
window { background-image: image(#1a0000); } ← correcto, se ve
window { background-color: #1a0000; } ← el tema lo ignora
Esto mismo aplica a cualquier otro selector (box, button, label, etc.) al
que le quieras poner un color de fondo.
Cómo activarlo
---------------
En radio-player, abrí Configuración → Skin (apariencia), elegí el skin y
guardá. El cambio se aplica la próxima vez que se abra cada ventana
(radio-player y las demás herramientas: pautaje, parrilla, botonera,
visor, playlist, buscador, grabador, reportes).
+58
View File
@@ -0,0 +1,58 @@
/* Skin "green" — inspirado en la consola de radiodifusión profesional
clásica (verde/ámbar/azul sobre gris acero). Solo colores: mantiene
el layout de G Radio Player intacto.
NOTA GTK4: los overrides de color de fondo usan background-image: image()
en vez de background-color, porque el tema del sistema puede pisar
background-color pero no background-image (ver LEEME.txt en ejemplo/). */
window { background-image: image(#20242b); color: #d8dde3; }
.header-bar { background-image: image(#14171c); border-bottom: 2px solid #3a4a3a; }
.clock-label { color: #3ddc61; }
.station-name-lbl { color: #ffcc44; }
.now-playing-bar { background-image: image(#2d3a2d); }
.now-playing-label { color: #3ddc61; }
.version-lbl { color: #7f96b0; }
.deck-frame { background-image: image(#2a2f26); border: 1px solid #4a5a3a; }
.deck-frame > label { background-image: image(#3a4a30); color: #d8e8c8; }
.track-title { background-image: image(#2a5a8a); }
.time-label { color: #3ddc61; }
scale trough { background-image: image(#3a3a3a); }
scale highlight { background-image: image(#3f8f3f); }
scale slider { background-image: image(#4caf50); border-color: #2e7d32; }
.control-btn { background-image: image(#e9e4d0); color: #1a2410; border-color: #4a6a2a; }
.control-btn:hover { background-image: image(#4a6a2a); color: #ffffff; }
.control-btn:active { background-image: image(#2a4a1a); color: #ffffff; }
button.deck-icon-btn { background-image: image(#3a4530); border-color: #4a6a2a; }
button.deck-icon-btn:hover { background-image: image(#4a5a3a); border-color: #6a9a3a; }
button.deck-icon-btn:active { background-image: image(#2a3520); }
button.global-icon-btn { background-image: image(#3a4530); border-color: #4a6a2a; }
button.global-icon-btn:hover { background-image: image(#4a5a3a); border-color: #6a9a3a; }
button.global-icon-btn:active { background-image: image(#2a3520); }
button.global-icon-btn:checked { background-image: image(#2e7d32); border-color: #4caf50; }
.ext-sq-btn { background-image: image(#3a4530); color: #ffcc44; border-color: #4a6a2a; }
.ext-sq-btn:hover { background-image: image(#4a6a2a); color: #ffffff; }
.duck-btn { background-image: image(#e9e4d0); color: #1a2410; border-color: #4a6a2a; }
.duck-btn:checked, .duck-btn:hover { background-image: image(#4a6a2a); color: #ffffff; }
.list-frame { background-image: image(#1c201a); border-color: #4a5a3a; }
.list-frame > label { background-image: image(#3a4a30); }
.queue-list row { background-image: image(#1c201a); }
.queue-list row:nth-child(even) { background-image: image(#242822); }
.queue-list row:hover { background-image: image(#2c3226); }
.playing-row { background-image: image(#3f6f3f); }
button.queue-idx-btn { background-image: image(#1565c0); }
+57
View File
@@ -0,0 +1,57 @@
/* Skin "red" — paleta roja/carmesí sobre negro. Solo colores: mantiene
el layout de G Radio Player intacto.
NOTA GTK4: los overrides de color de fondo usan background-image: image()
en vez de background-color, porque el tema del sistema puede pisar
background-color pero no background-image (ver LEEME.txt en ejemplo/). */
window { background-image: image(#2a0d0d); color: #f0dcdc; }
.header-bar { background-image: image(#1a0808); border-bottom: 2px solid #4a1e1e; }
.clock-label { color: #ff6b6b; }
.station-name-lbl { color: #ff8080; }
.now-playing-bar { background-image: image(#3a1414); }
.now-playing-label { color: #ff6b6b; }
.version-lbl { color: #b08080; }
.deck-frame { background-image: image(#2a1414); border: 1px solid #6a2a2a; }
.deck-frame > label { background-image: image(#4a1e1e); color: #ffcccc; }
.track-title { background-image: image(#8a2a2a); }
.time-label { color: #ff6b6b; }
scale trough { background-image: image(#3a1a1a); }
scale highlight { background-image: image(#c62828); }
scale slider { background-image: image(#e53935); border-color: #b71c1c; }
.control-btn { background-image: image(#f0e0e0); color: #3a0d0d; border-color: #b71c1c; }
.control-btn:hover { background-image: image(#b71c1c); color: #ffffff; }
.control-btn:active { background-image: image(#7a1212); color: #ffffff; }
button.deck-icon-btn { background-image: image(#4a1e1e); border-color: #6a2a2a; }
button.deck-icon-btn:hover { background-image: image(#5a2626); border-color: #9a3a3a; }
button.deck-icon-btn:active { background-image: image(#2a1010); }
button.global-icon-btn { background-image: image(#4a1e1e); border-color: #6a2a2a; }
button.global-icon-btn:hover { background-image: image(#5a2626); border-color: #9a3a3a; }
button.global-icon-btn:active { background-image: image(#2a1010); }
button.global-icon-btn:checked { background-image: image(#c62828); border-color: #ff6b6b; }
.ext-sq-btn { background-image: image(#4a1e1e); color: #ff8080; border-color: #6a2a2a; }
.ext-sq-btn:hover { background-image: image(#6a2a2a); color: #ffffff; }
.duck-btn { background-image: image(#f0e0e0); color: #3a0d0d; border-color: #b71c1c; }
.duck-btn:checked, .duck-btn:hover { background-image: image(#b71c1c); color: #ffffff; }
.list-frame { background-image: image(#241010); border-color: #6a2a2a; }
.list-frame > label { background-image: image(#4a1e1e); }
.queue-list row { background-image: image(#241010); }
.queue-list row:nth-child(even) { background-image: image(#2e1414); }
.queue-list row:hover { background-image: image(#3a1818); }
.playing-row { background-image: image(#8a2a2a); }
button.queue-idx-btn { background-image: image(#c62828); }