LSP + Embed: support for new HLS 7 CMAF output

This commit is contained in:
Cat 2019-03-28 13:12:18 +01:00
parent 5ee53f9cca
commit 2fa6565f7b
6 changed files with 50 additions and 39 deletions

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
mistplayers.videojs={name:"VideoJS player",mimes:["html5/application/vnd.apple.mpegurl"],priority:MistUtil.object.keys(mistplayers).length+1,isMimeSupported:function(e){return this.mimes.indexOf(e)==-1?false:true},isBrowserSupported:function(e,t,i){if(location.protocol!=MistUtil.http.url.split(t.url).protocol){i.log("HTTP/HTTPS mismatch for this source");return false}if(location.protocol=="file:"&&e=="html5/application/vnd.apple"){i.log("This source ("+e+") won't load if the page is run via file://");return false}return"MediaSource"in window},player:function(){},scriptsrc:function(e){return e+"/videojs.js"}};var p=mistplayers.videojs.player;p.prototype=new MistPlayer;p.prototype.build=function(e,t){var i=this;function r(){if(e.destroyed){return}e.log("Building VideoJS player..");var r=document.createElement("video");if(e.source.type!="html5/video/ogg"){r.crossOrigin="anonymous"}var o=e.source.type.split("/");o.shift();var s=document.createElement("source");s.setAttribute("src",e.source.url);i.source=s;r.appendChild(s);s.type=o.join("/");e.log("Adding "+s.type+" source @ "+e.source.url);if(s.type=="application/vnd.apple.mpegurl"){s.type="application/x-mpegURL"}MistUtil.class.add(r,"video-js");var n={};if(e.options.autoplay){n.autoplay=true}if(e.options.loop&&e.info.type!="live"){n.loop=true;r.loop=true}if(e.options.muted){n.muted=true;r.muted=true}if(e.options.poster){n.poster=e.options.poster}if(e.options.controls=="stock"){r.setAttribute("controls","");if(!document.getElementById("videojs-css")){var a=document.createElement("link");a.rel="stylesheet";a.href=e.options.host+"/skins/videojs.css";a.id="videojs-css";document.head.appendChild(a)}}i.onready(function(){i.videojs=videojs(r,n,function(){e.log("Videojs initialized")});i.api.unload=function(){if(i.videojs){videojs(r).dispose();i.videojs=false}};MistUtil.event.addListener(e.options.target,"error",function(e){if(e.message=="Stream is offline"){i.api.unload()}})});e.log("Built html");if("Proxy"in window&&"Reflect"in window){var l={get:{},set:{}};e.player.api=new Proxy(r,{get:function(e,t,i){if(t in l.get){return l.get[t].apply(e,arguments)}var r=e[t];if(typeof r==="function"){return function(){return r.apply(e,arguments)}}return r},set:function(e,t,i){if(t in l.set){return l.set[t].call(e,i)}return e[t]=i}});if(e.info.type=="live"){function p(e){var t=0;if(e.buffered.length){t=e.buffered.end(e.buffered.length-1)}return t}var u=90;l.get.duration=function(){if(e.info){return(e.info.lastms+(new Date).getTime()-e.info.updated.getTime())*.001}return false};e.player.api.lastProgress=new Date;e.player.api.liveOffset=0;MistUtil.event.addListener(r,"progress",function(){e.player.api.lastProgress=new Date});l.set.currentTime=function(t){var i=e.player.api.currentTime-t;var r=t-e.player.api.duration;e.log("Seeking to "+MistUtil.format.time(t)+" ("+Math.round(r*-10)/10+"s from live)");e.video.currentTime-=i};l.get.currentTime=function(){return this.currentTime+e.info.lastms*.001-e.player.api.liveOffset-u}}}else{i.api=r}e.player.setSize=function(t){if("videojs"in e.player){e.player.videojs.dimensions(t.width,t.height);r.parentNode.style.width=t.width+"px";r.parentNode.style.height=t.height+"px"}this.api.style.width=t.width+"px";this.api.style.height=t.height+"px"};e.player.api.setSource=function(t){if(!e.player.videojs){return}if(e.player.videojs.src()!=t){e.player.videojs.src({type:e.player.videojs.currentSource().type,src:t})}};e.player.api.setSubtitle=function(e){var t=r.getElementsByTagName("track");for(var i=t.length-1;i>=0;i--){r.removeChild(t[i])}if(e){var o=document.createElement("track");r.appendChild(o);o.kind="subtitles";o.label=e.label;o.srclang=e.lang;o.src=e.src;o.setAttribute("default","")}};t(r)}if("videojs"in window){r()}else{var o=MistUtil.scripts.insert(e.urlappend(mistplayers.videojs.scriptsrc(e.options.host)),{onerror:function(t){var i="Failed to load videojs.js";if(t.message){i+=": "+t.message}e.showError(i)},onload:r},e)}}; mistplayers.videojs={name:"VideoJS player",mimes:["html5/application/vnd.apple.mpegurl","html5/application/vnd.apple.mpegurl;version=7"],priority:MistUtil.object.keys(mistplayers).length+1,isMimeSupported:function(e){return this.mimes.indexOf(e)==-1?false:true},isBrowserSupported:function(e,t,i){if(location.protocol!=MistUtil.http.url.split(t.url).protocol){i.log("HTTP/HTTPS mismatch for this source");return false}if(location.protocol=="file:"&&e=="html5/application/vnd.apple"){i.log("This source ("+e+") won't load if the page is run via file://");return false}return"MediaSource"in window},player:function(){},scriptsrc:function(e){return e+"/videojs.js"}};var p=mistplayers.videojs.player;p.prototype=new MistPlayer;p.prototype.build=function(e,t){var i=this;function r(){if(e.destroyed){return}e.log("Building VideoJS player..");var r=document.createElement("video");if(e.source.type!="html5/video/ogg"){r.crossOrigin="anonymous"}var o=e.source.type.split("/");if(o[0]=="html5"){o.shift()}var n=document.createElement("source");n.setAttribute("src",e.source.url);i.source=n;r.appendChild(n);n.type=o.join("/");e.log("Adding "+n.type+" source @ "+e.source.url);if(n.type.indexOf("application/vnd.apple.mpegurl")>=0){n.type="application/x-mpegURL"}MistUtil.class.add(r,"video-js");var s={};if(e.options.autoplay){s.autoplay=true}if(e.options.loop&&e.info.type!="live"){s.loop=true;r.loop=true}if(e.options.muted){s.muted=true;r.muted=true}if(e.options.poster){s.poster=e.options.poster}if(e.options.controls=="stock"){r.setAttribute("controls","");if(!document.getElementById("videojs-css")){var l=document.createElement("link");l.rel="stylesheet";l.href=e.options.host+"/skins/videojs.css";l.id="videojs-css";document.head.appendChild(l)}}i.onready(function(){i.videojs=videojs(r,s,function(){e.log("Videojs initialized")});i.api.unload=function(){if(i.videojs){videojs(r).dispose();i.videojs=false}};MistUtil.event.addListener(e.options.target,"error",function(e){if(e.message=="Stream is offline"){i.api.unload()}})});e.log("Built html");if("Proxy"in window&&"Reflect"in window){var a={get:{},set:{}};e.player.api=new Proxy(r,{get:function(e,t,i){if(t in a.get){return a.get[t].apply(e,arguments)}var r=e[t];if(typeof r==="function"){return function(){return r.apply(e,arguments)}}return r},set:function(e,t,i){if(t in a.set){return a.set[t].call(e,i)}return e[t]=i}});if(e.info.type=="live"){function p(e){var t=0;if(e.buffered.length){t=e.buffered.end(e.buffered.length-1)}return t}var u=90;a.get.duration=function(){if(e.info){return(e.info.lastms+(new Date).getTime()-e.info.updated.getTime())*.001}return false};e.player.api.lastProgress=new Date;e.player.api.liveOffset=0;MistUtil.event.addListener(r,"progress",function(){e.player.api.lastProgress=new Date});a.set.currentTime=function(t){var i=e.player.api.currentTime-t;var r=t-e.player.api.duration;e.log("Seeking to "+MistUtil.format.time(t)+" ("+Math.round(r*-10)/10+"s from live)");e.video.currentTime-=i};a.get.currentTime=function(){return this.currentTime+e.info.lastms*.001-e.player.api.liveOffset-u}}}else{i.api=r}e.player.setSize=function(t){if("videojs"in e.player){e.player.videojs.dimensions(t.width,t.height);r.parentNode.style.width=t.width+"px";r.parentNode.style.height=t.height+"px"}this.api.style.width=t.width+"px";this.api.style.height=t.height+"px"};e.player.api.setSource=function(t){if(!e.player.videojs){return}if(e.player.videojs.src()!=t){e.player.videojs.src({type:e.player.videojs.currentSource().type,src:t})}};e.player.api.setSubtitle=function(e){var t=r.getElementsByTagName("track");for(var i=t.length-1;i>=0;i--){r.removeChild(t[i])}if(e){var o=document.createElement("track");r.appendChild(o);o.kind="subtitles";o.label=e.label;o.srclang=e.lang;o.src=e.src;o.setAttribute("default","")}};t(r)}if("videojs"in window){r()}else{var o=MistUtil.scripts.insert(e.urlappend(mistplayers.videojs.scriptsrc(e.options.host)),{onerror:function(t){var i="Failed to load videojs.js";if(t.message){i+=": "+t.message}e.showError(i)},onload:r},e)}};

View file

@ -84,7 +84,11 @@ var MistUtil = {
break; break;
} }
case "html5/application/vnd.apple.mpegurl": { case "html5/application/vnd.apple.mpegurl": {
return "HLS"; return "HLS (TS)";
break;
}
case "html5/application/vnd.apple.mpegurl;version=7": {
return "HLS (CMAF)";
break; break;
} }
case "flash/10": { case "flash/10": {
@ -103,8 +107,9 @@ var MistUtil = {
return "TS"; return "TS";
break; break;
} }
case "html5/application/vnd.ms-sstr+xml":
case "html5/application/vnd.ms-ss": { case "html5/application/vnd.ms-ss": {
return "Smooth streaming"; return "Smooth Streaming";
break; break;
} }
case "dash/video/mp4": { case "dash/video/mp4": {

View file

@ -1,6 +1,6 @@
mistplayers.videojs = { mistplayers.videojs = {
name: "VideoJS player", name: "VideoJS player",
mimes: ["html5/application/vnd.apple.mpegurl"], mimes: ["html5/application/vnd.apple.mpegurl","html5/application/vnd.apple.mpegurl;version=7"],
priority: MistUtil.object.keys(mistplayers).length + 1, priority: MistUtil.object.keys(mistplayers).length + 1,
isMimeSupported: function (mimetype) { isMimeSupported: function (mimetype) {
return (this.mimes.indexOf(mimetype) == -1 ? false : true); return (this.mimes.indexOf(mimetype) == -1 ? false : true);
@ -40,7 +40,9 @@ p.prototype.build = function (MistVideo,callback) {
} }
var shortmime = MistVideo.source.type.split("/"); var shortmime = MistVideo.source.type.split("/");
shortmime.shift(); if (shortmime[0] == "html5") {
shortmime.shift();
}
var source = document.createElement("source"); var source = document.createElement("source");
source.setAttribute("src",MistVideo.source.url); source.setAttribute("src",MistVideo.source.url);
@ -48,7 +50,7 @@ p.prototype.build = function (MistVideo,callback) {
ele.appendChild(source); ele.appendChild(source);
source.type = shortmime.join("/"); source.type = shortmime.join("/");
MistVideo.log("Adding "+source.type+" source @ "+MistVideo.source.url); MistVideo.log("Adding "+source.type+" source @ "+MistVideo.source.url);
if (source.type == "application/vnd.apple.mpegurl") { source.type = "application/x-mpegURL"; } if (source.type.indexOf("application/vnd.apple.mpegurl") >= 0) { source.type = "application/x-mpegURL"; }
MistUtil.class.add(ele,"video-js"); MistUtil.class.add(ele,"video-js");

View file

@ -18,36 +18,36 @@ QA:"Qatar",RE:"Réunion",RO:"Romania",RU:"Russian Federation",RW:"Rwanda",
SB:"Solomon Islands",SO:"Somalia",ZA:"South Africa",GS:"South Georgia and the South Sandwich Islands",SS:"South Sudan",ES:"Spain",LK:"Sri Lanka",SD:"Sudan",SR:"Suriname",SJ:"Svalbard and Jan Mayen",SZ:"Swaziland",SE:"Sweden",CH:"Switzerland",SY:"Syrian Arab Republic",TW:"Taiwan, Province of China",TJ:"Tajikistan",TZ:"Tanzania, United Republic of",TH:"Thailand",TL:"Timor-Leste",TG:"Togo",TK:"Tokelau",TO:"Tonga",TT:"Trinidad and Tobago",TN:"Tunisia",TR:"Turkey",TM:"Turkmenistan",TC:"Turks and Caicos Islands", SB:"Solomon Islands",SO:"Somalia",ZA:"South Africa",GS:"South Georgia and the South Sandwich Islands",SS:"South Sudan",ES:"Spain",LK:"Sri Lanka",SD:"Sudan",SR:"Suriname",SJ:"Svalbard and Jan Mayen",SZ:"Swaziland",SE:"Sweden",CH:"Switzerland",SY:"Syrian Arab Republic",TW:"Taiwan, Province of China",TJ:"Tajikistan",TZ:"Tanzania, United Republic of",TH:"Thailand",TL:"Timor-Leste",TG:"Togo",TK:"Tokelau",TO:"Tonga",TT:"Trinidad and Tobago",TN:"Tunisia",TR:"Turkey",TM:"Turkmenistan",TC:"Turks and Caicos Islands",
TV:"Tuvalu",UG:"Uganda",UA:"Ukraine",AE:"United Arab Emirates",GB:"United Kingdom",US:"United States",UM:"United States Minor Outlying Islands",UY:"Uruguay",UZ:"Uzbekistan",VU:"Vanuatu",VE:"Venezuela, Bolivarian Republic of",VN:"Viet Nam",VG:"Virgin Islands, British",VI:"Virgin Islands, U.S.",WF:"Wallis and Futuna",EH:"Western Sahara",YE:"Yemen",ZM:"Zambia",ZW:"Zimbabwe"},tooltip:{show:function(a,c){$tooltip=this.element;$.contains(document.body,$tooltip[0])||$("body").append($tooltip);$tooltip.html(c); TV:"Tuvalu",UG:"Uganda",UA:"Ukraine",AE:"United Arab Emirates",GB:"United Kingdom",US:"United States",UM:"United States Minor Outlying Islands",UY:"Uruguay",UZ:"Uzbekistan",VU:"Vanuatu",VE:"Venezuela, Bolivarian Republic of",VN:"Viet Nam",VG:"Virgin Islands, British",VI:"Virgin Islands, U.S.",WF:"Wallis and Futuna",EH:"Western Sahara",YE:"Yemen",ZM:"Zambia",ZW:"Zimbabwe"},tooltip:{show:function(a,c){$tooltip=this.element;$.contains(document.body,$tooltip[0])||$("body").append($tooltip);$tooltip.html(c);
clearTimeout(this.hiding);delete this.hiding;var d=$(document).height()-$tooltip.outerHeight(),b=$(document).width()-$tooltip.outerWidth();$tooltip.css("left",Math.min(a.pageX+10,b-10));$tooltip.css("top",Math.min(a.pageY+25,d-10));$tooltip.show().addClass("show")},hide:function(){$tooltip=this.element;$tooltip.removeClass("show");this.hiding=setTimeout(function(){$tooltip.hide()},500)},element:$("<div>").attr("id","tooltip")},humanMime:function(a){var c=!1;switch(a){case "html5/application/vnd.apple.mpegurl":c= clearTimeout(this.hiding);delete this.hiding;var d=$(document).height()-$tooltip.outerHeight(),b=$(document).width()-$tooltip.outerWidth();$tooltip.css("left",Math.min(a.pageX+10,b-10));$tooltip.css("top",Math.min(a.pageY+25,d-10));$tooltip.show().addClass("show")},hide:function(){$tooltip=this.element;$tooltip.removeClass("show");this.hiding=setTimeout(function(){$tooltip.hide()},500)},element:$("<div>").attr("id","tooltip")},humanMime:function(a){var c=!1;switch(a){case "html5/application/vnd.apple.mpegurl":c=
"HLS";break;case "html5/video/webm":c="WebM";break;case "html5/video/mp4":c="MP4";break;case "dash/video/mp4":c="DASH";break;case "flash/11":c="HDS";break;case "flash/10":c="RTMP";break;case "flash/7":c="Progressive";break;case "html5/audio/mp3":c="MP3";break;case "html5/audio/wav":c="WAV";break;case "html5/video/mp2t":case "html5/video/mpeg":c="TS";break;case "html5/application/vnd.ms-ss":c="Smooth";break;case "html5/text/vtt":c="VTT Subtitles";break;case "html5/text/plain":c="SRT Subtitles";break; "HLS (TS)";break;case "html5/application/vnd.apple.mpegurl;version=7":c="HLS (CMAF)";break;case "html5/video/webm":c="WebM";break;case "html5/video/mp4":c="MP4";break;case "dash/video/mp4":c="DASH";break;case "flash/11":c="HDS";break;case "flash/10":c="RTMP";break;case "flash/7":c="Progressive";break;case "html5/audio/mp3":c="MP3";break;case "html5/audio/wav":c="WAV";break;case "html5/video/mp2t":case "html5/video/mpeg":c="TS";break;case "html5/application/vnd.ms-sstr+xml":case "html5/application/vnd.ms-ss":c=
case "html5/text/javascript":c="JSON Subtitles";break;case "rtsp":c="RTSP";break;case "webrtc":c="WebRTC"}return c},popup:{element:null,show:function(a){this.element=$("<div>").attr("id","popup").append($("<button>").text("Close").addClass("close").click(function(){UI.popup.element.fadeOut("fast",function(){UI.popup.element.remove();UI.popup.element=null})})).append(a);$("body").append(this.element)}},menu:[{Overview:{},Protocols:{},Streams:{hiddenmenu:{Edit:{},Preview:{},Embed:{}}},Push:{LTSonly:!0}, "Smooth Streaming";break;case "html5/text/vtt":c="VTT Subtitles";break;case "html5/text/plain":c="SRT Subtitles";break;case "html5/text/javascript":c="JSON Subtitles";break;case "rtsp":c="RTSP";break;case "webrtc":c="WebRTC"}return c},popup:{element:null,show:function(a){this.element=$("<div>").attr("id","popup").append($("<button>").text("Close").addClass("close").click(function(){UI.popup.element.fadeOut("fast",function(){UI.popup.element.remove();UI.popup.element=null})})).append(a);$("body").append(this.element)}},
Triggers:{LTSonly:!1},Logs:{},Statistics:{},"Server Stats":{}},{Disconnect:{classes:["red"]}},{Guides:{link:"http://mistserver.org/documentation#Userdocs"},Tools:{submenu:{"Release notes":{link:"http://mistserver.org/documentation#Devdocs"},"Mist Shop":{link:"http://mistserver.org/products"},"Email for Help":{}}}}],buildMenu:function(){function a(a,b){var c=$("<a>").addClass("button");c.html($("<span>").addClass("plain").text(a)).append($("<span>").addClass("highlighted").text(a));for(var d in b.classes)c.addClass(b.classes[d]); menu:[{Overview:{},Protocols:{},Streams:{hiddenmenu:{Edit:{},Preview:{},Embed:{}}},Push:{LTSonly:!0},Triggers:{LTSonly:!1},Logs:{},Statistics:{},"Server Stats":{}},{Disconnect:{classes:["red"]}},{Guides:{link:"http://mistserver.org/documentation#Userdocs"},Tools:{submenu:{"Release notes":{link:"http://mistserver.org/documentation#Devdocs"},"Mist Shop":{link:"http://mistserver.org/products"},"Email for Help":{}}}}],buildMenu:function(){function a(a,b){var c=$("<a>").addClass("button");c.html($("<span>").addClass("plain").text(a)).append($("<span>").addClass("highlighted").text(a));
"LTSonly"in b&&c.addClass("LTSonly");"link"in b?c.attr("href",b.link).attr("target","_blank"):"submenu"in b||c.click(function(b){$(this).closest(".menu").hasClass("hide")||(UI.navto(a),b.stopPropagation())});return c}var c=UI.elements.menu,d;for(d in UI.menu){0<d&&c.append($("<br>"));for(var b in UI.menu[d]){var i=UI.menu[d][b],m=a(b,i);c.append(m);if("submenu"in i){var h=$("<span>").addClass("submenu");m.addClass("arrowdown").append(h);for(var f in i.submenu)h.append(a(f,i.submenu[f]))}else if("hiddenmenu"in for(var d in b.classes)c.addClass(b.classes[d]);"LTSonly"in b&&c.addClass("LTSonly");"link"in b?c.attr("href",b.link).attr("target","_blank"):"submenu"in b||c.click(function(b){$(this).closest(".menu").hasClass("hide")||(UI.navto(a),b.stopPropagation())});return c}var c=UI.elements.menu,d;for(d in UI.menu){0<d&&c.append($("<br>"));for(var b in UI.menu[d]){var i=UI.menu[d][b],m=a(b,i);c.append(m);if("submenu"in i){var h=$("<span>").addClass("submenu");m.addClass("arrowdown").append(h);for(var f in i.submenu)h.append(a(f,
i)for(f in h=$("<span>").addClass("hiddenmenu"),m.append(h),i.hiddenmenu)h.append(a(f,i.hiddenmenu[f]))}}d=$("<div>").attr("id","ih_button").text("?").click(function(){$("body").toggleClass("helpme");UI.stored.saveOpt("helpme",$("body").hasClass("helpme"))}).attr("title","Click to toggle the display of integrated help");UI.stored.getOpts().helpme&&$("body").addClass("helpme");c.after(d).after($("<div>").addClass("separator"))},findInput:function(a){return this.findInOutput("inputs",a)},findOutput:function(a){return this.findInOutput("connectors", i.submenu[f]))}else if("hiddenmenu"in i)for(f in h=$("<span>").addClass("hiddenmenu"),m.append(h),i.hiddenmenu)h.append(a(f,i.hiddenmenu[f]))}}d=$("<div>").attr("id","ih_button").text("?").click(function(){$("body").toggleClass("helpme");UI.stored.saveOpt("helpme",$("body").hasClass("helpme"))}).attr("title","Click to toggle the display of integrated help");UI.stored.getOpts().helpme&&$("body").addClass("helpme");c.after(d).after($("<div>").addClass("separator"))},findInput:function(a){return this.findInOutput("inputs",
a)},findInOutput:function(a,c){if("capabilities"in mist.data){var d=!1,b=mist.data.capabilities[a];c in b&&(d=b[c]);c+".exe"in b&&(d=b[c+".exe"]);return d}throw"Request capabilities first";},buildUI:function(a){var c=$("<div>").addClass("input_container"),d;for(d in a){var b=a[d];if(b instanceof jQuery)c.append(b);else if("help"==b.type){var i=$("<span>").addClass("text_container").append($("<span>").addClass("description").append(b.help));c.append(i);if("classes"in b)for(var m in b.classes)i.addClass(b.classes[m])}else if("text"== a)},findOutput:function(a){return this.findInOutput("connectors",a)},findInOutput:function(a,c){if("capabilities"in mist.data){var d=!1,b=mist.data.capabilities[a];c in b&&(d=b[c]);c+".exe"in b&&(d=b[c+".exe"]);return d}throw"Request capabilities first";},buildUI:function(a){var c=$("<div>").addClass("input_container"),d;for(d in a){var b=a[d];if(b instanceof jQuery)c.append(b);else if("help"==b.type){var i=$("<span>").addClass("text_container").append($("<span>").addClass("description").append(b.help));
b.type)c.append($("<span>").addClass("text_container").append($("<span>").addClass("text").append(b.text)));else if("custom"==b.type)c.append(b.custom);else if("buttons"==b.type)for(m in i=$("<span>").addClass("button_container").on("keydown",function(a){a.stopPropagation()}),"css"in b&&i.css(b.css),c.append(i),b.buttons){var h=b.buttons[m],f=$("<button>").text(h.label).data("opts",h);"css"in h&&f.css(h.css);if("classes"in h)for(var r in h.classes)f.addClass(h.classes[r]);i.append(f);switch(h.type){case "cancel":f.addClass("cancel").click(h["function"]); c.append(i);if("classes"in b)for(var m in b.classes)i.addClass(b.classes[m])}else if("text"==b.type)c.append($("<span>").addClass("text_container").append($("<span>").addClass("text").append(b.text)));else if("custom"==b.type)c.append(b.custom);else if("buttons"==b.type)for(m in i=$("<span>").addClass("button_container").on("keydown",function(a){a.stopPropagation()}),"css"in b&&i.css(b.css),c.append(i),b.buttons){var h=b.buttons[m],f=$("<button>").text(h.label).data("opts",h);"css"in h&&f.css(h.css);
break;case "save":f.addClass("save").click(function(){var a=$(this).data("opts").preSave;a&&a.call(this);var b=$(this).closest(".input_container"),c=!1;b.find('.hasValidate:visible, input[type="hidden"].hasValidate').each(function(){if(c=$(this).data("validate")(this,!0))return!1});(a=$(this).data("opts").failedValidate)&&a.call(this);c||(b.find('.isSetting:visible, input[type="hidden"].isSetting').each(function(){var a=$(this).getval(),b=$(this).data("pointer");if(""==a)if("default"in $(this).data("opts"))a= if("classes"in h)for(var r in h.classes)f.addClass(h.classes[r]);i.append(f);switch(h.type){case "cancel":f.addClass("cancel").click(h["function"]);break;case "save":f.addClass("save").click(function(){var a=$(this).data("opts").preSave;a&&a.call(this);var b=$(this).closest(".input_container"),c=!1;b.find('.hasValidate:visible, input[type="hidden"].hasValidate').each(function(){if(c=$(this).data("validate")(this,!0))return!1});(a=$(this).data("opts").failedValidate)&&a.call(this);c||(b.find('.isSetting:visible, input[type="hidden"].isSetting').each(function(){var a=
$(this).data("opts")["default"];else return b.main[b.index]=null,!0;b.main[b.index]=a}),(a=$(this).data("opts")["function"])&&a(this))});break;default:f.click(h["function"])}}else{var j=$("<label>").addClass("UIelement");c.append(j);"css"in b&&j.css(b.css);j.append($("<span>").addClass("label").html("label"in b?b.label+":":""));if("classes"in b)for(r in b.classes)j.addClass(b.classes[r]);i=$("<span>").addClass("field_container");j.append(i);var l;switch(b.type){case "password":l=$("<input>").attr("type", $(this).getval(),b=$(this).data("pointer");if(""==a)if("default"in $(this).data("opts"))a=$(this).data("opts")["default"];else return b.main[b.index]=null,!0;b.main[b.index]=a}),(a=$(this).data("opts")["function"])&&a(this))});break;default:f.click(h["function"])}}else{var j=$("<label>").addClass("UIelement");c.append(j);"css"in b&&j.css(b.css);j.append($("<span>").addClass("label").html("label"in b?b.label+":":""));if("classes"in b)for(r in b.classes)j.addClass(b.classes[r]);i=$("<span>").addClass("field_container");
"password");break;case "int":l=$("<input>").attr("type","number");"min"in b&&l.attr("min",b.min);"max"in b&&l.attr("max",b.max);"validate"in b?b.validate.push("int"):b.validate=["int"];break;case "span":l=$("<span>");break;case "debug":b.select=[["","Default"],[0,"0 - All debugging messages disabled"],[1,"1 - Messages about failed operations"],[2,"2 - Previous level, and error messages"],[3,"3 - Previous level, and warning messages"],[4,"4 - Previous level, and status messages for development"],[5, j.append(i);var l;switch(b.type){case "password":l=$("<input>").attr("type","password");break;case "int":l=$("<input>").attr("type","number");"min"in b&&l.attr("min",b.min);"max"in b&&l.attr("max",b.max);"validate"in b?b.validate.push("int"):b.validate=["int"];break;case "span":l=$("<span>");break;case "debug":b.select=[["","Default"],[0,"0 - All debugging messages disabled"],[1,"1 - Messages about failed operations"],[2,"2 - Previous level, and error messages"],[3,"3 - Previous level, and warning messages"],
"5 - Previous level, and more status messages for development"],[6,"6 - Previous level, and verbose debugging messages"],[7,"7 - Previous level, and very verbose debugging messages"],[8,"8 - Report everything in extreme detail"],[9,"9 - Report everything in insane detail"],[10,"10 - All messages enabled"]];case "select":l=$("<select>");for(m in b.select)f=$("<option>"),"string"==typeof b.select[m]?f.text(b.select[m]):f.val(b.select[m][0]).text(b.select[m][1]),l.append(f);break;case "textarea":l=$("<textarea>").on("keydown", [4,"4 - Previous level, and status messages for development"],[5,"5 - Previous level, and more status messages for development"],[6,"6 - Previous level, and verbose debugging messages"],[7,"7 - Previous level, and very verbose debugging messages"],[8,"8 - Report everything in extreme detail"],[9,"9 - Report everything in insane detail"],[10,"10 - All messages enabled"]];case "select":l=$("<select>");for(m in b.select)f=$("<option>"),"string"==typeof b.select[m]?f.text(b.select[m]):f.val(b.select[m][0]).text(b.select[m][1]),
function(a){a.stopPropagation()});break;case "checkbox":l=$("<input>").attr("type","checkbox");break;case "hidden":l=$("<input>").attr("type","hidden");j.hide();break;case "email":l=$("<input>").attr("type","email").attr("autocomplete","on").attr("required","");break;case "browse":l=$("<input>").attr("type","text");"filetypes"in b&&l.data("filetypes",b.filetypes);break;case "geolimited":case "hostlimited":l=$("<input>").attr("type","hidden");break;case "radioselect":l=$("<div>").addClass("radioselect"); l.append(f);break;case "textarea":l=$("<textarea>").on("keydown",function(a){a.stopPropagation()});break;case "checkbox":l=$("<input>").attr("type","checkbox");break;case "hidden":l=$("<input>").attr("type","hidden");j.hide();break;case "email":l=$("<input>").attr("type","email").attr("autocomplete","on").attr("required","");break;case "browse":l=$("<input>").attr("type","text");"filetypes"in b&&l.data("filetypes",b.filetypes);break;case "geolimited":case "hostlimited":l=$("<input>").attr("type",
for(d in b.radioselect)if(h=$("<input>").attr("type","radio").val(b.radioselect[d][0]).attr("name",b.label),("LTSonly"in b&&!mist.data.LTS||b.readonly)&&h.prop("disabled",!0),f=$("<label>").append(h).append($("<span>").html(b.radioselect[d][1])),l.append(f),2<b.radioselect[d].length)for(m in h=$("<select>").change(function(){$(this).parent().find("input[type=radio]:enabled").prop("checked","true")}),f.append(h),("LTSonly"in b&&!mist.data.LTS||b.readonly)&&h.prop("disabled",!0),b.radioselect[d][2])f= "hidden");break;case "radioselect":l=$("<div>").addClass("radioselect");for(d in b.radioselect)if(h=$("<input>").attr("type","radio").val(b.radioselect[d][0]).attr("name",b.label),("LTSonly"in b&&!mist.data.LTS||b.readonly)&&h.prop("disabled",!0),f=$("<label>").append(h).append($("<span>").html(b.radioselect[d][1])),l.append(f),2<b.radioselect[d].length)for(m in h=$("<select>").change(function(){$(this).parent().find("input[type=radio]:enabled").prop("checked","true")}),f.append(h),("LTSonly"in b&&
$("<option>"),h.append(f),b.radioselect[d][2][m]instanceof Array?f.val(b.radioselect[d][2][m][0]).html(b.radioselect[d][2][m][1]):f.html(b.radioselect[d][2][m]);break;case "checklist":l=$("<div>").addClass("checkcontainer");$controls=$("<div>").addClass("controls");$checklist=$("<div>").addClass("checklist");l.append($checklist);for(d in b.checklist)"string"==typeof b.checklist[d]&&(b.checklist[d]=[b.checklist[d],b.checklist[d]]),$checklist.append($("<label>").text(b.checklist[d][1]).prepend($("<input>").attr("type", !mist.data.LTS||b.readonly)&&h.prop("disabled",!0),b.radioselect[d][2])f=$("<option>"),h.append(f),b.radioselect[d][2][m]instanceof Array?f.val(b.radioselect[d][2][m][0]).html(b.radioselect[d][2][m][1]):f.html(b.radioselect[d][2][m]);break;case "checklist":l=$("<div>").addClass("checkcontainer");$controls=$("<div>").addClass("controls");$checklist=$("<div>").addClass("checklist");l.append($checklist);for(d in b.checklist)"string"==typeof b.checklist[d]&&(b.checklist[d]=[b.checklist[d],b.checklist[d]]),
"checkbox").attr("name",b.checklist[d][0])));break;case "DOMfield":l=b.DOMfield;break;case "unix":l=$("<input>").attr("type","datetime-local").attr("step",1);b.unit=$("<button>").text("Now").click(function(){$(this).closest(".field_container").find(".field").setval((new Date).getTime()/1E3)});break;case "selectinput":l=$("<div>").addClass("selectinput");h=$("<select>");l.append(h);h.data("input",!1);"LTSonly"in b&&!mist.data.LTS&&h.prop("disabled",!0);for(d in b.selectinput)f=$("<option>"),h.append(f), $checklist.append($("<label>").text(b.checklist[d][1]).prepend($("<input>").attr("type","checkbox").attr("name",b.checklist[d][0])));break;case "DOMfield":l=b.DOMfield;break;case "unix":l=$("<input>").attr("type","datetime-local").attr("step",1);b.unit=$("<button>").text("Now").click(function(){$(this).closest(".field_container").find(".field").setval((new Date).getTime()/1E3)});break;case "selectinput":l=$("<div>").addClass("selectinput");h=$("<select>");l.append(h);h.data("input",!1);"LTSonly"in
"string"==typeof b.selectinput[d]?f.text(b.selectinput[d]):(f.text(b.selectinput[d][1]),"string"==typeof b.selectinput[d][0]?f.val(b.selectinput[d][0]):(f.val("CUSTOM"),h.data("input")||h.data("input",UI.buildUI([b.selectinput[d][0]]).children())));h.data("input")&&l.append(h.data("input"));h.change(function(){"CUSTOM"==$(this).val()?$(this).data("input").css("display","flex"):$(this).data("input").hide()});h.trigger("change");break;case "inputlist":l=$("<div>").addClass("inputlist");l.data("newitem", b&&!mist.data.LTS&&h.prop("disabled",!0);for(d in b.selectinput)f=$("<option>"),h.append(f),"string"==typeof b.selectinput[d]?f.text(b.selectinput[d]):(f.text(b.selectinput[d][1]),"string"==typeof b.selectinput[d][0]?f.val(b.selectinput[d][0]):(f.val("CUSTOM"),h.data("input")||h.data("input",UI.buildUI([b.selectinput[d][0]]).children())));h.data("input")&&l.append(h.data("input"));h.change(function(){"CUSTOM"==$(this).val()?$(this).data("input").css("display","flex"):$(this).data("input").hide()});
function(){var a=$("<input>").attr("type","text").addClass("listitem");("LTSonly"in b&&!mist.data.LTS||b.readonly)&&a.prop("disabled",!0);var c=function(b){$(this).is(":last-child")?""!=$(this).val()?$(this).after(a.clone().keyup(c).val("")):8==b.which&&$(this).prev().focus():""==$(this).val()&&($(this).next().focus(),$(this).remove())};a.keyup(c);return a});l.append(l.data("newitem"));break;case "sublist":l=$("<div>").addClass("sublist");h=$("<div>").addClass("curvals");h.append($("<span>").text("None.")); h.trigger("change");break;case "inputlist":l=$("<div>").addClass("inputlist");l.data("newitem",function(){var a=$("<input>").attr("type","text").addClass("listitem");("LTSonly"in b&&!mist.data.LTS||b.readonly)&&a.prop("disabled",!0);var c=function(b){$(this).is(":last-child")?""!=$(this).val()?$(this).after(a.clone().keyup(c).val("")):8==b.which&&$(this).prev().focus():""==$(this).val()&&($(this).next().focus(),$(this).remove())};a.keyup(c);return a});l.append(l.data("newitem"));break;case "sublist":l=
var u=$("<div>").addClass("itemsettings"),g=$("<button>").text("New "+b.itemLabel),e=b.sublist;l.data("build",function(a,c){for(var d in b.saveas)d in a||delete b.saveas[d];b.saveas=Object.assign(b.saveas,a);d="New";"undefined"!=typeof c&&(d="Edit");d=UI.buildUI([$("<h4>").text(d+" "+b.itemLabel)].concat(e).concat([{label:"Save first",type:"str",classes:["onlyshowhelp"],validate:[function(){return{msg:"Did you want to save this "+b.itemLabel+"?",classes:["red"]}}]},{type:"buttons",buttons:[{label:"Cancel", $("<div>").addClass("sublist");h=$("<div>").addClass("curvals");h.append($("<span>").text("None."));var u=$("<div>").addClass("itemsettings"),g=$("<button>").text("New "+b.itemLabel),e=b.sublist;l.data("build",function(a,c){for(var d in b.saveas)d in a||delete b.saveas[d];b.saveas=Object.assign(b.saveas,a);d="New";"undefined"!=typeof c&&(d="Edit");d=UI.buildUI([$("<h4>").text(d+" "+b.itemLabel)].concat(e).concat([{label:"Save first",type:"str",classes:["onlyshowhelp"],validate:[function(){return{msg:"Did you want to save this "+
type:"cancel","function":function(){u.html("");g.show();j.show()}},{label:"Save "+b.itemLabel,type:"save",preSave:function(){$(this).closest(".input_container").find(".onlyshowhelp").closest("label").hide()},failedValidate:function(){$(this).closest(".input_container").find(".onlyshowhelp").closest("label").show()},"function":function(){var a=l.getval(),d=Object.assign({},b.saveas),e;for(e in d)null===d[e]&&delete d[e];"undefined"==typeof c?a.push(d):a[c]=d;l.setval(a);u.html("");g.show();j.show()}}]}])); b.itemLabel+"?",classes:["red"]}}]},{type:"buttons",buttons:[{label:"Cancel",type:"cancel","function":function(){u.html("");g.show();j.show()}},{label:"Save "+b.itemLabel,type:"save",preSave:function(){$(this).closest(".input_container").find(".onlyshowhelp").closest("label").hide()},failedValidate:function(){$(this).closest(".input_container").find(".onlyshowhelp").closest("label").show()},"function":function(){var a=l.getval(),d=Object.assign({},b.saveas),e;for(e in d)null===d[e]&&delete d[e];"undefined"==
u.html(d);g.hide();j.hide()});g.click(function(){l.data("build")({})});e.unshift({type:"str",label:"Human readable name",placeholder:"none",help:"A convenient name to describe this "+b.itemLabel+". It won't be used by MistServer.",pointer:{main:b.saveas,index:"x-LSP-name"}});l.data("savelist",[]);l.append(h).append(g);c.append(u);break;default:l=$("<input>").attr("type","text")}l.addClass("field").data("opts",b);"pointer"in b&&l.attr("name",b.pointer.index);i.append(l);if("classes"in b)for(m in b.classes)l.addClass(b.classes[m]); typeof c?a.push(d):a[c]=d;l.setval(a);u.html("");g.show();j.show()}}]}]));u.html(d);g.hide();j.hide()});g.click(function(){l.data("build")({})});e.unshift({type:"str",label:"Human readable name",placeholder:"none",help:"A convenient name to describe this "+b.itemLabel+". It won't be used by MistServer.",pointer:{main:b.saveas,index:"x-LSP-name"}});l.data("savelist",[]);l.append(h).append(g);c.append(u);break;default:l=$("<input>").attr("type","text")}l.addClass("field").data("opts",b);"pointer"in
"placeholder"in b&&l.attr("placeholder",b.placeholder);"default"in b&&l.attr("placeholder",b["default"]);"unit"in b&&i.append($("<span>").addClass("unit").html(b.unit));"readonly"in b&&(l.attr("readonly","readonly"),l.click(function(){$(this).select()}));"qrcode"in b&&i.append($("<span>").addClass("unit").html($("<button>").text("QR").on("keydown",function(a){a.stopPropagation()}).click(function(){var a=String($(this).closest(".field_container").find(".field").getval()),b=$("<div>").addClass("qrcode"); b&&l.attr("name",b.pointer.index);i.append(l);if("classes"in b)for(m in b.classes)l.addClass(b.classes[m]);"placeholder"in b&&l.attr("placeholder",b.placeholder);"default"in b&&l.attr("placeholder",b["default"]);"unit"in b&&i.append($("<span>").addClass("unit").html(b.unit));"readonly"in b&&(l.attr("readonly","readonly"),l.click(function(){$(this).select()}));"qrcode"in b&&i.append($("<span>").addClass("unit").html($("<button>").text("QR").on("keydown",function(a){a.stopPropagation()}).click(function(){var a=
UI.popup.show($("<span>").addClass("qr_container").append($("<p>").text(a)).append(b));b.qrcode({text:a,size:Math.min(b.width(),b.height())})})));"clipboard"in b&&document.queryCommandSupported("copy")&&i.append($("<span>").addClass("unit").html($("<button>").text("Copy").on("keydown",function(a){a.stopPropagation()}).click(function(){var a=String($(this).closest(".field_container").find(".field").getval()),b=document.createElement("textarea");b.value=a;document.body.appendChild(b);b.select();var c= String($(this).closest(".field_container").find(".field").getval()),b=$("<div>").addClass("qrcode");UI.popup.show($("<span>").addClass("qr_container").append($("<p>").text(a)).append(b));b.qrcode({text:a,size:Math.min(b.width(),b.height())})})));"clipboard"in b&&document.queryCommandSupported("copy")&&i.append($("<span>").addClass("unit").html($("<button>").text("Copy").on("keydown",function(a){a.stopPropagation()}).click(function(){var a=String($(this).closest(".field_container").find(".field").getval()),
false;try{c=document.execCommand("copy")}catch(d){}if(c){$(this).text("Copied to clipboard!");document.body.removeChild(b);var e=$(this);setTimeout(function(){e.text("Copy")},5E3)}else{document.body.removeChild(b);alert("Failed to copy:\n"+a)}})));"rows"in b&&l.attr("rows",b.rows);"LTSonly"in b&&!mist.data.LTS&&(i.addClass("LTSonly"),l.prop("disabled",!0));if("dependent"in b)for(d in b.dependent)j.attr("data-dependent-"+d,b.dependent[d]);switch(b.type){case "browse":h=$("<div>").addClass("grouper").append(j); b=document.createElement("textarea");b.value=a;document.body.appendChild(b);b.select();var c=false;try{c=document.execCommand("copy")}catch(d){}if(c){$(this).text("Copied to clipboard!");document.body.removeChild(b);var e=$(this);setTimeout(function(){e.text("Copy")},5E3)}else{document.body.removeChild(b);alert("Failed to copy:\n"+a)}})));"rows"in b&&l.attr("rows",b.rows);"LTSonly"in b&&!mist.data.LTS&&(i.addClass("LTSonly"),l.prop("disabled",!0));if("dependent"in b)for(d in b.dependent)j.attr("data-dependent-"+
c.append(h);h=$("<button>").text("Browse").on("keydown",function(a){a.stopPropagation()});i.append(h);h.click(function(){function a(b){h.text("Loading..");mist.send(function(a){f.text(a.browse.path[0]);mist.data.LTS&&d.setval(a.browse.path[0]+"/");h.html(i.clone(true).text("..").attr("title","Folder up"));if(a.browse.subdirectories){a.browse.subdirectories.sort();for(var b in a.browse.subdirectories){var g=a.browse.subdirectories[b];h.append(i.clone(true).attr("title",f.text()+l+g).text(g))}}if(a.browse.files){a.browse.files.sort(); d,b.dependent[d]);switch(b.type){case "browse":h=$("<div>").addClass("grouper").append(j);c.append(h);h=$("<button>").text("Browse").on("keydown",function(a){a.stopPropagation()});i.append(h);h.click(function(){function a(b){h.text("Loading..");mist.send(function(a){f.text(a.browse.path[0]);mist.data.LTS&&d.setval(a.browse.path[0]+"/");h.html(i.clone(true).text("..").attr("title","Folder up"));if(a.browse.subdirectories){a.browse.subdirectories.sort();for(var b in a.browse.subdirectories){var g=a.browse.subdirectories[b];
for(b in a.browse.files){var g=a.browse.files[b],k=f.text()+l+g,g=$("<a>").text(g).addClass("file").attr("title",k);h.append(g);if(j){var n=true,m;for(m in j)if(typeof j[m]!="undefined"&&mist.inputMatch(j[m],k)){n=false;break}n&&g.hide()}g.click(function(){var a=$(this).attr("title");d.setval(a).removeAttr("readonly").css("opacity",1);e.show();c.remove()})}}},{browse:b})}var b=$(this).closest(".grouper"),c=$("<div>").addClass("browse_container"),d=b.find(".field").attr("readonly","readonly").css("opacity", h.append(i.clone(true).attr("title",f.text()+l+g).text(g))}}if(a.browse.files){a.browse.files.sort();for(b in a.browse.files){var g=a.browse.files[b],k=f.text()+l+g,g=$("<a>").text(g).addClass("file").attr("title",k);h.append(g);if(j){var n=true,m;for(m in j)if(typeof j[m]!="undefined"&&mist.inputMatch(j[m],k)){n=false;break}n&&g.hide()}g.click(function(){var a=$(this).attr("title");d.setval(a).removeAttr("readonly").css("opacity",1);e.show();c.remove()})}}},{browse:b})}var b=$(this).closest(".grouper"),
0.5),e=$(this),g=$("<button>").text("Stop browsing").click(function(){e.show();c.remove();d.removeAttr("readonly").css("opacity",1)}),f=$("<span>").addClass("field"),h=$("<div>").addClass("browse_contents"),i=$("<a>").addClass("folder"),j=d.data("filetypes");b.append(c);c.append($("<label>").addClass("UIelement").append($("<span>").addClass("label").text("Current folder:")).append($("<span>").addClass("field_container").append(f).append(g))).append(h);var l="/";mist.data.config.version.indexOf("indows")> c=$("<div>").addClass("browse_container"),d=b.find(".field").attr("readonly","readonly").css("opacity",0.5),e=$(this),g=$("<button>").text("Stop browsing").click(function(){e.show();c.remove();d.removeAttr("readonly").css("opacity",1)}),f=$("<span>").addClass("field"),h=$("<div>").addClass("browse_contents"),i=$("<a>").addClass("folder"),j=d.data("filetypes");b.append(c);c.append($("<label>").addClass("UIelement").append($("<span>").addClass("label").text("Current folder:")).append($("<span>").addClass("field_container").append(f).append(g))).append(h);
-1&&(l="\\");i.click(function(){var b=f.text()+l+$(this).text();a(b)});b=d.getval();g=b.split("://");g.length>1&&(b=g[0]=="file"?g[1]:"");b=b.split(l);b.pop();b=b.join(l);e.hide();a(b)});break;case "geolimited":case "hostlimited":h={field:l};h.blackwhite=$("<select>").append($("<option>").val("-").text("Blacklist")).append($("<option>").val("+").text("Whitelist"));h.values=$("<span>").addClass("limit_value_list");switch(b.type){case "geolimited":h.prototype=$("<select>").append($("<option>").val("").text("[Select a country]")); var l="/";mist.data.config.version.indexOf("indows")>-1&&(l="\\");i.click(function(){var b=f.text()+l+$(this).text();a(b)});b=d.getval();g=b.split("://");g.length>1&&(b=g[0]=="file"?g[1]:"");b=b.split(l);b.pop();b=b.join(l);e.hide();a(b)});break;case "geolimited":case "hostlimited":h={field:l};h.blackwhite=$("<select>").append($("<option>").val("-").text("Blacklist")).append($("<option>").val("+").text("Whitelist"));h.values=$("<span>").addClass("limit_value_list");switch(b.type){case "geolimited":h.prototype=
for(d in UI.countrylist)h.prototype.append($("<option>").val(d).html(UI.countrylist[d]));break;case "hostlimited":h.prototype=$("<input>").attr("type","text").attr("placeholder","type a host")}h.prototype.on("change keyup",function(){$(this).closest(".field_container").data("subUI").blackwhite.trigger("change")});h.blackwhite.change(function(){var a=$(this).closest(".field_container").data("subUI"),b=[],c=false;a.values.children().each(function(){c=$(this).val();c!=""?b.push(c):$(this).remove()}); $("<select>").append($("<option>").val("").text("[Select a country]"));for(d in UI.countrylist)h.prototype.append($("<option>").val(d).html(UI.countrylist[d]));break;case "hostlimited":h.prototype=$("<input>").attr("type","text").attr("placeholder","type a host")}h.prototype.on("change keyup",function(){$(this).closest(".field_container").data("subUI").blackwhite.trigger("change")});h.blackwhite.change(function(){var a=$(this).closest(".field_container").data("subUI"),b=[],c=false;a.values.children().each(function(){c=
a.values.append(a.prototype.clone(true));b.length>0?a.field.val($(this).val()+b.join(" ")):a.field.val("");a.field.trigger("change")});"LTSonly"in b&&!mist.data.LTS&&(h.blackwhite.prop("disabled",!0),h.prototype.prop("disabled",!0));h.values.append(h.prototype.clone(!0));i.data("subUI",h).addClass("limit_list").append(h.blackwhite).append(h.values)}"pointer"in b&&(l.data("pointer",b.pointer).addClass("isSetting"),b.pointer.main&&(h=b.pointer.main[b.pointer.index],"undefined"!=h&&l.setval(h)));(""== $(this).val();c!=""?b.push(c):$(this).remove()});a.values.append(a.prototype.clone(true));b.length>0?a.field.val($(this).val()+b.join(" ")):a.field.val("");a.field.trigger("change")});"LTSonly"in b&&!mist.data.LTS&&(h.blackwhite.prop("disabled",!0),h.prototype.prop("disabled",!0));h.values.append(h.prototype.clone(!0));i.data("subUI",h).addClass("limit_list").append(h.blackwhite).append(h.values)}"pointer"in b&&(l.data("pointer",b.pointer).addClass("isSetting"),b.pointer.main&&(h=b.pointer.main[b.pointer.index],
l.getval()||null==l.getval())&&"value"in b&&l.setval(b.value);if("datalist"in b)for(d in h="datalist_"+d+MD5(l[0].outerHTML),l.attr("list",h),h=$("<datalist>").attr("id",h),i.append(h),b.datalist)h.append($("<option>").val(b.datalist[d]));i=$("<span>").addClass("help_container");j.append(i);"help"in b&&(i.append($("<span>").addClass("ih_balloon").html(b.help)),l.on("focus mouseover",function(){$(this).closest("label").addClass("active")}).on("blur mouseout",function(){$(this).closest("label").removeClass("active")})); "undefined"!=h&&l.setval(h)));(""==l.getval()||null==l.getval())&&"value"in b&&l.setval(b.value);if("datalist"in b)for(d in h="datalist_"+d+MD5(l[0].outerHTML),l.attr("list",h),h=$("<datalist>").attr("id",h),i.append(h),b.datalist)h.append($("<option>").val(b.datalist[d]));i=$("<span>").addClass("help_container");j.append(i);"help"in b&&(i.append($("<span>").addClass("ih_balloon").html(b.help)),l.on("focus mouseover",function(){$(this).closest("label").addClass("active")}).on("blur mouseout",function(){$(this).closest("label").removeClass("active")}));
if("validate"in b){h=[];for(m in b.validate){f=b.validate[m];if("function"!=typeof f)switch(f){case "required":f=function(a){return a==""||a==null?{msg:"This is a required field.",classes:["red"]}:false};break;case "int":f=function(a,b){var c=$(b).data("opts");if(!$(b)[0].validity.valid){var d=[];"min"in c&&d.push(" greater than or equal to "+c.min);"max"in c&&d.push(" smaller than or equal to "+c.max);return{msg:"Please enter an integer"+d.join(" and")+".",classes:["red"]}}if(parseInt(Number(a))!= if("validate"in b){h=[];for(m in b.validate){f=b.validate[m];if("function"!=typeof f)switch(f){case "required":f=function(a){return a==""||a==null?{msg:"This is a required field.",classes:["red"]}:false};break;case "int":f=function(a,b){var c=$(b).data("opts");if(!$(b)[0].validity.valid){var d=[];"min"in c&&d.push(" greater than or equal to "+c.min);"max"in c&&d.push(" smaller than or equal to "+c.max);return{msg:"Please enter an integer"+d.join(" and")+".",classes:["red"]}}if(parseInt(Number(a))!=
a)return{msg:"Please enter an integer.",classes:["red"]}};break;case "streamname":f=function(a,b){if(a!=""){if(!isNaN(a.charAt(0)))return{msg:"The first character may not be a number.",classes:["red"]};if(a.toLowerCase()!=a)return{msg:"Uppercase letters are not allowed.",classes:["red"]};if(a.replace(/[^\da-z_]/g,"")!=a)return{msg:"Special characters (except for underscores) are not allowed.",classes:["red"]};if("streams"in mist.data&&a in mist.data.streams&&$(b).data("pointer").main.name!=a)return{msg:"This streamname already exists.<br>If you want to edit an existing stream, please click edit on the the streams tab.", a)return{msg:"Please enter an integer.",classes:["red"]}};break;case "streamname":f=function(a,b){if(a!=""){if(!isNaN(a.charAt(0)))return{msg:"The first character may not be a number.",classes:["red"]};if(a.toLowerCase()!=a)return{msg:"Uppercase letters are not allowed.",classes:["red"]};if(a.replace(/[^\da-z_]/g,"")!=a)return{msg:"Special characters (except for underscores) are not allowed.",classes:["red"]};if("streams"in mist.data&&a in mist.data.streams&&$(b).data("pointer").main.name!=a)return{msg:"This streamname already exists.<br>If you want to edit an existing stream, please click edit on the the streams tab.",
classes:["red"]}}};break;case "streamname_with_wildcard":f=function(a){if(a!=""){streampart=a.split("+");var b=streampart.slice(1).join("+");streampart=streampart[0];if(!isNaN(streampart.charAt(0)))return{msg:"The first character may not be a number.",classes:["red"]};if(streampart.toLowerCase()!=streampart)return{msg:"Uppercase letters are not allowed in a stream name.",classes:["red"]};if(streampart.replace(/[^\da-z_]/g,"")!=streampart)return{msg:"Special characters (except for underscores) are not allowed in a stream name.", classes:["red"]}}};break;case "streamname_with_wildcard":f=function(a){if(a!=""){streampart=a.split("+");var b=streampart.slice(1).join("+");streampart=streampart[0];if(!isNaN(streampart.charAt(0)))return{msg:"The first character may not be a number.",classes:["red"]};if(streampart.toLowerCase()!=streampart)return{msg:"Uppercase letters are not allowed in a stream name.",classes:["red"]};if(streampart.replace(/[^\da-z_]/g,"")!=streampart)return{msg:"Special characters (except for underscores) are not allowed in a stream name.",

View file

@ -178,7 +178,10 @@ var UI = {
var human = false; var human = false;
switch (type) { switch (type) {
case 'html5/application/vnd.apple.mpegurl': case 'html5/application/vnd.apple.mpegurl':
human = 'HLS'; human = 'HLS (TS)';
break;
case "html5/application/vnd.apple.mpegurl;version=7":
human = "HLS (CMAF)";
break; break;
case 'html5/video/webm': case 'html5/video/webm':
human = 'WebM'; human = 'WebM';
@ -208,8 +211,9 @@ var UI = {
case 'html5/video/mpeg': case 'html5/video/mpeg':
human = 'TS'; human = 'TS';
break; break;
case "html5/application/vnd.ms-sstr+xml":
case 'html5/application/vnd.ms-ss': case 'html5/application/vnd.ms-ss':
human = 'Smooth'; human = 'Smooth Streaming';
break; break;
case 'html5/text/vtt': case 'html5/text/vtt':
human = 'VTT Subtitles'; human = 'VTT Subtitles';