From 6fee1a61d22591c94ecc86681e236932623dd6e4 Mon Sep 17 00:00:00 2001
From: Joe91 <1015.5@gmx.de>
Date: Sun, 8 Jan 2023 16:28:39 +0100
Subject: [PATCH 01/15] feature tts as playmode and button-action
---
html/management_DE.html | 61 ++++++++++++++++++++++++++++++++++++-
html/management_EN.html | 61 ++++++++++++++++++++++++++++++++++++-
src/AudioPlayer.cpp | 66 ++++++++++++++++++++++++++++++++++++++---
src/AudioPlayer.h | 1 +
src/Cmd.cpp | 16 ++++++++++
src/Web.cpp | 2 ++
src/values.h | 2 ++
7 files changed, 203 insertions(+), 6 deletions(-)
diff --git a/html/management_DE.html b/html/management_DE.html
index 1c76da63..d144df66 100644
--- a/html/management_DE.html
+++ b/html/management_DE.html
@@ -228,6 +228,39 @@
+
+
+
+
+
+
@@ -295,6 +328,7 @@
+
@@ -318,6 +352,7 @@
+
@@ -464,6 +499,18 @@
+
+
+
+
+
+
+
+
@@ -295,6 +328,7 @@
+
@@ -317,6 +351,7 @@
+
@@ -463,6 +498,18 @@
+
+
-
@@ -350,6 +350,7 @@
+
From 7077626f2b116281202aa6cfe75950cdd44d431d Mon Sep 17 00:00:00 2001
From: Joe91 <1015.5@gmx.de>
Date: Sun, 8 Jan 2023 20:56:32 +0100
Subject: [PATCH 03/15] some cleanup on the website
---
html/management_DE.html | 12 ++++++------
html/management_EN.html | 4 ++--
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/html/management_DE.html b/html/management_DE.html
index d144df66..fd24988d 100644
--- a/html/management_DE.html
+++ b/html/management_DE.html
@@ -229,9 +229,9 @@
@@ -1347,6 +1380,15 @@
var myJSON = JSON.stringify(myObj);
socket.send(myJSON);
}
+ function executeCommand() {
+ var myObj = {
+ "controls": {
+ action: document.getElementById('commandId').value
+ }
+ };
+ var myJSON = JSON.stringify(myObj);
+ socket.send(myJSON);
+ }
function sendVolume(vol) {
var myObj = {
"controls": {
From fef0288eb8d5b4bb79c996443f4cd9030aa6dbd9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Laszlo=20Heged=C3=BCs?=
Date: Fri, 10 Feb 2023 20:02:50 +0100
Subject: [PATCH 07/15] Bugfix for automatic file generation
Fixed some errors in the accesspoint html files, which created
double text entries.
Modifed processHtml.py to automatically generate the needed files.
Following functions are implemented:
- listed HTML files will be minified but not compressed
- Files ending in json will be minified & compressed
- Every other file will be compressed without further post processing
"Flask_Minify" is used as html and "json" as json minifier.
dist folder is removed since the source folder is used directly.
---
dist/accesspoint.html | 1 -
dist/js/i18next.min.js.gz | Bin 14906 -> 0 bytes
dist/js/i18nextHttpBackend.min.js.gz | Bin 3334 -> 0 bytes
dist/js/loc_i18next.min.js.gz | Bin 1192 -> 0 bytes
dist/locales/de.json.gz | Bin 2392 -> 0 bytes
dist/locales/en.json.gz | Bin 1988 -> 0 bytes
dist/management.html | 1 -
html/accesspoint.html | 6 +-
...{loc-i18next.min.js => loc_i18next.min.js} | 0
html/management.html | 8 +-
processHtml.py | 84 ++++++++++++------
11 files changed, 63 insertions(+), 37 deletions(-)
delete mode 100644 dist/accesspoint.html
delete mode 100644 dist/js/i18next.min.js.gz
delete mode 100644 dist/js/i18nextHttpBackend.min.js.gz
delete mode 100644 dist/js/loc_i18next.min.js.gz
delete mode 100644 dist/locales/de.json.gz
delete mode 100644 dist/locales/en.json.gz
delete mode 100644 dist/management.html
rename html/js/{loc-i18next.min.js => loc_i18next.min.js} (100%)
diff --git a/dist/accesspoint.html b/dist/accesspoint.html
deleted file mode 100644
index 11cbe73f..00000000
--- a/dist/accesspoint.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/dist/js/i18next.min.js.gz b/dist/js/i18next.min.js.gz
deleted file mode 100644
index af1abbf0017325c2104b3a13377db4f87b978ab8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 14906
zcmV-AI>p5wiwFpn5yxW!0BJEeZe@6ME^TRUE^2cC>|1$r<1`fiDye~BQ(-8_3^*9G
z(B-Bul;e*iFm9rzW*sTWa*t{9-T6tfEID>sZWxBy*^REJ_w@8`d56bako;4F1T
zN0k%>&NH#&BZcl>P+1EGqyu!G->olri33-%&TgYS7^2bd%H8m!s}d&SlS*_5~lH40Rq*E
z)7vep%M!xtX^MG
zp?MCn?22e&K%C@&Di&odF<@vrCJJ*!mmthA~~aXC26G
zWrwatlIC&+v6f}bxPi(*iS&Ur
zdK(FG5O4{XMJb`*&fzz*cvWRa!%%%*D;b~;$0dMeGujPJh3%idwLJu
zO9C|)5ToEe2ecIb0TMLgjerE)rm|_kGB-ha5*W(NeWnOhR%U>26ah#ROm|5y>QySu
zFZgC?hT%L_14DFsV6+7&d4H`_R@yrzk*RVBPlU)Jw$OjXU+f(^VbEVWWpf9Bjz<@{nK@*l`UIMZW65=Hu{=PK0VcBm3@8@r;Jv4rCKh^ll$;$V0j*SSw;kBNq406{NtQr1SGhq5ZYHTiN67rsA
z`tgd|p-l|pYE#0b;%bH*AgmB`$lw9eZg;z#&PjJj#}_JMY;L#ZCBM8JrmA})?Q%ky
z^+wa)h>MK|LQ0iOs1RaFODgH82ke=T^`PHy5l~-YnWwPw-IGkde3BsH6zPddZgp16
zrsCxjUv-7f`g?TP^mjV9LfKz3;lp=B8;5NC7-2fx=pzYU3K}$pLo>K&QVd5yvOy#X
z$Z<-p@wM{nYERdpL5J&YScUj#jeOPHRht@`G8jLBZLC1DSWpBP*EFR>wN;D-7wSc)
zcit_Vq6^J}0Lp$$-J-Qk=IJo!q!BZwFYgx4uPVpBQ9~KdtBfGpfMoGboZB2EGl03>3
zT;iLaD7)V!_ediXN}eSiI={m5rD3ZL3NO4c8uuRqdMe^)Ajp9{^9+{(P+G>+TEg-B
zOzD(}tjn76xr4pwqElP3R?b}YEfdKzorF8cTMKD#1a|_D8wG8e8YoEAIlZj984C4U
znhkhL0eh+b_3D(SU^XBPQm>Xnt22Fbm`T-il-%kLQ612nxS4_K&$%zhPGG0AmuJ)2
zeD=!hezu#1vuO6x?0A;V;@NEW!|eIlcCO@kHhX>?L^_T6DZLNIP`Yux-b@g7yrbHs
zRLyr)bETRu1}~!dbItYmi)#G2*WXs{S9JUKwGSu3&Y6v`9C3Z_Wj?v%cis(NoV}u`
z8Z!PrL8F!JH!0WWgC+MHXfVGSkIiq)^6O%iOO6|Ci*ox@aSdbnWJQ@g&1DYIgYyr~
zIn(jQ`6o}c?I2&LQ+Qya|77@kgujzu?pSm7pDs9j@Rt-E&i;i3hqJ%4;NTei)aAh~
zF6}FvW;j(t{ka4pRNR}Ed$EZc|8=5-t~U#tpRYSh2FjNp{PxZ+dUYbjot3WlIWK9>
zJpZF&G8F%`o;FhA@E^KY0TW^F4US-iJle8h(LdQsv
z|6ny?X`c>3TJcj)3bd>!q*NH0*L%1HEdjNeV7`Mq^|ZWSuy}2-VDZ{K^E(Mb0vw`w
zU!Y2^8-%JoanCR|gn)AJl#&8DXYr1(+IDa+<;TZ*(V-pY9ptq~
zkqHQ1&i!7tjR+8
zZA0&lTV}Pv)lTp8Vd^`&3PJ~IHIni)6khNxtgdsC|L&?6tCDFTMb4@+*ZMmr&4c9G
zdD5BK*`qWms!;O8w8|RwA)n(d-1Li(N0^S6aG$DDhFqPub+Vi|aj}ES$DPwnE{tam
zhbK}M1`k0OE5-%=^!&@SbFHbhpxET0dGm0{U0^G0PMt58XZe~|8$=-0!E&A5nN`-!
zW9pq($K$j(BaDM
z>w^OH`aJVHiMrX;#n_$e%DUaer?)dh3U7;{%gP2vI~xuyfL=@~fi*-R-OIEv7D8{l
zB$s&0(gVwQ#u|IdqeQ`Y8DgwsJiVTJd7IJRDt)HaMC$~}TfZpQp(^d^K9gb1nwnWhfkTN0T%YmUZpE5>ThgOzwF$rw91+W(A!b&8
zjS4wlwr-oN+>%9osX*cjA)T6cTvM2uW4fQxOKy@#8;}DqYR>DONFRU`HA^fVh^Qc)
zkFjWwLGL5VEDy>Y;kG!{*
zgYW}Yd4{)R`+|kB;&HBZ{lMdlYy1r=G~Km&Zaj8X&yG3JeS@N_3m#o&+EC``(uf`>
zYQMUo_jS(3kmq}$->@mz7w);gHYSNkaD4*n+?`(V^#)POMS+XHd-ByMS#wQD5y&8A
zQSunUI`x15?(>|j>U=doup`&wz0XDqdd}DM8y84D=J9)|Lu#GH(UJO~#jgs;NLA*M
zVL}N8%i|J6?SWta77dx*y_2fTYg8Akz
zDZxDX7nWe2{4*t(@BS~r{EJI43fs3S?9^xOc9=@Db4)j1@_rX0Jomq&v~=^|oo4SR
z&v`^Z^?~GB=OXKH8i>X>or4?jKtb7fgl}b0R_JfaTIA)|<{eF7pkR`U4Tq!Qs(X8{^fHOuHdPslF@*x-NT%uF!eddG`gOjy6I(Jz%JCvid2Xb^~Ka;t#Ut+ek1TNIP
zOT2TNcrUJSJo=EsrNF9Ph-F0TCD!z|sATo$e;4F`vEADRJZuTyJZT8MJ
zMceIg#HK$TC{pG>rZW8)lBY+Z52K$>PK}BD%tL^kfzaZ4^{6o7lBYhmC;7V|w_O=m^@YhS!&hO7BAuJV
zZCj-*c3=`C!W^goWNvn?u7j>9lGC&4v|P=&^a5lqB4|
zUDs`*2696Nam1amR6n&Is)W_}wn#~mIsi}W_9>cBbTp^h5U5|$)-Wn7CPOq?{cO!v
z-yn7BD2l}1f8b!z9_<`vy5#xNO9#HxQy=T-S7_DzO%S2;b`gOf170OP#y;5?0@AH3
z1#wa7U$|YJVognn0NuGU21V*wDFb^-WezWq?e#n6pgTn>Z7%(Nns*i6#G>-%#;EUeVAzFszJ>T&1jQkPez^tA$y(RIbAN-0m{6t*f@R
zh{!TZ9$T~9-*lm%7CIhUcKw!AoV`w$K%TQ_|1Xcg)j
zHIsDOmaokJI+_Qh9r>_PE`Q7z%sJweXP#hb{npZ4WqzkCRBoKyq(^$nML^r_-au@U
z&?l8S2f6KkpL31tzA&+HcaZ6`cwPFg3J)PkX;|k(O(l=3>V_w$J?>`*O4C
zaO-_hC^RtCrvNL#k?mo+h5pZuvNTbpnr*0|Yb9-;QcB^cipekrP%Nr9iri;kRuyxa
zXS!jQm5jF7rGo6wWT5qli(q%};qEHlHDB|$-dlKa2p#cHp{fPhjYCj8+pF?3h}exTR4@GkYn6k
zjjwAj?m0SQYacD#DdTF*&wbU?sYUb0_0Y=t?%bc8P0w|vWG$h*Q+viNlE98SJ$aly
z1JtKLL3z8zA2NM{vtP=VQb^m9mX~uK9KuX+jXc
z4*VW=i?yoPNHs17ijU_P#@TqMAg
z6V)0qsKd?X*=F-vG8vmA;NrawhpIlhfVt4XFysZF@tD63560l=nmV4kQY7A@UR%5a
zAxT+&IvPEt`T(-Uj4smjs)WZeWu*Opcq_|;${=7Y#9c*~DJxfK`Wj}p+hc^c#p=rXQqpe#aG^?s;IrerdG@ST}ErOsBfXyzQm6-W5b4Skn(Z!
z{=b4RrE6Jn8m)=e=xC`b$NR1N4;#mpG5_RlJWCR>TSq$kj=r_my`7
zx|)RJ{=pSD(Dcl6cRs$1GGX4QS6pz_n8
z^SzfE4)2V_c9&TqbeWNssKTa8X-k0D>ATYleM7SBrxqZ|c==1QCZ-hN@-i!q?8dQW
z#qDi0YI!BpK0-?px!$~;0|3143y^`%V1Sw1PF@Dm0SxyW+xO>|s6o9E_4I^0${nP+
zy{bQH6xY?=-8K;=;jOf&(0OgbBxHAKWu`2w@5X|<{sW}Iq{YGC;8HAIJ*_cW4}_(0
zr%2_Z)?5~UFg;H^9ARR73qCEktP%{6b2WH`6;{tENQ3Uy0FigM-GWPZw_p@JME~g|
zg8W`iBYVqHRPPqdA*vwz$!~@W>_kBfr~;P=z06gyjw)7?mPOi*)Nk}yVKBw3Wtpwh
z#Wf=y!)lgBZNl8jgnDmTT`2IC+sPkijY*>I{){h8&1r>-cPgf1il4p$>S@xQdx&$aP
z!+K-MmPsZe5cR{r`YhVkr^2BpJ}FK
z6tTV`+x(bJwnjg~JoguR8FA5F{gC+_IqYkXygD-Pz|i4c>?#GXV*Z&7)_XHqm77tUt{c~1Rt*LN3M|b#P(}39d>#lDL4fOi8q2)=$k8qB
zCnVqLZ^0KzzrRSO%yZzeEyS%8;$
zfdmV`lX90q#u4v!vfF49GhR{~KK|5ID%<0VYuy`y$ad+Emt5=ViPl5CFF#Q-D0B%Tk~jbMMB)W$p?ZS5g}#J%B*?n
z>`?_jTOL&2Lm!guT~U}2+Pzfos(EBwY`sU&xMwHSxhz6GmaBq}bCd{OIvxSHNFG2(
z#qAUpH~*&VXc}TcGDqwzT1v$S&c4niB0dUSZ-Vp?c!&%++m+-Jny|R6VDRuUEsLIe
zePBnWSOOpZpfz(MrEW}8)t3WQ&PyXg2vo1qk`kTy4uzRo|2VMpmQnS>1cji1rB$I1
zj4qAV1q-PICOc>fx}wxvx>UHp`VhFp*UJT6RM}N7zTy%g;}X$G(LV@-SPL`lK&(&%
zqA$^drS2M$uZ`ANm^JnU8FlpMR^$Rod_aFL)$k@&g$mt|be6pQ^fzx;+p9DTh5rf~
zO}NQ4+W_x%ibVZlOpHeTc4G`+K?FMO281jAcb}(SS@#OQetFo|_Vo0eu4~UZEzj!G
zQG3s+9eJCoCzB+Q=WJjI9W$BJWr{SeOHIMhDaboMDi!>*rj&|@O~peNucouS%-@I~
zbvmBX7yMku3^eP$q~Az5pV4=A^dXVv4{1L9yq2qd#a7R0Vu=G8OE}IkcrMa+?g)30
zTPGS`?5#`1z$g?DxKbz*$_iNSw3IIv(uM2}T~J!v_9qb^v6tX!($r
zlM;3Um~XW>-$Ql5;TTheh#!(%r={Zck&G0EjhejvPzhUhEf0e03a`y9QT0fl3_uaN
z2p$>5*jsB}WVm7$&B>X}(Ov{W@re~x)C21?xgDaBoMjFV$lp=uRU5#m
z^PoJ{plvj~N#U&06Ws2rBRNYExz#?4gi&lazDBZWbu=gaKqJSMdS{9KMGDtGL@Y5c^{QV&0962CU&)Vo7BZ|@Ei)aVKG%grmdB<^c~i7CXMz{`y#5!
zx_S`yX-C4mzKK%6abzTtxvVLcPX
zIbi{ar+}}ihI`N6;y0ZWR)htCWHvW|-I((+6*4CM3kKV+~)4>x2lP)ZVY-#tZ1a?|;o($LLM+1^ipFJppEUyccDg1%+J6|XeU3EB(X
zu;R~zl(m!MmJIKh@#eGTLvzu~xtIuYk&p|isK*;}!7D|Ii6XIO-U@G^DfFFos4Ug@
znBMb(zzcj|XB*_%rkd9(r3Y@73B|vvB8
z>3t{9r$V04H#wa5Vv&^J8AqvKwz)7&q9g0&u0XqQGB~1KrA~$*t9sz1Z=Lik*^%FR
zS?280NtDZ+HJg6rq!;Q2Wb_^R#a6b+Q0~pj>FKs?=*Ts(S{;~PVlp^l{Vdq?cLge5
znAH=)jB_*m9@I?lvtZb+cmhL*7q;Ypk4hj*uPzHX?Y9xX8(>O^B@ZuPtO8G5K-e9}c`?s(Gq7c;%TF8U80Kou1%*~%L$|&>>V2Kvze
zWFNFO*pL;5NpP64a(SZ6FSqULG{Mlc?MnL&1E_*c?4j(#R-Fz>KJd?`FCJfxLSPU;
zR(+NYPLw?yf}8~JETtz}XrZ6+8HDZqgS{dX%@FEgiC#+yZSiBK{@HEo;m0yF_|4AR
zuE*fPuaecxu%$0gin^ADmetkyuLrX~JS{brvTd|AqF;bQ_RP;7<~k1jUnA>MFpP!4
z2??UOWdWDrD72ToW9R9k>-wY>p4~ON;xYA!Ho-<=gq*eMhxZaTx^2MeKuG9eg#9@D
zPKQn8d$AM|thT#23cZ=wMLlmlmiwsh#SH$82F~{GZ}!a6VQ$xd(R3Or2laYKnBaNM
z-;F;viLlp9dB&TRL^m+L&ZbzUnVGRUobb-@KOLQ3bQ2F{(HO4kP21(Iq#)H8GRJsZ
zta!G4E>haF9S(ITGQx!phY#`o8&mCOB@(Q3+ldXSbeH}6!u<0EJgZQr+%8lsAr~9g
zBIA^<&WX?!b`a^;u{2l0>%gPM9RX!FI*2^kV{Nj6BNf=O>tK?iL$$(IXWO&U$2vU3
z>?X(rs7P}7ty||S;JGQA)^{3T=f~scHP#m|r9c~{XQ-K}mUk#WapufqYwm>7YoXjLryxkFPOXV_K+oGwo%$w*{fCIRPB
zeglsOj%S(hsXmRIpxxtO;&>uqJeDIgGXFkwgRyVya#
z$rKF14z>f7rti*o&g`CX5-6Jh=yg2%c-FI@Ge5cT1Lovlb4`cfga!AHth+}Na)|v(
zeZ^OH!u)pfqDIRE6qbjfkw0vV7t|=#77tkG4_GS8nV+NZ0&WG4cg&ee{=mw|Zp)o0+^$E|b>@Hj)>Jk(n4#2~FI@
zl0J^jQAX0`qX?aEw@b-m-1=^)j&(w1Fv~l9z6|>aq-YdV-e7L3jb!;NWvfxG?@>N=
zpQyZ^i5DHSFfYYB>O)
zuX$nKRQ?rE%bS~-5$(F-V*J9z_?3(CTTtxwcIK}WXSrw?$1I|lB8owULf5x#)cCxk
zzrseSyM?Z|VU!7_&vofAa~aj>DscI@0#)8Vs-c
zufi~@4P#Jk5D`|Jk1Evwwl@P)DT~RJB2I~C=KBh;94jaF<=}@FL8y3CKCTK>>z|-F
zuLL)}1s%j=B?nkg^TD-a^kDdu%SlPwdA`h)3m@P6_
z{bmg(-$IcDKXax}mvptRx_Gh1O~#A-V0S*$+5K(}u3L@Qt#}Wldl0VHxgYmlGz1N`
z<;LF~um|iavu2Ly6;`k^+{HHb4*X2k=$caou
z2O_xs#=Ox_81}7@7PAX?$ifuOjNLd4#U~m4PY5D5y|Muid=ML5BIu~)j@4G0GVX_{
zO6zCnVt`}oj1-A#7R-yY>nygfwsYzuDwI94dlkVw^JrTeZKDprzR@)gG*hjS6@NPS
zw0bsrbsUn~GX7R$_p2{$iP
zonNFOTSR808QGSDY6)s*l1j`CEZTw^q?bhCE+VVTH9^dIS_1fVL0icY7P?Nz%zZO_tG0lIj?)
z?mz?$otvA5wGWh;2S;lYNx*mZxbtlS`qTT_$rlgb%yKo4H#Vgs6XtWt>b=^OepZiF
zjWJnd+E{BfKl0EcU+1`uY7?FzJkKg9W$BT45L6E`5ZGf~*r?O;QdtJ9&4hDJt3!@17>d8c_G1d&RaLLC+^H4}q%|+4)~qqLf>&Pen023U
zN3G1faO{_~w#b_{mEHz+eS}mxRZST~0;7{;TS77v--kc`z$(x8D8{!YZDHSvHczM)
zlL4e;*Yp-t)_u<()uQuuO{Gwn9CP@{&BepFk0?uz4J{U<l`L}1koC@{t!UiAD_Z(P_Zp>~o*FUd-ESVJF&XKaM3_aVIfdy%
z)9E(4&4hmF;}Y|mI4C=!ii#z-vBhkywo5rd-LLhqQKYDdKP>cmuO@&9ZxomzEIJ)R
z!~S7PBg4RmyEFY0(a~RGI^Mggi`ptJN%B4;Jre~(X+zdD8C(ws_5}t^?b8E$BJPN@
zEj@ABCAQ@Vil%A|P0=wNPcZx5}WJ9eAc#0mV@I^gHUZ7wMnv~hI&zjho
z^~9t)a0PZC+AxiV!snBkL8cBKNsU}g3zKVgxm;_eJtd$=WXRpB5UOU2x4u1VHtre3
zu;x1sus5p>7XZfkzEouw!PgYC=gf_yGd}WVwkSTVcdzEnfVZc1k3PA3{IMLbFRbCJ
zQLb`T!vp3d$QS%=*8P+nAcu-}?N7|!{Q%$kl47mD+Tdwv}H
zoYO=wY-0RZUVPrX3Q}3OlAY$in=FD0RManRi4W@2+nyNb*ss+|G~-!*LTc6RiVSRJ
zp5x9>|J9UhDgPAG^{4+p()Fi*kCFaCIySRoa@%GDb4lG9Lpkcq0KX_}2_YTey3LfU
za3fWv%&3r{gt9`G%-EZ60d)wH9|f5w4{_sJ<`l6VTFlY&fzjM#P1>S9p~HcF0*bJz?+gsMbAnh}kZ5pC7p$7z
zT$mg<$6cUobyLm^-OS(2lhv8+m+7}rMK`Va#Q7|r(iwFF36NXoNBxYf41_6Q=B!}^
zCWLabZpb0*Up{oUd+3a*z%#<$I3V_=!M4kqV$Mop_mxx__&B
z3-{uvQY;-7VaQs@zAKGW<4XQUEiW=`Qw%}{G!3O_0Gtkr=<9MZ{UXRmbK9yYHi2es
z-7#%~k!Pl=>MW2ItiJEZVf1#4v3{psms#l3Vi?bn;&fF}HsX
z#N5e$AjsUwzXxWn<^P_o{^6djDmm>ux|U<_(V`W`uZ!5;-8ho-3*Arqh3<1C8(Yey
z#Cwkc!4*kwviq?n7JVhgS`1Yf77mfwiWu#Q9bchQoTs&-?N+OvG})QEfLj0^lWP^b
zjiR7Pb%~rE-cj}iB=qGa7iH1K2Iu1%zv?L1a}K4+g7O6|Q>i)6wH>Y`Pn1xM`VV}%QlDp5v)n=Wc$
znST{RxUTTS5KNJIl{_k#C_k0gCDbaRjuN(?4U~W%PQY=h>DGYVDTc$De+$>SHKXE3
zS0>unyyj_BwiRwRvY|y;R6@VKKql{sWO<>i7Lvd=Yt8fp7L+j#NT!yd!O_xkD8gQu
zsz~`=|%iZ);^nwf)uEo`ya7*=V1h|4n
za*wuN`-Q%MbA~TL0~J^J{Z6c5oVKI~+uGP-?bsOS{R8Zl-HxMp{xQrUD&|bEUFca;
z%TRNd{8)j2w`R`IL0)Z`j6`CRYK5p)&{e9k3G%adjJ5$J94un<$rD&j#mYSy{ggLW
zZqXD%?0m2S*Au6P+mpzyzD~WFU4=iP`i2N$KE;|!yD&>WGf8>jMXK^{McL(9ajZFu
z-RmB2ai@~I;cLC%7CErg`LJz&?_GQ;>fh_o9Sw&URf=E!MCguNRm*mCEQ85VM41;Q
zFw0u4EWARWp%0Dk-yE^wJ*`hVU|Zy%ttV7*$v9&p=zd)lt)T2h?as35R-@Tbt7m80
z$+sPQ>{kY0yCC2Bx#)skI45=*tqhY5H*~J5$rxP}OZfD{L-iLg++X}sN&J}p=C{B}
zvEkdNI}dJH^m5P>k@-+5x1fQkPW!5F&tPTX;aXJ0T&(k=;?KHOa%UDW06*{I9@&WU
zBYAef=r6aU`P=fc>~jy5=BRuQE@=WD$LD<`n}zyGGLd_=B3P^GLIKs-dpdUMA;>);
z#qNUGbVPxY`cOZtf^!E=rqsUkH(0RZgJGPMZFs9a(Rmn!XIJniKh~AC;=ApoRy1u|
zWm@>eSOe|Jkt*49$I42Z!8+0*i%i+k8kjNs*3GPCDJ#6I`iLd!B-0J_XI#e-;(+8F5PX1XMijdsi
z3*6WPj6oE0dvLwx$5RL-T#kHY`U^0WC|av8_RU;-R;~l{*?v-sBn4T`n4EQrRw~yJ
z{lx9a)o*Sl=UY}o1FXte1&hOTh;!J-Nql$3Q^L1cc%>1R6PJB5S@ubk^#YzKwpFHf
zIIXdg9z{-BOg}CoDH2Af&O@tu#m5Pa*h#`pdc`Kl)8@{H|Dw5bOW;>@!A2Y7Z>(Q5
zhk5%UO>Z#BYzth1$-cD~1?oR!|7nnLCP}G8$%z};+{RBoncMq!o-NBKN_SH)wsz6u
z9<_ly|DE@972nSlV2SvCuJBOQDc6Ha^oWDJ3r?>oY%8NgW6qi>)Lm!}x|de1@n$9O
zZNDbJg|s?e{r-Eos%anzq$eXwo@+Lk0kN*8qZH4GA<|&m&5J{J)E`Ed9zCtM>
za-d~X_BiX}3wxfs*440ChVS|Ko;&?JM&vS0ibLt+$-^w8hrbmqrY=D`r{
z(SC_oWDc6;sNF7%0}Pv6R1<;Sj*84~|QS<5T%m?hL8^0s#!o?tYc@{rL};CfSV-GdI@bRh>rMbBymd^F
zEi*x;ERX`_!{pFU`58S^Gbnx2s>mILQOpk}%ZILU{2)quArzLejpDR@X5+$IIVT?F
zDo0`K%E^=>*H0d!X!-BvHLm|0UgPqg$ZK5wO}xgd|9Or7WL~44rwzeuF8DQ1TXNp{
zhV{1oJ7&ztzVOuAN*M=NRA2fj@z6vqsTLA@`jMqimaaKlaR@^}b
zQ?v>EKScB$*=W#%OQQeX6pvKqNOlZPc5f{mcN9%Z%kso4j^OQ@;>i_g*HmjV{v*DY
zx~3M$q=a1lt4&QnWc`a=X=C>~O!8OD$yqqOP6nMC+
z*GF0O{W~r|2KUVp?xio*)B0*Ui_~^mkZ`9gq_WmOa?DxcF5^F~2xr#U*J^rk#lu!rjp@)aYVB5LK5STk88YWK@ER+CL-l=
z2B!8q-)(ShG>`|l#BB<2zkRxyx2!1F!n>9$3ike7GUM2I8xa6dtl}<#D8UwXOa4VU
zNUb6kM`FJB7Rp5&XT^fzgm|r7tT+*`L3G&J(C=O52hqWajJfbbx>HdUmA0+%ZRnQT
z>j4=(>~~n=pE}0|DoaDSW>D0xW{1^*c5iubCu=t`8<~qKA1)C`Azpgnody=R5vYy}
zI(FmnUW4Xa4}N1>Eb*O{y~1(J9G~Cr?{RqODv9iv153kNknHrh_z9R9TT&SYF^|$w
zo}$csX)GXo7P^<5MKWlJLylA&)Q76)uMN3&27?djHNd#c7`@Y27psi&4VfdCB}_Q%
z?AAD>U!$uYxqT-5P_KefFFW}?sGMOmI=cSjJIYoYoTKI}7aLbqgz67OB#f~Z#JDh@
z{BJkJEt82kH=HAy)M`!4)9VwjwBk@HLyOEd;>440NgcICrQiyQQ3pt(NRENN-A)FK
zP_K!Z%bg2#XiTSH8MCuEM1&dur6^<9JrE2HipxnjJi_&yY=Y+RTnrXtp34zeEtCFk
z5<_luQh^n!#t-+m!howHIbc@DrotWgQZywgE
z$t(PG{+9bc>H@Hq^wSJT-Gy*GjR!Q*70ui#a5#IFfAnbqazBU<*^u0Z@v13-;`S@;ozXC-f*Mg
z(AqN!mFe;A>^E%tX@{`6vo4@53$T1ZC)vaib|#tPx5(;=f}KuJ-T}1~qXo6d<#){A
z*AD-#M}>#h7pTheS+1oLv5Svs`{bvt#qXV)HS=N=5NM-wC$M*um<*jP*-YIZHnX`?
zaIf)&hF>MDnvZKy1*wwR7`&NodYqGsJCJ<3pv%KWJVtNW+^fX)4{Y3Il;0wi(=FI6
z+`!}AiVXZ;`}xzLHJ@O5UEB2-Z^)_jsq6J`+Ed5f5=w9&^ktgojsbKD22fBw#RUp8
z07T*yI^9act*DMU^#}7I??e8^V@or$#t6KIpIkO`Z8*ygOnB)Z5~);_pxQS50+nWQ
zf>O@if#eHKk8%ReG3vS_AwbhdDO{j0o8NTHi6;JLV}vkyDC6Any;#n|-)O
zMmMq{n8gOw7IiV%?WDU~v^%eulkYB(mNY9GAE9+=L3B8STxuU?H=T&8Na_4Tq?_7~
z&F&hf)`ROStHOKZ)CB~FyIy2W!rJpmoSa;Ac5YLPjbLgn=^*lCj=b1kxx47Hl#%=)
zg@@&=JVA;~zopDA@>l%gUFoMsA->a-RQ1=*a&d~OJcRQfRT1f19LTuh7bBW>ROT#K
z!f16~9G4#%>rB$)xcmWdLSQPqjjTS1j=Pkyn@(h`Nz^K_@+5m02}6e*b*Yc3OIwe+
z)IamsqCbC(s7uT8vH9}pe!j%ru>EX#{+Lf)T7EIF%GN?{ha`})&(J+fecBr6vMLq3
zg^m~|r&O9cLO+57eW`wQWRKW};u?-=D2#E_#-zRX-Hw)@3oFutxN@DQG~ZUn#mubi
zwXKLfErbTcntah5c9-H+kej%xk;@b>&*IpU4Ne3Blq_3|YTCo_u&8-Bhk}2B7>SyO
z4U^!FRwrt^>?WC;W=uvDOefXv;&S^gEzQxLA+{;`bKMX9AJU$xYF}eLs9TCfX(;+h
z*eXCl98Xi)dSb@FpXUz9s%@kRBr)kQ?wlnmSqbTYoHNG5lt{^G7>(mS2`v8hez+=5
zKu3@s{?uZ|Nv<;4C8ueYKx)JM%FxK^X=K1UiQ$Vnf^vhPHOs=VuSW~%lC+T1OYW*q
z1o0H*rqNfe#5tu}+~me?*EuN%s%HQs$~n?ObPplVe>co-2E7TG>W{c=hR
z$W<^RN(D)dKE=y<1Zz%FC>R;PQA^U{`GqVs$I4W2(&6`t4MtmwI=
zXH~WIy!Q=1f28N~dw%}F&!71DGe58Cxw_(KPfvM|pG$gP@%y(MdTy5dzwl&A?A?jC;Rg-}3DLfBD@#kH#_V@#RS5
zkKJx$Ma&6JomUXro#kNK@)E%29lDvLa1dwaRc(*-FO@Glo-Yx|UilkZ`6JNmCHC+m
zS|txb23$PnJgg*x_FT+H!{}LSNQ36(f`HqJ}mCnwTQ3W>C!*R-)*fU8xsZs^*5;sAl%c8st!zCC2DtU-wbbPxyV
zU>msu!UpSRp*R2>_qDz_Kr3(qI8YGSHnZ-&{UH9MjD_*hEh`!UYI6YH8f$OcHt?@F
z`rwfWqdDz13~~r>>)vRaVr{VjK~OLf9dngQPom-mmj3(hNWHDL*@j`jfG(Df7P0fu+SN>;mM=sO#3jaiQ
zqjDOm^Dni0XMePI_l=0(N}V9f6=~%_51F(@re_UgW{6@L6ZFtRa$*_CORdRCc4e>q
zlX6dYBAaPGA%RT(QK$?=P(Lj347_Su)6;5yKxr78MDpO-<+rb&e)s12<*PT}U%r0+ZNOxuIkL>0jbF4EVr40ptQVn!723EUu0${GkXtO58k|y`7`GM0Rt_kg^W%X6=k{=
zffwr%EdV1_5Pn)%mFD5^c|e)rM0z0Fp3JQS)A?M69p;sc4mGw&R?9XLsLnTtnlkK{
z_uCtjLIlm-!+0T7R%XJQY&GF*O%$%8iAC_050H}(0W?Uihygd}yoH}M&*3gJ*5I*K
z!&}r6q(G=@FPWh}=%I074X&v#Y~z~x^wc|-;r2>jFTvV07;PqQQpx)-WqESW3^KM>
zw}oFnS+KyVEKm?=!H7+`&y=m#D4SNgWCAw6mG_`MT6K&Hl#k?nGjg%HNo;U=R2aBX
zk)|LONgH7<{l(-}EgWlJWNNFdx|7!!kvj*jkB|WEQr`vuv#XcxIeK1fZ)AqTTWYSI
zS0NAJ^R?{+bU9{6(>4M4Fh9c}{|Yow2l}tR>M=9h7P+0(2gGdG!krMqfL1`TVXX<3
zt?l{igDrc02TCs5%y&qQNL~mFG4IpVz$Ik<>EV#-+p2}fKetG#kbgRf6^EXlJ`^YV{uO7h*agV%4!?@AnGW<|6
z?P6}gh~)zQvy`Hxt)>mjFx!L>%{t4Cz)U-{_3yQr`dAYg%&D3gXGf-Dbts8U6N3PP
ztp23I-|vP|l#jE(<1ggrECxlJ?T=C_PMPj+jE}EZTi0szow7d==y{y+RL4mRAzu;93
zfAp}kkNRgH;n^h;4|9;bie=6vbMMAqpOXd48#U#W=)r1P0%`CK>Y-rFwbZy_1FZ9T
z|5!Lw_k5m9+q_KFnzr6gz~n!G24Wravd+LRoKH0ZAG?6V@&>nktubH%7#D^Z9(EXt
zE;tSbK19&0A0dHVz7q7R7hd&}4=&ckn5lwnaw8Tv(@4WP|}Of-=DZP&Ve3!v;FSWwmbvd|j?Y5*3WU4MM*-_TRn(*_*;(}Xuw`B(zcZszEHcZEcactCfs{57{
zg9}=DWJtiR^LOP<$ypUE*m}aGMAA6d(Zw_XHHV6hvTW#h{oG3&Dar%~-{a8C7x+hq
zP%M5Y;JU|&U_B?
zgI&MK+@yE%M4lbxgtNya4L#`o
zDfoA^M?*veB|Cf7tWJLDQ0~u2(GXxnxEEODH}OIX2opOI%UOU847f6Oo-?2`tK|wS
zv{^E+IrCn1PsSw#Udn^WD
zaWJ-ie|r@)`?00&D&6zShr>0CdD=C>Y3tnopuE$6zr6Dff_{;@bV1Ba>D&q(JLjWx
z*jEh)XxOAdCl#k6&u0Su&07DZAFdniQAwyh1m(tq+Cu{m!{WFuuc~;wqnlL3%(lat
z77FoVIGu%(Ea
zY0k^C*C_9aq`lbM4VRj;{qc-z^_s%Oh8vM%A=uX1w-Qv*CU$HR6`z#CeD1+`;&QJW
z@V7FLGqtlOTjESa&lGT8=h|h{A0gAaLD2ahGSfrV%m_4Gj*yJ2)ki40y%CBCPh_~S
zEHkiCOW)hmYL;P#s;{}kbY7X>Y!C&6r!kGTqg7K8r$<2kJyueFBGx&)XdRyE`pkr8
zewE_wGqGDCvk|d4yl!Aj58jC2QxmS0j;tF+^~MzYZUfo>&jxNEm`!i~z1cK0O*d$j
zzdd`3UqycLVTKa4uOZRlj@2C>gC4-h=mgT>lPi?633+@S4o
zy)l6;pI8_$*P;R?ZJ?=wxOG>S+tns&$MN{3q^Cq5dT#kt$JTy>!;lAb4o#E_f-cxt
zYEF4DhwepV&-D72pPrcQ&SX#!CoV^3g`;ZNBD4R
z!aP;6BA*|O~4P$+wL=0)84(3?{GBg(lKNh4~&}C3bJo#VGEh)
z;I&H03%?V$_H$(s6V6MeUx29)K*d;!ZvwcVu>Yfr50FWS*YPNXM0z&za_B{G#(&SIFW
zRg^V+qHQiZW)UGySW~FffbsVR>9YJ-lR$N21hdCcPq^DcM<;GlHl1(VE>Ve^RHgL2p@+Fu%;a+36#`QlVYfJ!OoF-
zZ^B)c36?7L<-PTi;J33HAd|CSmE8m^7)l9&QDI%7{)**69k4X!3G}j?rgu`
zpMjFMXGNC!n436yd6#ca5DB1NLsJ(Alka;LAJOe3rY%%&?;qH@IiJt9uCj
zz=6&HbdS+e#vAA|CGQ2X#}`TH)?dOpaGVl1)Jy8=!6GdGo<#DfYNH}
zYxjTtv3pobN9V`w+h-sC`rXyurdI%)|5*Y2_doIHogM3zVdYhw`JZ-ZfN^E?IY72v
zWPLN&eeZ?u9uV*FhfDZFk!r>CaWLjbpLHgrH9S(5y%Sfi7Zl8RD@1k_sd?k-Kz5Rb?4!d^76?0)QiyReK4r*bQ_!kk)i
zK>GX>&n;ri?n|zV5&vFlW2?yoIkn-1P<(^N-QrGfoaC$K6Sb<$ViKbcwnu8LCzIwI
zWxLI)8DdLf9!Z@)UfxvvyY&DywjV`BPtJj7uHvK08UfxVoqWW-+f7vLgY)
z)r(^kQG@@|=#m?|KdK(SX43IkQLfyMo9tZjc)XywR)yHQ)BKwewjI~t-P)!MOzP9V
z76Vy@Hu!61Mv5&HbvrX#KvcGhBv)JeF;TM_Irw$Ml#_DIP8w^KuEI%tsHtGB)1Udi
z!iFS&ps>~0a{J<&>cV=p-<@j-8Nz~z2m;A7i~ptx;87u@z5y?h@2?z}s#fs)YN+2a9;S!1!Hfy42&HVVDRu+;T
z8iw-Fv^2crYIC%1LY6Gpr4Qn^)cIV%**Qamx=VDf1xmB!GLdKV=*pW2)q=mu=(n1F~pTk_m$<7LF(jk>!S
zIL$Ar+suIEq}(*2912{5?ia_+{#6TzbMo^iC)E7>IbMtzbCIj~i_*JPfjx+^VFF*+
zLH8;EfDSbx0Kz~YI+`BbvuA8Ux`tUW-QC^E@r*8L#)__QR=2aHg5HVHm=)_PolF##
z)Q_lX??*4tv6*2DJ|2
zvBxE3s_t_oAy+Y)-n-S!@UxXgI3MVlT=sbbI
z9Cak|SUKwtPVn?{%^AMWi_A&;#y_(j8og^f+v0uMB$I3sh>ZC=Gb@N&}gt5lW
z1?KNTMEi=4k(bOH0itczf|XW+=&&&2@sj?{PyhJqvKV)R&clOH!h+K^Nqzy+b;I^J
G3jhE}ZcQNo
diff --git a/dist/locales/de.json.gz b/dist/locales/de.json.gz
deleted file mode 100644
index 35a4a43bec6d6b53bd55e885706a6ff10f85b5d2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2392
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
diff --git a/dist/management.html b/dist/management.html
deleted file mode 100644
index 6b92ab21..00000000
--- a/dist/management.html
+++ /dev/null
@@ -1 +0,0 @@
-ESPuino-Settings
\ No newline at end of file
diff --git a/html/accesspoint.html b/html/accesspoint.html
index b324166b..c9eafa00 100644
--- a/html/accesspoint.html
+++ b/html/accesspoint.html
@@ -52,11 +52,11 @@
diff --git a/html/js/loc-i18next.min.js b/html/js/loc_i18next.min.js
similarity index 100%
rename from html/js/loc-i18next.min.js
rename to html/js/loc_i18next.min.js
diff --git a/html/management.html b/html/management.html
index 2b4ec524..5bcb51b1 100644
--- a/html/management.html
+++ b/html/management.html
@@ -610,17 +610,19 @@
// change the language if we found it in the local storage
const lang = localStorage.getItem("language");
- if(lang === null)
+ if(lang === null){
i18next.changeLanguage(language.split("-")[0]);
- else
+ } else {
i18next.changeLanguage(lang);
+ }
});
i18next.on('languageChanged', (lng) => {
document.querySelector('#langSel').value = lng;
- if(localize)
+ if(localize) {
localize('body');
+ }
});
document.querySelector('#langSel').addEventListener('change', (e) => {
diff --git a/processHtml.py b/processHtml.py
index 0d046e15..26608691 100644
--- a/processHtml.py
+++ b/processHtml.py
@@ -7,23 +7,36 @@
from pathlib import Path
import os
import mimetypes
+import gzip
+
+try:
+ from flask_minify.parsers import Parser
+except ImportError:
+ print("Trying to Install required module: flask_minify\nIf this failes, please execute \"pip install flask_minify\" manually.")
+ os.system('python -m pip install flask_minify')
+
+from flask_minify.parsers import Parser
+import json
Import("env") # pylint: disable=undefined-variable
OUTPUT_DIR = (
Path(env.subst("$BUILD_DIR")) / "generated"
) # pylint: disable=undefined-variable
-HTML_DIR = Path("dist").absolute()
+HTML_DIR = Path("html").absolute()
+# List of files, which will only be minifed but not compressed (f.e. html files with templates)
WWW_FILES = [
Path("management.html"),
Path("accesspoint.html"),
]
+# list of all files, which shall be compressed before embedding
+# files with ".json" ending will be minifed before compression, ".js" will not be changed!
BINARY_FILES =[
- Path("js/i18next.min.js.gz"),
- Path("js/i18nextHttpBackend.min.js.gz"),
- Path("js/loc_i18next.min.js.gz"),
- Path("locales/de.json.gz"),
- Path("locales/en.json.gz")
+ Path("js/i18next.min.js"),
+ Path("js/i18nextHttpBackend.min.js"),
+ Path("js/loc_i18next.min.js"),
+ Path("locales/de.json"),
+ Path("locales/en.json")
]
@@ -33,7 +46,7 @@ class HtmlHeaderProcessor:
@staticmethod
def _escape_html(data):
"""Escape HTML characters for usage in C"""
- data = data.replace("\n", "\\\n")
+ data = data.replace("\n", "\\n")
data = data.replace('"', r"\"")
data = data.replace(r"\d", r"\\d")
data = data.replace(r"\.", r"\\.")
@@ -43,36 +56,50 @@ def _escape_html(data):
@classmethod
def _process_header_file(cls, html_path, header_path):
+ parser = Parser({}, True)
+ parser.update_runtime_options(True, True, True)
with html_path.open("r") as html_file:
- content = cls._escape_html(html_file.read())
+ content = html_file.read()
+ content = parser.minify(content, "html") # minify content as html
+ content = cls._escape_html(content)
with header_path.open("w") as header_file:
header_file.write(
f"static const char {html_path.name.split('.')[0]}_HTML[] PROGMEM = \""
)
header_file.write(content)
- header_file.write('";')
+ header_file.write('";\n')
header_file.close()
@classmethod
def _process_binary_file(cls, binary_path, header_path, info):
- with binary_path.open("rb") as f:
- content = f.read()
+ # minify json files explicitly
+ if binary_path.suffix == "json":
+ with binary_path.open("r") as f:
+ jsonObj = json.load(f)
+ content = json.dumps(jsonObj, separators=(',', ':'))
+ # use everything else as is
+ else:
+ with binary_path.open("r") as f:
+ content = f.read()
+
+ # compress content
+ data = gzip.compress(content.encode())
with header_path.open("a") as header_file:
- path = binary_path.relative_to(HTML_DIR).as_posix()
- path = path[:-len(".gz")]
varName = binary_path.name.split('.')[0]
header_file.write(
- f"static const uint8_t {varName}_BIN[] PROGMEM = {{"
+ f"static const uint8_t {varName}_BIN[] PROGMEM = {{\n "
)
size = 0
- for d in content:
+ for d in data:
+ # write out the compressed byte stream as a hex array and create a newline after every 20th entry
header_file.write("0x{:02X},".format(d))
+ size = size + 1
if not (size % 20):
header_file.write("\n ")
- size = size + 1
header_file.write("\n};\n\n")
+ # populate dict with our information
info["size"] = size
info["variable"] = f"{varName}_BIN"
return info
@@ -86,29 +113,28 @@ def process(cls):
cls._process_header_file(HTML_DIR / html_file, OUTPUT_DIR / header_file)
binary_header = OUTPUT_DIR / "HTMLbinary.h"
if binary_header.exists():
- os.remove(binary_header)
+ os.remove(binary_header) # remove file if it exists, since we are appending to it
- files = []
+ fileList = [] # dict holding the array of metadata for all processed binary files
for binary_file in BINARY_FILES:
- fp = HTML_DIR / binary_file
- print(f" {fp} -> {binary_header}")
- # we always deal with compressed files here
- uri = fp.relative_to(HTML_DIR).as_posix()
- uri = uri[:-len(".gz")]
- info = dict()
- info["uri"] = "/" + uri
- info["mimeType"] = mimetypes.types_map[Path(uri).suffix]
+ filePath = HTML_DIR / binary_file
+ print(f" {filePath} -> {binary_header}")
+
+ info = dict() # the dict entry for this file
+ info["uri"] = "/" + filePath.relative_to(HTML_DIR).as_posix()
+ info["mimeType"] = mimetypes.types_map[filePath.suffix]
info = cls._process_binary_file(HTML_DIR / binary_file, binary_header, info)
- files.append(info)
+ fileList.append(info)
with binary_header.open("a") as f:
- f.write("""typedef std::function RouteRegistrationHandler;
+ f.write("""using RouteRegistrationHandler = std::function;
class WWWData {
public:
static void registerRoutes(RouteRegistrationHandler handler) {
""")
- for info in files:
+ for info in fileList:
+ # write the fileList entries to the binary file. These will be the paramenter with which the handler is called to register the endpoint on the webserver
f.write(f' handler("{info["uri"]}", "{info["mimeType"]}", {info["variable"]}, {info["size"]});\n')
f.write(" }\n};\n")
From 2d72990f86f89bf2a11f74a5622e424245389dad Mon Sep 17 00:00:00 2001
From: Joe91 <1015.5@gmx.de>
Date: Thu, 9 Feb 2023 21:39:41 +0100
Subject: [PATCH 08/15] add custom-text-command again
---
html/locales/de.json | 3 ++-
html/locales/en.json | 3 ++-
html/management.html | 1 +
3 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/html/locales/de.json b/html/locales/de.json
index d4bbbbab..58847be6 100644
--- a/html/locales/de.json
+++ b/html/locales/de.json
@@ -135,7 +135,8 @@
"Erster Titel",
"Letzter Titel",
"Springe vorwärts (n Sekunden)",
- "Springe rückwärts (n Sekunden)"
+ "Springe rückwärts (n Sekunden)",
+ "Lese Benutzertext"
]
}
}
diff --git a/html/locales/en.json b/html/locales/en.json
index cdeedc89..3f8ae1f2 100644
--- a/html/locales/en.json
+++ b/html/locales/en.json
@@ -134,7 +134,8 @@
"First track",
"Last track",
"Seek forwards (n seconds)",
- "Seek backwards (n seconds)"
+ "Seek backwards (n seconds)",
+ "Read Custom Text"
]
}
}
diff --git a/html/management.html b/html/management.html
index 838c45de..302258f7 100644
--- a/html/management.html
+++ b/html/management.html
@@ -267,6 +267,7 @@
+
From 80af63db9092fb24bdf5a3ed581579e57f4e60a2 Mon Sep 17 00:00:00 2001
From: laszloh
Date: Mon, 13 Feb 2023 18:39:46 +0100
Subject: [PATCH 09/15] bugfix: UTF8 encoding & missing translation
Make python explicitely use utf8 as file encoding.
Add missing translation of file upload progress bar.
---
html/locales/de.json | 10 ++++-
html/locales/en.json | 10 ++++-
html/management.html | 91 +++++++++++++++++++++-----------------------
processHtml.py | 12 +++---
4 files changed, 66 insertions(+), 57 deletions(-)
diff --git a/html/locales/de.json b/html/locales/de.json
index 4f4839fa..333ffbea 100644
--- a/html/locales/de.json
+++ b/html/locales/de.json
@@ -76,8 +76,14 @@
"desc": "Upload starten",
"selectFolder": "Wähle den Ordner für den Upload!",
"selectFile": "Wähle eine Datei zum Hochladen!",
- "success": "Upload erfolgreich",
- "error": "Upload fehlgeschlagen"
+ "success": "Upload erfolgreich ({{elapsed}}, {{speed}} KB/s)",
+ "error": "Upload fehlgeschlagen",
+ "timeCalc": "Verbleibende Zeit wird berechnet..",
+ "minutes_one": "Minute",
+ "minutes_other": "Minuten",
+ "seconds": "Sekunden",
+ "fewSec": "wenige",
+ "progress": "{{percent}}% ({{speed}} KB/s), {{remaining.value}} {{remaining.unit}} verbleibend.."
},
"rfid": {
"title": "RFID-Zuweisungen",
diff --git a/html/locales/en.json b/html/locales/en.json
index 89e9317e..c39a3d49 100644
--- a/html/locales/en.json
+++ b/html/locales/en.json
@@ -76,8 +76,14 @@
"desc": "Start Upload",
"selectFolder": "Please select the upload location!",
"selectFile": "Please select files to upload!",
- "success": "Upload success",
- "error": "Upload error"
+ "success": "Upload successfull ({{elapsed}}, {{speed}} KB/s)",
+ "error": "Upload error",
+ "timeCalc": "Remaining time is being calculated..",
+ "minutes_one": "minute",
+ "minutes_other": "minutes",
+ "seconds": "seconds",
+ "fewSec": "few",
+ "progress": "{{percent}}% ({{speed}} KB/s), {{remaining.value}} {{remaining.unit}} remaining.."
},
"rfid": {
"title": "RFID-Assignments",
diff --git a/html/management.html b/html/management.html
index 5bcb51b1..008ea1ad 100644
--- a/html/management.html
+++ b/html/management.html
@@ -775,6 +775,8 @@
console.log("Parent path: " + path);
}
+ const startTime = new Date().getTime();
+ let bytesTotal = 0;
$.ajax({
url: '/explorer?path=' + path,
type: 'POST',
@@ -782,63 +784,58 @@
contentType: false,
processData:false,
xhr: function() {
- var lastNow = new Date().getTime();
- startTime = new Date().getTime();
- var lastKBytes = 0;
- bytesTotal = 0;
var xhr = new window.XMLHttpRequest();
xhr.upload.addEventListener("progress", function(evt) {
if (evt.lengthComputable) {
- var now = new Date().getTime();
+ const now = new Date().getTime();
+ const percent = parseInt(evt.loaded * 100 / evt.total);
+ const elapsed = (now - startTime) / 1000;
bytesTotal = evt.total;
- var percentComplete = evt.loaded / evt.total;
- percentComplete = parseInt(percentComplete * 100);
- kbytes = evt.loaded / 1024;
- var uploadedkBytes = kbytes - lastKBytes;
- var elapsed = (now - lastNow) / 1000;
- elapsed_total = (now - startTime) / 1000;
- var kbps = elapsed ? uploadedkBytes / elapsed : 0;
- lastKBytes = kbytes;
- lastNow = now;
-
- var seconds_elapsed = (now - startTime) / 1000;
- var bytes_per_second = seconds_elapsed ? evt.loaded / seconds_elapsed : 0;
- var Kbytes_per_second = bytes_per_second / 1024;
- var remaining_bytes = evt.total - evt.loaded;
- var seconds_remaining = seconds_elapsed ? (remaining_bytes / bytes_per_second) : 'is being calculated..' ;
-
- var percent = percentComplete + '%';
- console.log("Percent: " + percent + ", " + Kbytes_per_second.toFixed(2) + " KB/s");
- var progressText = percent;
- if (seconds_remaining > 60) {
- progressText = progressText + ", " + (seconds_remaining / 60).toFixed(0) + " mins. remaining..";
- } else
- if (seconds_remaining <= 0) {
- progressText = progressText + " (" + Kbytes_per_second.toFixed(2) + " KB/s)";
- } else
- if (seconds_remaining < 2) {
- progressText = progressText + ", few secs. remaining..";
- } else {
- progressText = progressText + ", " + seconds_remaining.toFixed(0) + " secs. remaining..";
+
+ let progressText = i18next.t("files.upload.timeCalc");
+ if(elapsed){
+ const bps = evt.loaded / elapsed;
+ const kbps = bps / 1024;
+ const remaining = Math.round((evt.total - evt.loaded) / bps);
+
+ const data = {
+ percent: percent,
+ remaining: {
+ unit: (remaining>60) ? i18next.t("files.upload.minutes", {count: Math.round(remaining/60)}) : i18next.t("files.upload.seconds"),
+ value: (remaining>60) ? Math.round(remaining/60) : ((remaining > 2) ? remaining : i18next.t("files.upload.fewSec"))
+ },
+ speed: kbps.toFixed(2)
+ }
+ progressText = i18next.t("files.upload.progress", data);
+ console.log("Percent: " + percent + "%% " + kbps.toFixed(2) + " KB/s");
}
- $("#explorerUploadProgress").css('width', percent).text(progressText);
+ $("#explorerUploadProgress").css('width', percent+"%").text(progressText);
}
}, false);
return xhr;
},
success: function(data, textStatus, jqXHR) {
- var now = new Date().getTime();
- var elapsed_time = (now - startTime);
- var seconds_elapsed = elapsed_time / 1000;
- var bytes_per_second = seconds_elapsed ? bytesTotal / seconds_elapsed : 0;
- var Kbytes_per_second = bytes_per_second / 1024 ;
- var minutes = Math.floor(seconds_elapsed / 60);
- var seconds = seconds_elapsed - (minutes * 60);
- var timeText = minutes.toString().padStart(2, '0') + ':' + seconds.toFixed(0).toString().padStart(2, '0');
- console.log("Upload success (" + timeText + ", " + Kbytes_per_second.toFixed(2) + " KB/s): " + textStatus);
- var progressText = i18next.t("files.upload.success") +" (" + timeText + ", " + Kbytes_per_second.toFixed(2) + " KB/s).";
+ const now = new Date().getTime();
+ const elapsed = (now - startTime) / 1000;
+
+ let transData = {
+ elapsed: "00:00",
+ speed: "0,00"
+ };
+ if(elapsed){
+ const bps = bytesTotal / elapsed;
+ const kbps = bps / 1024;
+
+ const date = new Date(null);
+ date.setSeconds(elapsed);
+ const timeText = date.toISOString().substr(11, 8);
+
+ transData = { elapsed: timeText, speed: kbps.toFixed(2) };
+ }
+ console.log("Upload success (" + transData.elapsed + ", " + transData.speed + " KB/s): " + textStatus);
+ const progressText = i18next.t("files.upload.success", transData);
$("#explorerUploadProgress").text(progressText);
document.getElementById('uploaded_file').value = '';
document.getElementById('uploaded_file_text').innerHTML = '';
@@ -853,8 +850,8 @@
},
error: function(request, status, error) {
console.log("Upload ERROR!");
- $("#explorerUploadProgress").text(i18next.t("files.upload.error") +" :" + status);
- toastr.error(i18next.t("files.upload.error") + status);
+ $("#explorerUploadProgress").text(i18next.t("files.upload.error") +": " + status);
+ toastr.error(i18next.t("files.upload.error") + ": " + status);
}
});
});
diff --git a/processHtml.py b/processHtml.py
index 26608691..e8db5640 100644
--- a/processHtml.py
+++ b/processHtml.py
@@ -58,12 +58,12 @@ def _escape_html(data):
def _process_header_file(cls, html_path, header_path):
parser = Parser({}, True)
parser.update_runtime_options(True, True, True)
- with html_path.open("r") as html_file:
+ with html_path.open(mode="r", encoding="utf-8") as html_file:
content = html_file.read()
content = parser.minify(content, "html") # minify content as html
content = cls._escape_html(content)
- with header_path.open("w") as header_file:
+ with header_path.open(mode="w", encoding="utf-8") as header_file:
header_file.write(
f"static const char {html_path.name.split('.')[0]}_HTML[] PROGMEM = \""
)
@@ -75,18 +75,18 @@ def _process_header_file(cls, html_path, header_path):
def _process_binary_file(cls, binary_path, header_path, info):
# minify json files explicitly
if binary_path.suffix == "json":
- with binary_path.open("r") as f:
+ with binary_path.open(mode="r", encoding="utf-8") as f:
jsonObj = json.load(f)
content = json.dumps(jsonObj, separators=(',', ':'))
# use everything else as is
else:
- with binary_path.open("r") as f:
+ with binary_path.open(mode="r", encoding="utf-8") as f:
content = f.read()
# compress content
data = gzip.compress(content.encode())
- with header_path.open("a") as header_file:
+ with header_path.open(mode="a", encoding="utf-8") as header_file:
varName = binary_path.name.split('.')[0]
header_file.write(
f"static const uint8_t {varName}_BIN[] PROGMEM = {{\n "
@@ -126,7 +126,7 @@ def process(cls):
info = cls._process_binary_file(HTML_DIR / binary_file, binary_header, info)
fileList.append(info)
- with binary_header.open("a") as f:
+ with binary_header.open(mode="a", encoding="utf-8") as f:
f.write("""using RouteRegistrationHandler = std::function;
class WWWData {
From cede2249c6ecc0d42aaa62d833d6d8669c9fc3fc Mon Sep 17 00:00:00 2001
From: Joe91 <1015.5@gmx.de>
Date: Tue, 14 Feb 2023 06:30:11 +0100
Subject: [PATCH 10/15] execute modification works again
---
html/locales/de.json | 3 ++-
html/locales/en.json | 3 ++-
html/management.html | 2 ++
3 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/html/locales/de.json b/html/locales/de.json
index 58847be6..5e616882 100644
--- a/html/locales/de.json
+++ b/html/locales/de.json
@@ -2,6 +2,7 @@
"submit": "Absenden",
"restart": "Neustart",
"reset": "Reset",
+ "execute": "Ausführen",
"title": "ESPuino-Konfiguration",
"shutdown": "Ausschalten",
"log": "Log",
@@ -51,7 +52,7 @@
"voldown": "Leiser",
"volup": "Lauter",
"current": "Aktueller Titel",
- "command": "Befehl Ausführen"
+ "command": "Modifikation Ausführen"
},
"files": {
"title": "Dateien",
diff --git a/html/locales/en.json b/html/locales/en.json
index 3f8ae1f2..998558e2 100644
--- a/html/locales/en.json
+++ b/html/locales/en.json
@@ -2,6 +2,7 @@
"submit": "Submit",
"restart": "Restart",
"reset": "Reset",
+ "execute": "Execute",
"title": "ESPuino-Settings",
"shutdown": "Shutdown",
"log": "Log",
@@ -51,7 +52,7 @@
"voldown": "Volume Down",
"volup": "Volume Up",
"current": "Current track",
- "command": "Excecute Command"
+ "command": "Excecute Modification"
},
"files": {
"title": "Files",
diff --git a/html/management.html b/html/management.html
index 302258f7..3ac6649f 100644
--- a/html/management.html
+++ b/html/management.html
@@ -270,6 +270,8 @@
+
+
From 31368020a1320ed6fafc56da90b601f9b17d5589 Mon Sep 17 00:00:00 2001
From: Joe91 <1015.5@gmx.de>
Date: Tue, 14 Feb 2023 06:52:07 +0100
Subject: [PATCH 11/15] prepare for custom-text
---
html/locales/de.json | 6 ++++++
html/locales/en.json | 9 ++++++++-
html/management.html | 14 +++++++++++++-
3 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/html/locales/de.json b/html/locales/de.json
index 5e616882..f782a936 100644
--- a/html/locales/de.json
+++ b/html/locales/de.json
@@ -210,6 +210,12 @@
"lowCritical": "Eine LED leuchtet bei dieser Spannung",
"high": "Alle LEDs leuchten bei dieser Spannung",
"measureInterval": "Zeitabstand der Messung (in Minuten)"
+ },
+ "customtext": {
+ "title": "Benutzerdefinierte Ansage",
+ "desc": "Benuterdefinierte Ansage des ESPUINO",
+ "textLabel": "Text der Ansage",
+ "textDefault": "Dies ist der ESPUINO von Torsten"
}
},
"tools": {
diff --git a/html/locales/en.json b/html/locales/en.json
index 998558e2..bf694620 100644
--- a/html/locales/en.json
+++ b/html/locales/en.json
@@ -209,7 +209,14 @@
"lowCritical": "Lowest voltage, that is indicated by one LED",
"high": "Voltage, that is indicated by all LEDs",
"measureInterval": "Interval between measurements (in minutes)"
- }
+ },
+ "customtext": {
+ "title": "User defined speech",
+ "desc": "User defined speech of the ESPUINO",
+ "textLabel": "Text of speech",
+ "textDefault": "This is the ESPUINO of Torsten"
+ }
+
},
"tools": {
"nvserase": {
diff --git a/html/management.html b/html/management.html
index 3ac6649f..c4c2577d 100644
--- a/html/management.html
+++ b/html/management.html
@@ -538,7 +538,19 @@
-
+
+
+
+
 
From 857fe257d05b2d8009cda06427f03ae18d337d6f Mon Sep 17 00:00:00 2001
From: Joe91 <1015.5@gmx.de>
Date: Tue, 14 Feb 2023 16:02:20 +0100
Subject: [PATCH 12/15] add custom-text again
---
html/management.html | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/html/management.html b/html/management.html
index 7cbf0caa..6c0aa7db 100644
--- a/html/management.html
+++ b/html/management.html
@@ -1293,7 +1293,8 @@
vWarning: document.getElementById('warningLowVoltage').value,
vIndLow: document.getElementById('voltageIndicatorLow').value,
vIndHi: document.getElementById('voltageIndicatorHigh').value,
- vInt: document.getElementById('voltageCheckInterval').value
+ vInt: document.getElementById('voltageCheckInterval').value,
+ vCustText: document.getElementById('customText').value
}
};
var myJSON = JSON.stringify(myObj);
From abd804ec5a10cba07dc98496e25704663b79166c Mon Sep 17 00:00:00 2001
From: Joe91 <1015.5@gmx.de>
Date: Tue, 14 Feb 2023 17:13:02 +0100
Subject: [PATCH 13/15] don't require text anymore
---
html/management.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/html/management.html b/html/management.html
index 6c0aa7db..bd49bba2 100644
--- a/html/management.html
+++ b/html/management.html
@@ -547,7 +547,7 @@
+ data-i18n="[placeholder]general.customtext.textDefault" name="customText">
From 11497bf639c7f8d2f027e0ebc16fc9ff454a7325 Mon Sep 17 00:00:00 2001
From: Joe91 <1015.5@gmx.de>
Date: Tue, 14 Feb 2023 20:23:21 +0100
Subject: [PATCH 14/15] fix assignment in webserver
---
html/locales/en.json | 4 ++--
html/management.html | 41 ++++++++++++++++++++++-------------------
2 files changed, 24 insertions(+), 21 deletions(-)
diff --git a/html/locales/en.json b/html/locales/en.json
index ae5c1633..4a52fff4 100644
--- a/html/locales/en.json
+++ b/html/locales/en.json
@@ -132,7 +132,8 @@
"Loop track",
"Dimm LEDs (nightmode)",
"Toggle WiFi",
- "Toggle Bluetooth",
+ "Toggle Bluetooth Speeker",
+ "Toggle Bluetooth Headphones",
"Enable FTP",
"Remove assignment",
"Toggle Play/Pause",
@@ -222,7 +223,6 @@
"textLabel": "Text of speech",
"textDefault": "This is the ESPUINO of Torsten"
}
-
},
"tools": {
"nvserase": {
diff --git a/html/management.html b/html/management.html
index bd49bba2..174300d5 100644
--- a/html/management.html
+++ b/html/management.html
@@ -258,16 +258,17 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -362,15 +363,17 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
From 5fdeb92626bd72f9bff9f3d95255003120abd1c9 Mon Sep 17 00:00:00 2001
From: Joe91 <1015.5@gmx.de>
Date: Thu, 23 Feb 2023 20:33:59 +0100
Subject: [PATCH 15/15] fix merge issues
---
html/locales/de.json | 2 +-
html/locales/en.json | 2 +-
html/management.html | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/html/locales/de.json b/html/locales/de.json
index 91b7a265..909ee06e 100644
--- a/html/locales/de.json
+++ b/html/locales/de.json
@@ -112,7 +112,7 @@
"13":"Alle Titel aus einem zufälligen Unterverzeichnis (sortiert)",
"8":"Webradio",
"11":"Liste (Dateien von SD und/oder Webstreams) aus lokaler .m3u-Datei",
- "13":"Gesprochener Text"
+ "14":"Gesprochener Text"
}
},
"mod": {
diff --git a/html/locales/en.json b/html/locales/en.json
index 19ddc99a..5482d35c 100644
--- a/html/locales/en.json
+++ b/html/locales/en.json
@@ -112,7 +112,7 @@
"13":"All tracks of a random subdirectory (sorted alph.)",
"8":"Webradio",
"11":"List (files from SD and/or webstreams) from local .m3u-File",
- "13":"Text To Speech"
+ "14":"Text To Speech"
}
},
"mod": {
diff --git a/html/management.html b/html/management.html
index a6ae7768..64164087 100644
--- a/html/management.html
+++ b/html/management.html
@@ -240,7 +240,7 @@