| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 | 
							- <!doctype html>
 - <html lang="en">
 - <head>
 -   <meta charset="utf-8">
 -   <meta name="viewport" content="width=device-width, initial-scale=1">
 -   <title>Bystander</title>
 -   <link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet">
 -   <link rel="icon" href="/static/gfx/eye-horus.png">
 - </head>
 - <body data-bs-theme="dark">
 -   <div class="select" style="position:absolute; top:0;right:0; z-index:23">
 -     <label for="videoSource">Video source: </label><select id="videoSource"></select>
 -   </div>
 -   <div class="container-fluid text-center">
 -     <div class="row" style="background-image:url(/static/gfx/vest-funeral.jpg); backgroud-color:red; background-size:cover">
 -       <div class="col12" id="the-reporter" style="background-image:url(/static/gfx/anas-al-sharif.jpg); backgroud-color:red; background-size:cover">
 -         <video class="w-100" id="the-video" autoplay muted playsinline></video>
 -         </video>
 -       </div>
 -     </div>
 -   </div>
 -   <script src="/static/js/config.js"></script>
 -   <script src="/static/js/jquery-3.7.1.min.js"></script>
 -   <script src="/static/bootstrap/js/bootstrap.bundle.min.js"></script>
 -   <script>
 - 
 -   'use strict';
 - 
 -   var videoElement = document.querySelector('video');
 -   var videoSelect = document.querySelector('select#videoSource');
 - 
 -   videoSelect.onchange = getStream;
 - 
 -   getStream().then(getDevices).then(gotDevices);
 - 
 -   function getDevices() {
 -     // AFAICT in Safari this only gets default devices until gUM is called :/
 -     return navigator.mediaDevices.enumerateDevices();
 -   }
 - 
 -   function gotDevices(deviceInfos) {
 -     window.deviceInfos = deviceInfos; // make available to console
 -     console.log('Available input and output devices:', deviceInfos);
 -     for (const deviceInfo of deviceInfos) {
 -       const option = document.createElement('option');
 -       option.value = deviceInfo.deviceId;
 -       if (deviceInfo.kind === 'videoinput') {
 -         option.text = deviceInfo.label || `Camera ${videoSelect.length + 1}`;
 -         videoSelect.appendChild(option);
 -       }
 -     }
 -   }
 - 
 -   function getStream() {
 -     if (window.stream) {
 -       window.stream.getTracks().forEach(track => {
 -         track.stop();
 -       });
 -     }
 -     const videoSource = videoSelect.value;
 -     const constraints = {
 -       video: {deviceId: videoSource ? {exact: videoSource} : undefined}
 -     };
 -     return navigator.mediaDevices.getUserMedia(constraints).
 -     then(gotStream).catch(handleError);
 -   }
 - 
 -   function gotStream(stream) {
 -     window.stream = stream; // make stream available to console
 -     videoSelect.selectedIndex = [...videoSelect.options].
 -     findIndex(option => option.text === stream.getVideoTracks()[0].label);
 -     videoElement.srcObject = stream;
 -   }
 - 
 -   function handleError(error) {
 -     console.error('Error: ', error);
 -   }
 - 
 - 
 -   </script>
 -   <script>
 -   async function getDistance() {
 -     try {
 -       let response = await fetch("/d");
 -       let data = await response.json();
 -       return data.distance;
 -     } catch {
 -       return 0;
 -     }
 -   };
 -   async function updateDistance() {
 -     var dist = await getDistance();
 -     if (dist>NEO_FAR) {
 -       dist = NEO_FAR;
 -     }
 -     if (dist>NEO_MID) {
 -       var vidtransp = 1.0*(dist-NEO_MID)/(NEO_FAR-NEO_MID);
 -        $("#the-video").css("opacity",vidtransp);
 -        $("#the-reporter").css("opacity",1);
 -     } else {
 -       var reptransp = 1.0*(dist-NEO_NEAR)/(NEO_MID-NEO_NEAR);
 -       $("#the-video").css("opacity",0);
 -       $("#the-reporter").css("opacity",reptransp);
 -     }
 -   }
 -   window.update_interval = setInterval(updateDistance, 200);
 -   </script>
 - </body>
 - </html>
 
 
  |