Files
clarkeis.com/site/camera-info/main.js
Tyler Clarke 7b3779999a
All checks were successful
ClarkeIS Build / Build-Docker-Image (push) Successful in 41s
fixes? ig?
2025-06-12 21:40:58 -04:00

161 lines
4.6 KiB
JavaScript

function frame(e) {
for (let el of document.querySelectorAll("body > div")) {
if (el.style.display != "none") {
el.style.display = "none";
window.app[el.id].exit();
}
}
document.getElementById(e).style.display = "";
window.app[e].enter();
}
let canvas = document.getElementById("precanvas");
let ctx = canvas.getContext("2d");
let video = document.getElementById("magic_video");
function takepicture() {
let box = video.getBoundingClientRect();
video.classList.add("unbounded");
document.getElementById("endcamera").style.display = "";
ctx.canvas.classList.remove("offscreen");
document.getElementById("camview").classList.add("took")
// si c'est portrait, nous doivons le tourner à landscape (parce que le canvas ont besoin d'un photo landscape pour marcher bien)
// [un peu plus tard] pourquoi a-moi apprendré le français? c'est horrible
if (box.height > box.width) {
canvas.width = box.height;
canvas.height = box.width;
ctx.translate(box.width/2, box.height/2);
ctx.rotate(Math.PI / 2);
ctx.drawImage(video, -box.width/2, -box.height/2, box.width, box.height);
ctx.rotate(-Math.PI / 2);
ctx.translate(-box.width/2, -box.height/2);
}
else {
canvas.width = box.width;
canvas.height = box.height;
ctx.drawImage(video, 0, 0, box.width, box.height);
}
video.classList.remove("unbounded");
}
function setdetails() {
frame("details");
}
if ("geolocation" in navigator) {
document.getElementById("here").style.display = "";
}
function populateLocation() {
navigator.geolocation.getCurrentPosition(pos => {
document.getElementById("long").value = pos.coords.longitude;
document.getElementById("lat").value = pos.coords.latitude;
});
}
function render() {
frame("finalresult");
}
window.app = {
"home": {
enter() {
let preview = document.getElementById("preview");
navigator.mediaDevices.getUserMedia({ video: {
facingMode: { ideal: "environment" }
}, audio : false }).then((stream) => {
video.srcObject = stream;
video.play();
preview.srcObject = stream;
preview.play();
window.app.stream = stream;
});
},
exit() {
window.app.stream.getTracks().forEach(track => {
track.stop();
});
}
},
"details": {
enter() {
},
exit() {
}
},
"finalresult": {
enter() {
let canvas = document.getElementById("final");
let ctx = canvas.getContext("2d");
ctx.fillStyle = "white";
ctx.fillRect(0, 0, 1440, 960);
ctx.font = "bold 96px sans-serif";
ctx.fillStyle = "black";
ctx.fillText(document.getElementById("title").value, 0, 96);
ctx.font = "bold 48px sans-serif";
ctx.fillText(new Date().toLocaleString(), 0, 152);
let lat = document.getElementById("lat").value;
let long = document.getElementById("long").value;
reverse_geocode(lat, long).then(res => {
ctx.fillText(res, 0, 208);
});
ctx.fillText("https://maps.google.com/maps?q=" + lat + "," + long, 0, 256);
ctx.fillText("Notes: " + document.getElementById("notes").value, 0, 308);
let image = document.getElementById("precanvas");
ctx.drawImage(image, 0, 320, 720, image.height / image.width * 720);
maps_static(lat, long, img => {
ctx.drawImage(img, 365 * 2, 320);
});
},
exit() {
}
}
}
frame("home");
async function reverse_geocode(lat, long) {
let res = await fetch("https://maps.googleapis.com/maps/api/geocode/json?zoom=6&latlng=" + lat + "," + long + "&key=AIzaSyD_zbdxwN7_aOMNH69eAL9bSS814Ix-UM8");
let json = await res.json();
return json.results[0].formatted_address;
}
function maps_static(lat, long, cbk) {
let img = document.createElement("img");
document.body.appendChild(img);
img.classList.add("offscreen");
img.src = "https://maps.googleapis.com/maps/api/staticmap?size=710x600&key=AIzaSyD_zbdxwN7_aOMNH69eAL9bSS814Ix-UM8&markers=label:S%7C" + lat + "," + long;
img.crossOrigin = "anonymous";
img.onload = () => {
cbk(img);
};
}
function getFilename() {
var title = "camera-info-";
for (char of document.getElementById("title").value) {
let cc = char.charCodeAt(0);
if ((cc > 47 && cc < 58) || (cc > 64 && cc < 91) || (cc > 96 && cc < 123)) {
title += char.toLowerCase();
}
else {
title += '-';
}
}
return title + ".png";
}
function download() {
let canvas = document.getElementById("final");
let anchor = document.createElement("a");
anchor.href = canvas.toDataURL();
anchor.download = getFilename();
anchor.click();
}