inject_ctx. Route handler or application helper. This docstring was expanded to make future maintenance easier. Returns: Varies.
()
| 10079 | const btnSwitch = document.getElementById('fdSwitch'); |
| 10080 | const btnSave = document.getElementById('fdSave'); |
| 10081 | const btnBackLive = document.getElementById('fdBackLive'); |
| 10082 | const statusEl = document.getElementById('fdStatus'); |
| 10083 | const serverStatusEl = document.getElementById('fdServerStatus'); |
| 10084 | const sourceStatusEl = document.getElementById('fdSourceStatus'); |
| 10085 | const refSelect = document.getElementById('fdRefSelect'); |
| 10086 | const refImg = document.getElementById('fdRefImg'); |
| 10087 | const refEmpty = document.getElementById('fdRefEmpty'); |
| 10088 | const btnClearRef = document.getElementById('fdClearRef'); |
| 10089 | |
| 10090 | videoEl.muted = true; |
| 10091 | videoEl.setAttribute('muted', ''); |
| 10092 | videoEl.setAttribute('playsinline', ''); |
| 10093 | videoEl.setAttribute('webkit-playsinline', ''); |
| 10094 | |
| 10095 | let currentFacing = 'user'; |
| 10096 | let cameraActive = null; |
| 10097 | let stream = null; |
| 10098 | let sourceMode = 'camera'; |
| 10099 | let uploadedImage = null; |
| 10100 | let uploadedVideo = null; |
| 10101 | let uploadLoop = null; |
| 10102 | let liveLoop = null; |
| 10103 | let processing = false; |
| 10104 | let lastSource = null; |
| 10105 | let currentFaceBoxes = []; |
| 10106 | let currentUploadName = ''; |
| 10107 | |
| 10108 | function setStatus(msg){ statusEl.textContent = msg || ''; } |
| 10109 | function setServer(msg){ serverStatusEl.textContent = msg || ''; } |
| 10110 | function setSource(msg){ sourceStatusEl.textContent = msg || ''; } |
| 10111 | function sleep(ms){ return new Promise(r=>setTimeout(r, ms)); } |
| 10112 | function showReference(url){ |
| 10113 | if(!refImg || !refEmpty) return; |
| 10114 | if(!url){ |
| 10115 | refImg.hidden = true; refImg.removeAttribute('src'); |
| 10116 | refEmpty.hidden = false; |
| 10117 | setStatus(I18N.referenceCleared || 'Reference photo cleared.'); |
| 10118 | return; |
| 10119 | } |
| 10120 | refImg.onload = ()=>{ refImg.hidden = false; refEmpty.hidden = true; setStatus(I18N.referenceLoaded || 'Reference photo loaded.'); }; |
| 10121 | refImg.onerror = ()=>{ refImg.hidden = true; refEmpty.hidden = false; setStatus('Could not load the selected reference photo.'); }; |
| 10122 | refImg.src = url; |
| 10123 | } |
| 10124 | function updateSourceLabel(extra=''){ |
| 10125 | let label = I18N.sourceLive || 'SOURCE: LIVE CAMERA'; |
| 10126 | if(sourceMode === 'upload-image') label = I18N.sourcePhoto || 'SOURCE: UPLOADED PHOTO'; |
| 10127 | else if(sourceMode === 'upload-video') label = I18N.sourceVideo || 'SOURCE: UPLOADED VIDEO'; |
| 10128 | if(extra) label += ' | ' + extra; |
| 10129 | setSource(label); |
| 10130 | } |
| 10131 | function sizeCanvasFrom(source){ |
| 10132 | const w = source.videoWidth || source.naturalWidth || source.width || 1280; |
| 10133 | const h = source.videoHeight || source.naturalHeight || source.height || 720; |
| 10134 | canvasEl.width = w; canvasEl.height = h; |
| 10135 | } |
| 10136 | function stopLive(){ |
nothing calls this directly
no test coverage detected