Fix broadcast broken: reconnect loop, listener stuck on waiting

- server.py: Increase ping_timeout 10->60, ping_interval 5->25 to prevent
  frequent socket disconnects during audio streaming
- server.py: Guard dj_start() against reconnect loops - only clear pre-roll
  and emit broadcast_started on a fresh broadcast, not on DJ reconnects
- listener.js: Add polling fallback to transports (websocket-only caused
  silent failure on upgrade error), set reconnectionAttempts to Infinity
- script.js: Same transport fallback fix for DJ panel socket
- techdj_qt.py: Add _broadcast_started flag to StreamingWorker.on_connect
  so streaming_started signal only fires once; reconnects resume silently.
  Reset flag in stop_streaming() for clean next session.
This commit is contained in:
ComputerTech 2026-03-09 20:47:52 +00:00
parent 5ba5c45e64
commit 8c3c2613b1
4 changed files with 37 additions and 17 deletions

View File

@ -93,9 +93,11 @@ function initSocket() {
console.log(`[LISTENER] Initializing Socket.IO connection to: ${serverUrl}`);
socket = io(serverUrl, {
transports: ['websocket'],
transports: ['websocket', 'polling'],
reconnection: true,
reconnectionAttempts: 10
reconnectionAttempts: Infinity,
reconnectionDelay: 1000,
reconnectionDelayMax: 10000
});
socket.on('connect', () => {

View File

@ -1844,9 +1844,11 @@ function initSocket() {
console.log(` Host: ${window.location.host}`);
socket = io(serverUrl, {
transports: ['websocket'],
transports: ['websocket', 'polling'],
reconnection: true,
reconnectionAttempts: 10
reconnectionAttempts: Infinity,
reconnectionDelay: 1000,
reconnectionDelayMax: 10000
});
socket.on('connect', () => {

View File

@ -586,8 +586,8 @@ dj_socketio = SocketIO(
cors_allowed_origins=CONFIG_CORS,
async_mode='eventlet',
max_http_buffer_size=CONFIG_MAX_UPLOAD_MB * 1024 * 1024,
ping_timeout=10,
ping_interval=5,
ping_timeout=60,
ping_interval=25,
logger=CONFIG_DEBUG,
engineio_logger=CONFIG_DEBUG
)
@ -611,6 +611,7 @@ def stop_broadcast_after_timeout():
@dj_socketio.on('start_broadcast')
def dj_start(data=None):
was_already_active = broadcast_state.get('active', False)
broadcast_state['active'] = True
session['is_dj'] = True
print("BROADCAST: ACTIVE")
@ -625,13 +626,20 @@ def dj_start(data=None):
is_mp3_input = True
broadcast_state['is_mp3_input'] = is_mp3_input
# Clear pre-roll for fresh start
with _mp3_lock:
_mp3_preroll.clear()
_start_transcoder_if_needed(is_mp3_input=is_mp3_input)
listener_socketio.emit('broadcast_started', namespace='/')
if not was_already_active:
# Fresh broadcast start - clear pre-roll and start transcoder cleanly
with _mp3_lock:
_mp3_preroll.clear()
_start_transcoder_if_needed(is_mp3_input=is_mp3_input)
# Tell listeners a new broadcast has begun (triggers audio player reload)
listener_socketio.emit('broadcast_started', namespace='/')
else:
# DJ reconnected mid-broadcast - just ensure transcoder is alive
# Do NOT clear pre-roll or trigger listener reload
print("BROADCAST: DJ reconnected - resuming existing broadcast")
_start_transcoder_if_needed(is_mp3_input=is_mp3_input)
# Always send current status so any waiting listeners get unblocked
listener_socketio.emit('stream_status', {'active': True}, namespace='/')
@dj_socketio.on('get_listener_count')
@ -687,8 +695,8 @@ listener_socketio = SocketIO(
cors_allowed_origins=CONFIG_CORS,
async_mode='eventlet',
max_http_buffer_size=CONFIG_MAX_UPLOAD_MB * 1024 * 1024,
ping_timeout=10,
ping_interval=5,
ping_timeout=60,
ping_interval=25,
logger=CONFIG_DEBUG,
engineio_logger=CONFIG_DEBUG
)

View File

@ -812,11 +812,18 @@ class StreamingWorker(QThread):
self.stream_url = ""
self.is_running = False
self.ffmpeg_proc = None
self._broadcast_started = False
def on_connect(self):
print("[SOCKET] Connected to DJ server")
self.sio.emit('start_broadcast', {'format': 'mp3', 'bitrate': '128k'})
self.streaming_started.emit()
if not self._broadcast_started:
self._broadcast_started = True
self.sio.emit('start_broadcast', {'format': 'mp3', 'bitrate': '128k'})
self.streaming_started.emit()
else:
# Reconnected mid-stream - server handles resume gracefully
print("[SOCKET] Reconnected - resuming existing broadcast")
self.sio.emit('start_broadcast', {'format': 'mp3', 'bitrate': '128k'})
def on_disconnect(self):
print("[SOCKET] Disconnected from DJ server")
@ -878,6 +885,7 @@ class StreamingWorker(QThread):
def stop_streaming(self):
self.is_running = False
self._broadcast_started = False
if self.ffmpeg_proc:
try: self.ffmpeg_proc.terminate()
except: pass