From a0286f213e289c023e6790ee2b4bb5a5ea00aeb0 Mon Sep 17 00:00:00 2001 From: Elias Stepanik <40958815+eliasstepanik@users.noreply.github.com> Date: Mon, 25 Sep 2023 19:43:56 +0200 Subject: [PATCH] vdo.ninja docker --- app/Dockerfile | 7 + app/docker-compose.yml | 10 + app/nginx.conf | 33 + .gitignore => app/static/.gitignore | 0 AGPLv3.md => app/static/AGPLv3.md | 0 CONTRIBUTING.md => app/static/CONTRIBUTING.md | 38 +- IFRAME.md => app/static/IFRAME.md | 0 LICENCE.md => app/static/LICENCE.md | 28 +- README.md => app/static/README.md | 0 check.html => app/static/check.html | 1698 +- cloudflare.html => app/static/cloudflare.html | 532 +- codecs.html => app/static/codecs.html | 166 +- comms.html => app/static/comms.html | 4658 +- control.html => app/static/control.html | 240 +- convert.html => app/static/convert.html | 568 +- devices.css => app/static/devices.css | 0 devices.html => app/static/devices.html | 454 +- .../static/devices.json.html | 46 +- dock.html => app/static/dock.html | 594 +- electron.html => app/static/electron.html | 4 +- esports.html => app/static/esports.html | 260 +- .../static/examples}/addtoscene.html | 288 +- .../static/examples}/bigmutebutton.html | 240 +- .../static/examples}/changepass.html | 52 +- {examples => app/static/examples}/chat.html | 318 +- .../static/examples}/chatoverlay.html | 324 +- .../static/examples}/control.html | 244 +- .../examples}/custom_video_switcher.html | 0 .../static/examples}/draggable.html | 660 +- {examples => app/static/examples}/dual.html | 150 +- .../static/examples}/esports.html | 260 +- {examples => app/static/examples}/github.svg | 0 .../examples}/iframe.outbound-stats.html | 0 {examples => app/static/examples}/index.html | 4 +- {examples => app/static/examples}/main.css | 0 {examples => app/static/examples}/midi.html | 1110 +- {examples => app/static/examples}/mini.css | 4 +- {examples => app/static/examples}/mixer.html | 900 +- .../static/examples}/mobiledirector.css | 294 +- {examples => app/static/examples}/multi.html | 222 +- .../static/examples}/muteguestiframe.html | 636 +- {examples => app/static/examples}/nes.min.css | 0 .../static/examples}/obs_remote/index.html | 800 +- .../examples}/obs_remote/interface.html | 946 +- .../thirdparty/obs-websocket.min.js | 0 .../static/examples}/overlay.html | 290 +- {examples => app/static/examples}/p2p.html | 136 +- .../static/examples}/powerpoint.html | 270 +- {examples => app/static/examples}/readme.md | 46 +- .../static/examples}/remoteapi.html | 952 +- .../static/examples}/rotated.html | 268 +- .../static/examples}/sensoroverlay.html | 530 +- .../static/examples}/sensors.html | 558 +- {examples => app/static/examples}/socal.html | 368 +- {examples => app/static/examples}/status.html | 344 +- .../static/examples}/teleprompt.html | 576 +- .../static/examples}/teleprompter.html | 1350 +- .../static/examples}/test_overlay.html | 42 +- {examples => app/static/examples}/twitch.html | 714 +- .../static/examples}/waitingroom.html | 240 +- {examples => app/static/examples}/webhid.html | 266 +- .../static/examples}/youtube.html | 256 +- {examples => app/static/examples}/youtube.svg | 0 {examples => app/static/examples}/zoom.html | 364 +- fileshare.html => app/static/fileshare.html | 332 +- {filters => app/static/filters}/anon.js | 0 .../filters}/anon/addVideoRecordingEffect.js | 0 .../static/filters}/anon/anonymous.json | 0 .../static/filters}/anon/anonymous.png | Bin .../static/filters}/anon/anonymous_mask.blend | Bin {filters => app/static/filters}/dog.js | 0 .../static/filters}/dog/ThreeFlexMaterial.js | 0 .../filters}/dog/images/texture_pink.jpg | Bin .../filters}/dog/images/texture_white.jpg | Bin .../static/filters}/dog/index.html | 2 +- .../static/filters}/dog/libs/glfx.js | 0 {filters => app/static/filters}/dog/main.js | 0 .../filters}/dog/models/dog/alpha_ears.jpg | Bin .../dog/models/dog/alpha_ears_1024.jpg | Bin .../dog/models/dog/alpha_ears_256.jpg | Bin .../filters}/dog/models/dog/displace_nez.jpg | Bin .../dog/models/dog/displace_oreilles.jpg | Bin .../filters}/dog/models/dog/dog_ears.json | 0 .../filters}/dog/models/dog/dog_nose.json | 0 .../filters}/dog/models/dog/dog_tongue.jpg | Bin .../filters}/dog/models/dog/dog_tongue.json | 0 .../filters}/dog/models/dog/flex_ears.jpg | Bin .../dog/models/dog/flex_ears_1024.jpg | Bin .../filters}/dog/models/dog/flex_ears_256.jpg | Bin .../filters}/dog/models/dog/flex_nose.png | Bin .../filters}/dog/models/dog/flex_tongue.png | Bin .../dog/models/dog/flex_tongue_1024.png | Bin .../dog/models/dog/flex_tongue_256.png | Bin .../filters}/dog/models/dog/normal_ears.jpg | Bin .../filters}/dog/models/dog/normal_nose.jpg | Bin .../filters}/dog/models/dog/texture_ears.jpg | Bin .../filters}/dog/models/dog/texture_nose.jpg | Bin .../filters}/dog/models/dog/tongue_alpha.jpg | Bin .../dog/models/dog/tongue_alpha_1024.jpg | Bin .../dog/models/dog/tongue_alpha_256.jpg | Bin {filters => app/static/filters}/readme.md | 4 +- {filters => app/static/filters}/sample.js | 122 +- .../static/iframe-examples.js | 0 iframe.css => app/static/iframe.css | 0 iframe.html => app/static/iframe.html | 2 +- index.html => app/static/index.html | 48 +- install.md => app/static/install.md | 0 lib.js => app/static/lib.js | 78100 ++++++++-------- .../static/lineawesome}/LICENSE.txt | 0 .../static/lineawesome}/Readme.md | 0 .../static/lineawesome}/css/line-awesome.css | 4 +- .../lineawesome}/css/line-awesome.min.css | 2 +- .../lineawesome}/fonts/la-solid-900.eot | Bin .../lineawesome}/fonts/la-solid-900.svg | 0 .../lineawesome}/fonts/la-solid-900.ttf | Bin .../lineawesome}/fonts/la-solid-900.woff | Bin .../lineawesome}/fonts/la-solid-900.woff2 | Bin main.css => app/static/main.css | 4 +- main.js => app/static/main.js | 12934 +-- {media => app/static/media}/accept.png | Bin {media => app/static/media}/avatar.webp | Bin {media => app/static/media}/avatar1.png | Bin {media => app/static/media}/avatar2.png | Bin {media => app/static/media}/avatar3.png | Bin {media => app/static/media}/bg_sample.webp | Bin {media => app/static/media}/bg_sample2.webp | Bin .../static/media}/camera_inkscape.svg | 0 {media => app/static/media}/cap.webm | Bin {media => app/static/media}/fakesteve.webm | Bin {media => app/static/media}/favicon-16x16.png | Bin {media => app/static/media}/favicon-32x32.png | Bin {media => app/static/media}/favicon.ico | Bin {media => app/static/media}/grid_inkscape.svg | 0 {media => app/static/media}/hd.svg | 0 {media => app/static/media}/icon.png | Bin {media => app/static/media}/icon.svg | 0 {media => app/static/media}/join.mp3 | Bin {media => app/static/media}/join.ogg | Bin {media => app/static/media}/join.wav | Bin {media => app/static/media}/leave.mp3 | Bin {media => app/static/media}/leave.ogg | Bin {media => app/static/media}/leave.wav | Bin {media => app/static/media}/logo_cropped.png | Bin .../static/media}/logo_cropped_512.png | Bin {media => app/static/media}/micro.mp4 | Bin .../static/media}/monitor_inkscape.svg | 0 {media => app/static/media}/old_icon.png | Bin {media => app/static/media}/old_logo.png | Bin .../static/media}/permissions_chrome.jpg | Bin .../static/media}/plane_inkscape.svg | 0 {media => app/static/media}/profile.png | Bin {media => app/static/media}/robot.mp3 | Bin {media => app/static/media}/screenshare.webm | Bin {media => app/static/media}/sd.svg | 0 {media => app/static/media}/share.jpg | Bin {media => app/static/media}/streamdeck.png | Bin {media => app/static/media}/svg.md | 2 +- {media => app/static/media}/thirds.svg | 14 +- {media => app/static/media}/thirdshead.svg | 0 {media => app/static/media}/tone.mp3 | Bin {media => app/static/media}/tone.ogg | Bin .../static/media}/vdoNinja_logo_full.png | Bin {media => app/static/media}/vdoninja.svg | 0 meet.html => app/static/meet.html | 3950 +- midi.html => app/static/midi.html | 1150 +- .../static/minidirector.css | 292 +- mixer.html => app/static/mixer.html | 8382 +- monitor.html => app/static/monitor.html | 1180 +- popout.html => app/static/popout.html | 732 +- publish.html => app/static/publish.html | 2 +- regions.html => app/static/regions.html | 186 +- remotemidi.html => app/static/remotemidi.html | 3446 +- results.html => app/static/results.html | 1064 +- .../static/serviceWorker.js | 0 speedtest.css => app/static/speedtest.css | 0 speedtest.html => app/static/speedtest.html | 1186 +- stats.css => app/static/stats.css | 1664 +- stats.html => app/static/stats.html | 12 +- supports.css => app/static/supports.css | 0 supports.html => app/static/supports.html | 488 +- .../static/teleprompter.html | 1538 +- .../static/thirdparty}/CodecsHandler.js | 0 .../static/thirdparty}/StreamSaver.js | 0 .../static/thirdparty}/adapter.js | 0 {thirdparty => app/static/thirdparty}/aes.js | 0 .../static/thirdparty}/canvasFilters.js | 0 .../static/thirdparty}/ffmpeg.min.js | 0 .../static/thirdparty}/focus_worker.js | 0 .../thirdparty}/jeeliz/JeelizResizer.js | 0 .../thirdparty}/jeeliz/JeelizThreeHelper.js | 0 .../static/thirdparty}/jeeliz/Tween.min.js | 0 .../jeeliz/helpers/HeadControls.js | 0 .../jeeliz/helpers/JeelizCanvas2DHelper.js | 0 .../jeeliz/helpers/JeelizFaceCut.js | 0 .../jeeliz/helpers/JeelizResizer.js | 0 .../jeeliz/helpers/JeelizThreeHelper.js | 0 .../thirdparty}/jeeliz/helpers/README.md | 0 .../jeeliz/helpers/addDragEventListener.js | 0 .../thirdparty}/jeeliz/jeelizFaceFilter.js | 0 .../jeeliz/modules/jeelizFaceFilter.module.js | 0 .../modules/jeelizFaceFilter.moduleNoDOM.js | 0 .../jeeliz/neuralNets/NN_4EXPR_0.json | 0 .../jeeliz/neuralNets/NN_DEFAULT.json | 0 .../jeeliz/neuralNets/NN_INTEL1536.json | 0 .../jeeliz/neuralNets/NN_LIGHT_0.json | 0 .../jeeliz/neuralNets/NN_VERYLIGHT_0.json | 0 .../jeeliz/neuralNets/NN_VIEWTOP_0.json | 0 .../jeeliz/neuralNets/NN_WIDEANGLES_0.json | 0 .../static/thirdparty}/jeeliz/readme.md | 10 +- .../three/ShaderParticleEngine/SPE.min.js | 0 .../FlexMaterial/ThreeFlexMaterial.js | 0 .../GlowMaterial/threex.atmospherematerial.js | 0 .../threex.atmospherematerialdatgui.js | 0 .../GlowMaterial/threex.dilategeometry.js | 0 .../GlowMaterial/threex.geometricglow.js | 0 .../jeeliz/three/matrix/THREEMatrix.js | 0 .../jeeliz/three/v112/GLTFLoader.js | 0 .../thirdparty}/jeeliz/three/v112/three.js | 0 .../jeeliz/three/v112/three.min.js | 0 .../static/thirdparty}/jquery/jquery-3.6.0.js | 0 .../static/thirdparty}/jquery/jquery-ui.css | 0 .../static/thirdparty}/jquery/jquery-ui.js | 0 .../thirdparty}/jquery/jquery-ui.min.js | 0 .../static/thirdparty}/lyra/README.md | 0 .../thirdparty}/lyra/model_coeffs/README.md | 10 +- .../lyra/model_coeffs/lyragan.tflite | Bin .../lyra/model_coeffs/quantizer.tflite | Bin .../model_coeffs/soundstream_encoder.tflite | Bin .../lyra/webassembly_codec_wrapper.js | 0 .../lyra/webassembly_codec_wrapper.wasm | Bin .../static/thirdparty}/measureBlur.js | 0 .../static/thirdparty}/mitm.html | 0 .../static/thirdparty}/polyfill.min.js | 0 .../static/thirdparty}/polyfill.min.js.map | 0 .../static/thirdparty}/qrcode.min.js | 0 .../static/thirdparty}/readme.md | 4 +- {thirdparty => app/static/thirdparty}/sw.js | 0 .../tfjs/face-landmarks-detection.js | 124 +- .../thirdparty}/tfjs/tf-backend-webgl.js | 130 +- .../thirdparty}/tfjs/tf-backend-webgl.js.map | 0 .../static/thirdparty}/tfjs/tf-converter.js | 170 +- .../thirdparty}/tfjs/tf-converter.js.map | 0 .../static/thirdparty}/tfjs/tf-core.js | 2774 +- .../static/thirdparty}/tfjs/tf-core.js.map | 0 .../static/thirdparty}/tflite/README.md | 0 .../thirdparty}/tflite/segm_full_v679.tflite | Bin .../static/thirdparty}/tflite/tflite-simd.js | 1774 +- .../thirdparty}/tflite/tflite-simd.wasm | Bin .../static/thirdparty}/tflite/tflite.wasm | Bin .../static/thirdparty}/webmidi.js | 0 .../static/thirdparty}/webmidi3.js | 0 .../static/translations}/blank.json | 0 .../static/translations}/cn.json | 0 .../static/translations}/cs.json | 0 .../static/translations}/de.json | 0 .../static/translations}/en.json | 0 .../static/translations}/es.json | 0 .../static/translations}/eu.json | 0 .../static/translations}/fr.json | 0 .../static/translations}/it.json | 0 .../static/translations}/ja.json | 0 .../static/translations}/makepig.js | 146 +- .../static/translations}/nl.json | 0 .../static/translations}/pig.json | 0 .../static/translations}/pt-br.json | 0 .../static/translations}/pt.json | 0 .../static/translations}/readme.md | 36 +- .../static/translations}/ru.json | 0 .../static/translations}/tr.json | 0 .../static/translations}/translate.js | 550 +- .../static/translations}/uk.json | 0 .../static/turn-credentials-php.sample | 0 turnserver.conf => app/static/turnserver.conf | 0 turnserver.md => app/static/turnserver.md | 0 .../static/turnserver2.conf | 0 .../static/turnserver3.conf | 0 webrtc.js => app/static/webrtc.js | 2 +- whip.html => app/static/whip.html | 2 +- zoom.html => app/static/zoom.html | 364 +- 279 files changed, 73673 insertions(+), 73623 deletions(-) create mode 100644 app/Dockerfile create mode 100644 app/docker-compose.yml create mode 100644 app/nginx.conf rename .gitignore => app/static/.gitignore (100%) rename AGPLv3.md => app/static/AGPLv3.md (100%) rename CONTRIBUTING.md => app/static/CONTRIBUTING.md (99%) rename IFRAME.md => app/static/IFRAME.md (100%) rename LICENCE.md => app/static/LICENCE.md (98%) rename README.md => app/static/README.md (100%) rename check.html => app/static/check.html (95%) rename cloudflare.html => app/static/cloudflare.html (97%) rename codecs.html => app/static/codecs.html (96%) rename comms.html => app/static/comms.html (96%) rename control.html => app/static/control.html (96%) rename convert.html => app/static/convert.html (95%) rename devices.css => app/static/devices.css (100%) rename devices.html => app/static/devices.html (93%) rename devices.json.html => app/static/devices.json.html (95%) rename dock.html => app/static/dock.html (96%) rename electron.html => app/static/electron.html (99%) rename esports.html => app/static/esports.html (96%) rename {examples => app/static/examples}/addtoscene.html (96%) rename {examples => app/static/examples}/bigmutebutton.html (95%) rename {examples => app/static/examples}/changepass.html (96%) rename {examples => app/static/examples}/chat.html (95%) rename {examples => app/static/examples}/chatoverlay.html (96%) rename {examples => app/static/examples}/control.html (96%) rename {examples => app/static/examples}/custom_video_switcher.html (100%) rename {examples => app/static/examples}/draggable.html (95%) rename {examples => app/static/examples}/dual.html (96%) rename {examples => app/static/examples}/esports.html (96%) rename {examples => app/static/examples}/github.svg (100%) rename {examples => app/static/examples}/iframe.outbound-stats.html (100%) rename {examples => app/static/examples}/index.html (97%) rename {examples => app/static/examples}/main.css (100%) rename {examples => app/static/examples}/midi.html (96%) rename {examples => app/static/examples}/mini.css (95%) rename {examples => app/static/examples}/mixer.html (96%) rename {examples => app/static/examples}/mobiledirector.css (94%) rename {examples => app/static/examples}/multi.html (96%) rename {examples => app/static/examples}/muteguestiframe.html (96%) rename {examples => app/static/examples}/nes.min.css (100%) rename {examples => app/static/examples}/obs_remote/index.html (96%) rename {examples => app/static/examples}/obs_remote/interface.html (96%) rename {examples => app/static/examples}/obs_remote/thirdparty/obs-websocket.min.js (100%) rename {examples => app/static/examples}/overlay.html (96%) rename {examples => app/static/examples}/p2p.html (97%) rename {examples => app/static/examples}/powerpoint.html (96%) rename {examples => app/static/examples}/readme.md (98%) rename {examples => app/static/examples}/remoteapi.html (96%) rename {examples => app/static/examples}/rotated.html (95%) rename {examples => app/static/examples}/sensoroverlay.html (95%) rename {examples => app/static/examples}/sensors.html (96%) rename {examples => app/static/examples}/socal.html (95%) rename {examples => app/static/examples}/status.html (95%) rename {examples => app/static/examples}/teleprompt.html (94%) rename {examples => app/static/examples}/teleprompter.html (96%) rename {examples => app/static/examples}/test_overlay.html (93%) rename {examples => app/static/examples}/twitch.html (96%) rename {examples => app/static/examples}/waitingroom.html (95%) rename {examples => app/static/examples}/webhid.html (96%) rename {examples => app/static/examples}/youtube.html (96%) rename {examples => app/static/examples}/youtube.svg (100%) rename {examples => app/static/examples}/zoom.html (96%) rename fileshare.html => app/static/fileshare.html (95%) rename {filters => app/static/filters}/anon.js (100%) rename {filters => app/static/filters}/anon/addVideoRecordingEffect.js (100%) rename {filters => app/static/filters}/anon/anonymous.json (100%) rename {filters => app/static/filters}/anon/anonymous.png (100%) rename {filters => app/static/filters}/anon/anonymous_mask.blend (100%) rename {filters => app/static/filters}/dog.js (100%) rename {filters => app/static/filters}/dog/ThreeFlexMaterial.js (100%) rename {filters => app/static/filters}/dog/images/texture_pink.jpg (100%) rename {filters => app/static/filters}/dog/images/texture_white.jpg (100%) rename {filters => app/static/filters}/dog/index.html (98%) rename {filters => app/static/filters}/dog/libs/glfx.js (100%) rename {filters => app/static/filters}/dog/main.js (100%) rename {filters => app/static/filters}/dog/models/dog/alpha_ears.jpg (100%) rename {filters => app/static/filters}/dog/models/dog/alpha_ears_1024.jpg (100%) rename {filters => app/static/filters}/dog/models/dog/alpha_ears_256.jpg (100%) rename {filters => app/static/filters}/dog/models/dog/displace_nez.jpg (100%) rename {filters => app/static/filters}/dog/models/dog/displace_oreilles.jpg (100%) rename {filters => app/static/filters}/dog/models/dog/dog_ears.json (100%) rename {filters => app/static/filters}/dog/models/dog/dog_nose.json (100%) rename {filters => app/static/filters}/dog/models/dog/dog_tongue.jpg (100%) rename {filters => app/static/filters}/dog/models/dog/dog_tongue.json (100%) rename {filters => app/static/filters}/dog/models/dog/flex_ears.jpg (100%) rename {filters => app/static/filters}/dog/models/dog/flex_ears_1024.jpg (100%) rename {filters => app/static/filters}/dog/models/dog/flex_ears_256.jpg (100%) rename {filters => app/static/filters}/dog/models/dog/flex_nose.png (100%) rename {filters => app/static/filters}/dog/models/dog/flex_tongue.png (100%) rename {filters => app/static/filters}/dog/models/dog/flex_tongue_1024.png (100%) rename {filters => app/static/filters}/dog/models/dog/flex_tongue_256.png (100%) rename {filters => app/static/filters}/dog/models/dog/normal_ears.jpg (100%) rename {filters => app/static/filters}/dog/models/dog/normal_nose.jpg (100%) rename {filters => app/static/filters}/dog/models/dog/texture_ears.jpg (100%) rename {filters => app/static/filters}/dog/models/dog/texture_nose.jpg (100%) rename {filters => app/static/filters}/dog/models/dog/tongue_alpha.jpg (100%) rename {filters => app/static/filters}/dog/models/dog/tongue_alpha_1024.jpg (100%) rename {filters => app/static/filters}/dog/models/dog/tongue_alpha_256.jpg (100%) rename {filters => app/static/filters}/readme.md (98%) rename {filters => app/static/filters}/sample.js (97%) rename iframe-examples.js => app/static/iframe-examples.js (100%) rename iframe.css => app/static/iframe.css (100%) rename iframe.html => app/static/iframe.html (99%) rename index.html => app/static/index.html (98%) rename install.md => app/static/install.md (100%) rename lib.js => app/static/lib.js (97%) rename {lineawesome => app/static/lineawesome}/LICENSE.txt (100%) rename {lineawesome => app/static/lineawesome}/Readme.md (100%) rename {lineawesome => app/static/lineawesome}/css/line-awesome.css (99%) rename {lineawesome => app/static/lineawesome}/css/line-awesome.min.css (62%) rename {lineawesome => app/static/lineawesome}/fonts/la-solid-900.eot (100%) rename {lineawesome => app/static/lineawesome}/fonts/la-solid-900.svg (100%) rename {lineawesome => app/static/lineawesome}/fonts/la-solid-900.ttf (100%) rename {lineawesome => app/static/lineawesome}/fonts/la-solid-900.woff (100%) rename {lineawesome => app/static/lineawesome}/fonts/la-solid-900.woff2 (100%) rename main.css => app/static/main.css (99%) rename main.js => app/static/main.js (97%) rename {media => app/static/media}/accept.png (100%) rename {media => app/static/media}/avatar.webp (100%) rename {media => app/static/media}/avatar1.png (100%) rename {media => app/static/media}/avatar2.png (100%) rename {media => app/static/media}/avatar3.png (100%) rename {media => app/static/media}/bg_sample.webp (100%) rename {media => app/static/media}/bg_sample2.webp (100%) rename {media => app/static/media}/camera_inkscape.svg (100%) rename {media => app/static/media}/cap.webm (100%) rename {media => app/static/media}/fakesteve.webm (100%) rename {media => app/static/media}/favicon-16x16.png (100%) rename {media => app/static/media}/favicon-32x32.png (100%) rename {media => app/static/media}/favicon.ico (100%) rename {media => app/static/media}/grid_inkscape.svg (100%) rename {media => app/static/media}/hd.svg (100%) rename {media => app/static/media}/icon.png (100%) rename {media => app/static/media}/icon.svg (100%) rename {media => app/static/media}/join.mp3 (100%) rename {media => app/static/media}/join.ogg (100%) rename {media => app/static/media}/join.wav (100%) rename {media => app/static/media}/leave.mp3 (100%) rename {media => app/static/media}/leave.ogg (100%) rename {media => app/static/media}/leave.wav (100%) rename {media => app/static/media}/logo_cropped.png (100%) rename {media => app/static/media}/logo_cropped_512.png (100%) rename {media => app/static/media}/micro.mp4 (100%) rename {media => app/static/media}/monitor_inkscape.svg (100%) rename {media => app/static/media}/old_icon.png (100%) rename {media => app/static/media}/old_logo.png (100%) rename {media => app/static/media}/permissions_chrome.jpg (100%) rename {media => app/static/media}/plane_inkscape.svg (100%) rename {media => app/static/media}/profile.png (100%) rename {media => app/static/media}/robot.mp3 (100%) rename {media => app/static/media}/screenshare.webm (100%) rename {media => app/static/media}/sd.svg (100%) rename {media => app/static/media}/share.jpg (100%) rename {media => app/static/media}/streamdeck.png (100%) rename {media => app/static/media}/svg.md (98%) rename {media => app/static/media}/thirds.svg (99%) rename {media => app/static/media}/thirdshead.svg (100%) rename {media => app/static/media}/tone.mp3 (100%) rename {media => app/static/media}/tone.ogg (100%) rename {media => app/static/media}/vdoNinja_logo_full.png (100%) rename {media => app/static/media}/vdoninja.svg (100%) rename meet.html => app/static/meet.html (96%) rename midi.html => app/static/midi.html (96%) rename minidirector.css => app/static/minidirector.css (95%) rename mixer.html => app/static/mixer.html (96%) rename monitor.html => app/static/monitor.html (95%) rename popout.html => app/static/popout.html (96%) rename publish.html => app/static/publish.html (99%) rename regions.html => app/static/regions.html (95%) rename remotemidi.html => app/static/remotemidi.html (96%) rename results.html => app/static/results.html (95%) rename serviceWorker.js => app/static/serviceWorker.js (100%) rename speedtest.css => app/static/speedtest.css (100%) rename speedtest.html => app/static/speedtest.html (95%) rename stats.css => app/static/stats.css (96%) rename stats.html => app/static/stats.html (93%) rename supports.css => app/static/supports.css (100%) rename supports.html => app/static/supports.html (94%) rename teleprompter.html => app/static/teleprompter.html (96%) rename {thirdparty => app/static/thirdparty}/CodecsHandler.js (100%) rename {thirdparty => app/static/thirdparty}/StreamSaver.js (100%) rename {thirdparty => app/static/thirdparty}/adapter.js (100%) rename {thirdparty => app/static/thirdparty}/aes.js (100%) rename {thirdparty => app/static/thirdparty}/canvasFilters.js (100%) rename {thirdparty => app/static/thirdparty}/ffmpeg.min.js (100%) rename {thirdparty => app/static/thirdparty}/focus_worker.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/JeelizResizer.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/JeelizThreeHelper.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/Tween.min.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/helpers/HeadControls.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/helpers/JeelizCanvas2DHelper.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/helpers/JeelizFaceCut.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/helpers/JeelizResizer.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/helpers/JeelizThreeHelper.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/helpers/README.md (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/helpers/addDragEventListener.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/jeelizFaceFilter.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/modules/jeelizFaceFilter.module.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/modules/jeelizFaceFilter.moduleNoDOM.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/neuralNets/NN_4EXPR_0.json (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/neuralNets/NN_DEFAULT.json (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/neuralNets/NN_INTEL1536.json (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/neuralNets/NN_LIGHT_0.json (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/neuralNets/NN_VERYLIGHT_0.json (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/neuralNets/NN_VIEWTOP_0.json (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/neuralNets/NN_WIDEANGLES_0.json (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/readme.md (97%) rename {thirdparty => app/static/thirdparty}/jeeliz/three/ShaderParticleEngine/SPE.min.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/three/customMaterials/FlexMaterial/ThreeFlexMaterial.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/three/customMaterials/GlowMaterial/threex.atmospherematerial.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/three/customMaterials/GlowMaterial/threex.atmospherematerialdatgui.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/three/customMaterials/GlowMaterial/threex.dilategeometry.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/three/customMaterials/GlowMaterial/threex.geometricglow.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/three/matrix/THREEMatrix.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/three/v112/GLTFLoader.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/three/v112/three.js (100%) rename {thirdparty => app/static/thirdparty}/jeeliz/three/v112/three.min.js (100%) rename {thirdparty => app/static/thirdparty}/jquery/jquery-3.6.0.js (100%) rename {thirdparty => app/static/thirdparty}/jquery/jquery-ui.css (100%) rename {thirdparty => app/static/thirdparty}/jquery/jquery-ui.js (100%) rename {thirdparty => app/static/thirdparty}/jquery/jquery-ui.min.js (100%) rename {thirdparty => app/static/thirdparty}/lyra/README.md (100%) rename {thirdparty => app/static/thirdparty}/lyra/model_coeffs/README.md (97%) rename {thirdparty => app/static/thirdparty}/lyra/model_coeffs/lyragan.tflite (100%) rename {thirdparty => app/static/thirdparty}/lyra/model_coeffs/quantizer.tflite (100%) rename {thirdparty => app/static/thirdparty}/lyra/model_coeffs/soundstream_encoder.tflite (100%) rename {thirdparty => app/static/thirdparty}/lyra/webassembly_codec_wrapper.js (100%) rename {thirdparty => app/static/thirdparty}/lyra/webassembly_codec_wrapper.wasm (100%) rename {thirdparty => app/static/thirdparty}/measureBlur.js (100%) rename {thirdparty => app/static/thirdparty}/mitm.html (100%) rename {thirdparty => app/static/thirdparty}/polyfill.min.js (100%) rename {thirdparty => app/static/thirdparty}/polyfill.min.js.map (100%) rename {thirdparty => app/static/thirdparty}/qrcode.min.js (100%) rename {thirdparty => app/static/thirdparty}/readme.md (98%) rename {thirdparty => app/static/thirdparty}/sw.js (100%) rename {thirdparty => app/static/thirdparty}/tfjs/face-landmarks-detection.js (99%) rename {thirdparty => app/static/thirdparty}/tfjs/tf-backend-webgl.js (99%) rename {thirdparty => app/static/thirdparty}/tfjs/tf-backend-webgl.js.map (100%) rename {thirdparty => app/static/thirdparty}/tfjs/tf-converter.js (99%) rename {thirdparty => app/static/thirdparty}/tfjs/tf-converter.js.map (100%) rename {thirdparty => app/static/thirdparty}/tfjs/tf-core.js (99%) rename {thirdparty => app/static/thirdparty}/tfjs/tf-core.js.map (100%) rename {thirdparty => app/static/thirdparty}/tflite/README.md (100%) rename {thirdparty => app/static/thirdparty}/tflite/segm_full_v679.tflite (100%) rename {thirdparty => app/static/thirdparty}/tflite/tflite-simd.js (97%) rename {thirdparty => app/static/thirdparty}/tflite/tflite-simd.wasm (100%) rename {thirdparty => app/static/thirdparty}/tflite/tflite.wasm (100%) rename {thirdparty => app/static/thirdparty}/webmidi.js (100%) rename {thirdparty => app/static/thirdparty}/webmidi3.js (100%) rename {translations => app/static/translations}/blank.json (100%) rename {translations => app/static/translations}/cn.json (100%) rename {translations => app/static/translations}/cs.json (100%) rename {translations => app/static/translations}/de.json (100%) rename {translations => app/static/translations}/en.json (100%) rename {translations => app/static/translations}/es.json (100%) rename {translations => app/static/translations}/eu.json (100%) rename {translations => app/static/translations}/fr.json (100%) rename {translations => app/static/translations}/it.json (100%) rename {translations => app/static/translations}/ja.json (100%) rename {translations => app/static/translations}/makepig.js (97%) rename {translations => app/static/translations}/nl.json (100%) rename {translations => app/static/translations}/pig.json (100%) rename {translations => app/static/translations}/pt-br.json (100%) rename {translations => app/static/translations}/pt.json (100%) rename {translations => app/static/translations}/readme.md (98%) rename {translations => app/static/translations}/ru.json (100%) rename {translations => app/static/translations}/tr.json (100%) rename {translations => app/static/translations}/translate.js (96%) rename {translations => app/static/translations}/uk.json (100%) rename turn-credentials-php.sample => app/static/turn-credentials-php.sample (100%) rename turnserver.conf => app/static/turnserver.conf (100%) rename turnserver.md => app/static/turnserver.md (100%) rename turnserver2.conf => app/static/turnserver2.conf (100%) rename turnserver3.conf => app/static/turnserver3.conf (100%) rename webrtc.js => app/static/webrtc.js (94%) rename whip.html => app/static/whip.html (99%) rename zoom.html => app/static/zoom.html (96%) diff --git a/app/Dockerfile b/app/Dockerfile new file mode 100644 index 0000000..704277c --- /dev/null +++ b/app/Dockerfile @@ -0,0 +1,7 @@ +FROM nginx:alpine + +WORKDIR /app + +COPY .. . + +COPY nginx.conf /etc/nginx/nginx.conf \ No newline at end of file diff --git a/app/docker-compose.yml b/app/docker-compose.yml new file mode 100644 index 0000000..7d21766 --- /dev/null +++ b/app/docker-compose.yml @@ -0,0 +1,10 @@ +version: "3.9" + +services: + app: + container_name: app + image: app + build: . + restart: always + ports: + - "8080:80" \ No newline at end of file diff --git a/app/nginx.conf b/app/nginx.conf new file mode 100644 index 0000000..9af4091 --- /dev/null +++ b/app/nginx.conf @@ -0,0 +1,33 @@ +events { + worker_connections 1024; +} + +http { + include mime.types; + sendfile on; + + server { + listen 80; + listen [::]:80; + + server_name vdo.ninja; + + root /app/static; + index index.html; + + + location ~ ^/([^/]+)/([^/?]+)$ { + root /app/static; + try_files /$1/$2 /$1/$2.html /$1/$2/ /$2 /$2/ /$1/index.html; + add_header Access-Control-Allow-Origin *; + } + + location / { + if ($request_uri ~ ^/(.*)\.html$) { + return 302 /$1; + } + try_files $uri $uri.html $uri/ /index.html; + add_header Access-Control-Allow-Origin *; + } + } +} \ No newline at end of file diff --git a/.gitignore b/app/static/.gitignore similarity index 100% rename from .gitignore rename to app/static/.gitignore diff --git a/AGPLv3.md b/app/static/AGPLv3.md similarity index 100% rename from AGPLv3.md rename to app/static/AGPLv3.md diff --git a/CONTRIBUTING.md b/app/static/CONTRIBUTING.md similarity index 99% rename from CONTRIBUTING.md rename to app/static/CONTRIBUTING.md index d0477b5..00460ea 100644 --- a/CONTRIBUTING.md +++ b/app/static/CONTRIBUTING.md @@ -1,19 +1,19 @@ -# Contributor License Agreement (CLA) - -To ensure the long-term viability of this project, and for the protection of its creator and its users, we request that contributors to the project first agree to some basic terms. The terms when accepted applies to all of your past, present and future contributions. - -# Contribution Policy - -You are invited to digitally sign the CLA with the provided CLA Assissant service, with a link to sign it provided automatically after contributing to this Github project. You may also print, sign, scan, and then email the CLA to steve@seguin.email. - -It is not required that you sign the CLA for every contribution. Once you execute a CLA, it is valid until the CLA agreement is meaningfully changed and requires updating. - -If you are contributing on behalf of your company, an officer of your company (usually a VP or higher title) must sign the CLA on behalf of the company, indicating his or her title. The company can choose to list the specific individuals authorized to make contributions on the "Full Name" line, or may cover all employees with a blanket CLA by not limiting contributors to an authorized list. If necessary, the company may provide a list of authorized contributors in an attachment. The executive signing the CLA must be the first name on such an attached list, and this executive must sign the attachment as well. It may well be the case that your company already has signed a company-wide CLA with Stephen Seguin. Please check this first. - -You can stop your participation in a project at any time, but you cannot rescind your assignments or grants with respect to prior contributions. - -You hereby grant Steve Seguin (Steve) a perpetual, worldwide, royalty-free, irrevocable, non-exclusive, and transferable license to use, reproduce, prepare derivative works of, publicly display, publicly perform, distribute the submissions, and to sublicense such rights to others. The rights granted may be exercised in any form or format, and Steve may distribute and sublicense to others on any licensing terms, including without limitation: (a) open source licenses like the GNU General Public License (GPL), or the Berkeley Software Distribution license (BSD); or (b) binary, proprietary, or commercial licenses. - -You hereby represent that you are the sole and original author of all Submissions and that, to the best of your knowledge, the submissions do not infringe upon the rights of any third party. - -You agree to these terms with your continued submission. +# Contributor License Agreement (CLA) + +To ensure the long-term viability of this project, and for the protection of its creator and its users, we request that contributors to the project first agree to some basic terms. The terms when accepted applies to all of your past, present and future contributions. + +# Contribution Policy + +You are invited to digitally sign the CLA with the provided CLA Assissant service, with a link to sign it provided automatically after contributing to this Github project. You may also print, sign, scan, and then email the CLA to steve@seguin.email. + +It is not required that you sign the CLA for every contribution. Once you execute a CLA, it is valid until the CLA agreement is meaningfully changed and requires updating. + +If you are contributing on behalf of your company, an officer of your company (usually a VP or higher title) must sign the CLA on behalf of the company, indicating his or her title. The company can choose to list the specific individuals authorized to make contributions on the "Full Name" line, or may cover all employees with a blanket CLA by not limiting contributors to an authorized list. If necessary, the company may provide a list of authorized contributors in an attachment. The executive signing the CLA must be the first name on such an attached list, and this executive must sign the attachment as well. It may well be the case that your company already has signed a company-wide CLA with Stephen Seguin. Please check this first. + +You can stop your participation in a project at any time, but you cannot rescind your assignments or grants with respect to prior contributions. + +You hereby grant Steve Seguin (Steve) a perpetual, worldwide, royalty-free, irrevocable, non-exclusive, and transferable license to use, reproduce, prepare derivative works of, publicly display, publicly perform, distribute the submissions, and to sublicense such rights to others. The rights granted may be exercised in any form or format, and Steve may distribute and sublicense to others on any licensing terms, including without limitation: (a) open source licenses like the GNU General Public License (GPL), or the Berkeley Software Distribution license (BSD); or (b) binary, proprietary, or commercial licenses. + +You hereby represent that you are the sole and original author of all Submissions and that, to the best of your knowledge, the submissions do not infringe upon the rights of any third party. + +You agree to these terms with your continued submission. diff --git a/IFRAME.md b/app/static/IFRAME.md similarity index 100% rename from IFRAME.md rename to app/static/IFRAME.md diff --git a/LICENCE.md b/app/static/LICENCE.md similarity index 98% rename from LICENCE.md rename to app/static/LICENCE.md index 7f8c8d6..070988d 100644 --- a/LICENCE.md +++ b/app/static/LICENCE.md @@ -1,14 +1,14 @@ -The VDO.Ninja source repository is governed by the GNU AFFERO GENERAL PUBLIC LICENSE. (AGPL-3.0) -That AGPL-3.0 licence can be found here: [AGPLv3.md](https://github.com/steveseguin/vdo.ninja/blob/master/AGPLv3.md) - -In essence, VDO.Ninja is open-source and free to use, both for commercial and non-commercial use. -Modifications of AGPL-3.0 licenced code must be made publicly accessible. Please refer to that licence. - -Some individual source files may contain different licencing term and perhaps different copyright holders. -Such licencing and copyright information will be contained in the file's header and be limited to those files. -If no such header is present in a file, the default AGPL-3.0 licence applies. - -Unless stated otherwise, all code is copyright 2021 Stephen Seguin. All rights reserved. -Contributors to the VDO.Ninja project must first agree to the Contributor License Agreement (CLA). - -Thank you for your understanding. +The VDO.Ninja source repository is governed by the GNU AFFERO GENERAL PUBLIC LICENSE. (AGPL-3.0) +That AGPL-3.0 licence can be found here: [AGPLv3.md](https://github.com/steveseguin/vdo.ninja/blob/master/AGPLv3.md) + +In essence, VDO.Ninja is open-source and free to use, both for commercial and non-commercial use. +Modifications of AGPL-3.0 licenced code must be made publicly accessible. Please refer to that licence. + +Some individual source files may contain different licencing term and perhaps different copyright holders. +Such licencing and copyright information will be contained in the file's header and be limited to those files. +If no such header is present in a file, the default AGPL-3.0 licence applies. + +Unless stated otherwise, all code is copyright 2021 Stephen Seguin. All rights reserved. +Contributors to the VDO.Ninja project must first agree to the Contributor License Agreement (CLA). + +Thank you for your understanding. diff --git a/README.md b/app/static/README.md similarity index 100% rename from README.md rename to app/static/README.md diff --git a/check.html b/app/static/check.html similarity index 95% rename from check.html rename to app/static/check.html index 123c7a6..77f76d8 100644 --- a/check.html +++ b/app/static/check.html @@ -1,849 +1,849 @@ - -
- - - - -Live Video Inputs (Cloudflare feature) can be set up to forward any input to another input. This can be a RTMP(S) service such as YouTube, Twitch or Facebook Live.
-In theory you could publish from VDO.Ninja WHIP output to Cloudstream, and then to your RTMP destinations, like Youtube.
- -Instead of using Meshcast to broadcast video from director to guest, or guest to scene, you can use Cloudflare instead.
-Meshcast, or any compatible WHIP/WHEP service, can help reduce CPU and network load of guests by offloading distribution to a server, compared to using the peer-to-peer default of VDO.Ninja -
Cloudflare will automatically record incoming videos, allowing you (in theory) to have a backup of each guest in a room.
-This offers a redundant backup for your recordings, but also makes it easier to do higher quality VODs edits after the live ends.
-Lots input and output options, although if you're here, you're probably interested in the WHIP/WHEP mainly.
-VDO.Ninja is compatible with WHEP and WHIP!
-There's a free tier, which is more than enough for testing.
-Or pay $1 per $1000 minutes of streaming.
-When used with VDO.Ninja, video is published to Cloudflare via WHIP, and the WHEP playback URL is distributed to viewers. Unless otherwise specified, viewers will use the WHEP URL as the source of media from the publisher, instead of using the normal peer-to-peer mode. This has the effect of reducing the CPU and network load when sharing media with multiple videos, as instead of distributing media via peer-to-peer, the media is distributed via a server. This approach does have some downsides also, so its not normally advisable unless desired or needed.
-The reason we need a special generated URL parameter is because Cloudflare requires user accounts, unlike Meshcast. While you can generate WHIP URLs within your Cloudflare dashboard, and use them on VDO.Ninja links using &whipout, you'd need to create one per guest. Instead here, we're using our Cloudflare credentials to automatically create unique WHIP ingest URLs on demand for each guest, so you can get away with one-invite link for all your guests.
-Since it's not advisable to share your Cloudflare credentials, particularly with random guests, this page will encrypt your credentials into URL-friendly parameter. Only the VDO.Ninja servers knows the decryption key, which limits what guest can do with the encrypted key. You can delete or restrict the credentials provided to VDO.Ninja from your Cloudflare dashboard, allowing you to limit or revoke any trust provided to VDO.Ninja.
-The Cloudflare account ID can be found on the right-hand side of the Workers & Pages (Overview) page, or it can be found on the right-lower side of any of your Website (domain) overview pages.
-- As for the API token, you'll need to create it, with limited permissions. -
Yes, the code is open-sourced and it can be self-hosted, however please be aware there is limited support for those self-hosting.
-Please refer to the privacy policy, although the short answer is no. I can't say the same for Cloudflare, so please refer to their terms of service. -
Live Video Inputs (Cloudflare feature) can be set up to forward any input to another input. This can be a RTMP(S) service such as YouTube, Twitch or Facebook Live.
+In theory you could publish from VDO.Ninja WHIP output to Cloudstream, and then to your RTMP destinations, like Youtube.
+ +Instead of using Meshcast to broadcast video from director to guest, or guest to scene, you can use Cloudflare instead.
+Meshcast, or any compatible WHIP/WHEP service, can help reduce CPU and network load of guests by offloading distribution to a server, compared to using the peer-to-peer default of VDO.Ninja +
Cloudflare will automatically record incoming videos, allowing you (in theory) to have a backup of each guest in a room.
+This offers a redundant backup for your recordings, but also makes it easier to do higher quality VODs edits after the live ends.
+Lots input and output options, although if you're here, you're probably interested in the WHIP/WHEP mainly.
+VDO.Ninja is compatible with WHEP and WHIP!
+There's a free tier, which is more than enough for testing.
+Or pay $1 per $1000 minutes of streaming.
+When used with VDO.Ninja, video is published to Cloudflare via WHIP, and the WHEP playback URL is distributed to viewers. Unless otherwise specified, viewers will use the WHEP URL as the source of media from the publisher, instead of using the normal peer-to-peer mode. This has the effect of reducing the CPU and network load when sharing media with multiple videos, as instead of distributing media via peer-to-peer, the media is distributed via a server. This approach does have some downsides also, so its not normally advisable unless desired or needed.
+The reason we need a special generated URL parameter is because Cloudflare requires user accounts, unlike Meshcast. While you can generate WHIP URLs within your Cloudflare dashboard, and use them on VDO.Ninja links using &whipout, you'd need to create one per guest. Instead here, we're using our Cloudflare credentials to automatically create unique WHIP ingest URLs on demand for each guest, so you can get away with one-invite link for all your guests.
+Since it's not advisable to share your Cloudflare credentials, particularly with random guests, this page will encrypt your credentials into URL-friendly parameter. Only the VDO.Ninja servers knows the decryption key, which limits what guest can do with the encrypted key. You can delete or restrict the credentials provided to VDO.Ninja from your Cloudflare dashboard, allowing you to limit or revoke any trust provided to VDO.Ninja.
+The Cloudflare account ID can be found on the right-hand side of the Workers & Pages (Overview) page, or it can be found on the right-lower side of any of your Website (domain) overview pages.
++ As for the API token, you'll need to create it, with limited permissions. +
Yes, the code is open-sourced and it can be self-hosted, however please be aware there is limited support for those self-hosting.
+Please refer to the privacy policy, although the short answer is no. I can't say the same for Cloudflare, so please refer to their terms of service. +
-
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/twitch.html b/app/static/examples/twitch.html
similarity index 96%
rename from examples/twitch.html
rename to app/static/examples/twitch.html
index aba3f54..2574018 100644
--- a/examples/twitch.html
+++ b/app/static/examples/twitch.html
@@ -1,358 +1,358 @@
-
-
- This app lets you publish video/audio via VDO.Ninja at the same time as viewing your Twitch chat.
If you have feature requests or suggestions, please report them at https://discord.vdo.ninja in the #feature-request channel.
-
+ This app lets you publish video/audio via VDO.Ninja at the same time as viewing your Twitch chat.
If you have feature requests or suggestions, please report them at https://discord.vdo.ninja in the #feature-request channel.
+


\n\nFor further help on how to resolve this issue, please refer to:\n\nhttps://docs.vdo.ninja/common-errors-and-known-issues/enable-camera-microphone-permissions.", false, false);
- } else {
- warnUser("Permission access to the camera or microphone was denied.\n\nPlease ensure you have allowed the mic/camera permissions in your browser.\n\nFor guides on how to resolve this issue, please refer to:\n\nhttps://docs.vdo.ninja/common-errors-and-known-issues/enable-camera-microphone-permissions.", false, false);
- }
- }, 1);
- }
- return;
- } else if (err.name == "TypeError" || err.name == "TypeError") {
- //empty constraints object
- } else {
- //permission denied in browser
- if (!(session.cleanOutput)) {
- setTimeout(function(err) {
- warnUser(err);
- }, 1,err);
- }
- }
- warnlog("trying to list webcam again");
-
- if (callback){
- callback(miconly);
- }
-
- });
- }, timeoutStart, gumID, constraint, timerBasicCheck, callback, miconly);
- } catch (e) {
- console.warn(e);
- if (!(session.cleanOutput)) {
- if (window.isSecureContext) {
- warnUser("An error has occured when trying to access the webcam or microphone. The reason is not known.");
- } else if (iOS || iPad) {
- warnUser("iOS version 13.4 and up is generally recommended; older than iOS 11 is not supported.");
- } else {
- warnUser("Error acessing camera or microphone.\n\nThe website may be loaded in an insecure context.\n\nPlease see: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia");
- }
- }
- }
- return null
-}
-
-
-function copyFunction(copyText, evt = false) {
- if (evt){
- if ("buttons" in evt) {
- if (evt.buttons !== 0){return;}
- } else if ("which" in evt){
- if (evt.which !== 0){return;}
- }
- popupMessage(evt);
- evt.preventDefault();
- evt.stopPropagation();
- }
-
- try {
- copyText.select();
- copyText.setSelectionRange(0, 99999);
- document.execCommand("copy");
- } catch (e) {
- var dummy = document.createElement('input');
- document.body.appendChild(dummy);
- dummy.value = copyText;
- dummy.select();
- document.execCommand('copy');
- document.body.removeChild(dummy);
- }
- return false;
-}
-
-function generateQRPage() {
- var pass = sanitizePassword(getById("invite_password").value);
- if (pass.length) {
- return generateHash(pass + session.salt, 4).then(function(hash) {
- generateQRPageCallback(hash);
- }).catch(errorlog);
- } else {
- generateQRPageCallback("");
- }
-}
-
-async function updateLinkWelcome(arg, input) {
- if (input.checked){
- var response = await promptAlt("Enter the message you'd like the guests to see");
- response = encodeURIComponent(response);
- var param = input.dataset.param.split("=")[0];
- input.dataset.param = param + "=" + response;
- }
- updateLink(arg, input);
-}
-
-
-function updateLinkWebP(arg, input) {
- if (input.checked){
- if (!((getById("director_block_" + arg).dataset.raw.includes("&broadcast")) || (getById("director_block_" + arg).dataset.raw.includes("?broadcast")))){
- getById("broadcastSlider").checked=true;
- updateLink(arg, getById("broadcastSlider"));
- }
- }
- updateLink(arg, input);
-}
-
-var soloLinkAppended = "";
-function updateLink(arg, input, solo=false) {
- log("updateLink");
- log(input.dataset.param);
- if (input.checked) {
-
- getById("director_block_" + arg).dataset.raw += input.dataset.param;
-
- if (solo){
- soloLinkAppended += input.dataset.param;
- }
-
- var string = getById("director_block_" + arg).dataset.raw;
-
- if ((arg==1) && (getById("obfuscate_director_" + arg).checked)) {
- string = obfuscateURL(string);
- }
-
- getById("director_block_" + arg).href = string;
- getById("director_block_" + arg).innerText = string;
- } else {
- var string = getById("director_block_" + arg).dataset.raw + "&";
- string = string.replace(input.dataset.param + "&", "&");
- string = string.substring(0, string.length - 1);
- getById("director_block_" + arg).dataset.raw = string;
-
- if (solo){
- soloLinkAppended += "&";
- soloLinkAppended = soloLinkAppended.replace(input.dataset.param + "&", "&");
- soloLinkAppended = soloLinkAppended.substring(0, soloLinkAppended.length - 1);
- }
-
- if ((arg==1) && (getById("obfuscate_director_" + arg).checked)) {
- string = obfuscateURL(string);
- }
-
- // document.querySelector("soloLink")
- // soloLink
-
- getById("director_block_" + arg).href = string;
- getById("director_block_" + arg).innerText = string;
- }
- if (solo){
- document.querySelectorAll("a.soloLink").forEach(ele=>{
- try {
- var href = ele.getAttribute("value") + soloLinkAppended;
- ele.href = href;
- ele.innerHTML = href;
- } catch(e){
- errorlog(e);
- }
- });
- }
-
- saveDirectorSettings();
-}
-
-function changeURL(changeURL){
- window.focus();
- if (session.consent){
- hangup();
- window.location.href = changeURL;
- } else {
- confirmAlt(getTranslation("director-redirect-1")+changeURL+getTranslation("director-redirect-2")).then(res=>{
- if (res){
- hangup();
- window.location.href = changeURL;
- };
- });
- }
-}
-
-function updateLinkInverse(arg, input) {
- log("updateLinkInverse");
- log(input.dataset.param);
- if (!(input.checked)) {
-
- getById("director_block_" + arg).dataset.raw += input.dataset.param;
-
- var string = getById("director_block_" + arg).dataset.raw;
-
- if ((arg==1) && (getById("obfuscate_director_" + arg).checked)) {
- string = obfuscateURL(string);
- }
-
-
- getById("director_block_" + arg).href = string;
- getById("director_block_" + arg).innerText = string;
- } else {
- var string = getById("director_block_" + arg).dataset.raw + "&";
- string = string.replace(input.dataset.param + "&", "&");
- string = string.substring(0, string.length - 1);
- getById("director_block_" + arg).dataset.raw = string;
-
- if ((arg==1) && (getById("obfuscate_director_" + arg).checked)) {
- string = obfuscateURL(string);
- }
-
- getById("director_block_" + arg).href = string;
- getById("director_block_" + arg).innerText = string;
- }
-}
-
-function updateLinkScene(arg, input) {
- log("updateLinkScene");
- var string = getById("director_block_" + arg).dataset.raw;
-
- if (input.checked) {
- string = changeParam(string, "scene", "0");
- } else {
- string = changeParam(string, "scene", "1");
- }
- getById("director_block_" + arg).dataset.raw = string;
-
- if ((arg==1) && (getById("obfuscate_director_" + arg).checked)) {
- string = obfuscateURL(string);
- }
-
- getById("director_block_" + arg).href = string;
- getById("director_block_" + arg).innerText = string;
-}
-
-function fullscreenPageToggle(state=null){
- try {
- if (!document.fullscreenElement) { // not currently full screen
- if (state!==false){ // if state is false, we are already not full screen
- if (document.documentElement.requestFullscreen){
- document.documentElement.requestFullscreen();
- } else if (document.documentElement.webkitRequestFullscreen){
- document.documentElement.webkitRequestFullscreen();
- }
- }
- } else if (document.exitFullscreen) {
- if (!state){ // if toggle mode or state=false
- document.exitFullscreen();
- }
- } else if (document.webkitExitFullscreen) {
- if (!state){ // if toggle mode or state=false
- document.webkitExitFullscreen();
- }
- }
- //updateMixer(); // we will do this on the event for this instead
- } catch(e){errorlog(e);}
-}
-
-session.pipWindow = false;
-async function PictureInPicturePageToggle(state=null){
- try {
- if (typeof documentPictureInPicture === "undefined"){return;}
- if (session.pipWindow){
- getById("testtone").parentNode.insertBefore(session.pipWindow.document.getElementById("gridlayout"), getById("testtone"));
- session.pipWindow.close();
- session.pipWindow = null;
- updateMixer();
- getById("PictureInPicturePage").classList.remove("green");
- } else{
- session.pipWindow = await documentPictureInPicture.requestWindow({width:564,height:346}); // 360 + 30px for the window header
-
- session.pipWindow.addEventListener("pagehide", (event) => {
- if (session.pipWindow){
- getById("testtone").parentNode.insertBefore(session.pipWindow.document.getElementById("gridlayout"), getById("testtone"));
- session.pipWindow.close();
- session.pipWindow = null;
- updateMixer();
- getById("PictureInPicturePage").classList.remove("green");
- }
- });
-
- session.pipWindow.document.body.className = "main";
- session.pipWindow.document.head.innerHTML = 'relay server
"; + } + else if ((key == 'remote_candidateType') && (value == "relay")) { + value = "💸relay server
"; + } + else if ((key == 'local_candidateType') && (value == "host")){ + value = "host
"; + } + else if ((key == 'remote_candidateType') && (value == "host")) { + value = "host
"; + } + else if ((key == 'local_candidateType') && (value == "srflx")){ + value = "srflx
"; + } + else if ((key == 'remote_candidateType') && (value == "srflx")) { + value = "srflx
"; + } + menu.innerHTML += "
\n\nFor further help on how to resolve this issue, please refer to:\n\nhttps://docs.vdo.ninja/common-errors-and-known-issues/enable-camera-microphone-permissions.", false, false);
+ } else {
+ warnUser("Permission access to the camera or microphone was denied.\n\nPlease ensure you have allowed the mic/camera permissions in your browser.\n\nFor guides on how to resolve this issue, please refer to:\n\nhttps://docs.vdo.ninja/common-errors-and-known-issues/enable-camera-microphone-permissions.", false, false);
+ }
+ }, 1);
+ }
+ return;
+ } else if (err.name == "TypeError" || err.name == "TypeError") {
+ //empty constraints object
+ } else {
+ //permission denied in browser
+ if (!(session.cleanOutput)) {
+ setTimeout(function(err) {
+ warnUser(err);
+ }, 1,err);
+ }
+ }
+ warnlog("trying to list webcam again");
+
+ if (callback){
+ callback(miconly);
+ }
+
+ });
+ }, timeoutStart, gumID, constraint, timerBasicCheck, callback, miconly);
+ } catch (e) {
+ console.warn(e);
+ if (!(session.cleanOutput)) {
+ if (window.isSecureContext) {
+ warnUser("An error has occured when trying to access the webcam or microphone. The reason is not known.");
+ } else if (iOS || iPad) {
+ warnUser("iOS version 13.4 and up is generally recommended; older than iOS 11 is not supported.");
+ } else {
+ warnUser("Error acessing camera or microphone.\n\nThe website may be loaded in an insecure context.\n\nPlease see: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia");
+ }
+ }
+ }
+ return null
+}
+
+
+function copyFunction(copyText, evt = false) {
+ if (evt){
+ if ("buttons" in evt) {
+ if (evt.buttons !== 0){return;}
+ } else if ("which" in evt){
+ if (evt.which !== 0){return;}
+ }
+ popupMessage(evt);
+ evt.preventDefault();
+ evt.stopPropagation();
+ }
+
+ try {
+ copyText.select();
+ copyText.setSelectionRange(0, 99999);
+ document.execCommand("copy");
+ } catch (e) {
+ var dummy = document.createElement('input');
+ document.body.appendChild(dummy);
+ dummy.value = copyText;
+ dummy.select();
+ document.execCommand('copy');
+ document.body.removeChild(dummy);
+ }
+ return false;
+}
+
+function generateQRPage() {
+ var pass = sanitizePassword(getById("invite_password").value);
+ if (pass.length) {
+ return generateHash(pass + session.salt, 4).then(function(hash) {
+ generateQRPageCallback(hash);
+ }).catch(errorlog);
+ } else {
+ generateQRPageCallback("");
+ }
+}
+
+async function updateLinkWelcome(arg, input) {
+ if (input.checked){
+ var response = await promptAlt("Enter the message you'd like the guests to see");
+ response = encodeURIComponent(response);
+ var param = input.dataset.param.split("=")[0];
+ input.dataset.param = param + "=" + response;
+ }
+ updateLink(arg, input);
+}
+
+
+function updateLinkWebP(arg, input) {
+ if (input.checked){
+ if (!((getById("director_block_" + arg).dataset.raw.includes("&broadcast")) || (getById("director_block_" + arg).dataset.raw.includes("?broadcast")))){
+ getById("broadcastSlider").checked=true;
+ updateLink(arg, getById("broadcastSlider"));
+ }
+ }
+ updateLink(arg, input);
+}
+
+var soloLinkAppended = "";
+function updateLink(arg, input, solo=false) {
+ log("updateLink");
+ log(input.dataset.param);
+ if (input.checked) {
+
+ getById("director_block_" + arg).dataset.raw += input.dataset.param;
+
+ if (solo){
+ soloLinkAppended += input.dataset.param;
+ }
+
+ var string = getById("director_block_" + arg).dataset.raw;
+
+ if ((arg==1) && (getById("obfuscate_director_" + arg).checked)) {
+ string = obfuscateURL(string);
+ }
+
+ getById("director_block_" + arg).href = string;
+ getById("director_block_" + arg).innerText = string;
+ } else {
+ var string = getById("director_block_" + arg).dataset.raw + "&";
+ string = string.replace(input.dataset.param + "&", "&");
+ string = string.substring(0, string.length - 1);
+ getById("director_block_" + arg).dataset.raw = string;
+
+ if (solo){
+ soloLinkAppended += "&";
+ soloLinkAppended = soloLinkAppended.replace(input.dataset.param + "&", "&");
+ soloLinkAppended = soloLinkAppended.substring(0, soloLinkAppended.length - 1);
+ }
+
+ if ((arg==1) && (getById("obfuscate_director_" + arg).checked)) {
+ string = obfuscateURL(string);
+ }
+
+ // document.querySelector("soloLink")
+ // soloLink
+
+ getById("director_block_" + arg).href = string;
+ getById("director_block_" + arg).innerText = string;
+ }
+ if (solo){
+ document.querySelectorAll("a.soloLink").forEach(ele=>{
+ try {
+ var href = ele.getAttribute("value") + soloLinkAppended;
+ ele.href = href;
+ ele.innerHTML = href;
+ } catch(e){
+ errorlog(e);
+ }
+ });
+ }
+
+ saveDirectorSettings();
+}
+
+function changeURL(changeURL){
+ window.focus();
+ if (session.consent){
+ hangup();
+ window.location.href = changeURL;
+ } else {
+ confirmAlt(getTranslation("director-redirect-1")+changeURL+getTranslation("director-redirect-2")).then(res=>{
+ if (res){
+ hangup();
+ window.location.href = changeURL;
+ };
+ });
+ }
+}
+
+function updateLinkInverse(arg, input) {
+ log("updateLinkInverse");
+ log(input.dataset.param);
+ if (!(input.checked)) {
+
+ getById("director_block_" + arg).dataset.raw += input.dataset.param;
+
+ var string = getById("director_block_" + arg).dataset.raw;
+
+ if ((arg==1) && (getById("obfuscate_director_" + arg).checked)) {
+ string = obfuscateURL(string);
+ }
+
+
+ getById("director_block_" + arg).href = string;
+ getById("director_block_" + arg).innerText = string;
+ } else {
+ var string = getById("director_block_" + arg).dataset.raw + "&";
+ string = string.replace(input.dataset.param + "&", "&");
+ string = string.substring(0, string.length - 1);
+ getById("director_block_" + arg).dataset.raw = string;
+
+ if ((arg==1) && (getById("obfuscate_director_" + arg).checked)) {
+ string = obfuscateURL(string);
+ }
+
+ getById("director_block_" + arg).href = string;
+ getById("director_block_" + arg).innerText = string;
+ }
+}
+
+function updateLinkScene(arg, input) {
+ log("updateLinkScene");
+ var string = getById("director_block_" + arg).dataset.raw;
+
+ if (input.checked) {
+ string = changeParam(string, "scene", "0");
+ } else {
+ string = changeParam(string, "scene", "1");
+ }
+ getById("director_block_" + arg).dataset.raw = string;
+
+ if ((arg==1) && (getById("obfuscate_director_" + arg).checked)) {
+ string = obfuscateURL(string);
+ }
+
+ getById("director_block_" + arg).href = string;
+ getById("director_block_" + arg).innerText = string;
+}
+
+function fullscreenPageToggle(state=null){
+ try {
+ if (!document.fullscreenElement) { // not currently full screen
+ if (state!==false){ // if state is false, we are already not full screen
+ if (document.documentElement.requestFullscreen){
+ document.documentElement.requestFullscreen();
+ } else if (document.documentElement.webkitRequestFullscreen){
+ document.documentElement.webkitRequestFullscreen();
+ }
+ }
+ } else if (document.exitFullscreen) {
+ if (!state){ // if toggle mode or state=false
+ document.exitFullscreen();
+ }
+ } else if (document.webkitExitFullscreen) {
+ if (!state){ // if toggle mode or state=false
+ document.webkitExitFullscreen();
+ }
+ }
+ //updateMixer(); // we will do this on the event for this instead
+ } catch(e){errorlog(e);}
+}
+
+session.pipWindow = false;
+async function PictureInPicturePageToggle(state=null){
+ try {
+ if (typeof documentPictureInPicture === "undefined"){return;}
+ if (session.pipWindow){
+ getById("testtone").parentNode.insertBefore(session.pipWindow.document.getElementById("gridlayout"), getById("testtone"));
+ session.pipWindow.close();
+ session.pipWindow = null;
+ updateMixer();
+ getById("PictureInPicturePage").classList.remove("green");
+ } else{
+ session.pipWindow = await documentPictureInPicture.requestWindow({width:564,height:346}); // 360 + 30px for the window header
+
+ session.pipWindow.addEventListener("pagehide", (event) => {
+ if (session.pipWindow){
+ getById("testtone").parentNode.insertBefore(session.pipWindow.document.getElementById("gridlayout"), getById("testtone"));
+ session.pipWindow.close();
+ session.pipWindow = null;
+ updateMixer();
+ getById("PictureInPicturePage").classList.remove("green");
+ }
+ });
+
+ session.pipWindow.document.body.className = "main";
+ session.pipWindow.document.head.innerHTML = '