From 58d8de40f3c7d657f0943e8e1200a06316a3ea11 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 27 Jul 2022 10:15:06 +0200 Subject: [PATCH 01/10] feat: implement pwa --- favicons/favicon.ico | Bin 0 -> 32038 bytes images/icon_x192.png | Bin 0 -> 14169 bytes images/icon_x512.png | Bin 0 -> 29180 bytes images/maskable_icon_x192.png | Bin 0 -> 2304 bytes images/maskable_icon_x512.png | Bin 0 -> 7750 bytes manifest.json | 40 ++++++++++++++++++++++++++++++++++ package.json | 3 ++- src/index.html | 3 +++ src/index.js | 9 ++++++++ webpack.config.js | 19 +++++++++++++--- 10 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 favicons/favicon.ico create mode 100644 images/icon_x192.png create mode 100644 images/icon_x512.png create mode 100644 images/maskable_icon_x192.png create mode 100644 images/maskable_icon_x512.png create mode 100644 manifest.json diff --git a/favicons/favicon.ico b/favicons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..743d0c7b557a68e6c2e376215eca228a02b29cd7 GIT binary patch literal 32038 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 Vms|328g)1fP*v1YsFkyb_&*KgB;)`9 literal 0 HcmV?d00001 diff --git a/images/icon_x512.png b/images/icon_x512.png new file mode 100644 index 0000000000000000000000000000000000000000..ee0e4bf0ff6aabb2fa0b1703b5c181139237eb2f GIT binary patch literal 29180 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
18rX>mmmR3{RM~^lLTsM)lF)K1;OV0NgjI9 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 z zv=nl|mX1t+TYvV4#yo0?>Y>iDa|BNs0I-?cU>u@|4uYE3AS`;Krml$f@o*qY^87f- zx3$koB$zsZ4xv63%vS!HS_AIq%wsXS^SMrW$;-p7k*J&FQ4AzW)QW!)-4duoAEVV@PO^JMCpgE0z^2;(OhS-@ z&!{3Q**Y4!y9Suw;Ei=pXi>JNSWfrzwB4IOqS!W3b+qKyFE~!nESV+S<1Or2LC@}& zs|532QI|fR>qsBpf2GQO7fl3;o5sgi914 zwpZUtPaVca58=8)Itw0GO1*|}hlBB@!&_hkUA&2ZdUO-tZ(n)6s8x}Ws|I}g z;2;Wt`!dkEfk9OFzOh33?n*?B`;1I8VcSlQXH`Qihvci7;Zh%R-42WN^w3?X3^K|p zJ~>z`K4B#$g~sF0_WN-H-zaUsPW5CTQ6ZS2s6ZAw=Y`v6O-vHDk4?Z^`WDuPCj;Ql zOz~xMXU{wr{y4w+?c=;u*h`*RGm*n)rOpE(%=O%v>yyp5)-D^6|*Q$?f zPz%*#5|+>6o|?d4&p z{doTaneRYb`{>@Hk+a-B&lq^?Vg2jDi-=`HE&0%NQaj9VE+5!n(}y<*{4}O<{~TQG zae!zh46AecsHMZIj|`G}?PJ$v)W8!S-nw=2r7JW_?I`r5yZV*gi`I}8Mm5dk5GPFc zF)=ri9+BTy`tc+B_dSWj(Ef{cPuW4Ti@uJ{V#q?h7rb{yW*}1XoYtA@Z&C)SD`O?; zEB1K9DW^Xt7kD;r7tr_>km=L{sPT}KW z|3%LE-g6}-Sc9K^$QO6ty{zIuVOe#+OOzV@li63ojX>3(d`hd+Pg(SVpTARz{~WT* zt$VeXPtX+qvEuQXD8m{2?6vRlv0UZoliTgibMxkS$$Fga1pt_SUrCTFyscuS^Q4L( z0l%f9V8J%ud$nEOvIJ#yYO2T*716HepKZ2ADOSzKkE(M7L&+oM+4rMmgkr zV90B6hbfWM9~ySm##@U?H@(Kw{G>CL#=I@z3J1 zX89yrK63@&2W^QceSt4Z0k5d;U7(%Ik|2M*xplSVJSUbB)zkJR(JKs0z@ajzfp8hr zZK;=bB_IH!%8+eINmafcIB!YzYcBGrC<;y$f65DwXy&qBCfwdJMq)C-56aj9t*fm^ zjzKdx*A+g@HB%^D)ElH{DosZi8v5>9E4Kf$qcjwz zNX1tYXiljwG;-4unf{?H_V8u^6%F?q_~u(k8hR>-}NGXfho zVBWkVP3R4vPek;CABkxu=NKy_eEw`F_gg(#;!MI&&9T7z^K%tZ^CZ{<8;cpXoaL09 zaF_la&~JK4L8`UB!RRN+_vvj7$oH7|!LY~R@nlUYJ)VpF^>*=z(zkDCN}0gL?eTs~ zo8CKb-ZCxG0@p$5HeqJQqWKKf&8Mdf|tCkd8BFq{_Cz3y=};i2V9NeP|z zqYP0}_u7|M_xwo`Sb1I6`&Ga%K}1S3`oAkhyyBQROFR4Y%!TdY2gUkj0XTrJpvS%< zV>CkISsTwtl{^2J@gu{N|5MU+2SWMA@w;9nW`sKCiBF(;CG#;W1U0RPS!230eK zD1!Sa;{mIAwy@uiryAG0utcmI0c%;%C;yQ&CX4Gl9V~7oastnpnK*ohss#~8fnt^b z7r{Vp;0%cB9=9rpt;htA`kp#tL#hwlkPIN*)@RZF@I$KdBUbHC``DMQP03xa5gv6` zQR>36ATQ6Pub?K5MnYVO`BcYOgjz9T_!qT!7H9_yMh1?b-hP9%eY;yW@ zB)7P`YIs0o^{HNA$e-b9I9Y!(~@x3?}Q&3;E?qX?qk zig3y-+5rL1dy)=Vjv$*yR`fN^eG44-DmyAMIyvEXf8LsBuL4libGr>sR-5+i)S`K= zg|UH<)42Y?((4pWL$rH4CKJN@G*+t1xdK~~bzLuHu3!R9>4J{nDe{zio?>OWjZ4{^ zClgL&RKG;n?;+5lEYTB|cy%~PZ}^9PTXdJc?B6>au^sFSBPqu!-krF=-}(jZu|#%# z@S3)|bS6@1*@Dk+tF1<-OxX_O{yN=+v-?-v6}zP_DQYedL2d0c6s^`ef2%f^9UblP zpYgMaRCU%@@~)wh z^&Q%?Jxa!6pWh| z2IPW@%R&!vAGKqDKT;84kmn6&+*`+ryde?pu2EYDm?GB(4OlMdP&yjchy4H ze()-gLlpUKROp)-8(n~Nw1N5DLtc5X``grA=HxfyJsa?T`>7|a^777X3WKkOhUorA zEjK>PzdjyzIFFsMtWQ1C^WGS{2@o;)B8X%;_JDnfZ+u@M-r_+}vf=uGruuA5LrY;##S;+$dywiz z-kI!Qr}bGgXVN8fg1+-?5e=`86{OLO}K zFa8WG2+xvhq{7(b1KNgY|N3bLc6P_TO5as0oFWXqJD`aQ5glD?gq6GNR)(XJDSwHd z{P@iB?;TJhri^~BLV^Oz-BC;6m9UNj1C&GV03X1%ui<$WS$#EkUbttjNWQ&b=09xR zjY;&Lg*&HypkZd4hApO4WA_B6Z%F;&<_XMHv6VcfFvW8=s$k`ljbR>tquRXJR}QN> zOUS2SPiHj{7jbC?vCIU6lC}#NMZwM}sYYy~=zZ7a* zA6-pY`+a!$tkebXK;*UEP~>FvGS+8l*R_j$DctMqJtpWY2{(ZY>Iv&sM%!Gm>uD5o zxuwtI&8r-*@;c-!@cv(PI?ZFe@EYVN3c{~ z_EDYNHqTZxPJ49t>PX#`vi8EJJrPWj_%*#oCNm(`P{#%tagPs_KWlP0s}jP^wha^3 zX9h1OF3nB)qHjdw;`qs?F=`IvRyU1H)o8|hb-8+_v}1jTPu zXzM;Z$NKE{0tYPPOxFjtL9HZ}y5Hx%9gb=_4!JRAi?w_5zS!u?_+xdlT7i2z%c9HC z^DBvg#4Q4AxQ595t)`CFp2JwPOWps*N+Axgbbk#fYMt4(=+d7}%?UUj)m_c?#?gf( z&P_C>APq?7c5=*-GvE6bIGZ<`j985j<+n`=Oh1dEWp3(t|99sL*w>gKT6Aqx@J>_j zvA@he5B%ki1g9t8y*Zcb<~NAPe#X+2F3E+}_@0WMXbeW`lAHoE*8Tam{0NUWU0PBA z+A0cPsluk&q6MI{`HYRu9epYFBtQPOKb3i(yvyK+;fXh8>RxK97EW_UHZYl|aULwk z?eM^>v6}sB5?CJ?`|O0#D*v~QxQ5Bh4my%`8)4l@ z=EvH_S_W&UR!VWp!Nh31R6dQ6P2GoyOAmjtQ~3RS=7e~lj*e;`R~~uCLJ3V@+r%2vZ)wX#vQ&1o57rPy^&0gc?SNvPsL6lyFwSk8Mf zTb(53`i*8j7i9RaF5|3J^IFdg8Uhh8oTCJQxJ&XTIo|c1>3^6(lwlSB=!Fc(^INd`~Uny2`{r+RUPCs@)R`J&6McF0l@*}G($sN;kku$!1ivr}% z*SoL~QAjTx7827bopnxr_&R>a9dL|XIoQe1v%O*eiVi|l+7`>+p-_^{=CByh#!5s@ z<3?i$q@4F9J1$Y2l=uQ}vzeX>YRw=C&7k23J?iTS1S6~>G4#4kRY$)o%3;i*{!bEr z=Rm@QFLyMVem~A({AEFpa0U>dLL%}`LP7-nljkCcivaD;NmXmA*~+Rx{6G#eNn&V8xl5YWOshWo2h;w*F4DTD zHylonN9hL++@IwWLu*q9<-V#MHAn8Xk?}C@Sl=3w6u58eGaHyd$>c`Yk^hEXWyI{A zv}!B6hA-k?C7zxm7GXqY7(5ss>t-*40FW`C79}~q$tT8AFLG)2znxawWojY+h#~NW z&VJsWTZvnMh!}ACew6KbC0%FfT95SWp1j@Cs%RSCHtC1 zl>iPj@n54NFjMS+n1lfZzm@juKAg1_;($j8!c@OxY>55_q|7i?Z zo+OSGo|5N?nW^c6w#vM$R!jLSQG#E9D{K+dD*NmyG--nxiGZT9Btt=d9Rwk_WP;l_ zlt`;lciN-cN}(1?Q4G1V@D%X};{jsQ2?iROJk2 zV{^bO0<|KH@^X-lEH>b(1g(5pZOJO?o3?dGL z!~Rule^-uMM@DatgzV%vV$!O8dcwhL6K7(#?HhWespp@vI(o0tLd~xHyQIOY6C2ndH9X1y-xoURgbX(LoJ4^WZ_Vt?7I- zE^oS~*J)R9TjO|wUetT(Ct5~K#cgjPjvJ;%l|=X)F>dUWAq)r%7K|cg^l&ICjnHT! z0IysXYb|G-am&5>4$$);#s0}#_^VR_@JPM8_Z@*1M3YmG`r^A@WZn*!5GpYIRRnZ- zPXs~fiXJ*)Cj0D#B^NpxcZ1Zf)xjeh+b1*=13ec3MUZ!Xyc4fk(4&Ys2LAj& zy+6n+_m@heo|k&|bSsu(?*lqLXxd5re4YN;zluEU;+06e9^<36Y1mR{$LZT3%=_gPWL} z$>8y|X7V+S3*I;tXz|QIo68s(KlVQ3`Fjzl$s{*UT$x0+qqZzSTUAzAQP9zX!@HM+ z9!=9DRYuH%Fz%k540v?|FT(#kyp$Clb0o(gnz=#N)|hJ}7;fSK+#Nu) z9C^$#WvOj@10IYjz+;B_@e!R-1Z?MN95e(lg1`_TZZqIwsD%*`fi4ulE%E-yvZ6Wdb;?SqMiLF_Bhb<#%}59ApAxY>sE%P29z2&g_SmOXNZNY#{e_N#0mGRp-stmR z5)UW^UFL$Ek|w}?26QLRi*RCP#4`S_I$+wM<01%EGX;v*Z@hhqtH1&(+yxkbD8eKW zCGLQK@M&Te>>wqQT);oq`9yHxyh|H2#Td7l3E}GFD#YunRBP8&5rVi8_QNVYl9%hy z8=2#m2=kaF#f!T=C5&ICl0w)Q>wJ2a3JCG9E|F`1rGH5$EmE@p-XU-=W{e^(3&W&{ z4lQO(E8rhE(LY7ramEL?yp&N| zLq&GQ5|-%Hh<=4)9Kuo7JYx$gfS6@;2IQT;HLDo7yc{JF7q1~8F4|$C7?vR>jlH0c zEccV==9?4EH^S&z}@mMsyibC z4i#{pjlzH$h&U_^mt0g1r0h)6`yC2cu%In*e*uT0nN;NIvMo-JG`Uyy9<2e^;e$oy zHvamKnrji91-314Z69~xT!Uq-SUd)!QIKnT?7h%+z#8POwG$E|>DfW8({tLV8E$_8 zo{pR%-_ySkZqU`AK_f)8C+a{NfU5YYR_nWMzf)4dJbqiL4C2~FSj3TW?{&t&ux&3Q z&#_FOKV;|t?v^DH3HZUs03_r!gc!QgQyV6rv#)5c_A(BT3MpY|9#;4lU}cToGO4d+ zDc^CwBWoGk&V!2M+- zmgg$%-{&x9p8Zz%eS1Qg|N7gYQ{o0)ssy9PSxAW^u9?9+cijoI*msqL;F4v|{O{TW1hF$u)nIDE)!~}`M3xJcD-lI6=AFZ(4ZhG;HR*hG! z8cy)34KCVkX^2gVfrD8Tv9T%{u;a_O4P9@og4^K`iI)l74FSefqYulp53@=r2hvh0 z**-0@1*jz=BN!schnYRNhZzCKhn0T8ZiBm)-k^%&tVe3T$C)^armx2P2|Bn+42_c~ z6lwzN@dqHsIn3hSr%0nl6c@l<0P8LT)~zn|ZU5o19teCusd_R*0O{w%;9|}V)C)qA zNEhQtg;HoG5(RqqHNjNRE>aUXv14zkDxiX|n}&&=+OG;fnAg^`8`l){Jbu|8H$nzP zG5d&poS8atUR?-;I1raU4pshSEg26!I8fn#gmY3S>Ya`MI{#2%K?U(@3e9!n@6TR3 z*~}iJ4LCE zkMG@%Y2mMm`du%IjlPsVScvQ?mgJb)fn046=YZQ^W4A>!)JNtt5w09bwN2!kdZd{@pGtH6QJI;rQH;kYvHq)%OJKFP@xoJzX6i4a_(D|bx@=L@^4seF zY#e-60uCA|IiLvFhDtR)Ukt#{YZU4p1xJ#GKlbP}7EZtJ&?)!>1wUZTQ(vO+1K=c1 zAbDy{H^>Cg0(C>*2VO4m7&h57&29F(1GUFQW&aAKOnkgJ&8G6{Fd|v;{(|f&bQGYx z0_(}=LMUsSWGAqHVi88D+BM<6@P&{a)L#Z(eY_$0Z^&y-2uK$MOkN%_bb8Ro9Jsz+ z>b#@qSxYVzsTT%2gJ8>nYe5A1S2+4q|K?dR%s zAH02+D(GhPt2D-%)?3VD=hl94VBS}I71_K?6QbtZc|qI0%7f1(Uw7D9`WhXID`#`4 zWhH^Xlhwb6>Ng%V{PNMk;+G6V2g4+}Om#TzRcP!c%f*6rlK(mt3T8H$mwR=uXyS3( zo7m86i`m-2_&gSzvki}%%1Mbzk<@$3l3x@pj^JRnVbld-tv`vj1FZMeG!OI_h(VIC z4Ut1qq@qeaswb}4rWt#J*JNObBB&cBtZpp4;uO~G&7CvgLAcYypD>fvc~=~HSLPz# zw#!d!Gz;5cYxgLSu#N^)xx{LtMpQ7ro5Rls1*^)V}GBXc3Bz1wz|iM_6-=CnPEx;w0MWySXUZH@3spC8@OVqIgFi=}GC|TZ12R6&`7T-BBTF)Zzb}p|<;pO12 z9kL{Z9H2k!`;BsSN-VcV;n4EKGr+l`d#1O zB-K|7PP5pSV;Q$H6wY~^P0@Ui?s&^-bbJ2yZDjvaopXCQjxpO?l7HpA^yye0=iafl z>VG;R%pel^sVV+!MQ;#(S)K#lrcFBUGO?q=awX6rhmdl}JV^(3O)jsjoKw+Y5*O!8 zLCSU4F?7g~gl{d3p03v=i|o1_FH%9Cx(N_K=~R?lj>a6q2uz0iJjXvKq#&0rYYpp0 zE{0N303-$8^fTBnKSCL-HJ%@COk9Lj?D{JH`)^@Hd^^(i99*_a96_=? z+6613vdB4B`902f0&U@dnvz}(KNl;`Ft|r(w!WH8GI?j#R}lzt?GZoxXRz|EzLHjM zrI2*ra@G^9L^mZr3Qty(Q!yzAa3l;*r9gc_NQ+nEEq=RFJ4Ibq4pF?`$Le`{>{Ktu z1!s!5*N#Tsp&o}6><5xGsg^GfE9!Q5OvyT5u{NI#$ZPwuHKg92y-!Syif5`B9QLfa zc2dt)hAF11%_e9tC=$Uha3F z^p#KI$Fl&>Q(pSFQ85@l_~$l$uh8nKw<%+w`%qyDM-5Kb@l|Wzxg%hu6UC@yZAM(QtE#liUYmQF{gJINZ(| zNRqHY4*2qcjM4?jOLRzI73Z#flP}J3YIqGrZ|TET3S>%sEIe0LWJp}*XCa2dy2DUU zZKc*dVdaIeW4Dp&Csspi8;WmKbV3GQQ#j+zll9$VG7G!9S<9&egU!_f*QcqQXFG7g zG{>7_Wu0?8Y9m?NVkWFdwYWu#J1jxfA6l>O zNLvJqLH+`tAA|?4_TxvZYncYS^HFpxaG^=^tkP0iLlyD(bURKL)A$z~B3b$2+Tt~| zg(>1B&(mbaAdUx}Xa8-&92s(spHa|2mnQ~T=K+?XLzLts-KkeB_|kOB0`e9eq4~L2 z4~&7Xg&LiYR3FKbtzI88>_P@?=N_<;V-py%J)JnoeQjzcq+(%3>;e1l=CrWul@(_hUvTj literal 0 HcmV?d00001 diff --git a/images/maskable_icon_x192.png b/images/maskable_icon_x192.png new file mode 100644 index 0000000000000000000000000000000000000000..4bb56973c44326e6a9173af7c12090c278133280 GIT binary patch literal 2304 zcmZvedo+}L7sr3kpg$GYrTK${oUXH_FDV1_u9wZ-JF#aG!y^; zO011c51ESp6X+sY_ISHTUMA2X4`&7tv}k<-0KLy*I(Wtee!buqt#76XF4Q#dp%whF zcS|sAiR!h$l;b>)mO$5w;kk_;-nUAo<6>tI%}P$soE|SHp>6}6kDN~}MAF2*q2F@lj9av#j4S)10YC_k-n{(b=6B4v2KKMC9KXpx^OG=27t`LN-wO)xVkc|!S z;dLglX$w+A_x#uPRUYuGa$kql_2=yaBc=tFo8a_dOP@6!Hyk)DTm$v0XzM-Yr5`kB z3n6N|pQclg5KR@h*f_LAch{+#8>lIu`h1(IWUqGrqV|&sA+)k0qMmr;P+rk;GmnX< z^T)`R&Pa@vY2X`IC`LySJu&AwX`8Mn{u_*=%(|_?E>8-CS*JgAooUBA6*@2uVz$ z{eSyv1>?k#80r8CV;tYjAPITH@4rc=zxegcVSIha4bR+WBuPR@cxad_fP8Z<4wG^1 zf654yGqIpnL(awDc~?fDLXl@&{hNHJ4p-_W@JyrS`rn1;yFZuK4-pAMvA8fm)_2$Q zvooqtFhmiU6@HB_Q|OI^IH6sq{dVu$?sL>6uw3G6!_$5kV6DD`8-2C@K8Z)hfVxr9 zIs^WA+_%F@^YSF@qKP$)Jie3&ozJKr7)2%(+7>pHd~^Hr9qNz)| zn`%oy!6nI;j=7R%vk&%!$_{aIf@!#OVIattb}AE&gq1wLrixYT+d@kltbcNTNS(h& z#Vu?H*zcEi=b^~YLO>2vakPa|l7NZ~vt)n}cD$)6+jB3$zITpOHoI-T5EMXvSEpk? za!#VUrq)a5Nzz0Q*ZGEQ?tw)le*4QECOKF@xS9)q6e}un*Ujebe?*-qM0u4lgN|(B zc3m;1YEUY{Z0zFnaj^F%_OEHynLYs75scec6*b=KVt|OpO*;8vLn!<7`?ho<&5G*^ zGo2WFE}**NnjZhw-$nCmK_bGhi;tGFIv2xFDjPbwZYF;9Y~ZKHkuY^;TZ(sY>Vyb2 zF9aft=gNi;LT=HAZRY-3^n79YUSj3@PDmPh10bws_XtU1$JdWGK%1IM45!)$c7s_ zmzyOP>>O@#F9g5(MzczA1dxAEUFctjh&9p`;qZ7*MNA3BmFz~xhh`}6%*MAecOd7*f6G~7I2?Lsfru-D}zgEl# z)fMDg!H?B9rb1#%2KyS~1&!z^|zy~81pW|Ab*g1k)k+1qTA_#L7b>OhKvR#6G?B?3q8 zWIxueuV{fqSKgiY&hSsRgu~nw>CTNERw3@SCsF~Fzs3(G{`5Ubfu5Ac2v zEk-FW52H=dRwkZs&R|G@koXZJ&t^{mxD72MPLahU3;Dm~ZfV(kjC@DM1L1gu^Y#n& zuO14ta$bx$Sw3$ygf17ewfbb&Z|1kKqV;gPCSNKt>gi+p=ZNHI(eb zja97ROaM1U278iW3uNH=mSR7p_AoshT64{u0iX;@)~XLOUbOBFZt<^6JM(FYt?}bR z;CV=3%YG}RNBma&u5>Ll)!CKDa%gN!da+Snxk8Ivss}`=Vk(5>A`L=K?wofe2OgHs zP^&@_6%1a&qGsQ)yD~mGW|5Hsdzx6pGIhswihe1L0_KR4?4<#$4Q@;UgLCZP4NC42 literal 0 HcmV?d00001 diff --git a/images/maskable_icon_x512.png b/images/maskable_icon_x512.png new file mode 100644 index 0000000000000000000000000000000000000000..be772f160287d5bf5d49b0f0e38c6f09322e1abc GIT binary patch literal 7750 zcmcIpdpJ~U+h1$7re=`FF-e*vXCf*}Oh`yfQb{LDXQ7mwVn*jsI*F2|t)xUkNjglM zbRdT}Nl8Z8r3jUTRNuXxr+w|?`+fVm-uLs*So1vVKK}0CeLv6a7Pw6xETb+%5X4|- zCkGFLpx|GMU=M_kuF#r3_#lHlrrQzO6&h~{LX&WInCcn2_+7)Skl_;*S%UDuysQ4+ z!OHFxbr+Y1q{;GC-u6xO-`Hg15U!>Fwm$k>Ur%W7bRj`fG&^6hC!NT@U%!IGRsk2^_Nu%D=MxEThW^9R|i z6-Co8SjxiC*@lWBi4b*BGW@<>a!yFte|4pi6=`DE>?|O(#%E1K;`gxih-oq7bQq7g zyOjUYN}_Dsbt@0jOY_ihZ17h~M)FP06?>m3t4EaGYe+yrY8xsbx>x$d%%mE>eZHu5 zEWozo@|^&G&E&&MY|DZ&d#A-j>GQgrh1G*OTqh%GtJ901xXZJ6VPu`&%UULUe5nt~ zl1hWt#UpuxIhP~l@Xf%`{48Vf7u+AAsiBIW#Lt?#pgNkNp?)W z911~(wwUmADLao;{HH6C#!S+;eA|#69Y!k)t>-6gLtYpu35dj5x;OT(Nww5SQ{eG^ z_6jM}JCDv`t(SyU!X(XN_#VJu1+mqbmx%*i1ITzADu)sH3R1Uk;n&-R(<4oE1Pdi! zR>lshi;QH6d&!(FOgdZi#Y9(mLpB3YaiQcIB`v)8YI<2W^UTYG=Y+7wD@LQRJplZ@ z8YDqW;xiCf^UXy}U`4M$HA`WE5F0{}T14`H=Rzt%PU} zSZc8P^C-SJN9g|5NF%lSCRadc3`S*8CE$~*)UFyc?-C?SGK`ntD)}<(0BflRwG--P z=fJfKkoQt|D5Q^5|5QjX=xcr-YyK7JWv!xdeKDzaICum~m!6TBP?oQ3L9hCF^8d+- z6VJ5I(UZlS8tRCQp)$ewM=#oOR23nr96M7AiT5%V6LP!1NcW7IFqBCLU!7#}W-1RH zg@V=!Io(v-?tpAve4)DF-Jp7X;+8lO$5aKDW%QHxqmD6O#*nSdHK??VanUWDooFNs?tDnjuC$8v;iG|xfn4&xc9e{lvN4v)vNoR%> zZ#2>7i!+3jz~ah+WnbDuV%N6a8hN23`bC*7?5=_It!egiK`(L*#Kg7@-f?^tveL`b z`F;w$0`%wkWzAsRU(T9zZNoX@(3I4Hx+pd;!GbHt4G}l;=L1&!H~wkGRi&jJ*ck`+oT(ZHKbL~y!_ukf*AEXZsKBoU$~6UNA7N_{&ss)rgx95NXTbx+pN1!0-Lyg?sp^U zr;zk_S_QrceVyU@gd2&BUj=ZskZVZfa90^fPiLgx`W{s;BYX+P=}b13xseUUbzg;htK~qW*7RKf`CZbZbrJFjxQ|S1MWG4bnU5XTjAf8oY47}5vel#?rr5b%Q}!{C4sRs zGC5aP*^o%}xF03PtK;cCDnj*)bZvyjCyOS-W;4|er-ohuM5wvU|AOww!%m7b>7G^(mgu8yhNH8MTEx&{+j zJePk>La&JvfQa>s(jb<+SmC^X!-sZi}?+^jzMN0kSSpiH_t?@$PStIYoiEx z8hfH{(&=>9r_1yNj6eMN1-$~am~YAg7K54R zex1RaW$kH%hSKSHtfCbXvB_{BE~Y!6pcM|_V)-?FqzW}ubPOYTaa$!m1OyFEB@D&@}XWm zQ5n6*)(@iYflYoQHN>a}vi*Gv?B~axrv$wz$;VMN{?2yDnq2%S!70aJ4%HJPP2l!z8Ce|;+`kowLJ4Lp~} zm%55dSW?%ZA}zFK7?>ibpCm$hji9TkZY{!t;a%vKeonXKu*Qp^QSI3~HuuVC=>rK< z@RAX5tk|1)N0F`2In#JswHD2`1|rvdUwGw^uyLiK$`M};lz%e5ezoJs>6hkA zr}_rX$C8Ib_&4VdkrM0Lj?GKYos94x?5vDKwh70kOfOlbM6>(n1F_ltAU5cNzAcws zQ4uKT znFAo_@)ErHq|=CfO(=L04ZzFZ%sH4L)=4Xfv_i}ZriM0)TjWMT#& zq2@tFGlmmhX_6t`tFr|mLnwL@Kz_vRf|Zm#^{uXwdn}f%4HM0Qfy<1L2c`i3q_b<+ zVRzt^;-nsTk$p<3b4T39{c5`;N?^{5QI9Xfjxh}xd&pfa^(?fH*P!ddbbc6-0Vo_58p3K-}t=jqEz1c|?6sQRt zRti2iA$Nk}puxEwnt%tUY(V$pENeW9Xh2VADA!N9GdBtfz;n7}r}~3(m%oWKlVXW0 zz$QKW5{8WjM0d4mDdrG!Fe~|Lt($=~ewy=EGgXq3g>Sak1$;Uz47^*xj1Y4{bLQ;^ zJP~OF>nd*Zp^=3-fK4ys_9%o4o(Rg6M~}vsdIV*|wCle^6gmw&&!fpioEMpd5%)(3Q)Mh*NF=lcoH-bN4?&1ha`bq@&H7S@J!?AuMS? zi>5o0FApJ*XIHDLvo$&&I&MAWzn`xUoaVW32gaxwq%|&W4l1;Nv*Kma`9A!*O{2#9 zW6{seFIo?tcwQGutgO5Q{PQvpyT=EwygZvI4c;_Hq)sK@q#kiC#)w8kW=1c&q>qBo z2^~*b%jqp%ySJeBy${aEJZLnn9qqVIV}bU!H_XJ1W-%b(!p$N~o5qkF)sTtU+z61m z{M&Q>mAI$zjLp(4A=R09cK{}eFxVQF{8RyO5XJ3mOMBTF0in6at8$b~jF~X2ewD9i z)Athw#P)r=t2taRZRyKHL#Gx!Z~=9vFGpaq)rNo^;KkvYb1smD;iZOH)U>o=iabF3 z%3IwjJ4Y z9^fWPkbcb(=w6S_QlB5>ECgZjM7leUsnUq-mY}llz19iC*(P$E)VW zdbwwUUp|*5r!LgXNZO?5p^f>8E?qe0_B`$v4!$xgVzSW3cI`WPX^1rDxB(%X(7?=v zG}}*UmoZ_m+E)HEfk2+TP08Q946ZM-fNS9}wkfmB11F-zk9DuJHx`7zJ zn498*sTWX}k?v-DoXRBt#1kS8&c+4+gH>4L@bJfhjcxBz2vH;e;)bg$Ce3t^@^E(p z3K6>*y3~i|OSO;`(?!rY+}Z}xOX+JnwMwfEXm%u=!BQ~!{6^q>X|C{0s>$p*5n@VU zZ1xe~7D5U0h-yVt3*w`|Cx5%bbMbjpZ=x*BC^?U_6s4Qg$Ei9={($0}430=`O z#gEqQBSeD%HUl>n;K8;C;?Tgk^8F%}>S{URY4ODF_r1f`@9e1VwqYp~udy>0aG|We zBLI$X<%*pTKN`(%Ed^iSr_aSQ-hhlQg<<%rxa7x5f`jB?HG@jgAqdiaFF9NZuK?}A zTe9%UphQl^-4@U?vOVmQpPPnFIVLIpeq34Tzxo)y126*eQsosv zmxI9E)qyc_Mu|0wkq_{94)Meo<%~Z8qPIZn74BWL>8NiT1uP$#+-bOl1iX|c+`YW-S!LU&%}Is2B(()L-FQ-u?x-wa zZdKnI*vi;Y1^m@=?D}zrrTEK$Q`h%gPF*00kl*ln*(B-_y!DoI^aLaN0K326Il_5I z-v&7rFT(D}t$-3(!pTVd{Xw2p`FhhYK7ukRE^!9az>8|Gzbt7@Ju;n9A~9S^a`DwS z&vXu;?f%;J2zm)Hv)oONJ<9}xw@_Sr;m!8I?@MG2h`jAe*&W6MIQC|WV1_DWE%sIe z_SO$VJMNUvKwJSZC3(rUhoI2%wnA$h#WKgOaV+cAwXj)aP&1CSJ^1;Dc^HN6H|)Sm zFgy?ZhnsgPcYdCxHU4qdY2tidh%VTo0hp+Xn?q(KA3Mv@&^CQNyF#AIRiXaRv>if* zG(&z+_!&=3r$LN%-bkm27ff0qRM zPtzMuSgqG5f){2X;`ODzEp|}*Wr(akVea`b`%Uyu`PFLvnZgsM1s{rfb%1CFUAr)0 za!tcQ#(3)i_~0wqL{@4pE;#qmsgkI zYN3u>d)9sPBIBE8=G)Z0s>=&pc7(NeEOA4Av5l-I;?j5;p5t>}FU`4aI7ed#l$~TO z^f3G1_pm?wq*fvuI#};{%^o@issiwxrO^3xd3;_Gmlwp`iv(N_`7sOu2Wc?JWvH&- z{|F(v&61o6JifWvFMM%&h=Y(n2)>bedNk7RGiz_a?x1rZW=(E4;-6^Qo~)CNBWaf8 z`=5`0(v9TU8L6p3CEt{V>}hMcp<2@3d%EG-WB5LxPi_)5I~Ahc+NDTN47CArdMu>Fhah2Ukxqprx3)G=fTI zO}c)|AXt9I=uSYmGOwS5$3(I9nPFi9@oAa|8=(=m1^LCrTK)c50(x$u?Y&0|X7`QzNwmcm5-W+>?|oSbMzz$!2*n6I5Zz}FhZM*61mJ6s5ICe1H8jvv9DtmP}cPu P2>5fJ=H`%X=M(ckAtJ5c literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json new file mode 100644 index 000000000..3eed1569b --- /dev/null +++ b/manifest.json @@ -0,0 +1,40 @@ +{ + "short_name": "Stremio", + "name": "Stremio Web", + "description": "Freedom To Stream", + "icons": [ + { + "src": "favicons/favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "images/icon_x192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "images/icon_x512.png", + "type": "image/png", + "sizes": "512x512" + }, + { + "src": "images/maskable_icon_x192.png", + "type": "image/png", + "sizes": "192x192", + "purpose": "maskable" + }, + { + "src": "images/maskable_icon_x512.png", + "type": "image/png", + "sizes": "512x512", + "purpose": "maskable" + } + ], + "start_url": "https://web.stremio.com", + "scope": "https://web.stremio.com", + "display": "standalone", + "orientation": "natural", + "theme_color": "#2a2843", + "background_color": "#161523" +} \ No newline at end of file diff --git a/package.json b/package.json index 73a234313..ba2f0d977 100755 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "terser-webpack-plugin": "5.2.4", "webpack": "5.61.0", "webpack-cli": "4.9.1", - "webpack-dev-server": "4.7.4" + "webpack-dev-server": "4.7.4", + "workbox-webpack-plugin": "^6.5.3" } } diff --git a/src/index.html b/src/index.html index 552e72414..9367c7652 100644 --- a/src/index.html +++ b/src/index.html @@ -5,6 +5,9 @@ + + + Stremio - All you can watch! <%= htmlWebpackPlugin.tags.headTags %> diff --git a/src/index.js b/src/index.js index c7af67f8b..f148f603b 100755 --- a/src/index.js +++ b/src/index.js @@ -16,3 +16,12 @@ const ReactDOM = require('react-dom'); const App = require('./App'); ReactDOM.render(, document.getElementById('app')); + +if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + window.addEventListener('load', () => { + navigator.serviceWorker.register('/service-worker.js') + .catch((registrationError) => { + console.error('SW registration failed: ', registrationError); + }); + }); +} diff --git a/webpack.config.js b/webpack.config.js index 7fd65fcfa..c9c9952d6 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -6,6 +6,7 @@ const webpack = require('webpack'); const HtmlWebPackPlugin = require('html-webpack-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); +const WorkboxPlugin = require('workbox-webpack-plugin'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin'); const pachageJson = require('./package.json'); @@ -184,8 +185,18 @@ module.exports = (env, argv) => ({ new CleanWebpackPlugin({ cleanOnceBeforeBuildPatterns: ['*'] }), + argv.mode === 'production' && + new WorkboxPlugin.GenerateSW({ + maximumFileSizeToCacheInBytes: 20000000, + clientsClaim: true, + skipWaiting: true + }), new CopyWebpackPlugin({ - patterns: [{ from: 'favicons', to: `${COMMIT_HASH}/favicons` }] + patterns: [ + { from: 'favicons', to: `${COMMIT_HASH}/favicons` }, + { from: 'images', to: `${COMMIT_HASH}/images` }, + { from: 'manifest.json', to: `${COMMIT_HASH}/manifest.json` }, + ] }), new MiniCssExtractPlugin({ filename: `${COMMIT_HASH}/styles/[name].css` @@ -194,7 +205,9 @@ module.exports = (env, argv) => ({ template: './src/index.html', inject: false, scriptLoading: 'blocking', - faviconsPath: `${COMMIT_HASH}/favicons` + faviconsPath: `${COMMIT_HASH}/favicons`, + imagesPath: `${COMMIT_HASH}/images`, + manifestPath: `${COMMIT_HASH}/manifest.json`, }) - ] + ].filter(Boolean) }); From c7e907dc4e1f5411f97405985f8b26073a80d596 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 27 Jul 2022 10:49:25 +0200 Subject: [PATCH 02/10] fix: wrong maskable images for pwa icons --- images/maskable_icon_x192.png | Bin 2304 -> 5128 bytes images/maskable_icon_x512.png | Bin 7750 -> 21700 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/images/maskable_icon_x192.png b/images/maskable_icon_x192.png index 4bb56973c44326e6a9173af7c12090c278133280..f3e21ead53fc3f66bed107fc1e737451d321b0c9 100644 GIT binary patch literal 5128 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 E0d-t&rT_o{ delta 2280 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�RkJ)Rizv5{^<4diIi8#6DqIUN;Soc?><(9 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 P2>5fJ=H`%X=M(ckAtJ5c From 2112d40f519d36c4e404c022cedf192780a8a420 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 3 Nov 2022 18:15:26 +0100 Subject: [PATCH 03/10] fix(Player): continue watching on load was broken --- src/routes/Player/Player.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index a8f7c2c3f..ca06dcc71 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -240,7 +240,10 @@ const Player = ({ urlParams, queryParams }) => { [] }, autoplay: true, - time: player.libraryItem !== null && player.selected.streamRequest !== null && player.libraryItem.state.video_id === player.selected.streamRequest.id ? + time: player.libraryItem !== null && + player.selected.streamRequest !== null && + player.selected.streamRequest.path !== null && + player.libraryItem.state.video_id === player.selected.streamRequest.path.id ? player.libraryItem.state.timeOffset : 0, From b0fcfce24a6d411a36dd1bcf0458e05c3d1c162a Mon Sep 17 00:00:00 2001 From: zafar-hussain Date: Tue, 8 Nov 2022 14:05:05 +0500 Subject: [PATCH 04/10] Add cause argument to the custom errors #296 --- src/services/Chromecast/Chromecast.js | 2 +- src/services/Core/Core.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/Chromecast/Chromecast.js b/src/services/Chromecast/Chromecast.js index c025f2dee..44c9e4022 100644 --- a/src/services/Chromecast/Chromecast.js +++ b/src/services/Chromecast/Chromecast.js @@ -20,7 +20,7 @@ function Chromecast() { function onTransportInitError(args) { console.error(args); active = false; - error = new Error('Google Cast API not available'); + error = new Error('Google Cast API not available', { cause: args }); starting = false; onStateChanged(); transport = null; diff --git a/src/services/Core/Core.js b/src/services/Core/Core.js index e033396d5..9e78f1af1 100644 --- a/src/services/Core/Core.js +++ b/src/services/Core/Core.js @@ -20,7 +20,7 @@ function Core(args) { function onTransportError(args) { console.error(args); active = false; - error = new Error('Stremio Core Transport initialization failed'); + error = new Error('Stremio Core Transport initialization failed', { cause: args }); starting = false; onStateChanged(); transport = null; From d4bc40190fc31b54c2c57f623716456585714db1 Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 15 Nov 2022 15:12:24 +0100 Subject: [PATCH 05/10] fix(Player): add missing cases for videos menu --- src/routes/Player/Player.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index a8f7c2c3f..93089180e 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -366,7 +366,7 @@ const Player = ({ urlParams, queryParams }) => { const onKeyDown = (event) => { switch (event.code) { case 'Space': { - if (!subtitlesMenuOpen && !infoMenuOpen && videoState.paused !== null) { + if (!subtitlesMenuOpen && !infoMenuOpen && !videosMenuOpen && videoState.paused !== null) { if (videoState.paused) { onPlayRequested(); } else { @@ -377,7 +377,7 @@ const Player = ({ urlParams, queryParams }) => { break; } case 'ArrowRight': { - if (!subtitlesMenuOpen && !infoMenuOpen && videoState.time !== null) { + if (!subtitlesMenuOpen && !infoMenuOpen && !videosMenuOpen && videoState.time !== null) { const seekTimeMultiplier = event.shiftKey ? 3 : 1; onSeekRequested(videoState.time + (settings.seekTimeDuration * seekTimeMultiplier)); } @@ -385,7 +385,7 @@ const Player = ({ urlParams, queryParams }) => { break; } case 'ArrowLeft': { - if (!subtitlesMenuOpen && !infoMenuOpen && videoState.time !== null) { + if (!subtitlesMenuOpen && !infoMenuOpen && !videosMenuOpen && videoState.time !== null) { const seekTimeMultiplier = event.shiftKey ? 3 : 1; onSeekRequested(videoState.time - (settings.seekTimeDuration * seekTimeMultiplier)); } @@ -393,14 +393,14 @@ const Player = ({ urlParams, queryParams }) => { break; } case 'ArrowUp': { - if (!subtitlesMenuOpen && !infoMenuOpen && videoState.volume !== null) { + if (!subtitlesMenuOpen && !infoMenuOpen && !videosMenuOpen && videoState.volume !== null) { onVolumeChangeRequested(videoState.volume + 5); } break; } case 'ArrowDown': { - if (!subtitlesMenuOpen && !infoMenuOpen && videoState.volume !== null) { + if (!subtitlesMenuOpen && !infoMenuOpen && !videosMenuOpen && videoState.volume !== null) { onVolumeChangeRequested(videoState.volume - 5); } @@ -449,7 +449,7 @@ const Player = ({ urlParams, queryParams }) => { return () => { window.removeEventListener('keydown', onKeyDown); }; - }, [player.metaItem, settings.seekTimeDuration, routeFocused, subtitlesMenuOpen, infoMenuOpen, videoState.paused, videoState.time, videoState.volume, videoState.audioTracks, videoState.subtitlesTracks, videoState.extraSubtitlesTracks, toggleSubtitlesMenu, toggleInfoMenu, toggleVideosMenu]); + }, [player.metaItem, settings.seekTimeDuration, routeFocused, subtitlesMenuOpen, infoMenuOpen, videosMenuOpen, videoState.paused, videoState.time, videoState.volume, videoState.audioTracks, videoState.subtitlesTracks, videoState.extraSubtitlesTracks, toggleSubtitlesMenu, toggleInfoMenu, toggleVideosMenu]); React.useLayoutEffect(() => { return () => { setImmersedDebounced.cancel(); @@ -503,7 +503,7 @@ const Player = ({ urlParams, queryParams }) => { null } { - subtitlesMenuOpen || infoMenuOpen ? + subtitlesMenuOpen || infoMenuOpen || videosMenuOpen ?
: null From 7757ca7e4eada6b0a3253097782d1206dff4b6ef Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Fri, 18 Nov 2022 19:35:10 +0200 Subject: [PATCH 06/10] install hat --- package-lock.json | 1 + package.json | 1 + 2 files changed, 2 insertions(+) diff --git a/package-lock.json b/package-lock.json index 1642068a8..af307f99c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "classnames": "2.3.1", "eventemitter3": "4.0.7", "filter-invalid-dom-props": "2.1.0", + "hat": "0.0.3", "lodash.debounce": "4.0.8", "lodash.intersection": "4.4.0", "lodash.isequal": "4.5.0", diff --git a/package.json b/package.json index 43775796e..3152bb604 100755 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "classnames": "2.3.1", "eventemitter3": "4.0.7", "filter-invalid-dom-props": "2.1.0", + "hat": "0.0.3", "lodash.debounce": "4.0.8", "lodash.intersection": "4.4.0", "lodash.isequal": "4.5.0", From eae061d9972ebe4e4fa55d0b24611c71a745b1f0 Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Fri, 18 Nov 2022 19:57:15 +0200 Subject: [PATCH 07/10] new chromecast message protocol --- .../Chromecast/ChromecastTransport.js | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/services/Chromecast/ChromecastTransport.js b/src/services/Chromecast/ChromecastTransport.js index 7c82f80ae..f396df643 100644 --- a/src/services/Chromecast/ChromecastTransport.js +++ b/src/services/Chromecast/ChromecastTransport.js @@ -1,6 +1,7 @@ // Copyright (C) 2017-2022 Smart code 203358507 const EventEmitter = require('eventemitter3'); +const hat = require('hat'); const MESSAGE_NAMESPACE = 'urn:x-cast:com.stremio'; const CHUNK_SIZE = 20000; @@ -33,7 +34,7 @@ const initialize = () => { function ChromecastTransport() { const events = new EventEmitter(); - const chunks = []; + const messages = {}; initialize() .then(() => { @@ -59,26 +60,17 @@ function ChromecastTransport() { function onMessage(_, message) { try { - const { chunk, last } = JSON.parse(message); - chunks.push(chunk); - if (!last) { - return; + const { id, chunk, index, length } = JSON.parse(message); + messages[id] = messages[id] || []; + messages[id][index] = chunk; + if (Object.keys(messages[id]).length === length) { + const parsedMessage = JSON.parse(messages[id].join('')); + delete messages[id]; + events.emit('message', parsedMessage); } } catch (error) { - chunks.splice(0, chunks.length); events.emit('message-error', error); - return; } - - let parsedMessage; - try { - parsedMessage = JSON.parse(chunks.splice(0, chunks.length).join('')); - } catch (error) { - events.emit('message-error', error); - return; - } - - events.emit('message', parsedMessage); } function onApplicationStatusChanged(event) { events.emit(cast.framework.CastSession.APPLICATION_STATUS_CHANGED, event); @@ -165,11 +157,13 @@ function ChromecastTransport() { const chunk = serializedMessage.slice(start, start + CHUNK_SIZE); chunks.push(chunk); } - + const id = hat(); return Promise.all(chunks.map((chunk, index) => { return castSession.sendMessage(MESSAGE_NAMESPACE, { + id, chunk, - last: index === chunks.length - 1, + index, + length: chunks.length }); })); } else { From 7748a258d4007e0324c8e906fa4ab5da48f10e2d Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Fri, 25 Nov 2022 14:17:47 +0200 Subject: [PATCH 08/10] update stremio video --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index af307f99c..a2b2c37ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@stremio/stremio-colors": "4.0.1", "@stremio/stremio-core-web": "0.44.6", "@stremio/stremio-icons": "3.0.5", - "@stremio/stremio-video": "0.0.23", + "@stremio/stremio-video": "0.0.24", "a-color-picker": "1.2.1", "bowser": "2.11.0", "buffer": "6.0.3", @@ -2631,9 +2631,9 @@ "integrity": "sha512-knlcBibqJW2mbEgid6YEeQN9FPkIGAEtozYWqzKWeHd2DPY2nl8kYX2pMQpa2Db/RVSqbVstu/gdey5TtSgGYw==" }, "node_modules/@stremio/stremio-video": { - "version": "0.0.23", - "resolved": "https://registry.npmjs.org/@stremio/stremio-video/-/stremio-video-0.0.23.tgz", - "integrity": "sha512-2k9x28k6U5I4vrhTMo9hn+69s7tzTjVO9Wo2Ss8uufysfjuiQFWeJZkUJJgFEY0rWbCoJdfH6KVoMTcQLdHIwA==", + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/@stremio/stremio-video/-/stremio-video-0.0.24.tgz", + "integrity": "sha512-k9bSyQBbZQnLll62P/enc/gy2eILZrW0xuU/MRxxTm9gtjo+8JLp/77H0a4tQFFHjJ9WPuNj4K6Lo2UnGem3kg==", "dependencies": { "buffer": "6.0.3", "color": "4.2.3", @@ -15771,9 +15771,9 @@ "integrity": "sha512-knlcBibqJW2mbEgid6YEeQN9FPkIGAEtozYWqzKWeHd2DPY2nl8kYX2pMQpa2Db/RVSqbVstu/gdey5TtSgGYw==" }, "@stremio/stremio-video": { - "version": "0.0.23", - "resolved": "https://registry.npmjs.org/@stremio/stremio-video/-/stremio-video-0.0.23.tgz", - "integrity": "sha512-2k9x28k6U5I4vrhTMo9hn+69s7tzTjVO9Wo2Ss8uufysfjuiQFWeJZkUJJgFEY0rWbCoJdfH6KVoMTcQLdHIwA==", + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/@stremio/stremio-video/-/stremio-video-0.0.24.tgz", + "integrity": "sha512-k9bSyQBbZQnLll62P/enc/gy2eILZrW0xuU/MRxxTm9gtjo+8JLp/77H0a4tQFFHjJ9WPuNj4K6Lo2UnGem3kg==", "requires": { "buffer": "6.0.3", "color": "4.2.3", diff --git a/package.json b/package.json index 3152bb604..ba2d25fed 100755 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@stremio/stremio-colors": "4.0.1", "@stremio/stremio-core-web": "0.44.6", "@stremio/stremio-icons": "3.0.5", - "@stremio/stremio-video": "0.0.23", + "@stremio/stremio-video": "0.0.24", "a-color-picker": "1.2.1", "bowser": "2.11.0", "buffer": "6.0.3", From 8535213987b9be94cd67656f1823698e16ffb928 Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Fri, 25 Nov 2022 17:37:25 +0200 Subject: [PATCH 09/10] update colors --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 53986fe21..59a31a4bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@babel/runtime": "7.16.0", "@sentry/browser": "6.13.3", - "@stremio/stremio-colors": "4.0.1", + "@stremio/stremio-colors": "5.0.1", "@stremio/stremio-core-web": "0.44.6", "@stremio/stremio-icons": "3.0.5", "@stremio/stremio-video": "0.0.23", @@ -2692,9 +2692,9 @@ } }, "node_modules/@stremio/stremio-colors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@stremio/stremio-colors/-/stremio-colors-4.0.1.tgz", - "integrity": "sha512-yT3No1gIWKLV2BhQIeSgG94EzXxmEqXJLulO+pFpziqWNUbmmEKeE+nRvW5wtoIK4SLy+v0bLd0b6HBH3KFfWw==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@stremio/stremio-colors/-/stremio-colors-5.0.1.tgz", + "integrity": "sha512-Dt3PYmy1DZ473QNs99KYXVWQPHtpIl37VUY0+gCEvvuCqE1fRrZIJtZ9KbysUKonvO7WwdQDztgcW0iGoc1dEA==" }, "node_modules/@stremio/stremio-core-web": { "version": "0.44.6", @@ -16704,9 +16704,9 @@ } }, "@stremio/stremio-colors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@stremio/stremio-colors/-/stremio-colors-4.0.1.tgz", - "integrity": "sha512-yT3No1gIWKLV2BhQIeSgG94EzXxmEqXJLulO+pFpziqWNUbmmEKeE+nRvW5wtoIK4SLy+v0bLd0b6HBH3KFfWw==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@stremio/stremio-colors/-/stremio-colors-5.0.1.tgz", + "integrity": "sha512-Dt3PYmy1DZ473QNs99KYXVWQPHtpIl37VUY0+gCEvvuCqE1fRrZIJtZ9KbysUKonvO7WwdQDztgcW0iGoc1dEA==" }, "@stremio/stremio-core-web": { "version": "0.44.6", diff --git a/package.json b/package.json index 28ece56cd..447a3ae1c 100755 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "dependencies": { "@babel/runtime": "7.16.0", "@sentry/browser": "6.13.3", - "@stremio/stremio-colors": "4.0.1", + "@stremio/stremio-colors": "5.0.1", "@stremio/stremio-core-web": "0.44.6", "@stremio/stremio-icons": "3.0.5", "@stremio/stremio-video": "0.0.23", From 88e3618bc5fcc4f7af4433a4d7edb51c12766251 Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Fri, 25 Nov 2022 17:37:53 +0200 Subject: [PATCH 10/10] use background color from the pallete --- src/index.html | 2 +- webpack.config.js | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/index.html b/src/index.html index 79a09fbb5..7d07b51fc 100644 --- a/src/index.html +++ b/src/index.html @@ -8,7 +8,7 @@ - + Stremio - All you can watch! <%= htmlWebpackPlugin.tags.headTags %> diff --git a/webpack.config.js b/webpack.config.js index 93cff5e93..51997aa52 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -9,6 +9,7 @@ const { CleanWebpackPlugin } = require('clean-webpack-plugin'); const WorkboxPlugin = require('workbox-webpack-plugin'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin'); +const colors = require('@stremio/stremio-colors'); const pachageJson = require('./package.json'); const COMMIT_HASH = execSync('git rev-parse HEAD').toString().trim(); @@ -208,6 +209,7 @@ module.exports = (env, argv) => ({ template: './src/index.html', inject: false, scriptLoading: 'blocking', + themeColor: colors.background, faviconsPath: `${COMMIT_HASH}/favicons`, imagesPath: `${COMMIT_HASH}/images`, manifestPath: `${COMMIT_HASH}/manifest.json`,