From 51a213c7da2b3166f2737e9a9744f8fc49bcefef Mon Sep 17 00:00:00 2001 From: Sergey Krashevich Date: Tue, 3 Feb 2026 13:32:18 +0300 Subject: [PATCH] webui: links.html rewrite --- www/links.html | 824 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 597 insertions(+), 227 deletions(-) diff --git a/www/links.html b/www/links.html index 13e08edf..9c0c0599 100644 --- a/www/links.html +++ b/www/links.html @@ -3,18 +3,299 @@ - links - go2rtc + Links - go2rtc + @@ -23,246 +304,335 @@
- - + }); - - + new QRCode('homekit-qrcode', {text: setupURI, width: 128, height: 128}); + }; + document.head.appendChild(script); + }); -
-

Play audio

- - - -
- - - / cameras with two way audio support -
- + // Play audio + document.getElementById('play-send').addEventListener('click', ev => { + ev.preventDefault(); + const action = document.querySelector('input[name="play"]:checked').value; + const url = new URL('api/ffmpeg', location.href); + url.searchParams.set('dst', src); + url.searchParams.set(action, document.getElementById('play-url').value); + fetch(url, {method: 'POST'}); + }); -
-

Publish stream

-
YouTube:  rtmps://xxx.rtmp.youtube.com/live2/xxxx-xxxx-xxxx-xxxx-xxxx
-Telegram: rtmps://xxx-x.rtmp.t.me/s/xxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxx
- - - / Telegram RTMPS server -
- + // Publish stream + document.getElementById('pub-send').addEventListener('click', ev => { + ev.preventDefault(); + const url = new URL('api/streams', location.href); + url.searchParams.set('src', src); + url.searchParams.set('dst', document.getElementById('pub-url').value); + fetch(url, {method: 'POST'}); + }); -
-

WebRTC Magic

- - - - + // WebRTC functions + function webrtcLinksUpdate() { + const media = document.querySelector('input[name="webrtc"]:checked').value; + const direction = media.indexOf('video') >= 0 || media === 'audio' ? 'src' : 'dst'; + document.getElementById('local').href = `webrtc.html?${direction}=${src}&media=${media}`; -
-
  • webrtc.html local WebRTC viewer
  • + const share = document.getElementById('shareget'); + share.href = `https://go2rtc.org/webtorrent/#${share.dataset.auth}&media=${media}`; + } -
  • - share link - copy link - delete - external WebRTC viewer -
  • -
    - -
    + } + + function onsharedel() { + document.getElementById('shareadd').style.display = ''; + document.getElementById('shareget').style.display = 'none'; + document.getElementById('sharedel').style.display = 'none'; + } + + function copyTextToClipboard(text) { + if (navigator.clipboard && window.isSecureContext) { + navigator.clipboard.writeText(text).catch(err => { + console.error(err.name, err.message); + }); + } else { + const textarea = document.createElement('textarea'); + textarea.value = text; + textarea.style.opacity = '0'; + document.body.appendChild(textarea); + textarea.focus(); + textarea.select(); + try { + document.execCommand('copy'); + } catch (err) { + console.error(err.name, err.message); + } + document.body.removeChild(textarea); + } + } + + document.getElementById('shareadd').addEventListener('click', ev => { + ev.preventDefault(); + share('POST').then(r => r.json()).then(r => onshareadd(r)); + }); + + document.getElementById('shareget').addEventListener('click', ev => { + ev.preventDefault(); + copyTextToClipboard(ev.target.href); + }); + + document.getElementById('sharedel').addEventListener('click', ev => { + ev.preventDefault(); + share('DELETE').then(() => onsharedel()); + }); + + document.getElementById('webrtc').addEventListener('click', ev => { + if (ev.target.tagName === 'INPUT') webrtcLinksUpdate(); + }); + + share('GET').then(r => { + if (r.ok) r.json().then(r => onshareadd(r)); + else onsharedel(); + }); + + webrtcLinksUpdate(); +