| <html> | 
| <head> | 
| <title>WebRTC Streamer</title> | 
| <link rel="icon" type="image/png" href="webrtc.png" /> | 
| <link rel="stylesheet" type="text/css" href="styles.css"> | 
| <script src="libs/adapter.min.js" ></script> | 
| <script src="webrtcconfig.js" ></script> | 
| <script src="webrtcstreamer.js" ></script> | 
| <script> | 
|     // ------------------------------------------ | 
|     // WebRTC connections | 
|     // ------------------------------------------     | 
|     var webRtcServerList = {}; | 
|   | 
|     // ------------------------------------------ | 
|     // decode URL arguments | 
|     // ------------------------------------------     | 
|     var argurl = { video:location.search.slice(1) }; | 
|     var argoptions = null; | 
|     var layout = null; | 
|     if (typeof URLSearchParams != 'undefined') { | 
|         var params = new URLSearchParams(location.search); | 
|         argurl = { video:params.get("video"), audio:params.get("audio") }; | 
|         argoptions = params.get("options"); | 
|         if (!argoptions) { | 
|             argoptions = webrtcConfig.options;  | 
|         } | 
|         layout = params.get("layout"); | 
|     } else { | 
|         console.log("URLSearchParams not supported then no argument could be used"); | 
|     } | 
|          | 
|     // ------------------------------------------ | 
|     // get text from url object (video,audio) | 
|     // ------------------------------------------     | 
|     function getText(url) { | 
|         var text; | 
|         if (url.video) { | 
|             text = url.video + " "; | 
|         } | 
|         if (url.audio && (url.audio != url.video)) { | 
|             text += url.audio + " "; | 
|         } | 
|         return text; | 
|     } | 
|      | 
|     // ------------------------------------------ | 
|     // get the div where to insert a video | 
|     // ------------------------------------------     | 
|     function getContentDiv() { | 
|         var contentDiv = null; | 
|         if (document.getElementById("layout")) { | 
|             var divList = document.getElementsByTagName("div"); | 
|             for (var i=0; i<divList.length; i++) { | 
|                 if (divList[i].childNodes.length == 0) { | 
|                     contentDiv = divList[i]; | 
|                     break; | 
|                 } | 
|             } | 
|         } else { | 
|             contentDiv = document.getElementById("content"); | 
|         } | 
|         return contentDiv; | 
|     } | 
|      | 
|     // ------------------------------------------ | 
|     // init device list  | 
|     // ------------------------------------------     | 
|     function onGetDeviceList(remoteDeviceList) { | 
|         var deviceList = []; | 
|                 if (argurl.video || argurl.audio) { | 
|             deviceList.push( argurl ); | 
|         } | 
|         if (remoteDeviceList) { | 
|             deviceList.push.apply( deviceList, remoteDeviceList ); | 
|         } | 
|   | 
|         // create navigation menu | 
|         var urllist = document.getElementById("menu"); | 
|         for (var dev in deviceList) { | 
|             var url = deviceList[dev]; | 
|             var option = document.createElement("a"); | 
|             var videoTag = "video_" + JSON.stringify(url); | 
|             option.url = url; | 
|             option.text = getText(url); | 
|             option.id   = "nav_" + videoTag; | 
|             option.onclick = function () {  | 
|                 if (this.className === "active") { | 
|                     del(this.url);  | 
|                 } else { | 
|                     add(this.url);  | 
|                 } | 
|             } | 
|             urllist.appendChild(option); | 
|         } | 
|          | 
|                 if (argurl.video || argurl.audio) { | 
|             add(argurl); | 
|                 } else { | 
|         var nbVideos = 1; | 
|         if (layout) { | 
|             var splitLayout = layout.split("x"); | 
|             var nbrow = parseInt(splitLayout[0]); | 
|             var nbcol = parseInt(splitLayout[1]); | 
|             nbVideos = nbrow*nbcol; | 
|         } | 
|         var random = deviceList.sort(() => .5 - Math.random()).slice(0,nbVideos); | 
|         random.forEach((stream) => { | 
|             add(stream); | 
|         }); | 
|                 } | 
|     } | 
|      | 
|     // ------------------------------------------ | 
|     // Fill version | 
|     // ------------------------------------------     | 
|     function onVersion(version) { | 
|         document.getElementById("footer").innerHTML = "<p><a href='https://github.com/mpromonet/webrtc-streamer'>WebRTC-Streamer</a>" | 
|                             + " " + version.split(" ")[0] + "</p>"; | 
|     } | 
|          | 
|     // ------------------------------------------ | 
|     // add a webrtc client connection | 
|     // ------------------------------------------     | 
|     function del(url) { | 
|         var videoTag = "video_" + JSON.stringify(url); | 
|          | 
|         // disconnect webrtc connection | 
|         var webrtcServer = webRtcServerList[videoTag]; | 
|         if (webrtcServer) { | 
|             webrtcServer.disconnect();         | 
|             webRtcServerList[videoTag] = undefined; | 
|         } | 
|          | 
|         // remove the video element and its tile | 
|         var divElt =     document.getElementById ("div_" + videoTag); | 
|         divElt.parentElement.removeChild(divElt); | 
|                  | 
|         // unhighlight the navigation | 
|         var navElt =     document.getElementById ("nav_" + videoTag); | 
|         navElt.className = "";         | 
|     } | 
|          | 
|     // ------------------------------------------ | 
|     // add a webrtc client connection | 
|     // ------------------------------------------     | 
|     function add(url) { | 
|         var videoTag = "video_" + JSON.stringify(url); | 
|          | 
|         // add a video element to display webrtc stream | 
|         if (document.getElementById (videoTag) === null) { | 
|             var contentDiv = getContentDiv(); | 
|             if (contentDiv) { | 
|                 let webstreamurl = webrtcConfig.url + "/webrtcstreamer.html?"; | 
|                 if (url.video) { | 
|                     webstreamurl += "video=" + encodeURIComponent(url.video) + "&"; | 
|                 } | 
|                 if (url.audio) { | 
|                     webstreamurl += "audio=" + encodeURIComponent(url.audio) + "&"; | 
|                 } | 
|                 if (argoptions) { | 
|                     webstreamurl += "options=" + encodeURIComponent(argoptions) + "&"; | 
|                 }                 | 
|                 var divelt = document.createElement("div"); | 
|                 divelt.id = "div_" + videoTag | 
|                 var nameelt = document.createElement("h2"); | 
|                 nameelt.id = "title_" + videoTag | 
|                 nameelt.innerHTML = "<a href='" + webstreamurl +"' >"+getText(url)+"</a>"; | 
|                 divelt.appendChild(nameelt); | 
|                 var videoelt = document.createElement("video"); | 
|                 videoelt.id = videoTag; | 
|                 videoelt.title = getText(url); | 
|                 videoelt.muted = true; | 
|                 videoelt.controls = true; | 
|                 videoelt.playsinline = true; | 
|                 if (layout) { | 
|                     var splitLayout = layout.split("x"); | 
|                     var nbrow = parseInt(splitLayout[0]); | 
|                     var nbcol = parseInt(splitLayout[1]); | 
|                     videoelt.width =  window.innerWidth / (nbcol+1) | 
|                     videoelt.height =  window.innerHeight / (nbrow+1)  | 
|                 } | 
|                 divelt.appendChild(videoelt); | 
|                 contentDiv.appendChild(divelt); | 
|             }             | 
|         } | 
|          | 
|         var videoelt =     document.getElementById (videoTag);         | 
|         if (videoelt) {         | 
|             // connect video element to webrtc stream | 
|             var webRtcServer = new WebRtcStreamer(videoTag, webrtcConfig.url); | 
|   | 
|             var options = argoptions; | 
|             if (layout) { | 
|                 options += webrtcConfig.layoutextraoptions; | 
|             } | 
|   | 
|             webRtcServer.connect(url.video, url.audio, options); | 
|                  | 
|             // highlight the navigation  | 
|             var navElt =     document.getElementById ("nav_" + videoTag); | 
|             navElt.className = "active"; | 
|   | 
|             // register webrtc streamer connection | 
|             webRtcServerList[videoTag] = webRtcServer;         | 
|         } | 
|     } | 
|      | 
|     // ------------------------------------------ | 
|     // load/unload callbacks | 
|     // ------------------------------------------     | 
|     window.onload         = function() {  | 
|         if (layout) { | 
|             var splitLayout = layout.split("x"); | 
|             var nbrow = parseInt(splitLayout[0]); | 
|             var nbcol = parseInt(splitLayout[1]); | 
|             const layoutElement = document.createElement("div") | 
|             layoutElement.id = "layout" | 
|             layoutElement.style.display= "grid" | 
|             layoutElement.style.gridTemplateColumns= `repeat(${nbcol}, 1fr)` | 
|             for (var irow=0; irow<nbrow; irow++) { | 
|                 for (var icol=0; icol<nbcol; icol++) { | 
|                     const divElement = document.createElement("div") | 
|                     divElement.id = "cell_" + irow + "_" + icol | 
|                     divElement.style.width = "1fr" | 
|                     divElement.style.height = "1fr" | 
|                     layoutElement.appendChild(divElement); | 
|                 } | 
|             }             | 
|             let content = document.getElementById("content") | 
|             content.appendChild(layoutElement)             | 
|         } | 
|          | 
|         fetch(webrtcConfig.url + "/api/getMediaList") | 
|             .then( (response) => response.json() )  | 
|             .then( (response) => onGetDeviceList( response )) | 
|          | 
|         fetch(webrtcConfig.url + "/api/version") | 
|             .then( (response) => response.text() )  | 
|             .then( (response) => onVersion( response )) | 
|   | 
|     }  | 
|     window.onbeforeunload = function() {  | 
|         for (var url in webRtcServerList) {  | 
|             webRtcServerList[url].disconnect()  | 
|         }  | 
|     };     | 
| </script> | 
| </head> | 
| <body> | 
|     <nav id="menu"></nav> | 
|     <div id="content"></div> | 
|     <footer id="footer"></footer> | 
| </body> | 
| </html> |