Aniworld/src/server/web/static/js/queue/queue-socket-handler.js

162 lines
5.6 KiB
JavaScript

/**
* AniWorld - Queue Socket Handler Module
*
* Handles WebSocket events specific to the queue page.
*
* Dependencies: constants.js, websocket-client.js, ui-utils.js, queue-renderer.js, progress-handler.js
*/
var AniWorld = window.AniWorld || {};
AniWorld.QueueSocketHandler = (function() {
'use strict';
const WS_EVENTS = AniWorld.Constants.WS_EVENTS;
// Reference to queue app for data reloading
let queueApp = null;
/**
* Initialize socket handler
* @param {Object} app - Reference to queue app
*/
function init(app) {
queueApp = app;
setupSocketHandlers();
}
/**
* Set up WebSocket event handlers
*/
function setupSocketHandlers() {
const socket = AniWorld.WebSocketClient.getSocket();
if (!socket) {
console.warn('Socket not available for handler setup');
return;
}
// Connection events
socket.on('connect', function() {
AniWorld.UI.showToast('Connected to server', 'success');
});
socket.on('disconnect', function() {
AniWorld.UI.showToast('Disconnected from server', 'warning');
});
// Queue update events - handle both old and new message types
socket.on('queue_updated', function(data) {
AniWorld.QueueRenderer.updateQueueDisplay(data);
});
socket.on('queue_status', function(data) {
// New backend sends queue_status messages with nested structure
if (data.status && data.statistics) {
const queueData = {
...data.status,
statistics: data.statistics
};
AniWorld.QueueRenderer.updateQueueDisplay(queueData);
} else if (data.queue_status) {
AniWorld.QueueRenderer.updateQueueDisplay(data.queue_status);
} else {
AniWorld.QueueRenderer.updateQueueDisplay(data);
}
});
// Download started events
socket.on('download_started', function() {
AniWorld.UI.showToast('Download queue started', 'success');
if (queueApp) queueApp.loadQueueData();
});
socket.on('queue_started', function() {
AniWorld.UI.showToast('Download queue started', 'success');
if (queueApp) queueApp.loadQueueData();
});
// Download progress
socket.on('download_progress', function(data) {
console.log('Received download progress:', data);
const success = AniWorld.ProgressHandler.updateDownloadProgress(data);
if (!success && queueApp) {
// Card not found, reload queue
queueApp.loadQueueData();
}
});
// Download complete events
const handleDownloadComplete = function(data) {
const serieName = data.serie_name || data.serie || 'Unknown';
const episode = data.episode || '';
AniWorld.UI.showToast('Completed: ' + serieName + (episode ? ' - Episode ' + episode : ''), 'success');
// Clear pending progress updates
const downloadId = data.item_id || data.download_id || data.id;
if (downloadId) {
AniWorld.ProgressHandler.clearPendingUpdate(downloadId);
}
if (queueApp) queueApp.loadQueueData();
};
socket.on(WS_EVENTS.DOWNLOAD_COMPLETED, handleDownloadComplete);
socket.on(WS_EVENTS.DOWNLOAD_COMPLETE, handleDownloadComplete);
// Download error events
const handleDownloadError = function(data) {
const message = data.error || data.message || 'Unknown error';
AniWorld.UI.showToast('Download failed: ' + message, 'error');
// Clear pending progress updates
const downloadId = data.item_id || data.download_id || data.id;
if (downloadId) {
AniWorld.ProgressHandler.clearPendingUpdate(downloadId);
}
if (queueApp) queueApp.loadQueueData();
};
socket.on(WS_EVENTS.DOWNLOAD_ERROR, handleDownloadError);
socket.on(WS_EVENTS.DOWNLOAD_FAILED, handleDownloadError);
// Queue completed events
socket.on(WS_EVENTS.DOWNLOAD_QUEUE_COMPLETED, function() {
AniWorld.UI.showToast('All downloads completed!', 'success');
if (queueApp) queueApp.loadQueueData();
});
socket.on(WS_EVENTS.QUEUE_COMPLETED, function() {
AniWorld.UI.showToast('All downloads completed!', 'success');
if (queueApp) queueApp.loadQueueData();
});
// Download stop requested
socket.on(WS_EVENTS.DOWNLOAD_STOP_REQUESTED, function() {
AniWorld.UI.showToast('Stopping downloads...', 'info');
});
// Queue stopped events
const handleQueueStopped = function() {
AniWorld.UI.showToast('Download queue stopped', 'success');
if (queueApp) queueApp.loadQueueData();
};
socket.on(WS_EVENTS.DOWNLOAD_STOPPED, handleQueueStopped);
socket.on(WS_EVENTS.QUEUE_STOPPED, handleQueueStopped);
// Queue paused/resumed
socket.on(WS_EVENTS.QUEUE_PAUSED, function() {
AniWorld.UI.showToast('Queue paused', 'info');
if (queueApp) queueApp.loadQueueData();
});
socket.on(WS_EVENTS.QUEUE_RESUMED, function() {
AniWorld.UI.showToast('Queue resumed', 'success');
if (queueApp) queueApp.loadQueueData();
});
}
// Public API
return {
init: init
};
})();