',a+='
',t.argtable&&t.argtable.forEach((function(o){var r=o.datatype||"",e=t.name+"-"+o.longopts,i=_n(n,t.name,o.longopts),l="hasvalue="+o.hasvalue+" ";l+='longopts="'+o.longopts+'" ',l+='shortopts="'+o.shortopts+'" ',l+="checkbox="+o.checkbox+" ",l+='cmdname="'+t.name+'" ',l+='id="'+e+'" name="'+e+'" hasvalue="'+o.hasvalue+'" ';var d=o.mincount>0?"bg-success":"";"hidden"===o.glossary&&(l+=' style="visibility: hidden;"'),o.checkbox?(a+=' ",r?$(e).append(a):$("#commands-list").append(a)}})),n.commands.forEach((function(t){$("[cmdname="+t.name+"]:input").val(""),$("[cmdname="+t.name+"]:checkbox").prop("checked",!1),t.argtable&&t.argtable.forEach((function(o){var r="#"+t.name+"-"+o.longopts,e=_n(n,t.name,o.longopts);o.checkbox?$(r)[0].checked=e:(void 0!==e&&$(r).val(e).trigger("change"),0===$(r)[0].value.length&&(o.datatype||"").includes("|")&&($(r)[0].value="--"))}))}))})).fail((function(n,t,o){404==n.status?$(".orec").hide():F(n,0,o),$("#commands-list").empty(),W=!1}))}function Nn(){$.getJSON("/config.json",(function(n){$("#nvsTable tr").remove();var t=n.config?n.config:n;nn=t,Object.keys(t).sort().forEach((function(n){var o=t[n].value;if("autoexec"===n)"0"===t.autoexec.value?$("#disable-squeezelite")[0].checked=!0:$("#disable-squeezelite")[0].checked=!1;else if("autoexec1"===n){var r=/-o\s?(["][^"]*["]|[^-]+)/g.exec(o);r[1].toUpperCase().startsWith("I2S")?P("i2s"):r[1].toUpperCase().startsWith("SPDIF")?P("spdif"):r[1].toUpperCase().startsWith('"BT')&&P("bt")}else"host_name"===n?(o=o.replaceAll('"',""),$("input#dhcp-name1").val(o),$("input#dhcp-name2").val(o),$("#player").val(o),document.title=o,rn=o):"rel_api"===n&&(V=o);$("tbody#nvsTable").append("
"+n+" "),$("input#"+n).val(t[n].value)})),$("tbody#nvsTable").append("
"),n.gpio?($("#pins").show(),$("tbody#gpiotable tr").remove(),n.gpio.forEach((function(n){$("tbody#gpiotable").append("
'+n.group+" "+n.name+" "+n.gpio+" "+(n.fixed?"Fixed":"Configuration")+" ")}))):$("#pins").hide()})).fail((function(n,t,o){F(n,0,o),W=!1}))}function jn(n,t){On({message:n,type:t},new Date)}function On(n,t){var o="table-success";"MESSAGING_WARNING"===n.type?(o="table-warning","MESSAGING_INFO"===q&&(q="MESSAGING_WARNING")):"MESSAGING_ERROR"===n.type&&("MESSAGING_INFO"!==q&&"MESSAGING_WARNING"!==q||(q="MESSAGING_ERROR"),o="table-danger"),++Z>0&&($("#msgcnt").removeClass("badge-success"),$("#msgcnt").removeClass("badge-warning"),$("#msgcnt").removeClass("badge-danger"),$("#msgcnt").addClass(k[q]),$("#msgcnt").text(Z)),$("#syslogTable").append("
"+t.toLocalShort()+" "+n.message.encodeHTML()+" ")}function Cn(n,t,o){return(n-t)*(n-o)<=0}function Tn(n){return new m.Promise((function(t){return setTimeout(t,n)}))}m.Promise.prototype.delay=function(n){return this.then((function(t){return new m.Promise((function(o){setTimeout((function(){o(t)}),n)}))}),(function(t){return new m.Promise((function(o,r){setTimeout((function(){r(t)}),n)}))}))},window.saveAutoexec1=function(n){J("cfg-audio-tmpl","MESSAGING_INFO","Saving.\n",!1);var t='squeezelite -b 500:2000 -d all=info -C 30 -W -n "'+$("#player").val()+'"';"bt"===on?(t+=' -o "BT" -R -Z 192000',J("cfg-audio-tmpl","MESSAGING_INFO","Remember to configure the Bluetooth audio device name.\n",!0)):t+="spdif"===on?" -o SPDIF -Z 192000":" -o I2S",""!==$("#optional").val()&&(t+=" "+$("#optional").val());var o={timestamp:Date.now()};o.config={autoexec1:{value:t,type:33},autoexec:{value:$("#disable-squeezelite").prop("checked")?"0":"1",type:33}},$.ajax({url:"/config.json",dataType:"text",method:"POST",cache:!1,contentType:"application/json; charset=utf-8",data:JSON.stringify(o),error:F,complete:function(t){t.responseText.result&&"OK"===JSON.parse(t.responseText).result?(J("cfg-audio-tmpl","MESSAGING_INFO","Done.\n",!0),n&&hn(1500,"cfg-audio-tmpl")):t.responseText.result?J("cfg-audio-tmpl","MESSAGING_WARNING",JSON.parse(t.responseText).Result+"\n",!0):J("cfg-audio-tmpl","MESSAGING_ERROR",t.statusText+"\n"),console.log(t.responseText)}}),console.log("sent data:",JSON.stringify(o))},window.handleDisconnect=function(){$.ajax({url:"/connect.json",dataType:"text",method:"DELETE",cache:!1,contentType:"application/json; charset=utf-8",data:JSON.stringify({timestamp:Date.now()})})},window.handleConnect=function(){cn.ssid=$("#manual_ssid").val(),cn.pwd=$("#manual_pwd").val(),cn.dhcpname=$("#dhcp-name2").val(),$("*[class*='connecting']").hide(),$("#ssid-wait").text(cn.ssid),$(".connecting").show(),$.ajax({url:"/connect.json",dataType:"text",method:"POST",cache:!1,contentType:"application/json; charset=utf-8",data:JSON.stringify({timestamp:Date.now(),ssid:cn.ssid,pwd:cn.pwd}),error:F}),fn()},$(document).ready((function(){$("#wifiTable").on("click","tr",(function(){})),$("#fw-url-input").on("input",(function(){$(this).val().length>8&&($(this).val().startsWith("http://")||$(this).val().startsWith("https://"))?$("#start-flash").show():$("#start-flash").hide()})),$(".upSrch").on("input",(function(){var n=this.value;$("#rTable tr").removeClass(this.id+"_hide"),n.length>0&&$("#rTable td:nth-child(".concat($(this).parent().index()+1,")")).filter((function(){return!$(this).text().toUpperCase().includes(n.toUpperCase())})).parent().addClass(this.id+"_hide"),$('[class*="_hide"]').hide(),$("#rTable tr").not('[class*="_hide"]').show()})),setTimeout(wn,1500),$("#otadiv").on("hidden.bs.modal",(function(){N=R.NONE})),$("#WifiConnectDialog").on("shown.bs.modal",(function(){$("*[class*='connecting']").hide(),cn.Action!==gn?($(".connecting-init").show(),$("#manual_ssid").trigger("focus")):$n()})),$("#WifiConnectDialog").on("hidden.bs.modal",(function(){$("#WifiConnectDialog input").val("")})),$("#uCnfrm").on("shown.bs.modal",(function(){$("#selectedFWURL").text($("#fw-url-input").val())})),$("input#show-commands")[0].checked=1===tn,$('a[href^="#tab-commands"]').hide(),$("#load-nvs").on("click",(function(){$("#nvsfilename").trigger("click")})),$("#clear-syslog").on("click",(function(){Z=0,q="MESSAGING_INFO",$("#msgcnt").text(""),$("#syslogTable").html("")})),$("#wifiTable").on("click","tr",(function(){cn.Action=pn,$(this).children("td:eq(1)").text()!=mn.ssid?$(this).is(":last-child")?(cn.Action=bn,cn.ssid="",$("#manual_ssid").val(cn.ssid)):(cn.ssid=$(this).children("td:eq(1)").text(),$("#manual_ssid").val(cn.ssid)):cn.Action=gn})),$("#ok-credits").on("click",(function(){$("#credits").slideUp("fast",(function(){})),$("#app").slideDown("fast",(function(){}))})),$("#acredits").on("click",(function(n){n.preventDefault(),$("#app").slideUp("fast",(function(){})),$("#credits").slideDown("fast",(function(){}))})),$("input#show-commands").on("click",(function(){this.checked=this.checked?1:0,this.checked?($('a[href^="#tab-commands"]').show(),tn=1):(tn=0,$('a[href^="#tab-commands"]').hide())})),$("input#show-nvs").on("click",(function(){this.checked=this.checked?1:0,this.checked?$('*[href*="-nvs"]').show():$('*[href*="-nvs"]').hide()})),$("#save-as-nvs").on("click",(function(){var n=un(!0),t=document.createElement("a");t.href=URL.createObjectURL(new Blob([JSON.stringify(n,null,2)],{type:"text/plain"})),t.setAttribute("download","nvs_config_"+rn+"_"+Date.now()+"json"),document.body.appendChild(t),t.click(),document.body.removeChild(t)})),$("#save-nvs").on("click",(function(){T(un(!1))})),$("#fwUpload").on("click",(function(){var n=document.getElementById("flashfilename").files;0===n.length?alert("No file selected!"):B({event:M.START_OTA,file:n[0]})})),$("[name=output-tmpl]").on("click",(function(){P(this.id)})),$("#chkUpdates").on("click",(function(){$("#rTable").html(""),$.getJSON(V,(function(n){var t=[];n.forEach((function(n){var o=n.name.split("#")[3];t.includes(o)||t.push(o)}));var o="";t.forEach((function(n){o+='
'+n+" "})),$("#fwbranch").append(o),n.forEach((function(n){var t="";n.assets.forEach((function(n){n.name.match(/\.bin$/)&&(t=n.browser_download_url)}));var o=n.name.split("#"),r=o[0],e=o[2],a=o[3],i=r.substr(r.lastIndexOf("-")+1);i="32"==i||"16"==i?i:"";var l=n.body;l=(l=(l=l.replace(/'/gi,'"')).replace(/[\s\S]+(### Revision Log[\s\S]+)### ESP-IDF Version Used[\s\S]+/,"$1")).replace(/- \(.+?\) /g,"- "),$("#rTable").append("
\n ").concat(r," ").concat(new Date(n.created_at).toLocalShort(),"\n ").concat(e," ").concat(a," ").concat(i," "))})),$("#searchfw").css("display","inline"),xn(dn)||xn(ln),$("#rTable tr.release").on("click",(function(){var n=this.attributes.fwurl.value;Q&&(n=n.replace(/.*\/download\//,Q+"/plugins/SqueezeESP32/firmware/")),$("#fw-url-input").val(n),$("#start-flash").show(),$("#rTable tr.release").removeClass("table-success table-warning"),$(this).addClass("table-success table-warning")}))})).fail((function(){alert("failed to fetch release history!")}))})),$("#fwcheck").on("click",(function(){$("#releaseTable").html(""),$("#fwbranch").empty(),$.getJSON(V,(function(n){var t,o=0,r=[];n.forEach((function(n){var t=n.name.split("#")[3];r.includes(t)||r.push(t)})),r.forEach((function(n){t+='
'+n+" "})),$("#fwbranch").append(t),n.forEach((function(n){var t="";n.assets.forEach((function(n){n.name.match(/\.bin$/)&&(t=n.browser_download_url)}));var r=n.name.split("#"),e=r[0],a=r[1],i=r[2],l=r[3],d=n.body;d=(d=(d=d.replace(/'/gi,'"')).replace(/[\s\S]+(### Revision Log[\s\S]+)### ESP-IDF Version Used[\s\S]+/,"$1")).replace(/- \(.+?\) /g,"- ");var m=o++>6?" hide":"";$("#releaseTable").append("
"+e+" "+new Date(n.created_at).toLocalShort()+" "+i+" "+a+" "+l+" ")})),o>7&&($("#releaseTable").append("
"),$("#showallbutton").on("click",(function(){$("tr.hide").removeClass("hide"),$("tr#showall").addClass("hide")}))),$("#searchfw").css("display","inline")})).fail((function(){alert("failed to fetch release history!")}))})),$("#updateAP").on("click",(function(){wn(),console.log("refresh AP")})),Nn(),Rn(),fn()})),window.setURL=function(n){var t=n.dataset.url;$('[data-url^="http"]').addClass("btn-success").removeClass("btn-danger"),$('[data-url="'+t+'"]').addClass("btn-danger").removeClass("btn-success"),Q&&(t=t.replace(/.*\/download\//,Q+"/plugins/SqueezeESP32/firmware/")),$("#fwurl").val(t)},window.runCommand=function(n,t){var o=n.attributes.cmdname.value;J(n.attributes.cmdname.value,"MESSAGING_INFO","Executing.",!1);var r=document.getElementById("flds-"+o);if(o+=" ",r)for(var e=r.querySelectorAll("select,input"),a=0;a
0)}(n)?N==R.FLASHING?100==O?(N=R.DONE,$("#flashfilename").val("")):O<0&&C&&(console.log("End of flashing from older recovery"),""==n.ota_dsc&&(j="OTA Process Completed"),N=R.DONE):N==R.UPLOADING&&100==O&&(O=0,N=R.FLASHING):N=R.FLASHING)}function G(n){N=R.ERROR,B({ota_pct:0,ota_dsc:n,event:M.SET_ERROR})}function L(){$("#otadiv").modal(),O>=0&&U(),""!==j&&$("span#flash-status").html(j)}var M={SET_ERROR:function(n){var t;j=n.ota_dsc?n.ota_dsc:"Error",O=null!==(t=n.ota_pct)&&void 0!==t?t:0,$("#fwProgressLabel").parent().addClass("bg-danger"),U(),L()},START_OTA:function(){if(N==R.NONE||N==R.ERROR||null==N){if($("#fwProgressLabel").parent().removeClass("bg-danger"),N=R.REBOOT_TO_RECOVERY,H)j="Starting Update";else{j="Starting recovery mode...";var n={timestamp:Date.now()};$.ajax({url:"/recovery.json",dataType:"text",method:"POST",cache:!1,contentType:"application/json; charset=utf-8",data:JSON.stringify(n),error:function(n,t,o){var r;G("Unexpected error while trying to restart to recovery. (status=".concat(null!==(r=n.status)&&void 0!==r?r:"",", error=").concat(null!=o?o:""," ) "))},complete:function(n){console.log(n.responseText)}})}L()}else console.warn("Unexpected status while starting flashing")},FOUND_RECOVERY:function(n){console.log(JSON.stringify(n));var t=$("#fw-url-input").val();if(N==R.REBOOT_TO_RECOVERY){var o=$("#flashfilename")[0].files;if(o.length>0){j="Sending file to device.",N=R.UPLOADING;var r=new XMLHttpRequest;r.upload.addEventListener("progress",D,!1),r.onreadystatechange=function(){4===r.readyState&&(0!==r.status&&404!==r.status||(G("Upload Failed. Recovery version might not support uploading. Please use web update instead."),$("#flashfilename").val("")))},r.open("POST","/flash.json",!0),r.send(o[0])}else if(""==t)N=R.NONE;else{j="Saving firmware URL location.",N=R.SET_FWURL,T({fwurl:{value:$("#fw-url-input").val(),type:33}})}L()}},PROCESS_OTA_UPLOAD:function(n){N=R.UPLOADING,I(n),L()},PROCESS_OTA_STATUS:function(n){n.ota_pct>0&&(C=!0),N==R.REBOOT_TO_RECOVERY?(n.event=M.FOUND_RECOVERY,B(n)):N!=R.DONE||H?(I(n),N&&N>R.NONE&&O>=0&&L()):(N=R.NONE,$("#rTable tr.release").removeClass("table-success table-warning"),$("#fw-url-input").val(""))},PROCESS_OTA:function(n){I(n),N&&N>R.NONE&&O>=0&&L()}};function U(){$(".progress-bar").css("width",O+"%").attr("aria-valuenow",O).text(O+"%"),$(".progress-bar").html((N==R.DONE?100:O)+"%")}function B(n){n.event?n.event(n):console.error("Unexpected error while processing handle_flash_state")}function D(n){B({ota_pct:Math.round(n.loaded/n.total*100),ota_dsc:"Uploading file to device",event:M.PROCESS_OTA_UPLOAD})}function P(n){"bt"===n?($("#bt").prop("checked",!0),$("#o_bt").attr("display","inline"),$("#o_spdif").attr("display","none"),$("#o_i2s").attr("display","none"),on="bt"):"spdif"===n?($("#spdif").prop("checked",!0),$("#o_bt").attr("display","none"),$("#o_spdif").attr("display","inline"),$("#o_i2s").attr("display","none"),on="spdif"):($("#i2s").prop("checked",!0),$("#o_bt").attr("display","none"),$("#o_spdif").attr("display","none"),$("#o_i2s").attr("display","inline"),on="i2s")}function F(n,t,o){console.log(n.status),console.log(o),""!==o&&jn(o,"MESSAGING_ERROR")}function Y(n){$("#toast_"+n).css("display","none"),$("#toast_"+n).removeClass("table-success").removeClass("table-warning").removeClass("table-danger").addClass("table-success"),$("#msg_"+n).html("")}function J(n,t,o){var r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],e="table-success";"MESSAGING_WARNING"===t?e="table-warning":"MESSAGING_ERROR"===t&&(e="table-danger"),$("#toast_"+n).css("display","block"),$("#toast_"+n).removeClass("table-success").removeClass("table-warning").removeClass("table-danger").addClass(e);var a=o.substring(0,o.length-1).encodeHTML().replace(/\n/g," ");a=($("#msg_"+n).html().length>0&&r?$("#msg_"+n).html()+" ":"")+a,$("#msg_"+n).html(a)}window.hideSurrounding=function(n){$(n).parent().parent().hide()},window.hFlash=function(){$("#flashfilename").val(""),B({event:M.START_OTA,url:$("#fw-url-input").val()})},window.handleReboot=function(n){"reboot_ota"==n?($("#reboot_ota_nav").removeClass("active").prop("disabled",!0),hn(500,"","reboot_ota")):($("#reboot_nav").removeClass("active"),hn(500,"",n))};var Q,V="https://api.github.com/repos/sle118/squeezelite-esp32/releases",H=!1,W=!1,Z=0,q="MESSAGING_INFO",K=!1,X=null,nn={},tn=null,on="",rn="",en="Squeezelite-ESP32",an="",ln=en,dn=en,mn={},cn={},sn="",pn=0,bn=1,gn=2;function fn(){K=!0,setTimeout(En,3e3)}function un(n){var t={};$("input.nvs").each((function(o,r){if(n)t[r.id]=r.value;else{var e=parseInt(r.attributes.nvs_type.value,10);""!==r.id&&(t[r.id]={},t[r.id].value=e===p||e===b||e===g||e===f||e===u||e===h||e===x||e===v?parseInt(r.value):r.value,t[r.id].type=e)}}));var o=$("#nvs-new-key").val(),r=$("#nvs-new-value").val();return""!==o&&(n?t[o]=r:(t[o]={},t[o].value=r,t[o].type=33)),t}function hn(n,t){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"reboot",r="/"+o+".json";$("tbody#tasks").empty(),$("#tasks_sect").css("visibility","collapse"),m.Promise.resolve({cmdname:t,url:r}).delay(n).then((function(n){n.cmdname.length>0?J(n.cmdname,"MESSAGING_WARNING","System is rebooting.\n",!0):jn("System is rebooting.\n","MESSAGING_WARNING"),console.log("now triggering reboot"),$("button[onclick*='handleReboot']").addClass("rebooting"),$.ajax({url:n.url,dataType:"text",method:"POST",cache:!1,contentType:"application/json; charset=utf-8",data:JSON.stringify({timestamp:Date.now()}),error:F,complete:function(){console.log("reboot call completed"),m.Promise.resolve(n).delay(6e3).then((function(n){n.cmdname.length>0&&Y(n.cmdname),Rn(),Nn()}))}})}))}function xn(n){return $(".upf").filter((function(){return $(this).text().toUpperCase()===n.toUpperCase()})).length>0&&($("#splf").val(n).trigger("input"),!0)}function vn(n){return n>=-55?"#signal-wifi-fill":n>=-60?"#signal-wifi-3-fill":n>=-65?"#signal-wifi-2-fill":n>=-70?"#signal-wifi-1-fill":"#signal-wifi-line"}function wn(){$.getJSON("/scan.json",e()(i.a.mark((function n(){return i.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,Tn(2e3);case 2:$.getJSON("/ap.json",(function(n){n.length>0&&(n.sort((function(n,t){var o=n.rssi,r=t.rssi;return or?-1:0})),kn(n))}));case 3:case"end":return n.stop()}}),n)}))))}function yn(n,t,o){return''.concat(n,' \n \n \t\n\t\t\t\t \n\t\t\t \n \n \n \n \n \n\n ')}function kn(n){var t="";if($("#wifiTable tr td:first-of-type").text(""),$("#wifiTable tr").removeClass("table-success table-warning"),n&&(n.forEach((function(n){t+=yn(n.ssid,n.rssi,n.auth)})),$("#wifiTable").html(t)),0==$(".manual_add").length&&($("#wifiTable").append(yn("Manual add",0,0)),$("#wifiTable tr:last").addClass("table-light text-dark").addClass("manual_add")),!mn.ssid||mn.urc!==A&&mn.urc!==E)$("span#foot-wifi").html("");else{var o,r='#wifiTable td:contains("'.concat(mn.ssid,'")');if(0==$(r).filter((function(){return $(this).text()===mn.ssid})).length)$("#wifiTable").prepend("".concat(yn(mn.ssid,null!==(o=mn.rssi)&&void 0!==o?o:0,0)));$(r).filter((function(){return $(this).text()===mn.ssid})).siblings().first().html("✓").parent().addClass(mn.urc===A?"table-success":"table-warning"),$("span#foot-wifi").html("SSID: ".concat(mn.ssid," , IP: ").concat(mn.ip," ")),$("#wifiStsIcon").attr("xlink:href",vn(mn.rssi))}}function An(n){console.debug(this.toLocaleString()+"\t"+n.nme+"\t"+n.cpu+"\t"+_[n.st]+"\t"+n.minstk+"\t"+n.bprio+"\t"+n.cprio+"\t"+n.num),$("tbody#tasks").append(''+n.num+" "+n.nme+" "+n.cpu+" "+_[n.st]+" "+n.minstk+" "+n.bprio+" "+n.cprio+" ")}function Sn(n){return $("".concat("#cfg-audio-bt_source-sink_name"," option:contains('").concat(n,"')"))}function $n(n){if($("#WifiConnectDialog").is(":visible")){if(mn.ip&&$("#ipAddress").text(mn.ip),mn.ssid&&$("#connectedToSSID").text(mn.ssid),mn.gw&&$("#gateway").text(mn.gw),mn.netmask&&$("#netmask").text(mn.netmask),(void 0===cn.Action||cn.Action&&cn.Action==gn)&&($("*[class*='connecting']").hide(),$(".connecting-status").show()),nn.ap_ssid&&$("#apName").text(nn.ap_ssid),nn.ap_pwd&&$("#apPass").text(nn.ap_pwd),!n)return;switch(n.urc){case A:n.ssid&&n.ssid===cn.ssid&&($("*[class*='connecting']").hide(),$(".connecting-success").show(),cn.Action=gn);break;case S:cn.Action!=gn&&cn.ssid==n.ssid&&($("*[class*='connecting']").hide(),$(".connecting-fail").show());break;case z:break;case E:cn.Action!=gn&&cn.ssid!=n.ssid&&($("*[class*='connecting']").hide(),$(".connecting-fail").show())}}}function zn(n){(function(n){return n.urc!==mn.urc||n.ssid!==mn.ssid||n.gw!==mn.gw||n.netmask!==mn.netmask||n.ip!==mn.ip||n.rssi!==mn.rssi})(n)&&(mn=n,kn()),$n(n)}function En(){K&&fn(),W||(W=!0,$.getJSON("/messages.json",function(){var n=e()(i.a.mark((function n(t){var o,r,e,a,l,d,m,s,p,b,g;return i.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:o=c(t);try{for(e=function(){var n,t,o=r.value,e=o.current_time-o.sent_time;switch((a=new Date).setTime(a.getTime()-e),o.class){case"MESSAGING_CLASS_OTA":B({ota_pct:null!==(n=(l=JSON.parse(o.message)).ota_pct)&&void 0!==n?n:-1,ota_dsc:null!==(t=l.ota_dsc)&&void 0!==t?t:"",event:M.PROCESS_OTA});break;case"MESSAGING_CLASS_STATS":d=JSON.parse(o.message),console.debug(a.toLocalShort()+" - Number of running tasks: "+d.ntasks),console.debug(a.toLocalShort()+"\tname\tcpu\tstate\tminstk\tbprio\tcprio\tnum"),d.tasks?("collapse"===$("#tasks_sect").css("visibility")&&$("#tasks_sect").css("visibility","visible"),$("tbody#tasks").html(""),d.tasks.sort((function(n,t){return t.cpu-n.cpu})).forEach(An,a)):"visible"===$("#tasks_sect").css("visibility")&&($("tbody#tasks").empty(),$("#tasks_sect").css("visibility","collapse"));break;case"MESSAGING_CLASS_SYSTEM":On(o,a);break;case"MESSAGING_CLASS_CFGCMD":J((m=o.message.split(/((?:(?!\n)[\s\S])*)\n([\s\S]*)/g))[1],o.type,m[2],!0);break;case"MESSAGING_CLASS_BT":if($("#cfg-audio-bt_source-sink_name").is("input")){for(s=$("#cfg-audio-bt_source-sink_name")[0].attributes,p="",b=0;b').concat(g," "))}JSON.parse(o.message).forEach((function(n){Sn(n.name).length>0||($("#cfg-audio-bt_source-sink_name").append("".concat(n.name," ")),On({type:o.type,message:"BT Audio device found: ".concat(n.name," RSSI: ").concat(n.rssi," ")},a)),Sn(n.name).attr("data-description","".concat(n.name," (").concat(n.rssi,"dB)")).attr("rssi",n.rssi).attr("value",n.name).text("".concat(n.name," [").concat(n.rssi,"dB]")).trigger("change")})),$("#cfg-audio-bt_source-sink_name").append($("".concat("#cfg-audio-bt_source-sink_name"," option")).remove().sort((function(n,t){return console.log("".concat(parseInt($(n).attr("rssi"))," < ").concat(parseInt($(t).attr("rssi"))," ? ")),parseInt($(n).attr("rssi"))[recovery]":"")),$("span#foot-fw").html("fw: ".concat(en," , mode: ").concat(H?"Recovery":ln," "))):$("span#flash-status").html(""),n.Voltage?($("#battery").attr("xlink:href","#".concat(function(n){if(n>0)return Cn(n,5.8,6.8)||Cn(n,8.8,10.2)||Cn(n,6.8,7.4)||Cn(n,10.2,11.1)||Cn(n,7.4,7.5)||Cn(n,11.1,11.25)?"battery-low-line":Cn(n,7.5,7.8)||Cn(n,11.25,11.7)?"battery-fill":"battery-line"}(n.Voltage))),$("#battery").show()):$("#battery").hide(),""!=(null!==(r=n.message)&&void 0!==r?r:"")&&an!=n.message&&(an=n.message,jn(n.message,"MESSAGING_INFO")),$("button[onclick*='handleReboot']").removeClass("rebooting"),void 0===Q||n.lms_ip!=sn&&n.lms_ip&&n.lms_port){var e="http://"+n.lms_ip+":"+n.lms_port;sn=n.lms_ip,$.ajax({url:e+"/plugins/SqueezeESP32/firmware/-check.bin",type:"HEAD",dataType:"text",cache:!1,error:function(){Q=""},success:function(){Q=e}})}$("#o_jack").attr("display",Number(n.Jack)?"inline":"none"),W=!1})).fail((function(n,t,o){F(n,0,o),W=!1})))}function _n(n,t,o){return void 0!==n.values[t]?n.values[t][o]:""}function Rn(){$.getJSON("/commands.json",(function(n){console.log(n),$(".orec").show(),n.commands.forEach((function(t){if(0===$("#flds-"+t.name).length){var o=t.name.split("-"),r="cfg"===o[0],e="#tab-"+o[0]+"-"+o[1],a="";a+='',a+='
',t.argtable&&t.argtable.forEach((function(o){var r=o.datatype||"",e=t.name+"-"+o.longopts,i=_n(n,t.name,o.longopts),l="hasvalue="+o.hasvalue+" ";l+='longopts="'+o.longopts+'" ',l+='shortopts="'+o.shortopts+'" ',l+="checkbox="+o.checkbox+" ",l+='cmdname="'+t.name+'" ',l+='id="'+e+'" name="'+e+'" hasvalue="'+o.hasvalue+'" ';var d=o.mincount>0?"bg-success":"";"hidden"===o.glossary&&(l+=' style="visibility: hidden;"'),o.checkbox?(a+=' ",r?$(e).append(a):$("#commands-list").append(a)}})),n.commands.forEach((function(t){$("[cmdname="+t.name+"]:input").val(""),$("[cmdname="+t.name+"]:checkbox").prop("checked",!1),t.argtable&&t.argtable.forEach((function(o){var r="#"+t.name+"-"+o.longopts,e=_n(n,t.name,o.longopts);o.checkbox?$(r)[0].checked=e:(void 0!==e&&$(r).val(e).trigger("change"),0===$(r)[0].value.length&&(o.datatype||"").includes("|")&&($(r)[0].value="--"))}))}))})).fail((function(n,t,o){404==n.status?$(".orec").hide():F(n,0,o),$("#commands-list").empty(),W=!1}))}function Nn(){$.getJSON("/config.json",(function(n){$("#nvsTable tr").remove();var t=n.config?n.config:n;nn=t,Object.keys(t).sort().forEach((function(n){var o=t[n].value;if("autoexec"===n)"0"===t.autoexec.value?$("#disable-squeezelite")[0].checked=!0:$("#disable-squeezelite")[0].checked=!1;else if("autoexec1"===n){var r=/-o\s?(["][^"]*["]|[^-]+)/g.exec(o);r[1].toUpperCase().startsWith("I2S")?P("i2s"):r[1].toUpperCase().startsWith("SPDIF")?P("spdif"):r[1].toUpperCase().startsWith('"BT')&&P("bt")}else"host_name"===n?(o=o.replaceAll('"',""),$("input#dhcp-name1").val(o),$("input#dhcp-name2").val(o),$("#player").val(o),document.title=o,rn=o):"rel_api"===n&&(V=o);$("tbody#nvsTable").append("
"+n+" "),$("input#"+n).val(t[n].value)})),$("tbody#nvsTable").append("
"),n.gpio?($("#pins").show(),$("tbody#gpiotable tr").remove(),n.gpio.forEach((function(n){$("tbody#gpiotable").append("
'+n.group+" "+n.name+" "+n.gpio+" "+(n.fixed?"Fixed":"Configuration")+" ")}))):$("#pins").hide()})).fail((function(n,t,o){F(n,0,o),W=!1}))}function jn(n,t){On({message:n,type:t},new Date)}function On(n,t){var o="table-success";"MESSAGING_WARNING"===n.type?(o="table-warning","MESSAGING_INFO"===q&&(q="MESSAGING_WARNING")):"MESSAGING_ERROR"===n.type&&("MESSAGING_INFO"!==q&&"MESSAGING_WARNING"!==q||(q="MESSAGING_ERROR"),o="table-danger"),++Z>0&&($("#msgcnt").removeClass("badge-success"),$("#msgcnt").removeClass("badge-warning"),$("#msgcnt").removeClass("badge-danger"),$("#msgcnt").addClass(k[q]),$("#msgcnt").text(Z)),$("#syslogTable").append("
"+t.toLocalShort()+" "+n.message.encodeHTML()+" ")}function Cn(n,t,o){return(n-t)*(n-o)<=0}function Tn(n){return new m.Promise((function(t){return setTimeout(t,n)}))}m.Promise.prototype.delay=function(n){return this.then((function(t){return new m.Promise((function(o){setTimeout((function(){o(t)}),n)}))}),(function(t){return new m.Promise((function(o,r){setTimeout((function(){r(t)}),n)}))}))},window.saveAutoexec1=function(n){J("cfg-audio-tmpl","MESSAGING_INFO","Saving.\n",!1);var t='squeezelite -b 500:2000 -d all=info -C 30 -W -n "'+$("#player").val()+'"';"bt"===on?(t+=' -o "BT" -R -Z 192000',J("cfg-audio-tmpl","MESSAGING_INFO","Remember to configure the Bluetooth audio device name.\n",!0)):t+="spdif"===on?" -o SPDIF -Z 192000":" -o I2S",""!==$("#optional").val()&&(t+=" "+$("#optional").val());var o={timestamp:Date.now()};o.config={autoexec1:{value:t,type:33},autoexec:{value:$("#disable-squeezelite").prop("checked")?"0":"1",type:33}},$.ajax({url:"/config.json",dataType:"text",method:"POST",cache:!1,contentType:"application/json; charset=utf-8",data:JSON.stringify(o),error:F,complete:function(t){t.responseText.result&&"OK"===JSON.parse(t.responseText).result?(J("cfg-audio-tmpl","MESSAGING_INFO","Done.\n",!0),n&&hn(1500,"cfg-audio-tmpl")):t.responseText.result?J("cfg-audio-tmpl","MESSAGING_WARNING",JSON.parse(t.responseText).Result+"\n",!0):J("cfg-audio-tmpl","MESSAGING_ERROR",t.statusText+"\n"),console.log(t.responseText)}}),console.log("sent data:",JSON.stringify(o))},window.handleDisconnect=function(){$.ajax({url:"/connect.json",dataType:"text",method:"DELETE",cache:!1,contentType:"application/json; charset=utf-8",data:JSON.stringify({timestamp:Date.now()})})},window.handleConnect=function(){cn.ssid=$("#manual_ssid").val(),cn.pwd=$("#manual_pwd").val(),cn.dhcpname=$("#dhcp-name2").val(),$("*[class*='connecting']").hide(),$("#ssid-wait").text(cn.ssid),$(".connecting").show(),$.ajax({url:"/connect.json",dataType:"text",method:"POST",cache:!1,contentType:"application/json; charset=utf-8",data:JSON.stringify({timestamp:Date.now(),ssid:cn.ssid,pwd:cn.pwd}),error:F}),fn()},$(document).ready((function(){$("#wifiTable").on("click","tr",(function(){})),$("#fw-url-input").on("input",(function(){$(this).val().length>8&&($(this).val().startsWith("http://")||$(this).val().startsWith("https://"))?$("#start-flash").show():$("#start-flash").hide()})),$(".upSrch").on("input",(function(){var n=this.value;$("#rTable tr").removeClass(this.id+"_hide"),n.length>0&&$("#rTable td:nth-child(".concat($(this).parent().index()+1,")")).filter((function(){return!$(this).text().toUpperCase().includes(n.toUpperCase())})).parent().addClass(this.id+"_hide"),$('[class*="_hide"]').hide(),$("#rTable tr").not('[class*="_hide"]').show()})),setTimeout(wn,1500),$("#otadiv").on("hidden.bs.modal",(function(){N=R.NONE})),$("#WifiConnectDialog").on("shown.bs.modal",(function(){$("*[class*='connecting']").hide(),cn.Action!==gn?($(".connecting-init").show(),$("#manual_ssid").trigger("focus")):$n()})),$("#WifiConnectDialog").on("hidden.bs.modal",(function(){$("#WifiConnectDialog input").val("")})),$("#uCnfrm").on("shown.bs.modal",(function(){$("#selectedFWURL").text($("#fw-url-input").val())})),$("input#show-commands")[0].checked=1===tn,$('a[href^="#tab-commands"]').hide(),$("#load-nvs").on("click",(function(){$("#nvsfilename").trigger("click")})),$("#clear-syslog").on("click",(function(){Z=0,q="MESSAGING_INFO",$("#msgcnt").text(""),$("#syslogTable").html("")})),$("#wifiTable").on("click","tr",(function(){cn.Action=pn,$(this).children("td:eq(1)").text()!=mn.ssid?$(this).is(":last-child")?(cn.Action=bn,cn.ssid="",$("#manual_ssid").val(cn.ssid)):(cn.ssid=$(this).children("td:eq(1)").text(),$("#manual_ssid").val(cn.ssid)):cn.Action=gn})),$("#ok-credits").on("click",(function(){$("#credits").slideUp("fast",(function(){})),$("#app").slideDown("fast",(function(){}))})),$("#acredits").on("click",(function(n){n.preventDefault(),$("#app").slideUp("fast",(function(){})),$("#credits").slideDown("fast",(function(){}))})),$("input#show-commands").on("click",(function(){this.checked=this.checked?1:0,this.checked?($('a[href^="#tab-commands"]').show(),tn=1):(tn=0,$('a[href^="#tab-commands"]').hide())})),$("input#show-nvs").on("click",(function(){this.checked=this.checked?1:0,this.checked?$('*[href*="-nvs"]').show():$('*[href*="-nvs"]').hide()})),$("#save-as-nvs").on("click",(function(){var n=un(!0),t=document.createElement("a");t.href=URL.createObjectURL(new Blob([JSON.stringify(n,null,2)],{type:"text/plain"})),t.setAttribute("download","nvs_config_"+rn+"_"+Date.now()+"json"),document.body.appendChild(t),t.click(),document.body.removeChild(t)})),$("#save-nvs").on("click",(function(){T(un(!1))})),$("#fwUpload").on("click",(function(){var n=document.getElementById("flashfilename").files;0===n.length?alert("No file selected!"):B({event:M.START_OTA,file:n[0]})})),$("[name=output-tmpl]").on("click",(function(){P(this.id)})),$("#chkUpdates").on("click",(function(){$("#rTable").html(""),$.getJSON(V,(function(n){var t=[];n.forEach((function(n){var o=n.name.split("#")[3];t.includes(o)||t.push(o)}));var o="";t.forEach((function(n){o+='
'+n+" "})),$("#fwbranch").append(o),n.forEach((function(n){var t="";n.assets.forEach((function(n){n.name.match(/\.bin$/)&&(t=n.browser_download_url)}));var o=n.name.split("#"),r=o[0],e=o[2],a=o[3],i=r.substr(r.lastIndexOf("-")+1);i="32"==i||"16"==i?i:"";var l=n.body;l=(l=(l=l.replace(/'/gi,'"')).replace(/[\s\S]+(### Revision Log[\s\S]+)### ESP-IDF Version Used[\s\S]+/,"$1")).replace(/- \(.+?\) /g,"- "),$("#rTable").append("
\n ").concat(r," ").concat(new Date(n.created_at).toLocalShort(),"\n ").concat(e," ").concat(a," ").concat(i," "))})),$("#searchfw").css("display","inline"),xn(dn)||xn(ln),$("#rTable tr.release").on("click",(function(){var n=this.attributes.fwurl.value;Q&&(n=n.replace(/.*\/download\//,Q+"/plugins/SqueezeESP32/firmware/")),$("#fw-url-input").val(n),$("#start-flash").show(),$("#rTable tr.release").removeClass("table-success table-warning"),$(this).addClass("table-success table-warning")}))})).fail((function(){alert("failed to fetch release history!")}))})),$("#fwcheck").on("click",(function(){$("#releaseTable").html(""),$("#fwbranch").empty(),$.getJSON(V,(function(n){var t,o=0,r=[];n.forEach((function(n){var t=n.name.split("#")[3];r.includes(t)||r.push(t)})),r.forEach((function(n){t+='
'+n+" "})),$("#fwbranch").append(t),n.forEach((function(n){var t="";n.assets.forEach((function(n){n.name.match(/\.bin$/)&&(t=n.browser_download_url)}));var r=n.name.split("#"),e=r[0],a=r[1],i=r[2],l=r[3],d=n.body;d=(d=(d=d.replace(/'/gi,'"')).replace(/[\s\S]+(### Revision Log[\s\S]+)### ESP-IDF Version Used[\s\S]+/,"$1")).replace(/- \(.+?\) /g,"- ");var m=o++>6?" hide":"";$("#releaseTable").append("
"+e+" "+new Date(n.created_at).toLocalShort()+" "+i+" "+a+" "+l+" ")})),o>7&&($("#releaseTable").append("
"),$("#showallbutton").on("click",(function(){$("tr.hide").removeClass("hide"),$("tr#showall").addClass("hide")}))),$("#searchfw").css("display","inline")})).fail((function(){alert("failed to fetch release history!")}))})),$("#updateAP").on("click",(function(){wn(),console.log("refresh AP")})),Nn(),Rn(),fn()})),window.setURL=function(n){var t=n.dataset.url;$('[data-url^="http"]').addClass("btn-success").removeClass("btn-danger"),$('[data-url="'+t+'"]').addClass("btn-danger").removeClass("btn-success"),Q&&(t=t.replace(/.*\/download\//,Q+"/plugins/SqueezeESP32/firmware/")),$("#fwurl").val(t)},window.runCommand=function(n,t){var o=n.attributes.cmdname.value;J(n.attributes.cmdname.value,"MESSAGING_INFO","Executing.",!1);var r=document.getElementById("flds-"+o);if(o+=" ",r)for(var e=r.querySelectorAll("select,input"),a=0;a
3600 * (5 + rand());
use constant GITHUB_RELEASES_URI => "https://api.github.com/repos/sle118/squeezelite-esp32/releases";
use constant GITHUB_ASSET_URI => GITHUB_RELEASES_URI . "/assets/";
use constant GITHUB_DOWNLOAD_URI => "https://github.com/sle118/squeezelite-esp32/releases/download/";
-use constant ESP32_STATUS_URI => "/status.json";
+use constant ESP32_STATUS_URI => "http://%s/status.json";
my $FW_DOWNLOAD_REGEX = qr|plugins/SqueezeESP32/firmware/([-a-z0-9-/.]+\.bin)$|i;
my $FW_FILENAME_REGEX = qr/^squeezelite-esp32-.*\.bin(\.tmp)?$/;
@@ -61,7 +61,7 @@ sub initFirmwareDownload {
{
timeout => 10
}
- )->get('http://' . $client->ip . ESP32_STATUS_URI);
+ )->get(sprintf(ESP32_STATUS_URI, $client->ip));
Slim::Utils::Timers::setTimer($client, Time::HiRes::time() + FIRMWARE_POLL_INTERVAL, \&initFirmwareDownload);
}
@@ -128,6 +128,15 @@ sub handleFirmwareDownload {
return $_errorDownloading->(undef, 'Invalid request', $request->uri, 400);
}
+ # this is the magic number used on the client to figure out whether the plugin does support download proxying
+ if ($path eq '-check.bin' && $request->method eq 'HEAD') {
+ $response->code(204);
+ $response->header('Access-Control-Allow-Origin' => '*');
+
+ $httpClient->send_response($response);
+ return Slim::Web::HTTP::closeHTTPSocket($httpClient);
+ }
+
main::INFOLOG && $log->is_info && $log->info("Requesting firmware from: $path");
downloadFirmwareFile(sub {