From 498328a8baecfb232c5b2d510586de5ef960dcc9 Mon Sep 17 00:00:00 2001 From: Chuck <33324927+ChuckBuilds@users.noreply.github.com> Date: Fri, 4 Sep 2026 01:16:48 -0400 Subject: [PATCH] docs(hockey-scoreboard): document all 226 settings, with real renders The README ran to 894 lines and still covered a fraction of the 226 settings, with no images. It now documents every schema leaf -- verified by a token audit -- with five renders, and keeps the ChuckBuilds links block, the rotation and resume semantics, the non-favorite dwell table, the exclude-teams note and all three example configurations. Three leagues, 53 leaves each. The two NCAA blocks are identical; the NHL block differs in nine defaults, so that is a table rather than 106 duplicated rows. Two settings do not work, and the README now says so rather than describing them as features: - show_powerplay is resolved into the manager config and power_play is extracted onto the game dict, but nothing in this plugin or in the core draws either. No value changes the render. Filed as #431. - Scroll and Vegas cards gate the shot line on a flat show_shots key at the league root, which the schema never declares, so it reads False whatever show_shots_on_goal is set to. Switch mode is unaffected. Filed as #432. Also documented: the per-league display_options copy wins over the defaults copy and several of its defaults differ -- show_shots_on_goal is false under defaults and true under nhl -- which presents as a setting that does nothing. check_plugin.py passes with no FAIL. Carries the docs-tooling changes from #423, which this render depends on. Co-Authored-By: Claude Opus 5 --- .../hockey-scoreboard/display-modes.png | Bin 0 -> 36044 bytes docs/assets/hockey-scoreboard/hero.png | Bin 0 -> 8425 bytes docs/assets/hockey-scoreboard/panel-sizes.png | Bin 0 -> 39002 bytes .../hockey-scoreboard/period-states.png | Bin 0 -> 34752 bytes .../hockey-scoreboard/shots-on-goal.png | Bin 0 -> 23575 bytes docs/assets/hockey-scoreboard/shots.json | 1334 +++++++++++++++++ .../assets/hockey-scoreboard/show-records.png | Bin 0 -> 22694 bytes plugins.json | 4 +- plugins/hockey-scoreboard/README.md | 1234 +++++++-------- plugins/hockey-scoreboard/manifest.json | 12 +- scripts/docs_render_support/sitecustomize.py | 55 +- scripts/render_docs_assets.py | 3 + 12 files changed, 1912 insertions(+), 730 deletions(-) create mode 100644 docs/assets/hockey-scoreboard/display-modes.png create mode 100644 docs/assets/hockey-scoreboard/hero.png create mode 100644 docs/assets/hockey-scoreboard/panel-sizes.png create mode 100644 docs/assets/hockey-scoreboard/period-states.png create mode 100644 docs/assets/hockey-scoreboard/shots-on-goal.png create mode 100644 docs/assets/hockey-scoreboard/shots.json create mode 100644 docs/assets/hockey-scoreboard/show-records.png diff --git a/docs/assets/hockey-scoreboard/display-modes.png b/docs/assets/hockey-scoreboard/display-modes.png new file mode 100644 index 0000000000000000000000000000000000000000..ce1f650a59c6e9af24437da0de806bcfa22cf379 GIT binary patch literal 36044 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 GKKfrJ64TKD literal 0 HcmV?d00001 diff --git a/docs/assets/hockey-scoreboard/hero.png b/docs/assets/hockey-scoreboard/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..d0d96d8616e0d12b7025c691608e0a6dcfc4fb58 GIT binary patch literal 8425 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%0AxY~&o! z`YBf1LC(9A_8%el(|GV~Z#*w3vO8aJm*kW$ddJD>132F?JPXbsn_AQl@>euD#z6PO2z;>St~LhlKhuqMHfjn zTa}rrsywhxt-+V|6ck?`jwOwn@>6={%AQ7ersOVqMclYd0kERVAjeYot=zzdUn%5< zRfcCvm0)x#EC8U1s8on!)Or+FYnyTmn{>L@2{619N`h$f?pAw2ye6D{eR{~+x#)Y{ zNjjR72Xg2o=~uscL)o~a&%S~`dHOb zyD%2gC2}k30{qFv`RxnG!X|IX754SfI)qcd1HLM~J{cHkx6XT`M`Cr%twgE?<}Y&E zv!9R%x^k{VIlD@sdAKvyEnTy=YDp6N)JJ(g!~1BauEwMpdqf2(m3@D5G8oupBz-x2 z=>S%1Ep7Ef!}k@1aADv~C^nM)8~p=f7=`hP-uA99A*y63eBv(lAOlB6_m5Wqo zD3#!_HMn4*;>ZOmZX+I3?U5bro#yydqkGoFQDsNF&+Kc7A{8gcJpLn@m zb?S|)u9DL<2zeQPJ9kxRm#Eb;O%bN)M!M+g4Fn0uy&;@iVF@U8(l7zs!9Q13ltmx8 zGycS?cDYAp6phAN+Cb?>nF)yUb`{yr=iE`HC4eZ7RoxeUCc_;Uc;kuG=aaILwg5Lv zdh5+yWD}1m^xs0bt$6MIJc_xJ!_L(a?!RbQQBCmMuN5RbC>uAmTntfU{8{D4lf_aR zmV&WmV~|Kb?&$FWgVq&eE+avj3!xXnq&IIZ6?LUAC zT%+6<;{6>ATq6Z>JnNQ!jGYHeyaG>s$#xJ~5_nMCY+3^wY&Z?;?B95unc*#*MkY5R z1OwXgFvEi*5)A`Fi6Qu+?nVPZH#K*G6wQ$Faqo@D%Nz7SMco33sLoy9SWW<7gYknm zL~BrDt)*)l^;|OJ2j{mQserw2Y8e>pTCs(B5J+8E1$Kq#H)Ce?;eqa$B=y1f6SKo8 zR?jwZg%qBTX}hUdJZ1K`kbYrT&(DvGNlGUO9p%HG2>bYs;)r4-85S)$o0-61{iqYA6s zN~1BAH09Sx**$@`t9=XfS27bkM*T>Y!Dt9cr3@92QjHcbQ!F1_F*8%nj{@w|ob2_f z41)gywf`u#|FF!_)0=*_7n6SvXU(b-arG3u6p6Yn-)QmYIP zNd|i7YXf0k#XS0&4dP{e-UnBb9o}o95_|}z@$t7$Iy1k3K#E92i(sMhTT_pRpeE~d zgZ>!&A07q?|}&S7Low6^|2K9=H16xAFK2QWg$<56P{JX+?V&&15!hz##xl=8Tu` zfRM6Zl^8QYbi?e&kI8sdlM}U$eeDZ(2zjenRx*PsbfRq?aaOCoz3J6Sq=5!7!2%IF z&A&2`WDT(K7ZdCv`S?$r!EleR)29V9$#GJ|+Cg8hzWZ@TZney_bt^=7iv)PB`F!c)iA zSSNBKKLqbG3bz8XtWMORHRgQ~t8FNkkz&;)6MLo3=NM(yK-JL6siD&TD3d`pw!piy zdNjkpvZU}fj}p7izS9tvsQvpe5DOpOHAnTuV^bk{uhqP&NmDg(C ze{DH{@OS8au6=!Dr37wV&Qu)gDNgBDGGfZRa}YIGIA&L|Y}`GPwZ(CSf^2VQmX!3Ajt`Vc5J$bu4(`hJ>F`C3@^Nm77!w(yKy+lB z^WdO6&eb}Sy}H@Q1~X_V;zj8pOU>u-k_fvv0ySI^G{7<-^+n%y<3-y8;^(eaGim}J zOQ-g9kB1IQgAvh_lZ92GPox^dxpSA{>84E;%iar~tII5uA$s&FDo(5l1<`gYpm(?f zs|*24!pLA|+L2gMTi&pDx$JAb$}#_^jB#@vJc%(d3!a8;|LAn_U|b z#1@mJd1U)n6Ot?p`}uV?muA35k0fd^B`5$>UUQ&1GA6EhYyxRjEaZsIg7-{5u^3!g1p%}(?>LAaLt+m*a$A}y>St< zIqXZlJrLYG?@->I`%G$~9HEk1*ARkzWo+fJb`d`C(Y8v0v3a+_%^E4%i7bM@2tfN~ zn+AOYng#l`Q>CCOG>=)DLlzB{FO_?~@AqV9U+F4u;mqtv7KB!;F^=K#U?L!&Mx>k5`W;*MS zFdT5l_jsDX7?C%wKyoREk4jstpQe#O58(|>>Pa}DeG|KP`ogtvss)u@doe6?79hqHI z)85#ZhvBYPjIe{8@xTP26E?Z@$;x^a0*{L`k%TJQ2`ggXIFEcSQViFj@YGHP?TP3= z9M<~v$GJRq>S)(&;Qli8xtLp=R%rI#RdrP72Bu?gD93SN?F^>W;8%ZGR&_o#wNtN% TBR=eEN> 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 L;k9zDyFdMZ50S3w literal 0 HcmV?d00001 diff --git a/docs/assets/hockey-scoreboard/period-states.png b/docs/assets/hockey-scoreboard/period-states.png new file mode 100644 index 0000000000000000000000000000000000000000..f9748b3e688940c03b93f13d16127de94b21b8fb GIT binary patch literal 34752 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 literal 0 HcmV?d00001 diff --git a/docs/assets/hockey-scoreboard/shots-on-goal.png b/docs/assets/hockey-scoreboard/shots-on-goal.png new file mode 100644 index 0000000000000000000000000000000000000000..1eadcbe2914268efdc31b9ec76f23229ff87bbdf GIT binary patch literal 23575 zcmce-cUV*D+CGXp>WB(6Dk9QG5zx>?Kx)7SNS6?L6G9KY*Pw&K&;<-2Re^w^1nHd! z2!YUBLPvTDHIx8>@LTBqeS6M6^X>o6$t961*UDnO&-*<0Q{MXyeW9*+nf@j{9Ua|e zrRUEebaZDxbabaEzn%s@8GSGFoQ}?LLh0FKsQ1X~xYtXlNB!|}cd61yT^%lL{hx|+k<*NFnVb+6ts5u@&cUNUP!e>46)2J{A07aaf2ghynH3ad|U zU*EZqa*OrJ>293qW@pN-WSpC9S{r-nJh&V+@ zcmL?*k@|&zw`^13O%)5g{eO2+%C-K&Dz^nIE35j0<-D@lKj5RZ0riM0baXODxlGeD zGeX!ya)ODk?Z)?ph;vQAv-KCkFn*M^XxRgs$@+jg6QRt8FaLVN?{|_B9?JtuRSRiU z8g)H^U;lyIe20o))of27`vZ&Cjt?Tt0tVaj$xh`CqvaVBIU4B+rU;*gKhL(u3nYud z37<7Hr>CbQgbQoQ%2rnMUXuaLKEvDzMzJ4GUXu1h_hG6tEsbn#NN~%y^V}wmsS8BQ7P$C9?P-ZDu{!n z9A*>msh+J9%LxtE`fQ0$c+ZTvbr+ao>nGQpfG6|y^=-zM!--W)XX)Lg4)*AF5rXTV}?SbGLTP z1;-9+iLf0mMs+U$W^!vT<-rRuut|IYwmI^qSXgLi=wUx6ZR5NjAFyqmt*xJR3r$e{ zg{{w9FN*Ep&)s3UE}%l8xqdn0fXKYv-{@61Gu>E+yP}h z{oT8l5iF9f7V8sr>vfcg{QUf|K)@EXll#QP6gf{dwyxy(Y|US|aDfrL{jPm(qzq03 zjPF6vx31ftPi{%X7}uEi%pqfz5`?o=5(HZk)4+b$nVDH(T@o{wV5%Vu>=D9%Kk?nW zhyHNH0`}c*jp5=7pA0-cT3T8Pzb+s})?x6NMe5e(Yi257kB``v=&!)lMF|+y$#@w7nue5 z`T0|XVZn8*NCuT=Y<5%-rBP6OkzTd+V*8BMsw^e z4~n#?rpfqpCW)Ord$t=)G5X`T`z_lfqSNX~nWUs-OJY~5w7A{CXYD+l7&K(G+~Mk# zE4MYUh{H|X%~8N1=3Z!G{DE(q1|E4J5H#L&|10Qc9JJvsnXQhYAw5_JuyKR}L$B{& zU!S<|=ki6*n)8=#I8O#pz&it4F=0fKLtj>?{oUVw9rGM@0741ve&Au@x4Ys4IO|1v zdIoVmu)7o2)nQhrT9>KDw{8nv4uiSKeF{wd1n9KQCu)7t18G&l+4AAnDZu6sO#=fO z&N4#};U*>~vmqH7x3|`@ca>FC!Vha5o~{dpGjJ0iJn!|=C^$_z$aoji%Uu}Co{Si zk{?*&vy|daLiyIy;8Mr&>gjt>v3gXw(v#fHys`C(l*~Udhp)& zAYH)m44vwa-w!6-X9&u1z6~SRhy!Ib`-$O1cr7&CD^$q$!#?*nD%kIR-mcy_B7-F1=d%=FJ-* z2;^zIivXq+BqC5K6yRKNAUF-n?e&W-LWSo6tn#Qbx_F&mqA?B$E0SZ1&i371Vc8Gg zTdbI_BxjZ(jt*Mw=d+U??S_jj0Xz$&)J)1_o3quDZ^D56!|qLo18%5&hqXhKhm(&z zzDeyb%KD^Jgd}yP#IVe6Fhf3EMX0WH+7$5m>zB?&3Ink3m7|_|hzJB?nMXD8Yaut? z_iwwL0oGRL=F^M4nLr2_YkmOxdD_}8{eHczy`5DKaX3^2Gpukt0zg@JfSF(KzT3Pi ztOLLbAk`26%mlny5frneI~!NbUV->+0#Ub$!f3 zO|BAGdDRaAR|0%JF)nTkNTCYT@l3$xY*b*69LB3XfbayM2ykq6IfM*0p6=Dv7z{AaU!J3sG<;Ra3fGc$J^%}m@ z(Y@gHzH&8=<*n2mK|zcMi4e2y(u&6?f&F$9g<*)J9bJWUbaYKWYOBO$HCZ4f|17+I zeDb64l6ahL${6J%aqHHnhis#P#k^u}*R)5KS6R$}yHnB-mMP^3K4+L2@%p`@x>{k`#1!D#6{Ax4Zznd@4L)1M7wl2hgW zdo6XbmXyE-`57ARnUa!{g$tVMFC5kGxj3}6QhyW|8|$?)MB5Az0Uc;?n(^|vOV4z0 z@f$9svBEgmwl;8_0r&UDwys>c5-((UQ{N#d__EM`p_y9p!|^&lO4RD8Ic&xXvAg*R z9ygA0&yS6b6{?@@yDng8Y0bHJSfWu}>^a&rQK{5_EK50jKk&XY`C;eb$_!Ae*_`ts z5d;bhD zm7DRGv6#TX7C-$OFUFhxj-H;o2Rm@a@%R-_OBm8`rnACvq;xZgl9Les-biA5x;gwh z%T-x-?xO?7zoH8%!#SJ+doBn7z5swLL5v$Dw699M;6v!oOMHphIsdeQrGKJL*7@aP za{>=HuZACGRgG2LNNR-)c*lDraua@r?vR566|+ z&a?zyW-YVnZCuz2koHnnQgQ(vPu#S7&DXc$uK4eB#ipIK+i=Pnu#FuZOt!X{Gltu2 z;=yD>;NBGV&p-dn&mT{I=x8%msRa07oyoe_R=vQzd&5OAD%nycQ}Pi!-@vzSA}~O% zFhAdY4sWVDBx=+1)x?g*IJq!u!OXN`kOlgJfsK&p8n5*vY9~?G)a~f?87ek$M}PPAnHXP_wT4#4=4N@5 zbRkJeZtB<9VTuxxlEW7+glan8##>5zto4<_E6!cM$&+)(X`=LAQfh?NFqacpPN-t~ zet@j0vMc`e5tYxx2nxN{X*L2w#uL6zDblQH>;2s)n1+X(XPkeAxXXVxA~I5}#iKOH zf0oF6{TlEQA73YxVix~C-a9}RVNFLT(G^H7vmcH%Md%YMCSUOtR`1RQ*1uSS1C?8nPt)bgyXER(u!pmLWiTeW4E^2BUghDgtbA@AJb*;yQx z=HZ$D6(+lw;s%t35D27Odi_t+c%ewdyG#~6I=Yv3tLYQzzILOAPFT0^AKh5R>|{t= z-9Yuxi9NOflh2Q=j(FV_6r89JAhld3bxV}sd=^ZH&~69IgCFDs_Jqkj+;VbQr{mW^ zI2aXsYu>*hdQ7pOKOSTjI`BEF7E?6YO)j)fcg3R@Or14Jgq(cCiih0XVj^zx&1t1J zy?qmH^gxxAlS)`~ZjX zL2_oLzBm?WP#njLtDLZ>7E%Mv(n}5q8Y)zeBPso-SlXHE0tVjA8+qL;6K*rXrr2bP zg9IBxNK@}6azl`0)EU3UPdjUF1Yi*{-M4E}UFL!0>RMc~Uv`S_yWEr=A)hJJncv8B zexvzr6yoBW|X*fO9R6k6{PsE0pIxg>b~;0TX6jArT!c4JUskRH#%rl72suZdBpu z2OE_Z>qWO8%rw3HYtn{Jf{ltVq(}sYe_|-S&ofI_L5&f=8Mx>pX(nUUf7NVLtHEPR$zJhdZGtsEj$3Y=CY1#~9Bb2iZo`V*FV#_`Fh0yX<-)Xa zl&b-bgTTW7U?kCqVod`DEEw(EJOXhZYfiET9DmeL7LZmhfK^1lpX?uL?E0Nky4S)F z?#h@~F84@mfvte@Y1CJ#HIwD=RmF#$JczkAUTsI_V^KW4A?2}CK*63nBltBq%B$st zMACQI(8kGh=I0FNKc_QpecYUG7e%!;4#%ZX$#u?UPz=`cJv6(1GaqUWgXJy!TGxe3 zOv;S}%^VSY`|>AZbW(2X7(zb;Unc3A1!kD>at6qb`)it|K{1uPg6J`i*ALwzLVI@( z1F9YC5MeqrBw7W$mt=LzS|(%s4t1g+^LKtBFZzQ-=fugek-X|F;hxPVZlaR7q%qEq z)oqsAf>#lM8)imJFRHNI&S`f-pUCe zp*}Hd$KHbIqb+ZsH68mZ;gM2W62dqUm<+vgB{pK7Z41@sw1Je$EizS^`=Cj<(PDF& zyW+kANGJe9O^MG?8mw4YtbxDO?R+BZn}FGGu-;*xEAqVmoc#M>68O^9Y{B5_mIy?Q0B%Qs}_8%g}a8`w>QQ}`pP>&@qL?~{Xb zPG)DpjGRD-{^#(F&Gcjhr|mPf%igaQX05cDS|o)Ehkx9ED?UMt51W}7EFE_e?CX3R z9tjiwsvOIz`HamxpCKBN7XU-VY$e6bcnqH1PZGSK=W?}haLjd8p&*~1g&&D_s{aGY z>Nu#Lv^rjbA`@nG2!kV^9Q1u(>VmWPzn!sk$SMvPJ%`>i-~Re!E-At2;Lmz-jGxY= zT)T)$1nl~QZ|kmVpW8UX#j56$RQ0ES`E^W3i`8HuIZntVF5uI3q5*Nk94??^+A6j8 zx!ECqUF!ab*wEgz2RgOi-J8B7N|Wr;^ZgTvXhr@pQ~b}x|EzlrhPQeL?cPAojc*l0 zuh-`oN+uRQE;BnL%1x|C@%%nPRUm2!2^tBE(>2}V>Nr>Kv3 z4Zhevc3-aoL8z~SEcI;KqsM&AqM)>WUbwGumL$&j{Px#_L!Al)MQ_zel3bpL>O-mM zqG#upY1a~L)3$}2NaZv{cvSa3~gbt;ApQhG){J?fRM zvu1XPRrXPZ!<#L6zYgc#DOl>0d{yY}7CFb3SI5hvaWWYFiKPEIGrftyG?ZcK3jYx_6gygZ5DS4lHK3erY0J5CA*bP?0_ z!IwRhz1j;#m|e-NNpJlRudA)1xX)!hAp3N7a`Oh~z4PL`TdZtGbWxqW!@JCf7dy13 z4|ivr^nO(1J9m83 z7in_jnm|H2bk~CFbd9wugZ2y=kjm&nwQI(I7?%NdD}IpknjLa)l%`)6VJ7OYcJ4XK zY2nQdT;%fKHui7r*^goP{jx6$nW;w?-io^JwvdDj?@1bWPx8R8yY9v%`Q8XXS>59G z&ngU!9(?xnL-20L;*^2iXdnLZdtH>JPOCvAu`s+~A`59PH&F5$XCa^R=NzPA3!K4y ztzSwu6tNmPbWG-r)anxcttW`GU#s2vWa9Yi83>E4edX@0!Xcl_7=n~NU&`u)ReSp|e7l{svXJgq2c4E~Z1h9vi~A#aNpDLVJ*|dJP2=!mSdzsivQV@`$6Tzu zSSy~$&=b)FpS00!NTqIz37gbRrfikdhwlt2nq(E)Cg$_`T7)_B7p1vf*-B6|u+8nn zcZlg;c9W6jh~CN?o7t4`6lIlyO2+^bS#^+M#iBa%S<%a-_LEzd2RllCy z4>;cudK2%lR+L!tgilxi_1m@qJ4eBa8Fy79`AJ=7vzL2USIxH6yoU5$WZ#**Z7Hic z!KSopB=ZHSTg7<>zxu}RNO9hE?T~EAa_=dL8|ZgID^JKZJo(wUH-$t4vGF4!{s!!- z#!9kDAj?~;&l}#iCB0pV+s}kPTsIP6N+${-ry+SYak@E)hLpv5tYOZ60<>&PH6R z(9NnRY;=yTBLROV(+P>6jY&rJ{UI+MJje8w9e4j>OW2H_KKAhNG~ca7PZ^9&SMm7S z2M={bBA89{^;@me1G*06POF^>C^2$VcuEankBc^wk~z)G$X7ML+p@GX%nFkyiGoZy zcJ=ZYq^!4BYD_9SMjlhUKI@i0TBbwq6_~t14Z~4awBDipQf#=Xr{6~Dj?8pKW&4#i zWmY^d$wM_$ccRkWbJO|{g0_u*X^(()6vrxy$zi5X&Wm16H7Nq7_z@WYwg=t(4Ia** zhFsCUysYF{CVC}h)gE+4o^PW)M+GKFO{BBc$oFwNOmwGp{Hd63pOdzFRKf- zZSMMocD;<LbT%8x?c`< z*@~)MmbL!4rlDL6r4LsD@-fy;7ax4tgXFghRID9JeN(+%=(7xm8N|;+1Yhn=vEIQq zVepMxZ^xw}Lccms%G>1eFV<%%Z^w9>rx&e6L(p@p?z+S2i4fR$eS2rdqCH zpd{azkY{sWLu4cDq+A2vH@*CSc?O=VYuEC!a zKlHKX;EZp6OWm&U8|8u&nAz+4R{TL#tf=NhMc{dK%HRX?wbyAjKY*-m{gv?56a5{2=b9=vO$N`q(wSsM}@L0(%=j4Gw{{4GP#mG2t~{_QG+RCQJZ=K&4SgVveI3Ag7->dbJPC7c8I+z&udfvYyM7GT!s{R z+t+ik?G;pGBUzO=#Tj_N1Ax$mjveV+TxQPi=lw>-jue*JU4;8NcuS;=@(#YbquDz8x$1V7>meT`z1~90S7kn)aYBiS z_*Nv~b4qruKcFar`(A3IJy@f>R9_@5*B@;Dt?K!=OZD!PYwNa1X zfauw~e`idP#@&-4PcXP-?MYOCQKtGk3w=yPR&UO_5X}zdaNT{uEy-B9Ifnh~mtc`l@b+VX) zS8opoq-~_g6eMmU{?(>Sv*yvR?9={0&cHGwP`HkL4E{jPFRL$CKLDMj=kpbnSAJ7X z)~>K6${|^q`%{{gx^&9Ow@q=&Z$lM3L*b$``$IuZsA7k>U9?fPZw>UE@qjTX9kCTY zfj#Y;=eaKVQk;*8_>yG0@hJ~rn}v)FrJ>5J}|Ynr;$WobzmFNSu?p* zeubpZb^VgAO749&`Dy!PWM@Rl#0z}&VzLmQ=-^OZ0f+oLybPy5DVvJAQrws!SV3AeOwo>I5)c%O#}76M z#VJqKk4F{UK4}f9jKTYsnBA0_wz$@CEB{vBv{(AiNh!fke0TUpw=$uJ1*}S_fdckR zk;r~dN=Hr{f5c8$A`I&FK}r{je5Wc9d`=u`w~$2yO?NOh9lD%jQ+s@%S*UEe zo1D2_ccrv=OR(^tGtdu6rpw0M;p~>Fn-Lx<*{js!i-VxJw(Y7d+BrJ4{P)~0q7OHV z60)u^lZp=f^;2&bI2sKP`#`Elp?+E9d1L7;@`x^w_U|%CXYlW01A` z>I>LJKd$(*+lV5c^z2`8buxya^`jYebjQ9c8ak0AYzktj8&#T{IzD;FS0ou-i>2P zx0~$nk~`7|1=eU>r4$-o=x?m^UEj^(zL9o9#Sxh`l1WB*uXEADW=$~--CZ= zem>WHZ&KNEJM|zbBlZ;(aZL2u33wNuyD*^EeNuG(XQlSDQBxgPl2wQcEs1mY1BQ?(p7 zw;AqfbT(vo@lBrdxlEtPoY<9IoqF0lD{kjK{7y5F+^H!a<~%$4e8GgIpu_qz64m?` zUqlu8q^*^j6Y|>>>3SG$y68)gTU40@p!pxn}=@SJkDelFXmZ7lqw+cnd?1H zcM@%OI#Z;bP|$gy(JbrxS>i$OJSxa<^I4wn3K`fAM*Z{9=_f21B>9VK&a$nJ8QF%; zvvp&g6QNBLDECDZF#S>3N28wwXqOWdIkMzqw0r;vazp)1dY@FLV;#;I(p&C)v9U6Ke>cit2^Nght+tj%+Bej68v?CPM{HQvd z8G(F}!x4vVj=>sCwHuS8qeZ#dOG;d>ZP+Oj%S__7eyMmhvPL85xZHOQ~-# z5tmI0w-Oj|)VgrNjPH!OT1r7$@R{mm$a=?M9f$bTS#+(OM~37<3am#t%DYY~cO83N z5A|H>nSE~Lp8>s@z5L139<3;B9qUGI0mj~rbYcyw8fAh>zLDfNq9o=A2vRO8q2SA4 zZF%Lh(dnqbIlh^JkRp|uY+qxrc3gC_*Gd9jvToGS>-P8o27Dexrtog#(_O>Xy5F9u zem+O65sJg-j*mEqd`gQNdRL#CRXkw;vM8f^jGD&$)=|-wJ1+<>+VMG=?|l8o#@6oL z$tk+FNo4?T+iAgHuzA|NQ_{r0Xr3+MIA0Q1gbj^Twng*sx2O|tm?_7mwz{n~C7N2) z@j!#XzksW|(HDTq>J$dbWjZ8~m zH9XfxQ~LBkev~==$txcx1)Tp-5sAq0u)Bo>`|XJBztt(3GUxle-hXJN;ItaQST+JW z{^DE*?ON+46eY|xS|;aTPd!L%Tkk`B!=$9|7|q(d%H#x{V>HG-?EmK~`DbCMbb2bl&gsdV3vTI`SFJr+OY~2=3ZhwpyoI7Jv!I-b2ci zZrE7$XcfL4T&pO#hWA&?=V;)7i$00!gj07U)IeMLX~Bl^PVx8xFOxrzo;p&lb0h2! zpM`W&<+=KkFnrB+gbAuJp&EcFhdNYA9^U0~yIq;c-*#o{BB5Q9c|jB4t?lqj*9FEc z0*YQonb}Gxb=xjWLN*6U_5rqy2LCmMsghm3`sgZggLSkRXE=xj5q>6Ge!@B$pA7|j zMHTx+3%=o&X>Xnk#%*5+@sMA;Yn7|>yt%TVc}%A-2YSBAXv8pjyJ;QpsAa}g)Pt-h z-#pz+$MKoo$fLd3v{YFyo9pEAm?TKm`WguZ5T$6^pbI+nZs7nD_PGHIH|%|JPB| zs;ca+lc*u6dkn6&1T+e|a>5FrnH<|{fzhzg$}>qczShDt&5iy1FjE!z<`&`GaWA=r z!^4zO=4A^HWZ`JJdh>#+rbx(e(UK&3%o`U3VeuxmL-rA|X)ajZ?k)|XB^I{b92ZDi ztG60x>RnpuOFi5d&0I%Py;*gE8%I(9qZVc8pb@e5D%X@Y;B1(B1aEE<+hCGR*s`)B zp_4yri{l(UWih~g)XzX^l^gjETQwNoqx<#`D;K2?Fm8)+D`h;speD`g$Wu?hHA;sl z9~d$5*g#Ybshm5g_CVa!DZPlm{t!2^AfAojMasaz%=$_lUe3btsc6U#nfXG87BgiKuv}H-xQB0?LL!D;;n5~z)>UHCq{6VQ z;t8K@8k%2FMtz%XFmU@ST&4@jDD*Mko`bMZrkNqb)lan|)mTx_=bq#VSs2B7Vh+hv zZK?BLP9Kj;SG>m;8kSz1D{=DYLQdCJL0H`P^&v}rpQ>Q$gO=U&jXH*w(Gvyc%3=$8 z#ct*QT$2AB3gKe@4gWrF3rd@T!M6C9y}oJ{#@orfC~|A!v1C-{MsH3M#D^NXg(5fb z0d)qoOi{bAX4<3E?V$=vzC>ZLxZ5+Mzw5S-Oj6JOda|Mt3gAJYrnl@s76%k5wZg(r zEO8F<9 zq-0|DTWaG zebvwas=K^!t|prw0b{=ag>g$N&K!P68;edvs68tBVI34{*a;9;}$W(R`zlfwxNf+$ipdJGv(@xYF`1 z^!ObCu2RrdXUw3bpWVT0~@*h=&f)?CMW3qfAdKhBU7dH{5nPQz|j5O0M5WZ@}EQEXSs;`>wiMxZ`29dA653x ze(i5V)qlg$-;R?0vjF|yFOqnjV+t^rJ3Bi30a`P>?J=SJ2%Q?``5qw6(6)2r0su-U zpDutE@sBiE3u>8pt9vzMS{^v!(+Koor{_M_F>4a10jSi9S?d8F67vQ2LT`|%` z9reV{5&PeR7;i+P`e0!myV2@$nCMfYy_?dl9D&u#mar_)TgPtAK&OnAFko z0J`4|;CmlYCWQcc?tI6G1S8kBPsdUgt?xdFSPL4IE_RAf+5?1d`8t4Uej?uZ^X$bF zwF8`RLU#u!c`UFK_IyW22S6|tBo_nfj5{JHFSnsDW-W;=k*tce5>qTftV9lAqf!^- zj#+#<-(0x*KtzNq+CQq6$)ysR{FHXv?(3^loB(AM5IF!$Ujm>Z;fme|LO;i@lBq|#JpQtie1)~e0Oudz&*EuB z9A}{aNU3d1`tcr44v?fMDExs(a+=XmDeH28u7q19{&2frLkO_!rv+e4mTlT{qyPUm zMFlR3JyIB8xrQ?fVLlw88+D$E^2yD;*Gdbd?E{qF{Ue&7aWz1n7jdMRb+-eQS7ED; zM8NU~{`CMEUyj_$rC8Sd`pkJxfLsmigs`x1OyEHiC+(#Z3Lq`9u&@Bc>pXx&FQJJ! zbUx!fY?+{zB#H(o%?PaAty^XQ6JIM^)pp?X?^x8y(vNcjk7V)5V zCmx@>M?BaeO#&2Z;EsSWA)*73B<_^@lc)B27qks<(|;8Yv?I z3Ky0S2o@N?S2vFUDC^cPE=9ug5h7jpTih3W8g7)>4;KSmLO@A!LcL~_d{Ddx_+NTj zTD?tg2A9*^3q_ME$=UVKh-2!cwS~nq1}s2T280OGWAy8_Tk0@X9Ua2PRMU9|wo2em znIqF+%2-_5$!ns-x*M&Pqrjo>Bf~M=12`YEppl-Qo&>DrlAm}>6uV!i81WebF&)a= z*WV9tmsyVReC%KM_V$24sWid>9tBXNtO0Ej;PEQz>X;#bOQnj95Viu09K*>0h;-nE zb)En(J&socvquCZMt}y1S57XFkgp%33~;S|w-+@FO~9~@*|s=hzP{Fr7aIWK{p{&e zFjXw#h=4Ipj*EjuECH&ROod2;GCQUZpfZQihqrFsB5#ubf6XsCaRmmZIXv*~Ex`X5 z78U}@ZM-qcvs3A-K-mAF9;$wLUDw*~%MzB9H+{^5c$P0AHOw$8@k>PJ0OdDZ|L8IcjcUL3c$D#b@91 z@$qbkfMNMFL~B=96e3(U-3kBx9$?4n)$-BcODuiW9`LPoA>v;5q*8BTZQrT` zC6?n1-S<1Gh__EZo#*u5!1ERQlL{)r!o!ac$EGxLLMtbfy{jSUd?z+tMjr83WTcv! zT7mc7EBka9K;Z-Mw?$hH54XC3-^E%iEG$axhad3rS_3X7Rwc&-B3wPv$uRYK57N;S z*0=4=kl!|BlX72Vu}=A&A%qu*BG=j0oODF>&3`=;Al8XEBmv^1WW-;9>>+g$kOTG? z9*Y1F1;oVu_lBSowH33ezu5^TTV~8OKRGZ^f%3PC3t& zAz*6((mal72O#!8qxt&*n+(JZd@xs=L@3}wwr=y0%?Q8C`p76yO8_z1;o%{mFCk%S z)~bQGxp>2j$*>uGGy#AzAPjw$Pzh3 zwE;+QvT;@&H*ly4KpF~;z%F00Uyt=PIYeh&oy3h{y zfm@DMIGJi{_5uQlZNS?&9r*wuh2EE!kIl@cfNy1v6)ox_Do>@{H*1`v?N$H+10)g& z(4F%EP(9q+JPbQcr!I5CEfc2qAOZ=%1(4<3gki9>15?EQ+fxAdy=QClMq5WmX*dAR zOj8Zj^>QJGQ$WJ51=z}fqVQ8~?I9p}U=cQdBW!gdSL&vnOwE>*hZYO*sd|D60_6sP8ka z(gc}oze*d+B8~*6y34_Pk>_4D6%`)(MsHQzSl*zAJrQ)c3t5Ak7gTmY=SHvOhgYgl zE4}d)l5fyigUw|K%1|z^(S}VL7!QfzNZ|ki{=e9LKZ?8i{-nB~*=GsJ*#7zcRVmMS zJfmEPmyw&2Qm8u9xFaqs^ftRK@8zdD&0#7@PADOxfUb>hYr!j*rk~XvNTvy z163ytHAw}@LzI*VM<1}tlaji!H{aoLfddqUNjV#WReKbKG_=Y!M=34;;`R-vE;>As zG}e^6%J`yFQjrv}SZ;EKY;#WTyMxtH?t49?s}`8iCLh&E2fYYb+6U^-lXXcHL5l$`GCzIWSitn>qFtg z-8(-Rx|3kXGA1Cko8tG?*?Cu2rh+JwJjge1?qo{h{L$O2{-`Ls6(YpP>b+R7aMGhT zfruEqN;*k42W11l%b|8y~G?S$>Hv9Q|2>6m%qf$DqQ^XZ!c}u7+tk1 z#+j>Os(7^GB~G2L7#s*D?9b1J6D>?XHxs|FwDbWI1JILwUs%c zmEKV5dv^xHFY2m@e|2ufhrSVYo7$8pi~+b$R4DexCr>|ntpSVvkns&>^54d}MDK|WR0a?O@WyhrV$)dkqe zj2SoDnX-@4%*)UF-lcFw-L}_Foxx+4(bX+tmFLH9sIS3kirOa!#bbXuMyBk$47vKj6dD6PwUyGJi-b%}h&*4`R zOUrMZUp(V1SYhG^ixsui^L2h&=I$Mlotz~d7%4cg2sOU@TXPcW$zLP%vddM@bNL0? z9I3roTuuLlZt!uwGD!@sJ@vD92F^4Uf0%TTKj_*{}csThF_Iu zey-~P*e$=q_GJhZUmmC<0K0M7H0~5+X;jkeXhikDPI(1Z_HC>KpWKQ}soOkg*HKm{ zZdCxx!jz+|Yz_rew0`Ra&L#LXOsw}s_9w82Z)N;Qd8zAfbK15an2L2~c1Y%V;e5Zue9ZS%_J zA^Ynu^h>HE*|T`ocDMHZ~QpDQ~fImE7xprdiZ=oeyJkixR%azP)m1$K5D5mZI_H ze<5f6>(~h(+GZ>3KbMBww=A~0MYW*aMRrQ-sx&X`sGuqbme*zn@68jy)%)uNTiRUP z!i4aMS|2HerF7a;@;or0{kmv~df+o_g%*9@8)fDrZ-x_&h%B0x&>;xPVZSQ>TFoBK zmsDc!^*SPQ@X|~(GyFOkP#Txeq964?n&c;@^!CuqaI>&PhUl+tP0E<6Iv3x7-4?xG zsYrZ62$+x?)Wrg(VweR>JbUUzmXQMQq#l6~dCX?Ey9VfQ*DRJfcn#X>AAOoZ?n;zo zE}5)uEDH3k*x7C(>SlOTa~Dc!e}I`A9?aY*$@5%B^lg?d-(+v zxeZ#%ws`v__R3X2#*>?NKN(j*vh7zDd5~bzvv4DFk1uXS*|J|yP4>Vaa~E<$yX`=` zuLUm^ZR#PqRy80oFCL^hD}HJ~3At@n`e1#h9|ei; z(0;yKSy#ICN88{RZ!d=qby zA(D8fF8v&98nb-799y%#=ij+z|6a?#h<71z(Hz}Hcr9q(vpl;7MR?H{q>WzP=0_+8 zVnrVPZ6B_9{czq06Z1!~gAPszn^ORexyLYLZ-Rm>hMKMr$nTe9Wn!DJi>6`w~ z%_va=DxUXW?nK!;*F*iQF1m}oHm*)f)XH}-ta?I1m`%>ea8$tlx__;?U}UbCoU9=2 zdT?6WqbO_FH$JYr+(0p2``&`h-}dcqXEHyw@Rj7J*y#1HM9bV;>t-u#?XT_CxDILs zaVBqelg>O2P$MZE3yw~D)nf~+~btYbQj6TY~Vo8^(Urg49VAD*xS zy4lfxss3I`6yJnXeliA=^RacmoO#C0Uu~$meMr0=l3C@g>l*CAgD+VB#aVw}?I*PV zXG!uSdv~-Y_@^9xYtEL6jh@qac*{CHn^#8Gi>Xg(x11&+PaMle57zafY-^@n7qmws zTV-zAiBhoHqX%Xv4qfw%dLCX~aY7;d1t>tuW)4m9*ecjPjE3rTJrIk(TBIeD-QiT% zLK>=m&`m!%pfT+=d>A5GpF6j{BBmRwhzV+|U%q+SHA-xk!>jhusQz=O`;*n&4?h>t zUUB5P6b4-S1UaE~eiSM$Mquu!y{D{B0t_k-Ic?Bnhbb3whqWY&JQgSZ9F>MlINT~p zm&#sB79D`jRPP)doe?G^m3Xf8izU35E)VzQZkEpGS_O;#GnW7CEdEb9=NZ*hy6$mx zMj0E-h*Fdy2LuTiEJQjeIMSpTV?vJ-=|~Hq7e_?}1Qdu!q&ScOfrLm2p-32|X)x3f z5C{w)2`%ABNF4gzcjl~n?waMyy7%k7pZDHh-nI9;-{=4Qeh+Kz)AV9;0jk!Am(dSA zmz1|l8Ebc%JQUZ!!iDb%0H=Pceqj8bVIU*35U{79lGrh1>6ha3t`#R8{o7Hyq_LQM z%wl^b3Zg+n8N+R>QU!HA>B1CS1_@uT@lFSQ5YP9omM$_#7UIj&jhhP;X$YMQDv1^W znhWVNpqk1j1)v!^xz;_QYT8uK?`P`|6XW3x9#UkFMhE*1H&CK78ena}PFmR5pre3b zRj8e9^LVf)R77bKm7AV+2T2H5tb&^xDKPJDcNOeyBdOV6T>Y4j$N7ZixxnV651Usr zbe&-SoCnj2(%B`Al!X7b7=LsV{+<2*qR{#Yby_d#v3b~x3I+B3&nf1e=(g6G?$CW1 z5G_-u*)S5oIUs5=6uNqdqm-$er`>zb;DAv3mSWE6{2gbwz+`?SGx_Y7`_oze#u1!D zcH||V920s=B?HmZxeNt%TFw?7=7}qy43#}+vu{(>aMF~dIJ;4I-P(t+>IeWONgFzN z8i!_qpEURMu1s_yPvtO*j<^CC*?3eWBbLFLyVU`a8h}qrN(f z&TerLtICCSueEpR`z$Q($ZO_4wSe^X))593wLevw3;M^EGmx^bRUSxTM_>k4y6?zl z_0=!Dc@2!d=~h;Wd1ZnNQYeUQB)7$|AMI`(%mf{7WB3fdeXRRzc z_v_W&AFs}T;*!Yi8x6z)g=gGL0;NzYjA4Ut;_T(HV{~U{>&$;t1+%V z-taJjLEqqtde+EVyNh4ud=_KiTsVsOzOgE;iL}wR&kiE?udwV}cj1S!X%0Tb`=nQ8 zU3|ke86WJeA5&9P31OmtcHyD*!8BCGJD@ZaZQZ+>kXvEGi&|D&E|OPXPS&^~({EV% z^AnFvhIr%Tk;H||P)$sLgavA5rPD-6oW@WQ!TfQ3emrL_XDR&|!wC4G7|uQgAgnyR z|DThem0jH>McwtGqo%~TE%JEMG1k!G$=JfVI`AwdGPe+5RcxTqkSyR*wdfB7C04>1xCwt*+hM zR4ASsj4Dd+u;$409~xa$AZEAa73qKm#vgg@Y(@r-mukKZ)#-W0h~2Kg213)_Kvl4zFAXguf)xA0t;?4rAootlp#<+hXQC64RfxINa;=dZme)4dboCt|1Y z6Z1)1Ni?pt*Js{{Ftnp|L{G?ZNPNba5Dc_!F2LW`hET?vO#Jr#ZDSjNnGamoO!xJ9 zG^WH%jxrvEK*F7KFLKuW$dJB}0V+?q_=j!Z5j7%dg6Vl<1IUUC91?}wP?a-L0308Qh(uUQl7mNo-cRi zl59LnsHFcgJ}n+>_X*ocrG|Zu`Ej{qP82fW-@NQlV|XrNzLIl{w+$fP6uJQdl;6`E zSfXeD!ts1{3`D$6@qp$A&FnP#GPq=@Poap>Zm$B1VQi;{t`#veoVYv2&H5nZqC9VC z>D&67ZM&h-p$r;SKE9M*Ql@qsJFzWtk5|SM<_$0dLI5cFE8Q(JGo$a;)S_B`ezKM} z>)Wwz_w~GcaeerYfcxe+R1=XUZd{v4Ua~qdKEEng{q|vm3wk@jU6^jCh41$(6F68~ z4}b10Cc@4ePJ;5@_yXVAP|Ru; zv|-Vh)4Ep*Ney%ZRwf1vfW_=OCvpmOOZjR zP)9)>TNKDYHdvA?xb2sVov!Im{OKjV#7;WCFQ3QHW^kQ{fa-;8-gNp}Nm|PXEmi9B zJYpnG%Ls|chdJbcs_Q&RKgdg?_-IehyD0D8%ICg~5iULkdWdU_&r!^oJ zJ;)=v7FOjY#O=7ktlbWOz5Fm`MRLl%3hWA|V2%t1)zS4^U<|VBJNjlcG+O*L0AGC@ zQP)Q*6ohxy+2J!A>@)tsnOAK1awn*HXzn&X>@?D7zr?PX>k~Qo6iXM!mtS@*4DU}_ zQK#LSffJ)hMptvGqLAK{H?f;=m`4wyETmM#J-!NbhW`piBERnhaTRp>^QNC&A2}Gp zo;D>KZxyIJrs&?dIpvv#jbkyg21I2JewD;0*(|wIN0e9b%@dxP;Sg@s+**GSJLEjn05BVB_-vV|wH z4~Q{kimvllKjeNIqo0wRq8+(F1xe5;r#YHZPav6|JKu?|`AJB0(3v+MgCN zdZnyX^*laUgGi!1+vm(r;D`}w-wMe!FIdu|Z z_18n~zDp2i(Y-hA?Nnu)IQ1?obXU+d4Tta#2Eb+n(daL>j3jO}Cgk@8xy6hxHM=#% zU<7!}P@Z%36%=tKz}75P?%DS{Z)1$b65HPZ;yk;nqkshw+_ zT@uy0tx+zeGSH7T2xJ!07jg_-cX!Q{8SK5n4odc@ATLYpAF`cURJyGg>kM|Qd+*;z zq)D{cuK&;!mcT|ot$F`BPx7d7`2Qdca)OoRXP(`2FozM%)a6Bq__)Z?R~Be=tW=|- z#bXKK{I5@3RZMbeJdJ&5I{=lA<$6u5_OA$A?GMqx% zM2KMj>WBM#q0Ur)D(sN7G80P#uTpBPlY!{|0^$!5f7xT#{lF<5h# z2yPZrVS-h%7=6W_)ik&meN<&JI_4NL4-J=Sj^)nD%4@qczF+hFMzOU&B(q?Eg~m@+ z41HYdzfb-BxcnFKu0Ty$A}qkLErv;%LMm-Ngl|_l}H_jZgL+jcN*u;?p4rMm^ zTW=>{UGF>6Q2d-Y62FJT_6*8VU$?=W{y=CJS($BkNZ+Mw^?HCT3`w*Y$UNIbi8Gv` zGxu>0{m@$__!vxvaZxi`|Bi#r53w`D(oJKd-n z@Fs90&bRWF_F*4){658@#cF}%Q9$0`{>f zdgbDWsm!yTHt!ml+1XgvNE7B7|5f!9MRH~8mR$3_T3;Lp3#)i>D~LXBiXs~Yrc--@ zuWZ_bqS-Ov>dfa$-EM)2)Soa8p{}hY)a}sL$3GBn*Ap(OW`9R8^ zeTi3gX2h%t)1?lW3+Yix>FyCHf<+NmoVGc$3Rt zhpea13Ax=_Q`-lCu@yxkTu{@j9w4tgJ+qBgu$(M*fDo3&(mdOldkEcCUvWT2xkqIC z0*)8>%qG=4t=y}Sf5~T<@h<9r4Sps#>|~99D$f5!sCVonwz?h+FC06|gSa9vErX}d zoUmRpYS=wuVc?5_1v;8t1nq8bH1i_hsR!Ijsl2j*#geQKprwqf+1tzKiUS-7nu*3{jYWkyHH3e|%ez5wR<1suKtI9r`&9 zc6kDwHI4h`r#qMBtSOaOyt+$GY3MwekAbs~}FINtbL9Ub7Pzln78v`AF9h$Aa z$~mL_^0&Uj1~@abs8U#?D6ib|D(qJN%quLK1)0#l)H6ioEi_dunHXMR-^~4fQ(-4d z>HjFgxf7T!x2eF-L%HY?zs+2qH-~3-^J~uD11#SIMtWJg;Ps-p&xYJ7ErV`3%JkEb z7g9+@PBo*^u-5BFdRG_G`iH}>I5sXaV>i=La#r)GQ*|AGqiWniwGEP-D?mD9bd;eg za6Gd&2Zq!r75+Z-`s)*1{@iE#cT)Rjxbycz@1LXTKi}jC*;W?&wt_5rPK^TX=pEKS M+FzjKjO;Kzp=fvA(fxkHR1SO=av0K`+vlp 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 literal 0 HcmV?d00001 diff --git a/plugins.json b/plugins.json index f818927f..d37dac85 100644 --- a/plugins.json +++ b/plugins.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "last_updated": "2026-09-03", + "last_updated": "2026-09-04", "plugins": [ { "id": "cricket-scoreboard", @@ -335,7 +335,7 @@ "last_updated": "2026-09-02", "verified": true, "screenshot": "", - "latest_version": "1.25.1", + "latest_version": "1.25.2", "icon": "fas fa-hockey-puck" }, { diff --git a/plugins/hockey-scoreboard/README.md b/plugins/hockey-scoreboard/README.md index 7eb12714..7421d85f 100644 --- a/plugins/hockey-scoreboard/README.md +++ b/plugins/hockey-scoreboard/README.md @@ -1,894 +1,682 @@ ------------------------------------------------------------------------------------ ### Connect with ChuckBuilds -- Show support on Youtube: https://www.youtube.com/@ChuckBuilds +- Show support on YouTube: https://www.youtube.com/@ChuckBuilds - Stay in touch on Instagram: https://www.instagram.com/ChuckBuilds/ - Want to chat or need support? Reach out on the ChuckBuilds Discord: https://discord.com/invite/uW36dVAtcT -- Feeling Generous? Support the project: - - Github Sponsorship: https://github.com/sponsors/ChuckBuilds +- Feeling generous? Support the project: + - GitHub Sponsors: https://github.com/sponsors/ChuckBuilds - Buy Me a Coffee: https://buymeacoffee.com/chuckbuilds - - Ko-fi: https://ko-fi.com/chuckbuilds/ + - Ko-fi: https://ko-fi.com/chuckbuilds/ ------------------------------------------------------------------------------------ - -# Hockey Scoreboard Plugin - -Display live, recent, and upcoming hockey games across NHL, NCAA Men's, and NCAA Women's hockey on your LED matrix. - - -Recent Game: - -led_matrix_1764889670771 - -Upcoming Game: - -led_matrix_1764889695301 - - - - -## Features - -- **Multi-League Support**: NHL, NCAA Men's Hockey, NCAA Women's Hockey -- **Live Game Tracking**: Real-time scores, periods, time remaining -- **Recent Games**: View recently completed game results -- **Upcoming Games**: See scheduled games with start times -- **Favorite Teams**: Prioritize your favorite teams across all leagues -- **Power Play Indicators**: Highlight power play situations -- **Shots on Goal**: Optional SOG statistics display -- **Team Logos**: Display team logos when available -- **Background Data Fetching**: Efficient API calls with caching -- **Font Customization**: Override fonts via Web UI -- **Favorite Team Result Colors**: Optionally show a finished game's score in green when your favorite team won and red when it lost - -## Requirements - -- LEDMatrix 2.0.0+ -- Display: Minimum 64x32 pixels (recommended) -- No API key required (uses ESPN public API) -- Internet connection for live data +--- +# Hockey Scoreboard -#### League Selection +Live, recent, and upcoming games across **NHL**, **NCAA Men's**, and **NCAA +Women's** hockey on your LEDMatrix display, from ESPN's public API. No API key +required. -- **`leagues.nhl`**: Enable NHL games (default: true) -- **`leagues.ncaa_mens`**: Enable NCAA Men's Hockey (default: false) -- **`leagues.ncaa_womens`**: Enable NCAA Women's Hockey (default: false) +![NHL live scorebug with shots on goal](../../docs/assets/hockey-scoreboard/hero.png) - (note: College Club Hockey is not tracked - team like UGA does not have D1 hockey and cannot be shown) +## Contents -Enable multiple leagues to see games from all selected leagues in rotation. +- [Quick start](#quick-start) +- [Display modes](#display-modes) +- [The three leagues](#the-three-leagues) +- [Shots on goal](#shots-on-goal) +- [How games are chosen](#how-games-are-chosen) +- [Rotation, resume, and durations](#rotation-resume-and-durations) +- [Panel sizes](#panel-sizes) +- [Settings reference](#settings-reference) +- [Per-league settings](#per-league-settings) +- [Matchup separator and the upcoming card middle](#matchup-separator-and-the-upcoming-card-middle) +- [Fonts, colours and layout](#fonts-colours-and-layout) +- [Favorite team result colours](#favorite-team-result-colours) +- [Vegas ticker: seeing live games more often](#vegas-ticker-seeing-live-games-more-often) +- [Data source](#data-source) +- [Example configurations](#example-configurations) +- [Troubleshooting](#troubleshooting) -## 📺 Display Modes +## Quick start -The plugin registers granular display modes directly in `manifest.json`. The display controller rotates through these modes automatically: +1. Install **Hockey Scoreboard** from the LEDMatrix Plugin Store. +2. Turn on `enabled`, then the leagues you want — `nhl` is on by default, both + NCAA leagues are off. +3. Add your teams under each league's **Favorite Teams**. -**NHL Modes:** -- `nhl_recent`: Recently completed NHL games with final scores -- `nhl_upcoming`: Scheduled NHL games with start times -- `nhl_live`: Currently active NHL games with real-time updates +```json +{ + "hockey-scoreboard": { + "enabled": true, + "nhl": { + "enabled": true, + "teams": { + "favorite_teams": ["BOS", "TOR"], + "favorite_teams_only": false + }, + "filtering": { + "recent_games_to_show": 3, + "upcoming_games_to_show": 5 + }, + "live_priority": true + }, + "ncaa_mens": { + "enabled": true, + "teams": { "favorite_teams": ["BU", "DEN"] } + } + } +} +``` -**NCAA Men's Hockey Modes:** -- `ncaa_mens_recent`: Recently completed NCAA Men's Hockey games with final scores -- `ncaa_mens_upcoming`: Scheduled NCAA Men's Hockey games with start times -- `ncaa_mens_live`: Currently active NCAA Men's Hockey games with real-time updates +## Display modes -**NCAA Women's Hockey Modes:** -- `ncaa_womens_recent`: Recently completed NCAA Women's Hockey games with final scores -- `ncaa_womens_upcoming`: Scheduled NCAA Women's Hockey games with start times -- `ncaa_womens_live`: Currently active NCAA Women's Hockey games with real-time updates +Nine modes — three per league — that the LEDMatrix host rotation cycles through +independently. -### How Rotation Works +![The three NHL display modes](../../docs/assets/hockey-scoreboard/display-modes.png) -The display controller rotates through all registered modes in the order they appear in `manifest.json`. Each mode's duration is configured under `.display_durations.{base,live,recent,upcoming}` (or the cross-league fallback `defaults.display_duration`). +| Mode | Shows | Top line | +|---|---|---| +| `nhl_live` | NHL games in progress | `P1`–`P3`, or `OT1` past the third | +| `nhl_recent` | Finished NHL games | `Final`, or `Final/OT` | +| `nhl_upcoming` | Scheduled NHL games | `Next Game`, then the date and puck drop | +| `ncaa_mens_live` / `_recent` / `_upcoming` | NCAA men's | As above | +| `ncaa_womens_live` / `_recent` / `_upcoming` | NCAA women's | As above | -**Default Rotation Order:** -1. `nhl_recent` -2. `nhl_upcoming` -3. `nhl_live` -4. `ncaa_mens_recent` -5. `ncaa_mens_upcoming` -6. `ncaa_mens_live` -7. `ncaa_womens_recent` -8. `ncaa_womens_upcoming` -9. `ncaa_womens_live` +The three period states: -**Customizing Rotation Order:** -You can reorder modes in `manifest.json` to change the rotation sequence. For example, to show all Recent games before Upcoming: +![P2, Final and Final/OT](../../docs/assets/hockey-scoreboard/period-states.png) -```json -"display_modes": [ - "nhl_recent", - "ncaa_mens_recent", - "ncaa_womens_recent", - "nhl_upcoming", - "ncaa_mens_upcoming", - "ncaa_womens_upcoming", - "nhl_live", - "ncaa_mens_live", - "ncaa_womens_live" -] -``` +Each mode renders as **switch** (one game at a time, timed) or **scroll** (all +games scroll horizontally at high FPS), set per league and per mode with +`.display_modes._display_mode`. -### Disabled Leagues/Modes +## The three leagues -If a league or mode is disabled in the config, the plugin returns `False` for that mode, and the display controller automatically skips it. This allows you to: +Each league has its own managers, its own favorites, and its own config block. +The two NCAA blocks are **identical to each other**; the NHL block differs in +nine defaults, because an NHL night is a smaller, faster-moving slate than a +college one: -- Disable entire leagues (e.g., disable NCAA Men's to show only NHL) -- Disable specific modes per league (e.g., disable `nhl_upcoming` but keep `nhl_recent` and `nhl_live`) -- Mix and match enabled/disabled modes as needed +| Key | NHL | Both NCAA blocks | +|---|---|---| +| `.enabled` | `true` | `false` | +| `.live_priority` | `true` | `false` | +| `.display_durations.live` | `20` | `15` | +| `.update_intervals.base` | `60` | `300` | +| `.update_intervals.live` | `30` | `60` | +| `.display_options.show_records` | `false` | `true` | +| `.display_options.show_ranking` | `false` | `true` | +| `.display_options.show_shots_on_goal` | `true` | `false` | +| `.display_options.show_powerplay` | `true` | `false` | + +Everything else under [Per-league settings](#per-league-settings) is the same in +all three, with the prefix `nhl.`, `ncaa_mens.`, or `ncaa_womens.`. + +## Shots on goal + +`show_shots_on_goal` adds a shot line along the bottom of a live card. It is on +by default for the NHL, off for both NCAA leagues. + +![shots on goal on and off](../../docs/assets/hockey-scoreboard/shots-on-goal.png) + +> **`show_powerplay` currently does nothing.** ESPN's power-play flag is read and +> stored on the game (`power_play`), and the setting is resolved into the +> manager's config, but nothing in this plugin or in the LEDMatrix core ever +> draws it. No value of the setting changes what appears. It is left in place +> rather than removed so a future release can wire it up without a breaking +> config change. Tracked as +> [issue #431](https://github.com/ChuckBuilds/ledmatrix-plugins/issues/431). + +> **Shots do not appear on scroll or Vegas cards.** Those cards gate the shot +> line on a flat `show_shots` key at the league root, which the schema does not +> declare and the web UI therefore never writes — so it reads as `false` no +> matter what you set `show_shots_on_goal` to. Switch mode is unaffected. +> Tracked as +> [issue #432](https://github.com/ChuckBuilds/ledmatrix-plugins/issues/432). + +## How games are chosen + +**`upcoming_games_to_show` is not "how many cards you see".** It is the size of +a *pool*. The panel cycles through that pool one card at a time and keeps its +place between visits, so a pool of 3 means the board rotates through the same 3 +games until the schedule moves on. A bigger number gives you a *longer lap*, so +any one game comes round **less** often. + +Which regime you are in depends on that league's `teams.favorite_teams` and +`teams.favorite_teams_only`: + +| `favorite_teams` | `favorite_teams_only` | What you get | +|---|---|---| +| empty | either | The next N games league-wide, chronologically. Every game is a non-favorite game, so the `other_*` filters apply to all of them. | +| set | **on** | Only your teams. The limit is a budget **per team**. | +| set | **off** (default) | **Your teams first, then other games to fill.** Both limits are **totals**. | -### Mode Durations +Note the key is `teams.favorite_teams_only`, not `show_favorite_teams_only` as +in the single-league scoreboards, and it defaults to **off** here. -Each granular mode respects its own mode duration settings: -- `nhl_recent` uses `nhl.mode_durations.recent_mode_duration` or falls back to dynamic calculation -- `ncaa_mens_upcoming` uses `ncaa_mens.mode_durations.upcoming_mode_duration` or falls back to dynamic calculation -- Each mode can have independent duration configuration +### The selection settings -### Live Priority +Per league, under `filtering`, all **Advanced**: -When live games are available, the display controller prioritizes live modes (`nhl_live`, `ncaa_mens_live`, `ncaa_womens_live`) based on the `has_live_content()` and `get_live_modes()` methods. The plugin returns only the granular live modes that actually have live content. +| Option | Default | Description | +|---|---|---| +| `recent_games_to_show` | `5` | Pool size for finished games. | +| `upcoming_games_to_show` | `10` | The same for scheduled games. | +| `other_recent_games_to_show` | `5` | How many **non-favorite** finished games to add. `0` gives favorites only. | +| `other_upcoming_games_to_show` | `10` | The same for scheduled games. | +| `other_rotation_interval_seconds` | `1800` | How often the non-favorite slice advances. `0` pins it. | +| `other_games_min_quality` | `ranked` | Which non-favorite games qualify: `any` or `ranked`. | +| `other_games_divisions` | `["fbs"]` | Which divisions non-favorite games may come from. | -## ⏱️ Duration Configuration +**Your favorite teams are never filtered by the last two.** Those settings only +decide what fills the *remaining* slots. -The plugin offers flexible duration control at multiple levels to fine-tune your display experience: +> **Both are effectively inert in hockey.** `ranked` needs a national poll and +> the division filter needs ESPN's FBS/FCS group rosters, which are a college +> *football* taxonomy — no lookup is even attempted here, so every game passes +> both and neither costs a request. The schema's help text for +> `other_games_min_quality` also mentions a `broadcast` option that the enum +> does not offer; it was retired. -### Per-Game Duration +### Variety comes from turnover -Controls how long each individual game displays before rotating to the next game **within the same mode**. +Rather than widening the pool, the non-favorite slice **moves**: the window +advances by its own width every `other_rotation_interval_seconds`, so +consecutive windows do not overlap and the board works through the schedule +instead of resampling the front of it. Your favorites are not rotated — for +upcoming games the soonest ones are the point. -**Configuration:** -- Per-league `display_durations.live`: Seconds per live game (default: 20s for NHL) -- Per-league `display_durations.non_favorite_live`: Seconds per live game with **no** favorite team (default: 0 = off) -- Per-league `display_durations.recent`: Seconds per recent game (default: 15s) -- Per-league `display_durations.upcoming`: Seconds per upcoming game (default: 15s) +Both filters **fail open**: if the data behind them cannot be fetched, the game +is allowed through. They fail open a second time as a set — if the filters +between them leave nothing at all, the unfiltered list is used instead. Setting +`other_upcoming_games_to_show` or `other_recent_games_to_show` to `0` is the one +way to ask for an empty slate, and that is honoured. -**Example:** With `nhl.display_durations.recent: 15`, each NHL recent game shows for 15 seconds before moving to the next. +### Live rotation -#### Shorter dwell for non-favorite live games +When several games are live at once the rotation is weighted: a game involving +one of your teams gets `teams.favorite_live_boost` turns for every one turn +other live games get, and is queued first whenever the rotation refreshes. It +never interrupts a game already on screen — it just gets more and sooner turns. +Set it to `1` for even rotation. It is independent of `live_priority`, which +controls whether live games preempt the recent/upcoming rotation at all. -Set `display_durations.non_favorite_live` to give live games that don't involve one of your favorite teams a shorter turn than your favorites. For example `nhl.display_durations.live: 30` with `nhl.display_durations.non_favorite_live: 5` shows your teams for 30s each while everyone else's games flash by in 5s. +A live game the API stops reporting for `update_intervals.stale_game_timeout` +seconds is dropped, so an abandoned game does not sit on the board forever. -This **only takes effect when both** of the following are true: +### Shorter dwell for non-favorite live games -- one or more `favorite_teams` are configured for the league, **and** -- non-favorite live games are actually shown — `filtering.show_favorite_teams_only` is **off**, or `filtering.show_all_live` is **on** (otherwise non-favorite games never appear in the first place). +`display_durations.non_favorite_live` (0–120, default `0` = off) gives live +games involving **none** of your teams a shorter turn. It only takes effect when +favorite teams are configured **and** non-favorite live games are being shown — +`favorite_teams_only` off, or `show_all_live` on: -| Favorite teams set? | Non-favorite games shown? | Live game has a favorite? | Duration used | +| Favorites set? | Non-favorite games shown? | Game has a favorite? | Duration used | |---|---|---|---| -| No | — | — | `display_durations.live` (unchanged) | -| Yes | No (`show_favorite_teams_only` on, `show_all_live` off) | favorite | `display_durations.live` | -| Yes | Yes (`show_favorite_teams_only` off, or `show_all_live` on) | favorite | `display_durations.live` | -| Yes | Yes (`show_favorite_teams_only` off, or `show_all_live` on) | none | `display_durations.non_favorite_live` (when > 0) | - -Leave it at `0` to display every live game for `display_durations.live` (the previous behavior). +| No | — | — | `display_durations.live` | +| Yes | No | favorite | `display_durations.live` | +| Yes | Yes | favorite | `display_durations.live` | +| Yes | Yes | none | `display_durations.non_favorite_live`, when above `0` | -### Per-Mode Duration +### Excluding teams -Controls the **total time** a mode displays before rotating to the next mode, regardless of how many games are available. +`teams.exclude_teams` hides teams from **both** the live rotation and the +recent/final scores — useful when you plan to watch a game delayed. It uses the +same abbreviations as `favorite_teams` and always wins when a team appears in +both lists. -**Configuration:** -- `nhl.mode_durations.recent_mode_duration`: Total seconds for NHL Recent mode (default: dynamic) -- `nhl.mode_durations.upcoming_mode_duration`: Total seconds for NHL Upcoming mode (default: dynamic) -- `nhl.mode_durations.live_mode_duration`: Total seconds for NHL Live mode (default: dynamic) -- Same structure for `ncaa_mens` and `ncaa_womens` +## Rotation, resume, and durations -**Example:** With `nhl.mode_durations.recent_mode_duration: 60` and `nhl.display_durations.recent: 15`, NHL Recent mode shows 4 games (60s ÷ 15s = 4) before rotating to the next mode. +The plugin registers its nine modes in `manifest.json`, and the display +controller rotates through them in the order they appear: +`nhl_recent`, `nhl_upcoming`, `nhl_live`, then the same three for +`ncaa_mens`, then for `ncaa_womens`. Reorder them in `manifest.json` to change +the sequence. -### How They Work Together +A league or mode disabled in the config makes the plugin return `False` for that +mode and the controller skips it, so you can disable a whole league or a single +mode within one and the rotation closes up around it. -**Per-game duration** + **Per-mode duration**: -```text -NHL Recent Mode (60s total): - ├─ Game 1: 15s - ├─ Game 2: 15s - ├─ Game 3: 15s - └─ Game 4: 15s - → Rotate to NHL Upcoming Mode - -NHL Upcoming Mode (60s total): - ├─ Game 1: 15s - └─ ... (continues) -``` +### Resume -### Resume Functionality - -When a mode times out before showing all games, it **resumes from where it left off** on the next cycle: +When a mode's time runs out before it has shown every game in its pool, it +**resumes where it left off** on the next visit rather than restarting: ```text -Cycle 1: NHL Recent Mode (60s, 10 games available) - ├─ Game 1-4 shown ✓ - └─ Time expires → Rotate +Cycle 1: Recent mode (60s, 10 games in the pool) + games 1-4 shown, time expires, rotate -Cycle 2: NHL Recent Mode resumes - ├─ Game 5-8 shown ✓ (continues from Game 4, no repetition) - └─ Time expires → Rotate +Cycle 2: Recent mode resumes + games 5-8 shown, time expires, rotate -Cycle 3: NHL Recent Mode resumes - ├─ Game 9-10 shown ✓ - └─ All games shown → Full cycle complete → Reset progress +Cycle 3: Recent mode resumes + games 9-10 shown, full lap complete, progress resets ``` -### Dynamic Duration (Fallback) +### Dynamic duration -If per-mode durations are **not** configured, the plugin uses **dynamic calculation**: -- **Formula**: `total_duration = number_of_games × per_game_duration` -- **Example**: 24 games @ 15s each = 360 seconds for the mode +With no per-mode duration configured, the mode's total is calculated as +`number_of_games x per_game_duration` — 24 games at 15s each is a 360-second +mode. That shows everything but can make a mode very long on a full slate, which +is what `dynamic_duration.max_duration_seconds` is for. -This ensures all games are shown but may result in very long mode durations if you have many games. +## Panel sizes -### Per-League Overrides +![Live card at four panel sizes](../../docs/assets/hockey-scoreboard/panel-sizes.png) -You can set different durations per league using the `mode_durations` section: +The plugin passes the render-safety harness with no failures. At 64x32 the two +crests and the centre column share very little room; 128x32 or wider is a much +better fit, especially with the shot line enabled. -```json -{ - "nhl": { - "mode_durations": { - "recent_mode_duration": 45, - "upcoming_mode_duration": 30 - } - }, - "ncaa_mens": { - "mode_durations": { - "recent_mode_duration": 60 - } - } -} -``` +## Settings reference -When multiple leagues are enabled with different durations, the system uses the **maximum** to ensure all leagues get their time. +Settings marked **Advanced** sit behind the *Advanced* toggle in the web UI. +Defaults are the schema defaults, which is what the web UI writes. -### Integration with Dynamic Duration Caps +### Plugin level -If you have dynamic duration caps configured (e.g., `max_duration_seconds: 120`), the system uses the **minimum** of: -- Per-mode duration (e.g., 180s) -- Dynamic duration cap (e.g., 120s) -- **Result**: 120s (ensures cap is respected) +| Key | Type | Default | What it does | +|---|---|---|---| +| `enabled` | boolean | `false` | Master on/off switch for the whole plugin. | +| `timezone` | string | `""` | **Advanced.** IANA zone for start times, e.g. `America/Chicago`. Blank follows the LEDMatrix global timezone, then the host system's, then UTC. | +| `schedule_lookback_days` | 1–60 | `14` | **Advanced.** How far back to fetch for the Recent screens. | +| `schedule_lookahead_days` | 1–60 | `7` | **Advanced.** How far ahead to fetch for Upcoming. A game beyond this horizon is never fetched. | +| `no_data_interval_seconds` | 5–86400 s | `300` | **Advanced.** Wait between live checks when nothing is live. Backs off further the longer nothing is found. | +| `live_idle_max_interval_seconds` | 5–86400 s | `900` | **Advanced.** Ceiling for that back-off. Useful out of season. | -#### Favorite Teams +### Defaults -Specify team abbreviations for each league: +Fallbacks used when the corresponding per-league setting is absent. -```json -"favorite_teams": { - "nhl": ["TB", "TOR", "BOS", "DET"], - "ncaa_mens": ["BU", "BC", "MICH"], - "ncaa_womens": ["WISC", "MINN"] -} -``` +| Key | Type | Default | What it does | +|---|---|---|---| +| `defaults.display_duration` | 5–60 s | `15` | Per-game on-screen time. | +| `defaults.show_records` | boolean | `false` | Draw win-loss records. | +| `defaults.show_ranking` | boolean | `false` | **Advanced.** Draw poll rank badges. | +| `defaults.show_odds` | boolean | `false` | **Advanced.** Draw betting odds. | +| `defaults.show_shots_on_goal` | boolean | `false` | Draw the shot line on live cards. | +| `defaults.show_powerplay` | boolean | `true` | Highlight power plays. Nothing draws this — see [Shots on goal](#shots-on-goal). | +| `defaults.update_interval_seconds` | 30–86400 s | `3600` | **Advanced.** Base data refresh cadence. | +| `defaults.season_cache_duration_seconds` | 3600–604800 s | `86400` | **Advanced.** How long season data is cached. | + +> **The per-league copy wins, and several of its defaults are different.** Each +> league's `display_options.*` overrides the matching `defaults.*`. Because the +> web UI writes schema defaults on save, a saved config already carries the +> per-league value, and changing the `defaults` copy then appears to do nothing. +> Change the per-league setting. The clearest case is +> `show_shots_on_goal`: `false` under `defaults`, `true` under `nhl`. + +## Per-league settings + +Every table below exists three times — under `nhl`, `ncaa_mens`, and +`ncaa_womens` — with the same keys. `` stands for any of them; where the +NHL default differs, both are given as *NHL / NCAA*. + +### Enable and priority + +| Key | Type | Default | What it does | +|---|---|---|---| +| `.enabled` | boolean | `true` / `false` | Build this league's managers at all. | +| `.live_priority` | boolean | `true` / `false` | Let this league's live games interrupt the rotation and display immediately. | -#### Favorite Live Boost +### Display modes -Each league's `teams` block also has a `favorite_live_boost` (default `2`, -range 1-5): whenever one of your favorite teams is playing live, their game -is always queued first in the live rotation, and gets `favorite_live_boost` -turns for every 1 turn other live games get (evenly spaced, not clumped -together). Set it to `1` for perfectly even rotation among all live games — -this exactly matches the plugin's previous behavior. It has no effect unless -`favorite_teams` is configured, so it's safe to leave at its default. +| Key | Type | Default | +|---|---|---| +| `.display_modes.live` | boolean | `true` | +| `.display_modes.recent` | boolean | `true` | +| `.display_modes.upcoming` | boolean | `true` | +| `.display_modes.live_display_mode` | `switch` \| `scroll` | `switch` (**Advanced**) | +| `.display_modes.recent_display_mode` | `switch` \| `scroll` | `switch` (**Advanced**) | +| `.display_modes.upcoming_display_mode` | `switch` \| `scroll` | `switch` (**Advanced**) | -#### Exclude Teams +### Teams -Each league's `teams` block also has an `exclude_teams` list (same format as -`favorite_teams`) for teams you never want to see — useful if you're -planning to watch a game delayed and don't want the score spoiled. An -excluded team's games are hidden from **both** the live rotation and the -Recent/Final-scores mode, regardless of `favorite_teams`, `favorite_teams_only`, -or `show_all_live`. If a team is in both `favorite_teams` and `exclude_teams`, -exclusion wins. +| Key | Type | Default | What it does | +|---|---|---|---| +| `.teams.favorite_teams` | array | `[]` | Teams to prioritise, by abbreviation. | +| `.teams.favorite_teams_only` | boolean | `false` | Show only your teams' games. | +| `.teams.show_all_live` | boolean | `false` | Show every live game regardless of favorites. | +| `.teams.exclude_teams` | array | `[]` | **Advanced.** Teams to always hide, from the live rotation and from finals alike. Takes precedence over `favorite_teams` and `show_all_live`. | +| `.teams.favorite_live_boost` | 1–5 | `2` | **Advanced.** Turns a favorite's live game gets per one turn for other live games. `1` is even rotation. | -#### Display Settings +### Filtering -The full set of options lives in -[`config_schema.json`](config_schema.json) — the schema is the source of -truth and is what generates the web UI. The most commonly tweaked keys: +See [The selection settings](#the-selection-settings). All **Advanced**. -- **`enabled`** (boolean, default `false`) — master switch for the plugin -- **`defaults.display_duration`** (5–60s, default `15`) — fallback per-game - duration when a league doesn't override it -- **`defaults.show_records`** (boolean, default `false`) — show team - records (W-L) -- **`defaults.show_shots_on_goal`** (boolean, default `false`) — show SOG - during live games -- **`defaults.show_powerplay`** (boolean, default `true`) — highlight power - play situations -- **`defaults.update_interval_seconds`** (30–86400s, default `3600`) — - default base poll interval. Per-league `update_intervals.*` overrides - this. +| Key | Type | Default | +|---|---|---| +| `.filtering.recent_games_to_show` | 1–20 | `5` | +| `.filtering.upcoming_games_to_show` | 1–50 | `10` | +| `.filtering.other_recent_games_to_show` | 0–20 | `5` | +| `.filtering.other_upcoming_games_to_show` | 0–20 | `10` | +| `.filtering.other_rotation_interval_seconds` | 0–86400 s | `1800` | +| `.filtering.other_games_min_quality` | `any` \| `ranked` | `ranked` | +| `.filtering.other_games_divisions` | array | `["fbs"]` | -Each league (`nhl`, `ncaa_mens`, `ncaa_womens`) then has its own block with -finer-grained controls: +### Update intervals -- `.update_intervals.{base,live,recent,upcoming,odds}` — how often - to poll ESPN for each kind of data. Live games default to 30s; recent - and upcoming default to 3600s. -- `.display_durations.{base,live,recent,upcoming}` — per-mode - display duration overrides for that league. -- `.display_options.{show_records,show_ranking,show_odds,...}` — - per-league overrides of the cross-league defaults. -- `.live_priority` (boolean) — let this league's live games take - over the rotation when one is in progress. +All **Advanced**. -## Display Mode Details +| Key | Type | Default (NHL / NCAA) | What it does | +|---|---|---|---| +| `.update_intervals.base` | 15–300 s | `60` / `300` | Base data refresh. | +| `.update_intervals.live` | 10–300 s | `30` / `60` | Refresh while a game is live. | +| `.update_intervals.recent` | 60–86400 s | `3600` | Refresh for finished games. | +| `.update_intervals.upcoming` | 60–86400 s | `3600` | Refresh for the schedule. | +| `.update_intervals.odds` | 60–86400 s | `3600` | Refresh for betting odds. | +| `.update_intervals.stale_game_timeout` | 60–3600 s | `300` | Drop a live game the API has stopped updating. | -### Live Games (e.g., `nhl_live`, `ncaa_mens_live`) +### Display durations -Shows games currently in progress with: -- Current score -- Period (P1, P2, P3, OT, OT2, etc.) -- Time remaining in period -- Power play indicator (if enabled) -- Shots on goal (if enabled) +All **Advanced**. -### Recent Games (e.g., `nhl_recent`, `ncaa_mens_recent`) +| Key | Type | Default (NHL / NCAA) | What it does | +|---|---|---|---| +| `.display_durations.base` | 5–60 s | `15` | Fallback per-game time. | +| `.display_durations.live` | 5–120 s | `20` / `15` | Per-game time for live games. | +| `.display_durations.non_favorite_live` | 0–120 s | `0` | Shorter turn for live games with no favorite. `0` means use the live duration for everything. | +| `.display_durations.recent` | 5–60 s | `15` | Per-game time on the Recent screen. | +| `.display_durations.upcoming` | 5–60 s | `15` | Per-game time on the Upcoming screen. | -Shows completed games from the last X hours with: -- Final score -- Game status ("Final", "Final/OT", "Final/SO") -- Team logos +### Display options -### Upcoming Games (e.g., `nhl_upcoming`, `ncaa_mens_upcoming`) +All **Advanced**. -Shows scheduled games for the next X hours with: -- Game start time -- Venue information -- Team matchup +| Key | Type | Default (NHL / NCAA) | What it does | +|---|---|---|---| +| `.display_options.show_records` | boolean | `false` / `true` | Draw win-loss records in the bottom corners. | +| `.display_options.show_ranking` | boolean | `false` / `true` | Draw poll rank badges where available. | +| `.display_options.show_odds` | boolean | `false` | Draw betting odds. | +| `.display_options.show_shots_on_goal` | boolean | `true` / `false` | Draw the shot line on live cards. | +| `.display_options.show_powerplay` | boolean | `true` / `false` | Highlight power plays. Nothing draws this yet. | -## Setup Instructions +![show_records on and off](../../docs/assets/hockey-scoreboard/show-records.png) -### 1. Install Plugin +### Mode durations -Install from the Plugin Store in the LEDMatrix web UI: +How long the *whole mode* holds the board before the core rotates on. `null` +uses the dynamic calculation. All **Advanced**, and read by the LEDMatrix core +rather than by this plugin, which is why they do not appear in the plugin's own +source. -1. Open `http://your-pi-ip:5000` -2. Open the **Plugin Manager** tab -3. Find **Hockey Scoreboard** in the **Plugin Store** section and click - **Install** -4. The plugin appears in **Installed Plugins** above and gets its own tab - in the second nav row — open that tab to configure it +| Key | Type | Default | +|---|---|---| +| `.mode_durations.live_mode_duration` | 10–600 s or `null` | `null` | +| `.mode_durations.recent_mode_duration` | 10–600 s or `null` | `null` | +| `.mode_durations.upcoming_mode_duration` | 10–600 s or `null` | `null` | -### 2. Configure Leagues +### Dynamic duration -Enable the leagues you want to track: +All **Advanced**. -- **NHL Only**: Set `leagues.nhl: true`, others false -- **All Leagues**: Set all to true -- **NCAA Only**: Enable `ncaa_mens` and/or `ncaa_womens` +| Key | Type | Default | +|---|---|---| +| `.dynamic_duration.enabled` | boolean | `false` | +| `.dynamic_duration.max_duration_seconds` | 60–600 s | — | +| `.dynamic_duration.modes.live.enabled` | boolean | `false` | +| `.dynamic_duration.modes.live.max_duration_seconds` | 60–600 s | — | +| `.dynamic_duration.modes.recent.enabled` | boolean | `false` | +| `.dynamic_duration.modes.recent.max_duration_seconds` | 60–600 s | — | +| `.dynamic_duration.modes.upcoming.enabled` | boolean | `false` | +| `.dynamic_duration.modes.upcoming.max_duration_seconds` | 60–600 s | — | -### 3. Add Favorite Teams +### Scroll settings -Add your favorite team abbreviations to the `favorite_teams` object for each league. Games involving these teams will be shown first when `.live_priority` is enabled. +All **Advanced**, and per league. -### 4. Adjust Display Settings +| Key | Type | Default | What it does | +|---|---|---|---| +| `.scroll_settings.scroll_speed` | 1.0–200.0 px/s | `50.0` | Higher scrolls faster. | +| `.scroll_settings.scroll_delay` | 0.001–0.1 s | `0.01` | Frame delay; `0.01` is 100 FPS. Lower is smoother. | +| `.scroll_settings.gap_between_games` | 8–128 px | `48` | Gap between game cards. | +| `.scroll_settings.show_league_separators` | boolean | `true` | Draw the NHL shield or NCAA logos between leagues. | +| `.scroll_settings.dynamic_duration` | boolean | `true` | Size the scroll duration from the content width. | +| `.scroll_settings.game_card_width` | 32–512 px | `128` | Card width. Lower it on a multi-panel chain to fit more games on screen at once. | -- Set `.display_durations.{base,live,recent,upcoming}` (or the fallback `defaults.display_duration`) based on how many games you expect (shorter = more games shown) -- Adjust `.update_intervals.{base,live,recent,upcoming,odds}` (or the fallback `defaults.update_interval_seconds`) based on desired freshness (30s live poll recommended) -- Enable/disable display modes based on preference +## Matchup separator and the upcoming card middle -### 5. Enable Plugin +The **Matchup Card Layout** section (`scroll_card`) controls what sits between +the two crests before a game starts, and how the date and time are written. +Plugin-wide, not per league. -Make sure `enabled: true` in the configuration and the plugin is activated in the rotation. +| Setting | Key | Default | What it does | +|---|---|---|---| +| Matchup Separator | `scroll_card.vs_text` | `VS` | Text between the teams: `VS`, `@`, `at`, `v`. The away side is always on the left, so `@` and `at` read as "away at home". Blank draws nothing. | +| Middle of an Upcoming Card | `scroll_card.upcoming_center` | `vs` | Scroll and Vegas cards: `vs`, `date_time`, or `none`. | +| Middle of a Full-Screen Upcoming Scoreboard | `scroll_card.switch_upcoming_center` | `date_time` | The same choice for the full-screen scoreboard, plus `inherit` to follow the row above. | +| Date Format | `scroll_card.date_format` | `abbrev` | Scroll and Vegas cards: `Sep 19`, `9/19`, `19 Sep`, `19/9`, or `Fri Sep 19`. | +| Full-Screen Date Format | `scroll_card.switch_date_format` | `numeric` | **Advanced.** The same for the full-screen scoreboard, plus `inherit`. It has its own default because the two displays disagree about what is normal. | +| Time Format | `scroll_card.time_format` | `12h` | 12- or 24-hour clock. | +| Show Date / Show Time | `scroll_card.show_date`, `scroll_card.show_time` | `true` | Drop either line. | +| Swap Date and Time | `scroll_card.swap_date_time` | `false` | Flip the two lines. Each display starts from its own order, so this flips rather than forces. | + +The centre-gap settings size the scroll and Vegas card's middle strip only — the +full-screen scoreboard pins its crests to the panel edges and is unaffected. + +| Key | Type | Default | What it does | +|---|---|---|---| +| `scroll_card.center_gap` | 0–64 px | unset | Pixels kept clear down the middle. Unset scales with card width; `0` restores edge-to-edge logos. | +| `scroll_card.center_gap_ratio` | 0.0–0.6 | `0.28` | **Advanced.** Fraction of card width used when the gap is not pinned. | +| `scroll_card.center_gap_min` | 0–64 px | `22` | **Advanced.** Floor for the scaled gap. | +| `scroll_card.center_gap_max` | 0–96 px | `40` | **Advanced.** Ceiling for the scaled gap. | +## Fonts, colours and layout -## Favorite Team Result Colors +Seven text elements, each with `font`, `font_size`, and `text_color`, under +`customization.`. All **Advanced**. -A run of games against the same opponent is hard to read at a glance: in scroll -and Vegas mode the same two logos go past several times and only the digits -change. Turn on **Customization -> Favorite Team Result Colors** to color a -finished game's score by how your favorite team did - green for a win, red for -a loss. +| Element | Default font | Default size | Draws | +|---|---|---|---| +| `score_text` | `PressStart2P-Regular.ttf` | `10` | The score, and the matchup separator on an upcoming card | +| `period_text` | `PressStart2P-Regular.ttf` | `8` | The period, and the date/time on an upcoming scoreboard | +| `team_name` | `PressStart2P-Regular.ttf` | `8` | Team names and abbreviations | +| `status_text` | `4x6-font.ttf` | `6` | Status lines such as "Next Game" | +| `detail_text` | `4x6-font.ttf` | `6` | Small detail lines, including the shot line | +| `rank_text` | `PressStart2P-Regular.ttf` | `10` | Rank badges | +| `odds_text` | `4x6-font.ttf` | `6` | Betting odds (defaults to green, `[0, 255, 0]`) | + +Colours are `[r, g, b]` or `"#RRGGBB"`. Every default is white except +`odds_text`. Odds sizes snap to the face's pixel grid to stay crisp: +`4x6-font.ttf` to 7, 14, 21; press_start to 8, 16. Every +`customization.` object sets `additionalProperties: false`. ```json { "customization": { - "favorite_result_colors": { - "enabled": true, - "win_color": [0, 255, 0], - "loss_color": [255, 0, 0], - "tie_color": [255, 200, 0] - } - } -} -``` - -- Off by default. Until you enable it the score keeps exactly the color it has - today. -- Only finished games are colored. Live and upcoming cards are untouched. -- A game needs exactly one favorite team. If neither side is a favorite, or both - are, the score keeps its normal color. -- Applies to both the one-game-at-a-time switch view and the scroll/Vegas - ticker. -- The three colors are Advanced settings; leave them alone for the defaults - above. - -## Troubleshooting - -**No games showing:** -- **Start times look like UTC** (a 6:45pm Central start showing as 11:45PM): - the plugin couldn't read your global timezone. Set `timezone` under the - plugin's Advanced Settings to your IANA zone, e.g. `America/Chicago`. -- Check that at least one league is enabled in config -- Verify the season is active for enabled leagues -- Check `recent_games_hours` and `upcoming_games_hours` settings -- Ensure internet connection is working - -**Games not updating:** -- Check `.update_intervals.*` (or `defaults.update_interval_seconds`) settings -- Verify API is responding (check logs) -- Try clearing cache: restart plugin or clear cache manually -- Check background service is enabled - -**Favorite teams not showing:** -- Verify team abbreviations are correct (case-sensitive) -- Ensure `.live_priority` is true -- Check that favorite teams have games in current time window - -**Logos not displaying:** -- Verify logo assets are available in LEDMatrix installation -- Check `assets/sports/nhl_logos` and `assets/sports/ncaa_logos` directories -- Some NCAA teams may not have logos available - -**Power play not showing:** -- Enable `show_powerplay` in config -- Verify ESPN API includes situation data (may not be available for all leagues) - -**SOG not accurate:** -- Enable `defaults.show_shots_on_goal` (or the per-league override `.display_options.show_shots_on_goal`) in config -- ESPN API may have delayed SOG updates -- Some leagues may not provide SOG data - -## Advanced Configuration - -### Custom Fonts - -Override default fonts via config or Web UI: - -```json -"fonts": { - "team_name": { - "family": "press_start", - "size": 10, - "color": "#FFFFFF" - }, - "score": { - "family": "press_start", - "size": 12, - "color": "#FFC800" - }, - "status": { - "family": "four_by_six", - "size": 6, - "color": "#00FF00" + "score_text": { "text_color": [255, 200, 0] }, + "status_text": { "text_color": "#00A0FF" } } } ``` -### Layout Customization - -The plugin supports fine-tuning element positioning for custom display sizes. All offsets are relative to the default calculated positions, allowing you to adjust elements without breaking the layout. - -#### Accessing Layout Settings - -Layout customization is available in the plugin's tab in the web UI: -1. Open the **Hockey Scoreboard** tab (second nav row) -2. Expand the **Customization** section -3. Find the **Layout Positioning** subsection - -#### Offset Values +### Layout offsets -- **Positive values**: Move element right (x_offset) or down (y_offset) -- **Negative values**: Move element left (x_offset) or up (y_offset) -- **Default (0)**: No change from calculated position +Nudge any element in pixels. All default to `0`, all **Advanced**, all under +`customization.layout.`, and all set `additionalProperties: false`. -#### Available Elements - -- **home_logo**: Home team logo position (x_offset, y_offset) -- **away_logo**: Away team logo position (x_offset, y_offset) -- **score**: Game score position (x_offset, y_offset) -- **status_text**: Status/period text position (x_offset, y_offset) -- **date**: Game date position (x_offset, y_offset) -- **time**: Game time position (x_offset, y_offset) -- **records**: Team records/rankings position (away_x_offset, home_x_offset, y_offset) +| Element | Keys | Measured from | +|---|---|---| +| `home_logo`, `away_logo` | `x_offset`, `y_offset` | Default logo position | +| `score` | `x_offset`, `y_offset` | Panel centre | +| `status_text` | `x_offset`, `y_offset` | Centre horizontally, top vertically | +| `date` | `x_offset`, `y_offset` | Centre horizontally, default position vertically | +| `time` | `x_offset`, `y_offset` | Centre horizontally, the date's position vertically | +| `records` | `away_x_offset`, `home_x_offset`, `y_offset` | Away from the left, home from the right, both from the bottom | +| `odds` | `x_offset`, `y_offset` | Default odds position | -#### Example Adjustments +## Favorite team result colours -**Move logos inward for smaller displays:** -```json -{ - "customization": { - "layout": { - "home_logo": { "x_offset": -5 }, - "away_logo": { "x_offset": 5 } - } - } -} -``` +A run of games against the same opponent is hard to read at a glance: in scroll +and Vegas mode the same two crests go past several times and only the digits +change. Turn this on to colour a finished game's score by how your team did. -**Adjust score position:** -```json -{ - "customization": { - "layout": { - "score": { "x_offset": 0, "y_offset": -2 } - } - } -} -``` +| Key | Type | Default | +|---|---|---| +| `customization.favorite_result_colors.enabled` | boolean | `false` | +| `customization.favorite_result_colors.win_color` | `[r, g, b]` | `[0, 255, 0]` | +| `customization.favorite_result_colors.loss_color` | `[r, g, b]` | `[255, 0, 0]` | +| `customization.favorite_result_colors.tie_color` | `[r, g, b]` | `[255, 200, 0]` | -**Shift records upward:** ```json { "customization": { - "layout": { - "records": { "y_offset": -3 } + "favorite_result_colors": { + "enabled": true, + "win_color": [0, 255, 0], + "loss_color": [255, 0, 0], + "tie_color": [255, 200, 0] } } } ``` -#### Display Size Compatibility +- Only finished games are coloured; live and upcoming cards are untouched. +- A game needs **exactly one** favorite team. Neither side or both, and the score + keeps its normal colour. +- The three colours are Advanced settings. -Layout offsets work across different display sizes. The plugin calculates default positions based on your display dimensions, and offsets are applied relative to those defaults. This ensures compatibility with various LED matrix configurations. +This tint is applied by the LEDMatrix core rather than by the plugin, which is +why the keys do not appear in this plugin's source. -### Multi-League Strategy +## Vegas ticker: seeing live games more often -Enable all three leagues for comprehensive coverage: +By default a live game **takes over** the display. To keep the marquee scrolling +and still see scores, set this in the **core** config — not in this plugin's +settings: ```json -"leagues": { - "nhl": true, - "ncaa_mens": true, - "ncaa_womens": true +{ + "display": { + "vegas_scroll": { + "live_in_ticker": true, + "live_weight": 3, + "favorite_live_weight": 5 + } + } } ``` -Games from all leagues will be mixed and sorted by: -1. Live games first -2. Favorite teams (if enabled) -3. Start time - -### Timezone +The ticker is otherwise a strict round robin — every plugin appears once per +cycle. These weights let this plugin claim several slots per cycle, spaced +evenly through it. `live_weight` applies whenever this scoreboard has a live +game; `favorite_live_weight` when one of your teams is playing. That distinction +has to be made here rather than in the core, which can tell *that* a game is +live but not *whose*. -- `timezone` (Advanced): IANA name used to display event start times, e.g. - `America/Chicago`. Leave blank (the default) to follow the LEDMatrix global - timezone; if that isn't set, the host system's timezone is used, and only if - neither is available do times fall back to UTC. +- The weight is per **plugin**, not per game. With four games live this + scoreboard still occupies one slot at a time and picks between its own games + using `favorite_live_boost`. +- More slots make the cycle **longer**, not faster. -## Data Source +## Data source -This plugin uses the **ESPN public API** for all hockey data: +ESPN's public site API, no key required: -- **NHL**: `https://site.api.espn.com/apis/site/v2/sports/hockey/nhl/scoreboard` -- **NCAA M**: `https://site.api.espn.com/apis/site/v2/sports/hockey/mens-college-hockey/scoreboard` -- **NCAA W**: `https://site.api.espn.com/apis/site/v2/sports/hockey/womens-college-hockey/scoreboard` +- NHL: `https://site.api.espn.com/apis/site/v2/sports/hockey/nhl/scoreboard` +- NCAA men's: `.../hockey/mens-college-hockey/scoreboard` +- NCAA women's: `.../hockey/womens-college-hockey/scoreboard` -**Note**: No API key required. Please use responsibly and respect ESPN's rate limits. +Crests are downloaded on first sight and cached under +`assets/sports/nhl_logos/`, `assets/sports/ncaa_mens_logos/`, and +`assets/sports/ncaa_womens_logos/`. If a download fails, a placeholder is +generated from the team abbreviation. -## Examples +## Example configurations -### NHL Only Configuration +### NHL only ```json { - "enabled": true, - "leagues": { - "nhl": true, - "ncaa_mens": false, - "ncaa_womens": false - }, - "favorite_teams": { - "nhl": ["TB", "TOR", "BOS"] - }, - "defaults": { - "update_interval_seconds": 60, - "display_duration": 15 - }, - "nhl": { + "hockey-scoreboard": { "enabled": true, - "display_modes": { - "live": true, - "recent": true, - "upcoming": false - }, - "update_intervals": { - "base": 60, - "live": 30 - }, - "display_durations": { - "base": 15, - "live": 20 + "nhl": { + "enabled": true, + "teams": { "favorite_teams": ["BOS", "TOR", "NYR"] }, + "display_options": { "show_shots_on_goal": true, "show_records": true } } } } ``` -### NCAA Men's Only Configuration +### NCAA men's only ```json { - "enabled": true, - "leagues": { - "nhl": false, - "ncaa_mens": true, - "ncaa_womens": false - }, - "favorite_teams": { - "ncaa_mens": ["BU", "BC", "MICH", "WISC"] - }, - "ncaa_mens": { + "hockey-scoreboard": { "enabled": true, - "display_modes": { - "live": true, - "recent": true, - "upcoming": true - }, - "update_intervals": { - "base": 120 - }, - "upcoming_games_hours": 168 + "nhl": { "enabled": false }, + "ncaa_mens": { + "enabled": true, + "teams": { "favorite_teams": ["BU", "DEN", "MIN"] }, + "live_priority": true + } } } ``` -### All Leagues Configuration +### All three leagues ```json { - "enabled": true, - "leagues": { - "nhl": true, - "ncaa_mens": true, - "ncaa_womens": true - }, - "favorite_teams": { - "nhl": ["TB", "DET"], - "ncaa_mens": ["MICH"], - "ncaa_womens": ["WISC"] - }, - "defaults": { - "show_shots_on_goal": true, - "show_powerplay": true - }, - "nhl": { - "enabled": true, - "live_priority": true, - "display_modes": { - "live": true, - "recent": true, - "upcoming": true - } - }, - "ncaa_mens": { + "hockey-scoreboard": { "enabled": true, - "display_modes": { - "live": true, - "recent": true, - "upcoming": true - } - }, - "ncaa_womens": { - "enabled": true, - "display_modes": { - "live": true, - "recent": true, - "upcoming": true + "defaults": { "display_duration": 15 }, + "nhl": { + "enabled": true, + "teams": { "favorite_teams": ["BOS"] } + }, + "ncaa_mens": { + "enabled": true, + "teams": { "favorite_teams": ["BU"] } + }, + "ncaa_womens": { + "enabled": true, + "teams": { "favorite_teams": ["WIS"] } } } } ``` -## Integration Notes - -### Base Classes - -This plugin uses LEDMatrix base classes: -- `Hockey` - Base hockey functionality -- `HockeyLive` - Live game display logic -- `SportsRecent` - Recent games display -- `SportsUpcoming` - Upcoming games display - -These are imported from the main LEDMatrix installation at `src/base_classes/`. - -### Caching - -The plugin uses LEDMatrix's `CacheManager` to cache API responses: -- Cache duration: 5 minutes for live data -- Cache key format: `hockey_{league}_{date}` -- Automatic cache invalidation on date change - -### Background Service - -Uses LEDMatrix's `BackgroundDataService` for: -- Non-blocking API requests -- Automatic retries on failure -- Request prioritization -- Timeout handling - -## Performance - -### Resource Usage - -- **CPU**: Low (background fetching, cached data) -- **Memory**: ~5–10 MB for game data -- **Network**: ~1–5 KB per API call per league -- **API calls**: depends on how many leagues are enabled and which - `update_intervals` you set. With defaults (NHL only, base 60s, live 30s, - recent/upcoming 3600s) and no live games, expect about one ESPN call per - minute per enabled league. - -### Optimization Tips - -1. **Disable Unused Leagues**: Only enable leagues you follow -2. **Increase Update Interval**: Use 120-300s during off-season -3. **Reduce Time Windows**: Lower `recent_games_hours` and `upcoming_games_hours` -4. **Enable Caching**: Keep `background_service.enabled: true` +With three leagues enabled, nine modes enter the rotation and any one league's +games come round roughly a third as often. Disabling the modes you do not watch +— say, every league's Upcoming screen — is usually better than shortening +durations. -## 🎯 Which Games Get Shown - -**`upcoming_games_to_show` is not "how many cards you see".** It is the size of a *pool*. The panel cycles through that pool one card at a time and keeps its place between visits, so a pool of 3 means the board rotates through the same 3 games until the schedule moves on. Making the number bigger gives you a *longer lap*, so any one game comes round **less** often. - -Which mode you are in depends on whether `favorite_teams` is set and whether `show_favorite_teams_only` is on: - -| `favorite_teams` | `show_favorite_teams_only` | What you get | -|---|---|---| -| empty | either | The next N games league-wide, chronologically. Every game shown is a non-favorite game, so the two filters below apply to all of them. | -| set | **on** | Only your teams. The limit is a budget **per team**. | -| set | **off** | **Your teams first, then other games to fill.** Both limits are **totals**. | - -The third row is what most people want, and it did not exist before: with the flag off, favorites used to be ignored *entirely*. - -### The settings - -| Option | Default | Description | -|---|---|---| -| `upcoming_games_to_show` | varies | How many **favorite** upcoming games to show. | -| `recent_games_to_show` | varies | The same, for finished games. | -| `other_upcoming_games_to_show` | matches `upcoming_games_to_show` | How many **non-favorite** upcoming games to add. `0` gives you favorites only. | -| `other_recent_games_to_show` | matches `recent_games_to_show` | The same, for finished games. | -| `other_rotation_interval_seconds` | `1800` | How often the non-favorite slice advances. `0` pins it. | -| `other_games_min_quality` | `ranked` | Which non-favorite games qualify: `ranked`, `broadcast`, or `any`. | -| `other_games_divisions` | `["fbs"]` | Which divisions non-favorite games may come from. College football only — see the note below. | +## Troubleshooting -**Your favorite teams are never filtered by the last two** — follow a smaller-division team and its games always appear. Those settings only decide what fills the *remaining* slots. +**Nothing appears.** Check that `enabled` is on, and that the league's own +`enabled` is on — both NCAA leagues are off by default. -Within the other-games pool, **the better matchup leads**, and each team appears once. The pool is each team's *next* game ordered by the best poll position of either side, so a top-five matchup sits in the first window rather than whichever kicks off soonest — and the #1 team's whole season does not sort above everyone else's opener. Ties fall back to kickoff order, and a league with no poll keeps chronological order. Your favorite teams are ordered by when they play, not by rank -- for your own team the next game is the point. +**Shots on goal never show.** In scroll or Vegas mode they cannot — see +[issue #432](https://github.com/ChuckBuilds/ledmatrix-plugins/issues/432). In +switch mode, confirm `.display_options.show_shots_on_goal` is `true`; +the NCAA leagues default it to `false`, and the `defaults` copy does not +override the per-league one. -### Variety comes from turnover +**Power-play highlighting never shows.** Nothing draws it yet — see +[issue #431](https://github.com/ChuckBuilds/ledmatrix-plugins/issues/431). -Rather than widening the pool, the non-favorite slice **moves**: the window advances by its own width every `other_rotation_interval_seconds`, so consecutive windows do not overlap and the board works through the schedule instead of resampling the front of it. Your favorites are not rotated — for upcoming games the soonest ones are the point. +**Records or rank badges are on when I turned them off.** You changed the +`defaults` copy. The per-league `display_options` copy wins, and both NCAA +leagues default those to `true`. -Both filters **fail open**: if the data behind them cannot be fetched, the game is allowed through. A board showing filler is a poor board; a board showing nothing is a broken one. +**Start times look like UTC.** The plugin could not read your global timezone. +Set `timezone` under Advanced Settings to your IANA zone. -They fail open a second time, as a set: if the filters between them leave **nothing at all** — your teams idle and every other game rejected — the unfiltered list is used instead. Setting `other_upcoming_games_to_show` or `other_recent_games_to_show` to `0` is the one way to ask for an empty slate, and that is honoured. +**The same few games keep repeating.** That is the pool cycling. Lower +`other_rotation_interval_seconds` for faster turnover rather than raising the +pool size — a larger pool makes the lap longer, so each game appears less often, +not more. -> `other_games_min_quality` needs a national poll, which only the college leagues publish — set to `ranked` in a professional league it lets every game through, and no poll is requested. `other_games_divisions` needs ESPN's FBS/FCS group rosters, which exist for **college football and nothing else**: asked for any other college league they come back empty or 500, so the setting is inert here and no lookup is made. +**A finished game disappeared too soon.** Raise `schedule_lookback_days` +(default 14). +**A game I know about never appears.** It may be beyond +`schedule_lookahead_days` (default 7). A game outside that horizon is never +fetched. ## License -GPL-3.0 License - see main LEDMatrix repository for details. - -## Support - -- **Issues**: [GitHub Issues](https://github.com/ChuckBuilds/ledmatrix-plugins/issues) -- **Documentation**: see the LEDMatrix - [`docs/`](https://github.com/ChuckBuilds/LEDMatrix/tree/main/docs) directory -- **Community**: [Discussions](https://github.com/ChuckBuilds/LEDMatrix/discussions) - ---- - -For the current version, author, category and tags see -[`manifest.json`](manifest.json) — that's the source of truth and is -what the Plugin Store reads. - -## Vegas ticker: seeing live games more often - -By default a live game **takes over** the display: the Vegas ticker stops and -this scoreboard shows full screen until the game ends. If you would rather keep -the marquee scrolling and still see scores, set this in the core config: - -```json -{ - "display": { - "vegas_scroll": { - "live_in_ticker": true, - "live_weight": 3, - "favorite_live_weight": 5 - } - } -} -``` - -The ticker is otherwise a strict round robin — every plugin appears once per -cycle — so with a dozen plugins enabled a score comes round once a lap. These -weights let this plugin claim several slots per cycle, spaced evenly through -it rather than bunched together. - -`live_weight` applies whenever this scoreboard has a live game. -`favorite_live_weight` applies when one of your `favorite_teams` is playing, so -your team's game comes round more often than other live games. That distinction -has to be made here rather than in the core, which can tell *that* a game is -live but not *whose*. - -Two things to keep in mind: - -- The weight is per **plugin**, not per game. With four games live this - scoreboard still occupies one slot at a time and picks between its own games - using `favorite_live_boost`; these weights control how often the scoreboard - itself comes round. -- More slots make the cycle **longer**, not faster — everything else appears - proportionally less often. And appearing more often only helps if the data is - fresh, which is governed by this plugin's own live update interval. - -## Matchup separator and the upcoming card middle - -The **Matchup Card Layout** section (advanced) controls what sits between the -two team logos before a game starts, and how the date and time are written. -These settings now apply to every display mode -- the scroll ticker, the Vegas -ticker, and the full-screen scoreboard -- rather than only the tickers. - -| Setting | Key | Default | What it does | -|---|---|---|---| -| Matchup Separator | `vs_text` | `VS` | Text drawn between the teams: `VS`, `@`, `at`, `v`. The away team is always on the left, so `@` and `at` read as "away at home". Blank draws nothing. | -| Middle of an Upcoming Card | `upcoming_center` | `vs` | Scroll and Vegas cards: the separator, the date and time stacked, or nothing. | -| Middle of a Full-Screen Upcoming Scoreboard | `switch_upcoming_center` | `date_time` | The same choice for the full-screen scoreboard, plus `inherit` to follow the setting above. It defaults to the stacked date and time, which is what this display has always shown, so nothing changes until you pick something else. | -| Date Format | `date_format` | `abbrev` | How the scroll and Vegas cards write the date: `Sep 19`, `9/19`, `19 Sep`, `19/9`, or `Fri Sep 19`. | -| Full-Screen Date Format | `switch_date_format` | `numeric` | The same choice for the full-screen scoreboard, plus `inherit` to follow the row above. It has its own default because the two displays disagree about what is normal: the cards have always written `Sep 19` and the full-screen scoreboard `9/19`, so a single shared default would restyle one of them. | -| Time Format | `time_format` | `12h` | 12- or 24-hour clock. | -| Show Date / Show Time | `show_date`, `show_time` | `true` | Drop either line. | -| Swap Date and Time | `swap_date_time` | `false` | Swap the two lines over. Each display starts from its own order, so this flips them rather than forcing one: the scroll and Vegas cards put the time on top, the full-screen date/time stack puts the date on top. | - -Choosing the separator for the full-screen scoreboard moves the date and time -out of the middle and onto the top and bottom rows, the same way the scroll -card lays them out; the "Next Game" header gives up the top row to them. - -The center-gap settings in the same section size the scroll and Vegas card's -middle strip only -- the full-screen scoreboard pins its logos to the panel -edges and is unaffected. - -Example: - -```json -{ - "scroll_card": { - "vs_text": "@", - "switch_upcoming_center": "vs", - "date_format": "weekday" - } -} -``` - -### Text Colours - -Each text element in the **Customization** section carries a colour, and it now -applies to the text drawn in that element's face — on the full-screen scoreboard -and on the scroll and Vegas cards alike. Until this version the picker changed -only which font was loaded; every string was drawn white. - -| Element | Key | Colours | -|---|---|---| -| Score | `score_text` | The score, and the matchup separator on an upcoming card | -| Period / clock | `period_text` | The clock, period, and the date and time on an upcoming scoreboard | -| Team name | `team_name` | Team names and abbreviations | -| Status | `status_text` | Status lines such as "Next Game" | -| Detail | `detail_text` | Small detail lines | -| Ranking | `rank_text` | Team rankings drawn in the ranking face | - -Colours are `[r, g, b]` or `"#RRGGBB"`, and every default is white, so a display -nobody has recoloured looks exactly as it did. - -```json -{ - "customization": { - "score_text": { "text_color": [255, 200, 0] }, - "status_text": { "text_color": "#00A0FF" } - } -} -``` - -Two things keep their own colours on purpose: the betting-odds figures, which -are coloured by which side is favoured, and a finished game's score when -**Favorite Team Result Colors** is on — that tint wins, and your score colour -shows on every other game. Records and rankings drawn in the small fixed face -stay white; no element in the schema owns that face. +See `LICENSE`. diff --git a/plugins/hockey-scoreboard/manifest.json b/plugins/hockey-scoreboard/manifest.json index a3f6894a..9e1f9e6c 100644 --- a/plugins/hockey-scoreboard/manifest.json +++ b/plugins/hockey-scoreboard/manifest.json @@ -1,7 +1,7 @@ { "id": "hockey-scoreboard", "name": "Hockey Scoreboard", - "version": "1.25.1", + "version": "1.25.2", "author": "ChuckBuilds", "description": "Live, recent, and upcoming hockey games across NHL, NCAA Men's, and NCAA Women's hockey with real-time scores and schedules", "homepage": "https://github.com/ChuckBuilds/ledmatrix-plugins/tree/main/plugins/hockey-scoreboard", @@ -54,6 +54,16 @@ } ], "versions": [ + { + "version": "1.25.2", + "released": "2026-09-02", + "ledmatrix_min_version": "3.3.0", + "notes": "Fix every grid-snapped font rendering a pixel narrow. The shared code reads this plugin's config_schema.json to tell a default font size from one the user chose; a default gets snapped to the font's pixel grid, a choice is left alone. It located the schema by inspecting loaded modules, which fails under the real plugin loader -- the loader renames a plugin's modules and removes their original names, so nothing was left to inspect. The lookup returned nothing, every size then looked user-chosen, and the snap was skipped: 4x6-font.ttf drew at 6 instead of 7, which is 3-pixel-wide glyphs instead of 4. On a 256x64 panel the betting odds, team records and the date row were hard to read. The plugin now tells the shared code where it lives instead of leaving it to guess.", + "changelog": "Retry a team logo whose previous download failed, instead of showing a grey box forever. A failed download is cached by the core as a placeholder wearing the real logo's filename; the logo loader scans filename variations, found that stub, and so never called the downloader again. The loader now skips a placeholder that is stale enough to be worth retrying and lets the download run, which also picks up stubs already on disk. The retry is rate-limited by the core (6h), so this does not trade a permanent grey box for a request every frame. Needs a core carrying src.logo_downloader.is_placeholder_logo; against an older core the check is skipped and behaviour is unchanged. Ported byte-identically across every sports lineage.", + "changes": [ + "Rewrote the README as a complete settings reference covering all 226 settings, with rendered examples of every display mode and the shots-on-goal line." + ] + }, { "version": "1.25.1", "released": "2026-09-02", diff --git a/scripts/docs_render_support/sitecustomize.py b/scripts/docs_render_support/sitecustomize.py index 44eafa3a..64fbb438 100644 --- a/scripts/docs_render_support/sitecustomize.py +++ b/scripts/docs_render_support/sitecustomize.py @@ -89,12 +89,59 @@ def advance(seconds): _WANTED = _json.loads(_ATTRS) _TARGET = "src.plugin_system.plugin_loader" + def _resolve(instance, path): + """Walk a dotted path to the object that owns the final attribute. + + The sports scoreboards keep their per-mode state on sub-managers rather + than on the plugin -- self._managers["live"].current_game -- so a shot + that can only set top-level attributes cannot reach the game it wants + to draw. A segment is tried as a mapping key first, then as an + attribute, so both self._managers["live"] and self.live_manager work. + """ + parts = path.split(".") + target = instance + for part in parts[:-1]: + if hasattr(target, "get") and not hasattr(target, part): + nxt = target.get(part) + else: + nxt = getattr(target, part, None) + if nxt is None and hasattr(target, "get"): + nxt = target.get(part) + if nxt is None: + return None, None + target = nxt + return target, parts[-1] + + def _coerce(name, value): + """Turn JSON into the shapes the plugins actually hold. + + A shots file can only carry JSON, but plugin state is not all strings + and lists: colours are tuples throughout the core, and a logo field is + a pathlib.Path -- the sports renderers call logo_path.parent, so a + string there raises AttributeError and the card silently fails to draw. + """ + if isinstance(value, list) and len(value) == 3 and all( + isinstance(v, int) for v in value): + return tuple(value) # colours are tuples everywhere in the core + if isinstance(value, str) and name.endswith("_path") and value: + import pathlib as _pathlib + return _pathlib.Path(value) + if isinstance(value, dict): + return {k: _coerce(k, v) for k, v in value.items()} + if isinstance(value, list): + return [_coerce(name, v) for v in value] + return value + def _apply(instance): for name, value in _WANTED.items(): - if isinstance(value, list) and len(value) == 3 and all( - isinstance(v, int) for v in value): - value = tuple(value) # colours are tuples everywhere in the core - setattr(instance, name, value) + value = _coerce(name.rsplit(".", 1)[-1], value) + owner, attr = _resolve(instance, name) + if owner is None: + continue # the path does not exist on this plugin; leave it alone + if hasattr(owner, "__setitem__") and not hasattr(owner, attr): + owner[attr] = value + else: + setattr(owner, attr, value) return instance class _PatchingLoader: diff --git a/scripts/render_docs_assets.py b/scripts/render_docs_assets.py index fa38f5f9..2ca204e6 100644 --- a/scripts/render_docs_assets.py +++ b/scripts/render_docs_assets.py @@ -268,6 +268,9 @@ def render_shot( mock_path = resolve_mock_data(mock_spec, shot_list_dir, tmpdir, name) if mock_path: cmd += ["--mock-data", str(mock_path)] + display_mode = shot.get("display_mode", defaults.get("display_mode")) + if display_mode: + cmd += ["--display-mode", str(display_mode)] if shot.get("skip_update", defaults.get("skip_update", False)): cmd.append("--skip-update")