You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Servidor de streaming de audio autohospedado con panel web reactivo. Backend Node.js + Express + FFmpeg para transmision continua sin cortes (zero-gap) con crossfade en tiempo real, persistencia de configuracion en SQLite y despliegue portatil via pkg.
Stack Tecnologico
Tecnologia
Version package.json
Proposito
Node.js
>=22.0.0
Runtime
Express
^4.21.2
Servidor HTTP + API REST
TypeScript
^5.8.3
Lenguaje
FFmpeg
externo (bundled con pkg)
Codificacion/decodificacion de audio (pipes PCM)
yt-dlp
externo (bundled con pkg)
Descarga de audio desde YouTube
SQLite (WAL)
built-in
Base de datos embebida (settings, auth, queue)
Caddy
externo (descarga via prepare)
Proxy reverso + TLS automatico via DuckDNS
Cloudflared
externo
Tunel HTTPS sin abrir puertos
CORS
^2.8.5
Middleware CORS
dotenv
^16.4.7
Variables de entorno
uuid
^11.1.0
IDs unicos para cola
pkg
^5.8.1 (dev)
Empaquetado Windows .exe
tsx
^4.19.4 (dev)
Hot-reload en desarrollo
Arquitectura
flowchart TB
subgraph Frontend
UI[Panel Web Reactivo]
EXTERNAL[Reproductor Externo / FiveM]
end
subgraph ProcyonRadio Server
EX[Express Server :3000]
AUTH[Auth RBAC<br/>Owner / Admin / Operator / Guest]
API[API REST<br/>Queue, Settings, Stream]
QUEUE[Queue Manager<br/>add, skip, shuffle, reorder]
WORKER[Stream Worker<br/>FFmpeg Encoder + Decoder]
MIXER[PCM Mixer<br/>Crossfade en tiempo real]
FALLBACK[Fallback Audio<br/>MP3 loop cuando queue vacia]
SETTINGS[Settings Manager<br/>SQLite persistente]
DB[(SQLite database.db)]
LICENSE[License Manager<br/>Activacion via Supabase]
PROXY[Stream Proxy<br/>GET /radio.mp3]
end
subgraph Output
ICECAST[Icecast / ZenoMedia]
YOUTUBE[YouTube RTMP]
LOCAL[Streaming HTTP Local<br/>:8000/radio.mp3]
end
UI -->|HTTP| EX
EXTERNAL -->|GET /radio.mp3| PROXY
PROXY --> LOCAL
EX --> AUTH
AUTH --> API
API --> QUEUE
API --> WORKER
WORKER --> MIXER
WORKER --> FALLBACK
API --> SETTINGS
SETTINGS --> DB
API --> LICENSE
WORKER -.->|RTMP| YOUTUBE
WORKER -.->|MP3/AAC| ICECAST
WORKER -->|PCM| LOCAL
Loading
Caracteristicas Principales
Streaming y Audio
Modo Icecast (activo): Audio MP3/AAC a servidores de radio online (ZenoMedia, Icecast, Shoutcast)
Modo YouTube RTMP (disponible en codigo, ⚠️ pendiente de exponer en UI): Transmision via RTMP a YouTube Live
Zero-gaps: Codificador persistente FFmpeg, decodificadores PCM alternados en background
Crossfade en tiempo real: Mezcla PCM con fade linear entre canciones (duracion configurable)
Fallback Audio: Reproduce un MP3 local cuando la cola esta vacia o en pausa
Keep-Alive: Generador de silencio periodico para evitar que el stream se corte por inactividad
Overlay Text: Archivos current_title.txt y current_artist.txt para overlays en streaming
Stream Proxy: Endpoint /radio.mp3 para evitar bloqueos HTTPS Mixed Content en navegadores y FiveM
Fuentes de Audio
YouTube: Busqueda y descarga via yt-dlp (URLs, playlists, busqueda por nombre)
SoundCloud: Fallback automatico si un tema falla en YouTube
cd backend
npm install
npm run dev # tsx watch src/index.ts (puerto 3000)
Windows (instalador portable)
npm run package:win # Genera dist/package/ProcyonRadio.exe
Descargar ProcyonRadio-Instalador.exe desde Releases para version pre-empaquetada.
Produccion
cd backend
npm run build # Compilacion TypeScript
npm start # node dist/index.js
Requisitos Externos
FFmpeg en PATH (o ffmpeg.exe en la raiz del proyecto)
yt-dlp en PATH (o yt-dlp.exe en la raiz del proyecto)
Caddy: Se descarga automaticamente via npm run prepare
Variables de Entorno
PORT=3000# Puerto del servidorOUTPUT_MODE=youtube# youtube | icecastEXPOSE_SERVER=false# Exponer via tunnelYOUTUBE_RTMP_URL=rtmp://a.rtmp.youtube.com/live2YOUTUBE_STREAM_KEY=# Tu stream key de YouTubeICECAST_SERVER_URL=# URL del servidor IcecastICECAST_FORMAT=mp3# mp3 | aacICECAST_BITRATE=128k# Bitrate IcecastFADE_DURATION=3# Crossfade en segundosSTREAM_PORT=8000# Puerto del stream localSTREAM_SERVER_ENABLED=true# Activar stream HTTP localDUCKDNS_ENABLED=false# Activar DuckDNSDUCKDNS_DOMAIN=# Tu dominio DuckDNSDUCKDNS_TOKEN=# Tu token DuckDNSSTATION_ALIAS=ProcyonRadio# Nombre de la radioSTATION_LANGUAGE=es# es | en
Notas
Modo YouTube RTMP: Implementado en settings.manager.ts y stream.worker.ts pero aun no expuesto en la UI. Se activa via API de settings.
Cache de YouTube: Las busquedas se hacen en tiempo real via yt-dlp, sin cache local.
Overlay de texto: El StreamWorker escribe data/current_title.txt y data/current_artist.txt para overlays OBS/XSplit.
Licencia: Requiere activacion via clave. Sin licencia, la app redirige a /activate.
Backwards compatibility: Migra automaticamente settings desde settings.json legacy a SQLite.
Licencia
Todos los derechos reservados. Desarrollo privado — Ecosistema Procyon.
About
Servidor de streaming y gestión de radio en vivo (RTMP/Icecast) diseñado para GTA V (FiveM) con panel web reactivo y autenticación por roles (RBAC).