adam-hassen
Ajout fonctionnalités de suivi
a3da09c
Raw
History Blame Contribute Delete
5.75 kB
// assets/camera.js
// Variables globales
let videoStream = null;
let captureInterval = null;
let isCapturing = false;
let isCameraStarted = false;
// Initialiser la caméra
window.startCamera = function(videoElementId) {
console.log(" startCamera appelé pour:", videoElementId);
const video = document.getElementById(videoElementId);
if (!video) {
console.error(" Élément vidéo non trouvé:", videoElementId);
return false;
}
// Si déjà démarrée, ne pas redémarrer
if (isCameraStarted && videoStream) {
console.log("Caméra déjà démarrée");
return true;
}
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia({
video: {
width: { ideal: 640 },
height: { ideal: 480 },
facingMode: "user"
}
})
.then(function(stream) {
videoStream = stream;
video.srcObject = stream;
video.play();
isCameraStarted = true;
console.log(" Caméra démarrée avec succès");
// Mettre à jour le statut
const statusDiv = document.getElementById('face-login-status') ||
document.getElementById('camera-status');
if (statusDiv) {
statusDiv.innerHTML = 'Caméra active';
statusDiv.className = 'camera-status face-detected';
}
return true;
})
.catch(function(error) {
console.error("Erreur caméra:", error);
const statusDiv = document.getElementById('face-login-status') ||
document.getElementById('camera-status');
if (statusDiv) {
statusDiv.innerHTML = 'Erreur accès caméra: ' + error.message;
statusDiv.className = 'camera-status no-face';
}
return false;
});
} else {
console.error("navigator.mediaDevices non supporté");
return false;
}
return true;
};
// Arrêter la caméra
window.stopCamera = function() {
console.log("Arrêt de la caméra");
if (videoStream) {
videoStream.getTracks().forEach(track => {
track.stop();
console.log(" - Track arrêtée:", track.kind);
});
videoStream = null;
isCameraStarted = false;
}
if (captureInterval) {
clearInterval(captureInterval);
captureInterval = null;
isCapturing = false;
}
// Nettoyer l'élément vidéo
const videoElements = ['face-login-camera', 'camera-feed'];
videoElements.forEach(id => {
const video = document.getElementById(id);
if (video && video.srcObject) {
video.srcObject = null;
}
});
console.log("Caméra arrêtée");
};
// Capturer une image
window.captureImage = function(videoElementId, callbackId) {
console.log("captureImage appelé");
const video = document.getElementById(videoElementId);
if (!video || !videoStream || !isCameraStarted) {
console.log("Caméra pas prête");
return null;
}
try {
const canvas = document.createElement('canvas');
canvas.width = 320;
canvas.height = 240;
const context = canvas.getContext('2d');
// Effet miroir
context.translate(canvas.width, 0);
context.scale(-1, 1);
context.drawImage(video, 0, 0, canvas.width, canvas.height);
// Convertir en base64
const imageData = canvas.toDataURL('image/jpeg', 0.8);
console.log("Image capturée");
return imageData;
} catch (error) {
console.error("Erreur capture:", error);
return null;
}
};
// Démarrer automatiquement sur la page face-login
document.addEventListener('DOMContentLoaded', function() {
console.log("DOM chargé, initialisation...");
// Vérifier toutes les secondes
var checkInterval = setInterval(function() {
if (window.location.pathname === '/face-login') {
console.log("Page face-login détectée");
var videoElement = document.getElementById('face-login-camera');
if (videoElement && !isCameraStarted) {
console.log("Démarrage de la caméra...");
window.startCamera('face-login-camera');
// Mettre à jour le statut
var statusDiv = document.getElementById('face-login-status');
if (statusDiv) {
statusDiv.innerHTML = 'Caméra activée';
}
// Une fois démarré, on peut arrêter de vérifier
clearInterval(checkInterval);
}
}
}, 1000);
});
// Exposer les fonctions pour Dash
window.dash_clientside = window.dash_clientside || {};
window.dash_clientside.camera = {
start: function(videoId) {
return window.startCamera(videoId);
},
stop: function() {
return window.stopCamera();
},
capture: function(videoId) {
return window.captureImage(videoId, 'face-login-result');
}
};
// Fonction pour le callback automatique de Dash
window.dash_clientside.capture = {
capture: function(n_intervals) {
if (window.captureImage && isCameraStarted) {
return window.captureImage('face-login-camera', 'face-login-result');
}
return window.dash_clientside.no_update;
}
};
console.log("camera.js chargé avec succès");