Init photobooth - borne photo evenementielle RPi4

Backend FastAPI complet : camera gphoto2, filtres/overlays Pillow,
chroma key OpenCV, multi-shot/collage, GIF, impression CUPS, email SMTP,
QR code. Frontend web vanilla (HTML/CSS/JS) pour Chromium kiosk.
Menu admin cache (appui long coin ecran). Toutes les fonctionnalites
activables/desactivables. Scripts install + systemd pour RPi4.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-21 21:46:31 +01:00
commit c8e4ec80c1
29 changed files with 2854 additions and 0 deletions

48
frontend/js/websocket.js Normal file
View File

@@ -0,0 +1,48 @@
/* Communication WebSocket avec le backend */
let ws = null;
let wsReconnectTimer = null;
const wsCallbacks = {};
function wsConnecter() {
const proto = location.protocol === 'https:' ? 'wss:' : 'ws:';
ws = new WebSocket(`${proto}//${location.host}/ws`);
ws.onopen = () => {
console.log('WebSocket connecte');
if (wsReconnectTimer) {
clearInterval(wsReconnectTimer);
wsReconnectTimer = null;
}
};
ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
const cb = wsCallbacks[msg.type];
if (cb) cb(msg);
};
ws.onclose = () => {
console.log('WebSocket deconnecte, reconnexion dans 3s...');
if (!wsReconnectTimer) {
wsReconnectTimer = setInterval(wsConnecter, 3000);
}
};
ws.onerror = () => {
ws.close();
};
}
function wsEnvoyer(msg) {
if (ws && ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify(msg));
}
}
function wsOnMessage(type, callback) {
wsCallbacks[type] = callback;
}
// Connexion au demarrage
wsConnecter();