| const video = document.querySelector("#videoElement"); |
| let currentFacingMode = "user"; |
| let stream = null; |
|
|
| |
| function startCamera(facingMode = "user") { |
| if (stream) { |
| stream.getTracks().forEach(track => track.stop()); |
| } |
|
|
| const constraints = { |
| video: { |
| facingMode: { exact: facingMode } |
| } |
| }; |
|
|
| navigator.mediaDevices.getUserMedia(constraints) |
| .then((newStream) => { |
| stream = newStream; |
| video.srcObject = stream; |
|
|
| |
| video.setAttribute("playsinline", true); |
| video.play().catch(err => console.warn("Autoplay issue:", err)); |
| }) |
| .catch((err) => { |
| console.warn("Exact facingMode failed, trying fallback. Error:", err); |
|
|
| |
| navigator.mediaDevices.getUserMedia({ video: true }) |
| .then((fallbackStream) => { |
| stream = fallbackStream; |
| video.srcObject = stream; |
| video.setAttribute("playsinline", true); |
| video.play().catch(err => console.warn("Autoplay issue:", err)); |
| }) |
| .catch((error) => { |
| console.error("Error accessing camera:", error); |
| alert("Camera access failed. Please allow camera permissions."); |
| }); |
| }); |
| } |
|
|
| |
| function toggleCamera() { |
| currentFacingMode = currentFacingMode === "user" ? "environment" : "user"; |
| startCamera(currentFacingMode); |
| } |
|
|
| |
| function captureAndSend() { |
| if (!stream) { |
| alert("Camera is not started yet!"); |
| return; |
| } |
|
|
| const canvas = document.createElement('canvas'); |
| canvas.width = video.videoWidth; |
| canvas.height = video.videoHeight; |
|
|
| const context = canvas.getContext('2d'); |
| context.drawImage(video, 0, 0, canvas.width, canvas.height); |
|
|
| const dataUrl = canvas.toDataURL("image/jpeg"); |
|
|
| document.getElementById("snapshotImage").src = dataUrl; |
|
|
| fetch("https://prime810-facefeel.hf.space/process_image", { |
| method: "POST", |
| headers: { "Content-Type": "application/json" }, |
| body: JSON.stringify({ image: dataUrl }) |
| }) |
| .then(response => response.json()) |
| .then(data => { |
| document.getElementById("emojiDisplay").innerHTML = |
| `<img src="${data.emoji}" style="width:200px; border-radius:10px;">`; |
| document.getElementById("emotionText").textContent = |
| `Emotion: ${data.emotion}`; |
| |
| const link = document.getElementById("downloadEmoji"); |
| link.href = data.emoji; |
| link.style.display = "inline-block"; |
|
|
| const sound = document.getElementById("emojiSound"); |
| if (sound) sound.play(); |
| }) |
| .catch(error => { |
| console.error("Error:", error); |
| alert("Failed to get emoji. Is your backend running?"); |
| }); |
| } |
|
|
| |
| startCamera(); |
|
|