500 lines
18 KiB
Markdown
500 lines
18 KiB
Markdown
╔══════════════════════════════════════════════════════════════════════╗
|
||
║ ║
|
||
║ ✅ IMPLEMENTADO: Switches + Lista + Monitoreo de PIDs ║
|
||
║ ║
|
||
╚══════════════════════════════════════════════════════════════════════╝
|
||
|
||
## 🎯 FUNCIONALIDADES IMPLEMENTADAS
|
||
|
||
### 1️⃣ ✅ Componente Switch para Cada Plataforma
|
||
|
||
**Ubicación:** Pestaña 🎛️ Control
|
||
|
||
**Funcionalidad:**
|
||
- Switch tipo toggle para cada red social
|
||
- **ON** = Iniciar transmisión automáticamente
|
||
- **OFF** = Detener transmisión automáticamente
|
||
- Se habilita/deshabilita según el estado actual
|
||
- Visual claro del estado actual
|
||
|
||
**Uso:**
|
||
```
|
||
┌────────────────────────────────────────┐
|
||
│ 🎥 YouTube PID: 1234 │
|
||
│ │
|
||
│ Estado: TRANSMITIENDO │
|
||
│ Transmitiendo (PID: 1234) │
|
||
│ │
|
||
│ 🔴 Transmitir a YouTube [ON ●] │
|
||
│ │
|
||
│ ⏱️ Tiempo Activo 🔍 Proceso │
|
||
│ 00:15:42 ✅ Activo │
|
||
└────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
### 2️⃣ ✅ Lista de Redes Preparadas y Listas
|
||
|
||
**Ubicación:** Pestaña 🎛️ Control (antes de las tarjetas)
|
||
|
||
**Funcionalidad:**
|
||
- Tabla con todas las plataformas configuradas
|
||
- Estado actual de cada una
|
||
- PID de cada proceso activo
|
||
- Indicador de configuración correcta
|
||
|
||
**Columnas de la tabla:**
|
||
- Red Social
|
||
- Estado (🟢 Activo / ⚪ Listo / 🔴 Error)
|
||
- PID
|
||
- Configurada (✅/❌)
|
||
|
||
**Resumen rápido:**
|
||
- Total Plataformas
|
||
- Transmitiendo (cuántas activas)
|
||
- Listas (cuántas configuradas)
|
||
- Errores (cuántas con problemas)
|
||
|
||
---
|
||
|
||
### 3️⃣ ✅ Gestión de PIDs
|
||
|
||
**Funcionalidades:**
|
||
- Cada proceso FFmpeg guarda su PID al iniciar
|
||
- PID visible en todas las vistas
|
||
- Monitoreo en tiempo real del PID
|
||
- Verificación de si el proceso está vivo
|
||
- Detención usando PID si es necesario
|
||
|
||
**Persistencia:**
|
||
- PIDs se guardan en `process_state.json`
|
||
- Se mantienen entre reinicios del panel
|
||
- Recuperación automática de estado
|
||
|
||
---
|
||
|
||
### 4️⃣ ✅ Monitor Mejorado con PIDs
|
||
|
||
**Ubicación:** Pestaña 📊 Monitor
|
||
|
||
**Funcionalidades:**
|
||
- Resumen general con métricas
|
||
- Detalle por plataforma con PID
|
||
- Verificación en tiempo real del proceso
|
||
- Información técnica completa
|
||
- Comando FFmpeg usado
|
||
- Auto-refresh cada 5 segundos
|
||
|
||
**Información mostrada:**
|
||
- PID del proceso
|
||
- Estado del proceso (Vivo/Muerto)
|
||
- Tiempo activo
|
||
- Hora de inicio
|
||
- Comando FFmpeg completo
|
||
- RTMP URL (parcialmente oculta)
|
||
|
||
---
|
||
|
||
## 🎨 NUEVA INTERFAZ
|
||
|
||
### Pestaña Control - Vista Completa
|
||
|
||
```
|
||
╔════════════════════════════════════════════════════════════╗
|
||
║ 🎛️ Control de Transmisión ║
|
||
╠════════════════════════════════════════════════════════════╣
|
||
║ ║
|
||
║ 📺 Video Seleccionado ║
|
||
║ [Miniatura] Título del Video ║
|
||
║ Canal: Nombre del Canal ║
|
||
║ 🔴 EN VIVO ║
|
||
║ ║
|
||
║ ────────────────────────────────────────────────────── ║
|
||
║ ║
|
||
║ 📋 Redes Preparadas y Listas para Transmitir ║
|
||
║ ║
|
||
║ ┌────────────────────────────────────────────────────┐ ║
|
||
║ │ Red Social │ Estado │ PID │ Configurada │ ║
|
||
║ ├────────────────────────────────────────────────────┤ ║
|
||
║ │ YouTube │ 🟢 Activo │ 1234 │ ✅ │ ║
|
||
║ │ Facebook │ ⚪ Listo │ - │ ✅ │ ║
|
||
║ │ Twitch │ ⚪ Listo │ - │ ✅ │ ║
|
||
║ │ X (Twitter) │ 🔴 Error │ 5678 │ ✅ │ ║
|
||
║ └────────────────────────────────────────────────────┘ ║
|
||
║ ║
|
||
║ [Total: 4] [Transmitiendo: 1] [Listas: 4] [Errores: 1]║
|
||
║ ║
|
||
║ ────────────────────────────────────────────────────── ║
|
||
║ ║
|
||
║ 🎛️ Control Individual por Plataforma ║
|
||
║ ║
|
||
║ ┌──────────────────────┐ ┌──────────────────────┐ ║
|
||
║ │ 🎥 YouTube PID:1234│ │ 🎥 Facebook PID: - │ ║
|
||
║ │ 🟢 │ │ ⚪ │ ║
|
||
║ │ Estado: TRANSMITIENDO│ │ Estado: LISTO │ ║
|
||
║ │ Transmitiendo │ │ Detenido │ ║
|
||
║ │ │ │ │ ║
|
||
║ │ 🔴 Transmitir [ON●] │ │ 🔴 Transmitir [OFF○] │ ║
|
||
║ │ │ │ │ ║
|
||
║ │ ⏱️ 00:15:42 │ │ │ ║
|
||
║ │ 🔍 Proceso: ✅ Activo│ │ │ ║
|
||
║ └──────────────────────┘ └──────────────────────┘ ║
|
||
║ ║
|
||
╚════════════════════════════════════════════════════════════╝
|
||
```
|
||
|
||
---
|
||
|
||
### Pestaña Monitor - Vista Mejorada
|
||
|
||
```
|
||
╔════════════════════════════════════════════════════════════╗
|
||
║ 📊 Monitor de Estado y PIDs ║
|
||
╠════════════════════════════════════════════════════════════╣
|
||
║ ║
|
||
║ 📈 Resumen General ║
|
||
║ ║
|
||
║ [Total: 3] [🟢 Activas: 2] [🔴 Errores: 1] [⚪: 0] ║
|
||
║ ║
|
||
║ ────────────────────────────────────────────────────── ║
|
||
║ ║
|
||
║ 🔍 Detalle por Plataforma ║
|
||
║ ║
|
||
║ ┌────────────────────────────────────────────────────┐ ║
|
||
║ │ 🟢 YouTube PID: 1234 [⏹️ Detener] │ ║
|
||
║ │ Transmitiendo (PID: 1234) │ ║
|
||
║ │ │ ║
|
||
║ │ ⏱️ Tiempo: 00:15:42 🔍 Vivo 🕐 Inicio: 10:30:00 │ ║
|
||
║ │ │ ║
|
||
║ │ ℹ️ Información Técnica ▼ │ ║
|
||
║ │ PID: 1234 │ ║
|
||
║ │ RTMP: rtmp://a.rtmp.youtube.com/live2 │ ║
|
||
║ │ Comando: ffmpeg -re -i "URL" -c copy... │ ║
|
||
║ │ Verificación: ✅ El proceso 1234 está corriendo│ ║
|
||
║ └────────────────────────────────────────────────────┘ ║
|
||
║ ║
|
||
║ ┌────────────────────────────────────────────────────┐ ║
|
||
║ │ 🔴 Twitter/X PID: 5678 [⏹️ Detener] │ ║
|
||
║ │ Error: Proceso detenido (PID: 5678) │ ║
|
||
║ │ │ ║
|
||
║ │ ⏱️ Tiempo: 00:05:12 🔍 Muerto 🕐 Inicio: 10:40:30│ ║
|
||
║ │ │ ║
|
||
║ │ ℹ️ Información Técnica ▼ │ ║
|
||
║ │ Verificación: ❌ El proceso 5678 no está corriendo│ ║
|
||
║ └────────────────────────────────────────────────────┘ ║
|
||
║ ║
|
||
╚════════════════════════════════════════════════════════════╝
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 FUNCIONES TÉCNICAS IMPLEMENTADAS
|
||
|
||
### Gestión de PIDs
|
||
|
||
```python
|
||
# Al iniciar transmisión
|
||
pid = process.pid # Obtener PID del proceso FFmpeg
|
||
|
||
# Guardar en diccionario
|
||
st.session_state.active_processes[platform_name] = {
|
||
'process': process,
|
||
'pid': pid,
|
||
'platform': platform_name,
|
||
'start_time': datetime.now().isoformat(),
|
||
'status': 'running',
|
||
'command': ' '.join(command),
|
||
'rtmp_url': rtmp_url,
|
||
'enabled': True
|
||
}
|
||
|
||
# Verificar si proceso está vivo
|
||
def check_process_alive(pid):
|
||
try:
|
||
os.kill(pid, 0) # Señal 0 para verificar existencia
|
||
return True
|
||
except OSError:
|
||
return False
|
||
```
|
||
|
||
---
|
||
|
||
### Persistencia de Estado
|
||
|
||
```python
|
||
# Guardar estado en archivo JSON
|
||
def save_process_state():
|
||
state = {}
|
||
for key, info in st.session_state.active_processes.items():
|
||
state[key] = {
|
||
'pid': info.get('pid'),
|
||
'platform': info.get('platform'),
|
||
'start_time': info.get('start_time'),
|
||
'status': info.get('status'),
|
||
'rtmp_url': info.get('rtmp_url'),
|
||
'enabled': info.get('enabled', True)
|
||
}
|
||
|
||
with open('process_state.json', 'w') as f:
|
||
json.dump(state, f, indent=2)
|
||
```
|
||
|
||
---
|
||
|
||
### Switch Component
|
||
|
||
```python
|
||
# Switch que controla inicio/detención
|
||
switch_value = st.toggle(
|
||
f"🔴 Transmitir a {platform_name}",
|
||
value=is_enabled, # Estado actual
|
||
key=f"switch_{platform_name}"
|
||
)
|
||
|
||
# Detectar cambio
|
||
if switch_value != is_enabled:
|
||
if switch_value:
|
||
# Iniciar transmisión
|
||
start_ffmpeg_stream(...)
|
||
else:
|
||
# Detener transmisión
|
||
stop_stream(platform_name)
|
||
```
|
||
|
||
---
|
||
|
||
## 🚀 CÓMO USAR
|
||
|
||
### 1. Configurar Plataformas
|
||
|
||
```
|
||
Barra lateral → Configuración
|
||
→ Expandir cada plataforma
|
||
→ Ingresar RTMP URL
|
||
→ Ingresar Stream Key
|
||
→ Guardar Configuración
|
||
```
|
||
|
||
---
|
||
|
||
### 2. Seleccionar Video
|
||
|
||
```
|
||
Pestaña 🔍 Búsqueda
|
||
→ Buscar o pegar URL de video EN VIVO
|
||
→ Seleccionar video
|
||
```
|
||
|
||
---
|
||
|
||
### 3. Ver Redes Listas
|
||
|
||
```
|
||
Pestaña 🎛️ Control
|
||
→ Ver tabla "📋 Redes Preparadas y Listas"
|
||
→ Verificar que tengan ✅ en "Configurada"
|
||
→ Ver resumen de cuántas están listas
|
||
```
|
||
|
||
---
|
||
|
||
### 4. Activar Transmisiones con Switch
|
||
|
||
```
|
||
En cada tarjeta de plataforma:
|
||
→ Activar switch: 🔴 Transmitir a [Plataforma] [ON]
|
||
→ La transmisión inicia automáticamente
|
||
→ Ver PID asignado
|
||
→ Ver semáforo cambiar a 🟢
|
||
→ Ver tiempo activo en tiempo real
|
||
```
|
||
|
||
---
|
||
|
||
### 5. Desactivar Transmisiones
|
||
|
||
```
|
||
→ Desactivar switch: [OFF]
|
||
→ La transmisión se detiene automáticamente
|
||
→ PID se libera
|
||
→ Semáforo cambia a ⚪
|
||
```
|
||
|
||
---
|
||
|
||
### 6. Monitorear PIDs
|
||
|
||
```
|
||
Pestaña 📊 Monitor
|
||
→ Ver resumen general
|
||
→ Ver detalle por plataforma con PID
|
||
→ Verificar estado del proceso (Vivo/Muerto)
|
||
→ Ver comando FFmpeg usado
|
||
→ Auto-refresh cada 5 segundos
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 ARCHIVOS GENERADOS
|
||
|
||
### process_state.json
|
||
|
||
```json
|
||
{
|
||
"YouTube": {
|
||
"pid": 1234,
|
||
"platform": "YouTube",
|
||
"start_time": "2026-01-29T10:30:00",
|
||
"status": "running",
|
||
"rtmp_url": "rtmp://a.rtmp.youtube.com/live2",
|
||
"enabled": true
|
||
},
|
||
"Facebook": {
|
||
"pid": 5678,
|
||
"platform": "Facebook",
|
||
"start_time": "2026-01-29T10:35:00",
|
||
"status": "running",
|
||
"rtmp_url": "rtmps://live-api-s.facebook.com:443/rtmp/",
|
||
"enabled": true
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 💡 VENTAJAS DEL SISTEMA
|
||
|
||
| Característica | Beneficio |
|
||
|----------------|-----------|
|
||
| **Switch ON/OFF** | Control intuitivo y rápido |
|
||
| **Lista de redes** | Vista rápida de estado general |
|
||
| **PIDs visibles** | Fácil identificación de procesos |
|
||
| **Monitoreo de PIDs** | Verificar que procesos estén vivos |
|
||
| **Persistencia** | Estado se mantiene entre reinicios |
|
||
| **Auto-refresh** | Monitor actualizado automáticamente |
|
||
| **Resumen rápido** | Métricas de un vistazo |
|
||
|
||
---
|
||
|
||
## 🔍 MONITOREO DE PROCESOS
|
||
|
||
### Verificación Automática
|
||
|
||
El sistema verifica automáticamente:
|
||
- ✅ **PID existe** - Usa `os.kill(pid, 0)`
|
||
- ✅ **Proceso activo** - Usa `process.poll()`
|
||
- ✅ **Tiempo de ejecución** - Calcula desde `start_time`
|
||
- ✅ **Estado de salud** - Combina todas las verificaciones
|
||
|
||
### Estados Posibles
|
||
|
||
- 🟢 **TRANSMITIENDO** - Proceso vivo y activo
|
||
- ⚪ **LISTO** - Configurado pero no transmitiendo
|
||
- 🔴 **ERROR** - Proceso murió o falló
|
||
|
||
---
|
||
|
||
## 🎯 FLUJO COMPLETO
|
||
|
||
```
|
||
1. Configurar plataformas en sidebar
|
||
↓
|
||
2. Buscar video EN VIVO
|
||
↓
|
||
3. Ir a Control
|
||
↓
|
||
4. Ver tabla de redes preparadas
|
||
↓
|
||
5. Activar switch de plataformas deseadas
|
||
↓
|
||
6. Sistema inicia FFmpeg y guarda PID
|
||
↓
|
||
7. Ver semáforo 🟢 y PID asignado
|
||
↓
|
||
8. Ir a Monitor para ver detalles
|
||
↓
|
||
9. Monitor muestra PIDs y verifica procesos
|
||
↓
|
||
10. Desactivar switch para detener
|
||
↓
|
||
11. Sistema detiene proceso usando PID
|
||
```
|
||
|
||
---
|
||
|
||
## 🐛 SOLUCIÓN DE PROBLEMAS
|
||
|
||
### Switch no responde
|
||
|
||
**Solución:**
|
||
- Verifica que el video esté seleccionado
|
||
- Verifica que `stream_url` esté en session_state
|
||
- Revisa logs del navegador
|
||
|
||
---
|
||
|
||
### PID no aparece
|
||
|
||
**Solución:**
|
||
- El PID se asigna al iniciar FFmpeg
|
||
- Si no aparece, el proceso no se inició correctamente
|
||
- Revisa logs de FFmpeg
|
||
|
||
---
|
||
|
||
### Proceso muestra "Muerto" pero el switch está ON
|
||
|
||
**Solución:**
|
||
- El proceso FFmpeg se detuvo inesperadamente
|
||
- Desactiva y reactiva el switch para reiniciar
|
||
- Verifica la URL m3u8 y RTMP
|
||
|
||
---
|
||
|
||
### Lista de redes no muestra plataformas
|
||
|
||
**Solución:**
|
||
- Configura al menos una plataforma en el sidebar
|
||
- Asegúrate de guardar la configuración
|
||
- Recarga el panel
|
||
|
||
---
|
||
|
||
## ✅ CHECKLIST DE FUNCIONALIDADES
|
||
|
||
- [x] Switch ON/OFF por plataforma
|
||
- [x] Inicio automático al activar switch
|
||
- [x] Detención automática al desactivar switch
|
||
- [x] Tabla de redes preparadas
|
||
- [x] Resumen con métricas
|
||
- [x] PIDs guardados para cada proceso
|
||
- [x] PIDs visibles en UI
|
||
- [x] Verificación de PIDs en tiempo real
|
||
- [x] Persistencia de estado en JSON
|
||
- [x] Monitor mejorado con PIDs
|
||
- [x] Auto-refresh en monitor
|
||
- [x] Verificación de proceso vivo/muerto
|
||
- [x] Comando FFmpeg visible
|
||
- [x] Tiempo activo por proceso
|
||
- [x] Detención usando PID si es necesario
|
||
|
||
---
|
||
|
||
╔══════════════════════════════════════════════════════════════════════╗
|
||
║ ║
|
||
║ ✅ TODO IMPLEMENTADO Y FUNCIONANDO ║
|
||
║ ║
|
||
║ CARACTERÍSTICAS: ║
|
||
║ ✅ Switch ON/OFF por plataforma ║
|
||
║ ✅ Lista de redes preparadas con tabla ║
|
||
║ ✅ PIDs guardados y monitoreados ║
|
||
║ ✅ Verificación en tiempo real ║
|
||
║ ✅ Persistencia de estado ║
|
||
║ ║
|
||
║ PROBAR AHORA: ║
|
||
║ docker-compose up -d ║
|
||
║ http://localhost:8501 ║
|
||
║ ║
|
||
╚══════════════════════════════════════════════════════════════════════╝
|