162 lines
5.6 KiB
JavaScript
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
|
|
};
|
|
})();
|