From 3ccb0c3c33009bfcf8c399f79473b144d960940f Mon Sep 17 00:00:00 2001 From: Chuck <33324927+ChuckBuilds@users.noreply.github.com> Date: Wed, 2 Sep 2026 23:05:52 -0400 Subject: [PATCH] fix(jellyfin-now-playing): make the bitmap fonts work, and document every setting A .bdf is a bitmap face that exists at exactly one pixel size. Requesting any other raises inside FreeType, and the plugin caught that and fell back to PIL's default font -- much smaller than anything the schema offers -- with only a log warning. Measured against the 4-16 sizes the schema allows: 5x7.bdf loads only at 7 fails at 12 of 13 offered sizes 4x6.bdf loads only at 6 fails at 12 of 13 offered sizes cozette.bdf loads at nothing fails at 13 of 13 Bitmap faces now load at their declared PIXEL_SIZE when the requested size is not available, the same fix already in clock-simple, countdown, news, tide-display, mqtt-notifications and youtube-stats. cozette.bdf is dropped from both font menus outright: the core ships no file of that name, so it could never load at any size. Eleven other plugins offer the same non-existent font -- filed as #387. README: real rendered screenshots for the three content types, the three playback states, both progress-bar widths and four panel sizes, rendered against a recorded Jellyfin response with generated poster art. Documents progress_bar_match_text, which was absent entirely, and the eight customization settings that were summarised as one table row. All 21 schema leaves are now covered by key. Tooling: the HTTP replay shim can serve a file as raw bytes via body_file, so a render can include the poster art the plugin fetches rather than the grey placeholder. Co-Authored-By: Claude Opus 5 --- README.md | 3 +- .../jellyfin-now-playing/content-types.png | Bin 0 -> 17097 bytes docs/assets/jellyfin-now-playing/hero.png | Bin 0 -> 2599 bytes .../jellyfin-now-playing/panel-sizes.png | Bin 0 -> 17654 bytes .../jellyfin-now-playing/playback-states.png | Bin 0 -> 12492 bytes .../jellyfin-now-playing/poster-album.png | Bin 0 -> 3654 bytes .../jellyfin-now-playing/poster-movie.png | Bin 0 -> 3286 bytes .../jellyfin-now-playing/poster-series.png | Bin 0 -> 4406 bytes .../progress-bar-width.png | Bin 0 -> 16994 bytes .../jellyfin-now-playing/sessions-idle.json | 23 ++++++ .../jellyfin-now-playing/sessions-paused.json | 37 +++++++++ .../assets/jellyfin-now-playing/sessions.json | 69 +++++++++++++++++ docs/assets/jellyfin-now-playing/shots.json | 73 ++++++++++++++++++ plugins.json | 4 +- plugins/jellyfin-now-playing/README.md | 63 ++++++++++++++- .../jellyfin-now-playing/config_schema.json | 6 +- plugins/jellyfin-now-playing/manager.py | 30 ++++++- plugins/jellyfin-now-playing/manifest.json | 12 ++- .../docs_render_support/_docs_http_replay.py | 48 +++++++++--- 19 files changed, 342 insertions(+), 26 deletions(-) create mode 100644 docs/assets/jellyfin-now-playing/content-types.png create mode 100644 docs/assets/jellyfin-now-playing/hero.png create mode 100644 docs/assets/jellyfin-now-playing/panel-sizes.png create mode 100644 docs/assets/jellyfin-now-playing/playback-states.png create mode 100644 docs/assets/jellyfin-now-playing/poster-album.png create mode 100644 docs/assets/jellyfin-now-playing/poster-movie.png create mode 100644 docs/assets/jellyfin-now-playing/poster-series.png create mode 100644 docs/assets/jellyfin-now-playing/progress-bar-width.png create mode 100644 docs/assets/jellyfin-now-playing/sessions-idle.json create mode 100644 docs/assets/jellyfin-now-playing/sessions-paused.json create mode 100644 docs/assets/jellyfin-now-playing/sessions.json create mode 100644 docs/assets/jellyfin-now-playing/shots.json diff --git a/README.md b/README.md index 9fae8532..eb530354 100644 --- a/README.md +++ b/README.md @@ -124,10 +124,11 @@ curl -X POST http://your-pi-ip:5000/api/v3/plugins/install \ | [Weather Display](./plugins/ledmatrix-weather/) | Current conditions, hourly & daily forecasts (Open-Meteo) | | | [Tide Display](./plugins/tide-display/) | Coastal tides with animated wave level, schedule & 24-hour chart (NOAA) | | -### Media (2) +### Media (3) | Plugin | Description | Preview | |--------|-------------|---------| +| [Jellyfin Now Playing](./plugins/jellyfin-now-playing/) | Poster, title and playback progress from your Jellyfin server | jellyfin-now-playing on an LED panel | | [Music Player](./plugins/ledmatrix-music/) | Now playing with album art (Spotify & YouTube Music) | | | [Static Image Display](./plugins/static-image/) | Image display with scaling and transparency | | diff --git a/docs/assets/jellyfin-now-playing/content-types.png b/docs/assets/jellyfin-now-playing/content-types.png new file mode 100644 index 0000000000000000000000000000000000000000..772ad0d65e4e8112fefa7ab65372fb9fb64cd5cb GIT binary patch literal 17097 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 literal 0 HcmV?d00001 diff --git a/docs/assets/jellyfin-now-playing/panel-sizes.png b/docs/assets/jellyfin-now-playing/panel-sizes.png new file mode 100644 index 0000000000000000000000000000000000000000..5238e81a4fdcd92d467181e9f041c8b7e611127e GIT binary patch literal 17654 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 OLjTw)oeZs?ul*kaGUZzU literal 0 HcmV?d00001 diff --git a/docs/assets/jellyfin-now-playing/poster-album.png b/docs/assets/jellyfin-now-playing/poster-album.png new file mode 100644 index 0000000000000000000000000000000000000000..4bcb1f09825e343c6cfbe94cdabfee71bbe266f6 GIT binary patch literal 3654 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 literal 0 HcmV?d00001 diff --git a/docs/assets/jellyfin-now-playing/poster-series.png b/docs/assets/jellyfin-now-playing/poster-series.png new file mode 100644 index 0000000000000000000000000000000000000000..9cbeb00234441e75a70d1ea63a7c02073517a324 GIT binary patch literal 4406 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 literal 0 HcmV?d00001 diff --git a/docs/assets/jellyfin-now-playing/progress-bar-width.png b/docs/assets/jellyfin-now-playing/progress-bar-width.png new file mode 100644 index 0000000000000000000000000000000000000000..66ea18a995b3bf70c526c8c2ee568f64f6113e06 GIT binary patch literal 16994 zcmeHvX;@QdyRO~+s%;%8Ql%F@)BKHS!=!T`@GL{Klgnv zqmP>#uK#-L*Q-{oT5t5L{)ttqRx7Vs^&ek<`5$m(pVEcnt5zM^Wu*U$<@tWbQ0RH< z@d~xqN?-l3?yFyZHgH?>?YGkxHWht;bo1B+YzpmS zlb|33hdP#P%|M=ERdB4S3G(yjC<5~1%Xul}#~;gI!Jikt(fbU3d^4hi9Q*Lm4|wEz z-#?MDP#z$A?RN_-Mr?R$l%6C01Vj{UuiY?bY#rJ~U6aKYo1f<&L;JvhVMB zri;|x=S~pT>xqg`1YI(Bx$HYn_qGl2DLk;1)>7|j=9AG_f?!OEJ=HzXQeRkiTniig zUymDAy%Vo2p13<)jn(4}1_aPs)AxIHWM^fh;QxGe?`W1;YA`)L#V5_9Tj`by}daeAUz zGP5=9Fzfd<+Yc?jzI2k^nywYM^}tk%1}&U36ryC7vRFb8dK=c|q=zpwwCQjL(+&rq z!{_U+)=PZ%)9ZFaxpd8-DL8f_prN55n`fPC+b}ysMx`B^9}1!2CX(G_wHID)kk!-{ z%+;2-wS-M(CaFGoebG}b3@)#?`08l(>0_}nb})IPa^gd5f>UMSmIIz$4!+d~U^q4y z+=0F06dd0?Wxq#Ho}HAU>5rJoK&xw*NuI>EgS*-DPFO~nY4{JKopV7s2Z!42ROwfB$?zYIxRjvzH%1MNYNA#V^oc;;L$DFpMMUM-gU1s z6gPR}=!Oa=ghfm>d~0-e z?AXE1V)U17JLqj&?lW{{-In5@=^hic>cteV0wZDjn@BnIcDbE9UuaL~mEidUw1+R6 z8yY6NbEzZJ|_?(PUlEwWK0p2u<&?#i7 z%)75Rlr>?XUx==b)miGj8qm`UR3J%P*I`sDLr5D$>#E0eQoy;=l3}b!uOTGK{ z$=jFv;8-mhHE=`@zkJF}HRV+nig0s>VPegro?_P~7*YbN;&grN4#U{y=H_cr1y1B) z9A`+#=cuWuJ2i>unb%WoyY?iy0Xvt@x}y^6U^>~-XS!_tDRWK#B<0#LzP2;oo2|Q`OVi! z+i2hQ=zMtp*mcb}e@M+z__Kq9gEYZ}#+EHxE?>U<`I-&da9q*!&Nq^V+e60=)6?Qp zQ?cCfB*W)dH>s>%_uZ>po5G3!x^-Cl)zb$(yWYOo=G*-8<@v>SLo%!d3^&sxX@X8C zgbau3V3$nmOl=(f>gMa^B3cem^K6TV9nS0N=lP8CtcgP|FK=|o33=3-*$()Us#C1i z>=QUqTOMw6AGt`<=-Q{1E(`1V!N>H4c{!r9$6aoP*N z+S%DzSXe+rZPoCRk%Xm1UEU2VQ91W)ZAnQ9cJXZyMBVE3TlJsckJIHr%o;rZTtfRN zykL1T##*LC+k7hwMg~mO=*c`0PMp+g^3`62rLdPUPUTGzu=q7M>w-k3%9|YZEfbyB(j*UDp_nipoBj z^)UFW>vDQ{n1MEJRx?bmyfY2Q$$w*@GSy$^1t~?|d8W6hkizrSZ%$Tshh#RsCL9uC z_NF`9q5iNd<%zCMiA_mrg>OE8Rpv#N&5zKBTsfLxgPx=o(r)~46t??8pTRp<=akFN z4m`ehG_q&*aNd(vE8hz_yem*>AbNxKHf`RVD6YZ_c~QOY1f25rM=&!B8WkxTz8SoG z+C#mSLDTSCUS3bH#vo>M_6VGm$U6n8Jpo-ha%cRW=@E1D)@{C3^CK~8$MjPVo-H8H zR@$IL$8VoB&n|^IQt^qiFL5)|-+#7$zkG2?i5x878oBUuZ(rTR@t2TU5}b}O%PhAq z>(bPJ{?IH{*}74z&R%jfQ?+jw@tFkP8_4Gcix;}GHcM{P@G%wMNKbcSt+{)ZjS}AY z`kRwl&mN)(Xa>5ZKbxy*gRMnM&5Sjf&{+F0FE0;P<=FEat6Ufv+-`wDEpXZ-9(eFZDP%X`m8o=jfQmdxNAoT76*cdW~z_G-mTkS~clu0b37x zpNDv_7A!O+Y|i~sZGpv7NgwsdN)LvBOiD<&zD3sHj0shnKRkXa}l0llXp zuge_Xhh&3ukhlt+$V-r}QunzUD_=PTCAu?)Jxwhf*;p?VV44}A{rbY^^3F|(drm$y z<-Wco5esS4X|Bi$*S?T%S}z;oI5qIxy)B~}f-~wns2}i*+o14OV>!QETHQT6H92Zi zB$D)N+?BOBJESFl?E2O+$p4U~9egSjf}DBBtwJcdi?@vv5)<)4HdWGZBwFdQ7q!4F z^`Lu3sGHgL?_f^853U_TDJUpFt;JZL*U0bi^-_+Ln602^r20}SV4>Ue#NnYhq;@Ep zDeu{XK#XMg`m0~oWL~`2mFgpDQP=YzLB+=W&QEWWY6PzJv9eMayY!?a4d>@kUD8UK zRf`=a>$e>=ReSg!DZPGa7Lzh3*NXsnKnhXQ*U!XMThbvbLZ;I2?!A$e6!P>7X~%O< zzesZQZ^*MNnXM6vrVDE*PytTAxEB4j+Vk!snWM}z!qoj9w|GZ*kcMNoX%zU4zJUF& zweWHWpTiV4tG7LnCz*l0s_Mx(Q7sCudG`R(po=Y=*uwMpY`LhUk&9KF{Na&O?Cn5dcIpjCO zV^3@N4h#Cd3WxmaW#{!UcXGO3-rV6^BV2-{cxJjM-@w3Nt+Z+tJp(K6{Pf}%EP9)o zvT}b_C<}%y7e4nCwtZ2Db6EiVb$>EERD7$2Qy$+kj0;p zuw|@Aa8QuSeXHDH+PDBR?`$~@4+%AId0aPWx&u(nM2eTZ^Q*hRz;m#Y5d{8xcxl0D zsFF98o3zK_;Mx9C#y~k|c8Fixq#6^|rpw>We$m%@^7!!^=$YYa{+0FHmY(F!oGnM% zjz5;OC+r`4he9Q{$@_NGCIk{>+pvN&RGlhkF7`1}{`o{mT*FY~;SMhD?uCvO{=CIW zsFO~V@CwvgB+Qo{GvC4g3%z~mOgQjYAFvYa&&(`OUfJf`(9$xbLw~G3d$v5?_t>$C zak0M@9*-yD!^>y&v_|RJo;7RUJ)wt2yYTt;`e5PwY(#?nwYjsXT`DTV(K})U!!U6b z$c;wUNa-E$9VViy!^mPQ&%MuD@AMbgslq20t`;vWEYvh{b;2@A11IU9uR+gs;>BG# zR;j3@-NO_dR$nG)aj$Sq8o!ew?t1g*rNrH$^N`yl{c5k5d-p!VzcM)b`0S9i?XrQO zE#zrWz7uwqdnqgTNM|*NC%9i5ok@@+C%C{q}=@NR&H)5fs5OPA? zT->R8LU;F!U|zD4=m8zdB?VoUW7rn|_1YRpSZlGI$y5SC+)y7QPc(`bh(2!>(mPw< zhA&HEHsdWUEx(mSzINevI$JwCWc0=Lq}`$iBi9uQ{Eu*?ybevo9)l*wZ{)R)Qrh{2 z2HY?~Pffn{(DaOu<#Z#hWp^>htW zqGpyC%53SY4D#xH$Y1x}d67q!c;?kn2?+Cm>af0;&3p11^pRMrP!_)|$u&#G^CoX~JaVJmM zFVM3Hw!#*TtaQ9vyg-me5X33O=pAO!-D@;BLjbuRN-T>6oRs|y1U+%J65+fze~EDk zzxVvn_ABD>iAlIuv+pf&w~b2JqV_JOtfwVy+QK&%FXFS(cy$Y|komWT&#NWvwiC># zOO<;MhfjHAwPhU01rUnE_cLj7q085)7&8}?>+7%mm>c*96qv4_*pjLd zG53@|Q0_}$bCMzDL1`0)byKrDL-zk>oNJw*Iz|@d zRNnt$&2az`5nYO)*C~a&@qcW z_A{xp{o+mqlST=2d2pnI_f_$HYd=g`PoY?hxmO+9G!fRK1o2>?H$ zdAx|3w|%7^r>kdX1cHYxspU_`dj^^$UN$v36uZoK*^)J*VO)S4{u_S3Y>~z^=qCQpW%7K(QzEUFEV2G7S&qKjufTfdU*2pCt-v zd|;(w^O*VSUI2Xu@yMme_Kw7>pPf9oS(@3IXID1*?I!6>_#y$VUN?=@md>B83Jr+p z7<~}1Izv2nR3bbVJJ5cIHuW0f%GJdUR;@57^)Y5Q#=7py80iTA*T1hR?+u|9QtXRd z8b+36H+XmFu-A&&j@-{u5Bhp`jMZRBg8+iH$6@+^o@rO3r4RD6Dk>_>QfE60X}eg% zsZx?=tW=*t+p3YKXHmtfPWZ(kHJD?Fy;8AgkNUoSiK!HI!>CX3lmT!;2wFE(Ld_fi$v$Vt*P|{^D-_+Bbs+80aOtUpI z@GtBn{Q!1}r`a{!7PE2yCn(Hv6Km2v0h5UrrfrR_xG%X+y`)28w!MVfn1I>iz~d^( zsVS?fYEm3H%BsA+EW$zGVeM|xY;GZ?(W_%;(K83=|0mi|ve+3v>h)!ep>AHQ zk}#$V=|3Q)-WsXn7kbZzyra}s@?m;A*_5V+$lxjGFOakFbDQ_ORJ%ExFOke4T=?96)%v?`Qs*vU^{uSFNDz zzD#Exp_6r5yKOM(ByD!r$>>ICQ8p%E#5`(rqmV-cOg!|sDYJe&QuoFQE+_&Nl=qB5YtFycPwC_USZL)s0b z6_i6mL!%r2_)2PHf|U88A1rqL_~WmZJPwmU(&oLr-yN$CMO%Ly8ardli8ca(RO->G zXt8CV%dfgCPpd&BN&nHEQ#H6I5~QA>uvT)eC%S z6botD5zpcU;6Jn`jYzplC5kN1jt53%5u=_9UqL|rG4zh*{OFW@AWB<9uq9Tx)(XnL z)og2`fAijYOKcCc>QV`S>=X%q%*^P!zW(#~=tiW4A(i^lbS*-Go7 zRDy(_;3o^NfYs(zq&vBT>VihnUL%ZZV*+f**6>Se`GltxZ|1FoE4$ zrSA$&Yxgh^^JNb(-4JYWGVD~?!6@tCX^)JF&mEvZ7rRh0tL(jDwB!5yH95=m7e-n3{71p0@V`xuk_VFjHv-iEuc55WK}U~HMFhRGmRLGv7K3<%_Y zB_6%w*tK6R?Mu(xBx%n-mx^wL4s8pKqGWGonxTEzf?FQJFZX0B;c%Y*dUbVm-Lc`V zhw1u3vad3LV$>gp#w9et%{Pr4n|bYHmZgR2?{M?slafxx^=BALq8o z@TBB~Yi(Dl(n`wpY)w^*ikTOuq8n`p(u&HR53ABiV-s{m$*iOehiaSWZm=pc`x#BdEwm<)9 zv~i6HCzWuqoMvKaY!WZs#6#0Tdw4|l7<}SK+~+g+gj9gC>&oFT0T-~1oMY%Grc_{C{{k1Mt`KK$l_h&ROhO8a9LQNsqQHPG<%WRlB(<)E2Mz zxMPXP;fW_soY;u9r$z@(I;{(K zmAL%u*|X)P^j#e_3^B}VtW)y#et-8s{peubSJyqdIr}rU#RtiL~ zxT;GxT0<=C6Mq~VKWJ(hmKl`CZ)=ZJQs(b(F|$PDXVjt_)$r=OEt0v zD>+8W;w}?{4Uf62Z2FsW*0F+iwZ6wAj0(4Ey3Pu0xA5chF!x=SSp z+{~mBZr$1_VHaMGhAICugBU#Y+_Qu3v-q}sp1}{J>O)SfZtjRk$~LMg=@%wi+936T ze8OzjJ%miJ=5oJUvAI9GL;tvDo!{Th8#}5MG$}9>rU$ya9{ACT{W?FoF=AL<*Mb}V zv_9I{eDqj!V~<&?RDw{e)Yua5H(j_fVNHSPEV20P^kaPmb@e^3L92*oZ&7D*J>&i} zzTa=CE(6ZhH?@&A*dE|Ma&;a)di1FOrWaN2UNC3fs#W3AWqk1*P~wV6Y1f)8Pfht% z?DSBvredb?=5$Vsqm!^_>8KOE+8wRLIefPL*~L$aeUcTOESKM!9nXK+Y`prEK`vE6 zxmryVa%{-+AEFzVY1d3G7gENRkhIZ|OKmc??1`ubq_7xqOXokV3vClff}rNkhFlF_ zdq%exUBt;?Eh8|Le4#Z2eysW<=^e-MF-`PQc`iq`t*w=Gf7`BIX5Xe9Lc+UgyyEgpO6>cL5~NYQ?1|aZp&TMpbQ#f5n^o1geQ{^falkb%ie2%3i(RJVutF9JW%=-0$_>((wST1MyGn5CJ$_ul-K?w*_gF&_Dgzla z$EbOAy3xkOEX#;z_3?nNFr3*xPT-Fg;>J5^r_hH6os{C$f-~{!Q>l z0QXABtaq(7q`RDAqDS<*zdE`x1(l?vyjHR1CaLsH`pji%SJwki?44k!8ijtu;pR>R-FQpGO;K6ScOXM1voufx({ime zHps58VN(I^(eL%|l4`|o36#DV?HYw&Krsy~)kT--a#;~+JD1#bON&Hjp?_qg>r zXNarn`AWWECbD8|ONJ(V=|iFZm*V$M+5bzH4}8~ntoo30-d}0uT)wvo9HDEyrw9Ln z9)EW#xz~cOmCp>ul&4v^Nm8WS!Uy~0=c*l^oV$ngJpUdGy+?J(xIgK3ueiwUu0%E~ z!~Xq{z7M3VO=seN#Pcu4A=PW;#Xq`hJ~rr&o!Gl;pM9C9&2+p3qpR*~B;^QR1AX)j z&E)-bzZutpV=H^Kzl(#vncfxa_ujPe{a@`MEem>-&EI|t&Ve0n<*8@-ODDx5nwSr5 zAWkggfI>f8%^ihZ3o%hN4Wh~0nUXdU_y>AH?i~sj^sf(MR&z2y@!jL_7{uT?KR6fS zthWwP&Oy{2Rnp@cRfn;IS@T|dyYPGl2QeSWqw(BvP{3oq+xtujS&JX=7b}b5ZV&Ny zKsp9}a`%^T^tpr<7&DyH|6eg?+~`;NR`UOnE#o0Z*s8@0=S^mv)T4m{@WmHjWZPNJ zOYWR`8$fHXMG|wkVGzr|=LcZLK=uWy$3PzxLeX5L9+*(1nKfcO_cO4dAm#yi`AuJ^ zLCXWO1(qw#DfOcIfPRRG?fYC_0-Fc6j1I4Y3PrYIB)B2K24X*HAayz;sK>5G$nZUR zdSYyBajJXzEoj~R8PLB=>aTB0N=;4G%mpt9OhB?$h) z;m?wxla64e(%{2yH*ek`b7&5Z-}&j(5q+RiZ-V-3?&C8%o`l&hsbZb?-A}*$48-O{ zYx*{=GZEIhZeT9(shWRr?bRPJ>7kIN31{1}dyzzJ7=EpBFyMzN;*>zF(=)bVWjL z7`f1kF3`#@uaypF4p$4FZ`TR4#I;NAI0o*IP1&ar^&Kt(s-TLJ68-Uj5Ad643yb!- zH??3JIS8%>HOewkP}!1lfV|Z21#>8ZK-Jd={S%(rX;Ri&6TfM?2K)kD8HGTGp#2*Z zK+Sj6uYyI5S3(s8lImilYXIUyN1ot@0)C1GBTV9PLu&X=p=WFvhTn*LM{bKMZ2VZF z-(d+Z^qK{~vutGB5Jd|~HIBi3uCn0RfCjPda|%doAnQESA z;{GuwFy?^YNhfU4_OZ9!rPb@@N5HHhgh-Yj0cY2DdiZc2qSv>!Fy81t@5(-TlKjVuIJp|oXF*6-WXleW)50wo{}=5V_yMIy zS8^>Vso5iRbY1PJ9FnD@hQL0zd-rZ}sF25&ECMmoQu{a9SL43^AlGTLkA_wj0Urdv z%g(fal4~OaWF?R|D`qRF@$6g-B3KqyEf|N*XC|R@oMShY8|K@UJcNh<1^#+eR}&6G zJaA+ggnO&7Tq`7MrXt}ZtGwG{_bEn2ieo7e7)(8OE$mvy$Mk#8f0KF=v{pRwnBKl4tkq0lu{-Wov@&y6m4yucji^e*_!%KXP!O_W#cv9MS&= z9UQ^Kp8EQr_weX=@Q7I9STKg4!>8PK zKkI|T#})jOh=LD(v6{8Ik8{-QDG8I1bxd%n%iy3a_wL&$3C@IRaDySfsSu{_nOArF zopf*lcDdu046?gwE!JQP%CV^v-dOd-cv!TgqR+rFx zd)M;kM_?rD`pnAP%)Y{Z95`w`w+RzG)4O**p&N#XP>49c6OEwagI-j-=&XFV?v4 z!RX~De_0UBQuZ6+eh`9j4yq>giQg!EUlu9?SP3J*1=XZb1qFFyJA}VWB6p2(e&bK!SvUtpo?8qIudA zSUeCYLCy3E8T2z0v}sf+AMhW02_{V;l=FTNm?61?RgVdDSCs9e-<}G%teC4;VO6Tm z&yPSVoP+e0S8B_UL6*Bq27sh4Vh5C=0Xl5IZ&(Pp7>F>$0E@^D?_3)bi`i5Rf%mu&E(Q$0@TTE*BV1}X z)EgFy)fvefi$}RN-?4y8LfX}|yS_}I$zk3VX=ImE$Ou=0OJV^msDwvqf$NSW@w@Ur zcuk|Dz%&FC(B_Ufp}xTmG=&6B17(JWM*+SbQuZ*EuqIXVZg~XTbZJ>@p?>-0m#`u% zXBNz>y`u%inaxRB&|B2}?^zavGWFmVr>Hx5aDS%Dw*i#8h2e7?_I( zNtc_E_R`Jfbx!~UFGZ^@~%buXcJddGMcr`r%C}_St!h9 zxfi?PtI%F$4H7G!ShY9 zd)GMacNyq8d-*cPQilGVuqgA>Tvdh=8%WamTXlp78_-1~OSkBOUYT% z_$RM#pG09Q7g>-CV3^fljZidOptnUZ82=fz!bNKy%1;Byw?K2o!P05;yjX>ve_IOAGfRWfPStf{xppF!%}( z054wTg8u%a-ub1O8sEO+!+VeXWhwC4v?D~jH05TN8MXx6w{=&+q9Jk-3ms<9G|MI* zWV8^8>oK@8=Z29w0Jn$&Gu@rb=}GkkZE0M{p&Qtho@sYB1b^{450A-64?LT6KJ10YcPqU09o2!+ltMGazSsXe}=&TMm@5JFvIz?+tMgR+f!tQJY#@ z+kC-W7USSkT`jl(%K|E&b=Yj|2GL9j>VDqtEW8lxMFqU6ZdGcmYSI1oQ;4{fynBCS z>*({r*41A&E#KJx*b7+s?1=Pz9^hzTXa&9<+#JT9D)Z@FiWzST4h%C(%2EyUD_Vpprl-RrniQe14VH=1XI7EO0i z(T9bL>hLQhusy{zr^BSnCmo3!=eB;~U#k6#^!a_JN%ebSVy5i9IQADw_CYG6 zglUhzGIz@R9=`jh#4z#l7xTCvibL^(42jp+qQ#OLTO>>TCVi-)&Ew4nRt%$qP#PaD zw34)`?h9c!B&DBP|3BcWeBuHiaFvu%I&4c~F<2P&$Eh`BMfKGL-RDx2*dFQxP14f1^)QR`3`bu7DCAZD8IK8v_OFEna+YO?P(P%Vr->GMR=#N7y`l}_p;<7OT+GHhV#GY9;x(?nGv8b3X zAa6|Ivgk_6fZ>fS;Z==Wr2XInvIw0is^6FZt|k3(>6&E&kcQ(!ySsT^K52`gnI@Q8 z$VB#w*QUYu)MXI)BqcBW)TuY-VH>BW8uA*d;H{Js4BC^F@QX0FA9(AJ5|8icF5s<) z!6#!C-3afuB#>kRn)h~R9Drt1-*u`hyFm${zr~hA=YAt1tdpWLlrEGd8eW;v9|zB? zsU;d*bo%495_+bVx?%y#J`crvc_7&aQXO$0j7mQfFc;Yy*TH|%?UJ_0-vVvlo}NdF zxY-VX25J^tGy~6+al*lYyHgo_ou-!l{{Eo%w;npJr1KTDyUyv_$za^a6ZZjO;YlC? z%HtYJd?+GCn0!CC&hE~VS5?*d0kP3Y5d3(k4a$?Eupa}BFRh1l_i45#) z_R<{%lSE6cPOxd~y8=NI-3V-n4TA@aLQg|g2evnpb}DR5=^{USh&LESbt?OgzR;vr z81KG&2ZQ!U%HlH;h;qYAk}FX+>|G}jNAh*_;0#{%pFV5Sd`hInA>{+59^NuL1hfG!kOcY zM&vyyuuSy0)Om8=87I11a{*vlIEi)tbNBq+NHlM@=U9>L3E^k5RJUMUn4tl!FMExI z)Zk329#1V!4TAU4+O$D>slnQ{A9(F&P4A_qcQ4$n+?l;z-TYX(yZcONz;LCj3Gswp z7R3-r9V;dE58U+%L(lh1&ssyaY-w4nn6o*2Gek>}LyF6a6yyQ+D|(DOYeSqK!R_8qoZ~Yuj}+Eh>OO5e5OHof8B! zqJlD*qYLW}Nhz6|T7JED?X=4nlQTv3N0;$;PfbagYCz+pub`$@*k1zR_y%d6tY#OB zRo$%eNwRTpFL##jjZ3mf$=mOFBc7BNEYgEyG$=Yw>?n+&>1V!Xa5g4%bd1#%Q>Ycd zanAU_`!{JMc!feWXZqykvMCAPdZ|K0#eVWn> z9hP~D4I_il>rp-W$%3#bf=+e{DFjXUk#}v%7>B_*45IIeN*tEBFg7#_a&-N0h76sK z+nCTGB~r0y@J%F;Zr{HBJfkN_-YHD_l2hN&dygLdM8UaVUG(MGz^tCO33>`^e*!P& z(+q=fPddbURf?Vq5z7{aP7R*^`G8RL$A_`Z{P+!iTE1h82{k~V`o2f>i)IbUb+*I}!l{9R3x1bVvSK@$8yvTWS zwu;rNKR%J_3vL5LvLdb#yjdcwG2@-3z-!SY*ke)^d(gAEwQRZ)9Z%Z=FAmtocy-T~ zw}0{ghVHVQ+^qL)9e5OmBX-cAft`x20;N<=EEMXy(uAoB%7iwDJEU;-tqti z6hGF7I3zmtGao#7esnV}pNeeRERvH(5ty#Ff$1%rPZ>UNQ`bLCtz?nr>e<1}3$9V< z?uPn6EwGH|_W`)@#p73Q?vL)!cdo!PT`u4Y&4`l`N<(&b>y2%6&U+CT2%KvuOI^&I zA4r)`EQrNHofG=5;tly=$Q$J4>W}}P8<9%#9;n=7(a>zVcDb=}$_4kL8B6Iu{a1V! zyxUOU1hrQ?gO>_wA2hq3afmM_c&wjoNE*_C?LaeNi1fnYr7onj51aEC4;2xkL4&U< z*?+8ZO5Vn%rc8L88p=$jHsH)1N+11|cmCeZ;n~fdHOvi|8q?iZa_bk{_Nky~V`faN zv1Pxk-><}dB8?rOQ@e4Iv|+R`#V&?b!4w)(_C=tr+KVYv4zVP=2&gbR)N13Ht`R%v|t5Tu+VX#3#%Y+aUHv1mOL9 z%^KX3{;=75bKj=IXbC236qR$6aLEu_Z$|VL3PT~FN?ovfj+C!PHj{7SZZpfTI}3)V z1)X4-y05rXxgufk-aFI5&%HwAmMh2g!M^q(#lH>b&>9~rk=qY=6`_b7^UE-y;wrXi z?B`Ssg|)fHx2RW3DgKk!C-!x$Z8-7b@!9CcuJ$-^9*Eyufw;HkD=^O;_48j}(y4oS zU-cZ^>=S@tuLDvG6pt2M_ZXs?3z7)n&nfK(*}aMyCzY_;%wH;@_*O@H>4`0N4R+r4 znA@bWgH0$)^Q~!VRFe?BTcol5XKs;hC%%0LxIYNgAKe)5m-4y9eU=kDpV<+2W{~s? zv3R0$Ji75>gYQn|J@&9v2C!QStZi;l8(X~6NV~(%hWVqLY#yX1%=AD#kU6ZfqxL@H zT>F$85m`=MM0dwv^I&4}*!AS-#`=NBN`|}k47J#(@5n#xWF72(d0NB!brB+yeNrqe zTUXC*)gV2N8O$K%?Ou8!!ofFJ;?@tH!HOAJHIECS#B42%QsJLc4ZV`}$u0oo>VLj> z+^&QH@8|M^1pSI@PJgE>e;C8xo~jz$#WkNM4^j8H-?sb5h3ZCixsb;|_=g+9D_HAR zn2s)d Optional[int]: + """The pixel size a .bdf font declares, or None if it does not.""" + try: + with open(path, "r", encoding="latin-1") as handle: + for line in handle: + if line.startswith("PIXEL_SIZE"): + return int(line.split()[1]) + if line.startswith("CHARS"): + break # past the header; no point reading the glyphs + except (OSError, ValueError, IndexError): + return None + return None + def _dims(self) -> Tuple[int, int]: """Panel (width, height); prefers .width/.height, falls back to .matrix.""" width = getattr(self.display_manager, 'width', None) diff --git a/plugins/jellyfin-now-playing/manifest.json b/plugins/jellyfin-now-playing/manifest.json index e60acd29..d7cc0328 100644 --- a/plugins/jellyfin-now-playing/manifest.json +++ b/plugins/jellyfin-now-playing/manifest.json @@ -1,7 +1,7 @@ { "id": "jellyfin-now-playing", "name": "Jellyfin Now Playing", - "version": "1.1.0", + "version": "1.2.0", "author": "ChuckBuilds", "description": "Shows what's playing on your Jellyfin server: poster art, title, and playback progress", "category": "media", @@ -26,10 +26,16 @@ "pillow" ], "versions": [ + { + "released": "2026-09-02", + "version": "1.2.0", + "notes": "Bitmap fonts and documentation. A .bdf face exists at exactly one pixel size, so picking 5x7.bdf or 4x6.bdf at any other size raised inside FreeType and fell back to PIL's default -- a much smaller font -- with only a log warning; twelve of the thirteen offered sizes were affected for each. They now load at their own size instead. cozette.bdf is dropped from both font menus: the core ships no such file, so it could never load at any size (#387). The README gains real rendered screenshots, documents progress_bar_match_text and all eight customization settings that were previously summarised in one line, and states which fonts work at which sizes.", + "ledmatrix_min": "2.0.0" + }, { "released": "2026-07-29", "version": "1.1.0", - "notes": "Progress bar now matches the widest of the title and subtitle instead of spanning the whole text area, so a short episode name no longer leaves a bar stretched across a wide panel — and the blank remainder can be reclaimed in Vegas scroll mode. Disable with progress_bar_match_text.", + "notes": "Progress bar now matches the widest of the title and subtitle instead of spanning the whole text area, so a short episode name no longer leaves a bar stretched across a wide panel \u2014 and the blank remainder can be reclaimed in Vegas scroll mode. Disable with progress_bar_match_text.", "ledmatrix_min": "2.0.0" }, { @@ -39,7 +45,7 @@ "notes": "Initial release: polls the Jellyfin /Sessions API and shows the active session's poster (series poster for TV episodes), scrolling title and subtitle, a paused indicator, and a progress bar that moves smoothly between polls. Includes username and content-type filters, a Nothing Playing screen, and on-panel setup/error messages on all four panel sizes." } ], - "last_updated": "2026-07-20", + "last_updated": "2026-09-02", "stars": 0, "downloads": 0, "verified": true, diff --git a/scripts/docs_render_support/_docs_http_replay.py b/scripts/docs_render_support/_docs_http_replay.py index 9082ba5f..688c08b3 100644 --- a/scripts/docs_render_support/_docs_http_replay.py +++ b/scripts/docs_render_support/_docs_http_replay.py @@ -9,9 +9,14 @@ repeatable:: {"matches": [ - {"url_contains": "baseball/mlb/scoreboard", "body": { ...ESPN JSON... }} + {"url_contains": "baseball/mlb/scoreboard", "body": { ...ESPN JSON... }}, + {"url_contains": "/Images/Primary", "body_file": "poster.png", + "content_type": "image/png"} ]} +``body`` is served as JSON; ``body_file`` names a file beside the replay file +and is served as raw bytes, for poster art, album covers and icons. + Only matching URLs are intercepted. Everything else -- logo downloads in particular -- goes to the real network untouched. """ @@ -23,21 +28,30 @@ class _ReplayResponse: """The slice of requests.Response that plugin fetch paths actually use.""" - def __init__(self, payload): + def __init__(self, payload, raw=None, content_type="application/json"): self._payload = payload + self._raw = raw self.status_code = 200 - self.headers = {"content-type": "application/json"} + self.headers = {"content-type": content_type} self.encoding = "utf-8" def json(self, **_kwargs): + if self._raw is not None: + raise ValueError("replayed body is binary, not JSON") return self._payload @property def text(self): + if self._raw is not None: + return self._raw.decode("utf-8", "replace") return json.dumps(self._payload) @property def content(self): + # Poster art, album covers and icons arrive as bytes, so a replayed + # response has to be able to carry a file rather than only JSON. + if self._raw is not None: + return self._raw return self.text.encode("utf-8") def raise_for_status(self): @@ -64,27 +78,37 @@ def install(): matches = json.load(handle).get("matches", []) if not matches: return + base = os.path.dirname(os.path.abspath(path)) + + _MISS = object() def _match(url): for entry in matches: - if entry.get("url_contains", "") in url: - return entry.get("body") - return None + if entry.get("url_contains", "") not in url: + continue + body_file = entry.get("body_file") + if body_file: + with open(os.path.join(base, body_file), "rb") as handle: + return _ReplayResponse( + None, raw=handle.read(), + content_type=entry.get("content_type", "application/octet-stream")) + return _ReplayResponse(entry.get("body")) + return _MISS real_session_get = requests.Session.get real_get = requests.get def session_get(self, url, *args, **kwargs): - body = _match(str(url)) - if body is None: + response = _match(str(url)) + if response is _MISS: return real_session_get(self, url, *args, **kwargs) - return _ReplayResponse(body) + return response def plain_get(url, *args, **kwargs): - body = _match(str(url)) - if body is None: + response = _match(str(url)) + if response is _MISS: return real_get(url, *args, **kwargs) - return _ReplayResponse(body) + return response requests.Session.get = session_get requests.get = plain_get