From cbf4c3c273426ee1a21fe14beb72ab7f6e7db30f Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 22 Jun 2025 12:43:13 +0200 Subject: [PATCH 1/4] shrink label --- layouter.py | 124 ++++++++++++++++++++++++++++++++++++++-------------- output.png | Bin 5599 -> 5129 bytes 2 files changed, 91 insertions(+), 33 deletions(-) diff --git a/layouter.py b/layouter.py index 58dbde9..deebd6e 100644 --- a/layouter.py +++ b/layouter.py @@ -21,10 +21,9 @@ FONT_PATH = "/usr/share/fonts" DEFAULT_FONT_REGULAR = "DejaVuSans.ttf" DEFAULT_FONT_BOLD = "DejaVuSans-Bold.ttf" OUTPUT_WIDTH = 696 # px -OUTPUT_HEIGHT = 300 # px -TEXT_X_OFFSET = 300 # px -QR_CODE_SIZE = 289 # px - +OUTPUT_HEIGHT = 212 # px +TEXT_X_OFFSET = 212 # px +QR_CODE_SIZE = 200 # px # Configure logging logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" @@ -122,7 +121,7 @@ def format_to_printable(drive): cut_string(20, re.sub(r"[^a-zA-Z0-9. ]", "", drive.modelfamily), "end"), cut_string(20, re.sub(r"[^a-zA-Z0-9. ]", "", drive.modelname), "end"), cut_string(20, human_readable_capacity(drive.capacity), "end"), - cut_string(16, re.sub(r"[^a-zA-Z0-9.-_]", "", drive.serialnumber), "start"), + cut_string(20, re.sub(r"[^a-zA-Z0-9.-_]", "", drive.serialnumber), "start"), cut_string(30, human_readable_power_on_hours(drive.power_on_hours), "end"), cut_string(10, str(drive.power_cycle), "end"), cut_string(10, str(drive.smart_error_count), "end"), @@ -138,40 +137,98 @@ def format_to_printable(drive): def draw_text(drawable, printable_data, font_regular, font_bold, font_bold_bigger): - """Draws the formatted text onto the image.""" - text_y_offset = 10 - value_column_x_offset = 120 - font_size = 20 + """Draws formatted text with Cycles and Errors on one row.""" + line_height = 26 + label_x = TEXT_X_OFFSET + value_offset = 115 + right_field_spacing = 200 # Horizontal gap between Cycles and Errors + x_capacity = 480 + y_capacity = 161 + y_start = 10 + + # Serial Number + drawable.text((label_x, y_start), "Serial:", fill=0, font=font_bold) drawable.text( - (TEXT_X_OFFSET, text_y_offset), printable_data.serialnumber, (0), font=font_bold + (label_x + value_offset, y_start), + printable_data.serialnumber, + fill=0, + font=font_bold, ) - text_y_offset += 25 - fields = [ - ("Family:", printable_data.modelfamily, font_regular), - ("Model:", printable_data.modelname, font_regular), - ("Hours:", printable_data.power_on_hours, font_regular), - ("Cycles:", printable_data.power_cycle, font_regular), - ("Errors:", printable_data.smart_error_count, font_regular), - ("Shred on:", printable_data.shred_timestamp, font_regular), - ("Duration:", printable_data.shred_duration, font_regular), - ] + y1 = y_start + line_height + y2 = y1 + line_height + y3 = y2 + line_height + y4 = y3 + line_height + y5 = y4 + line_height + y6 = y5 + line_height - for label, value, font in fields: - drawable.text((TEXT_X_OFFSET, text_y_offset), label, fill=0, font=font_bold) - drawable.text( - (TEXT_X_OFFSET + value_column_x_offset, text_y_offset), - value, - fill=0, - font=font, - ) - text_y_offset += 25 + # Left-Aligned Fields (One per row) + drawable.text((label_x, y1), "Family:", fill=0, font=font_bold) + drawable.text( + (label_x + value_offset, y1), + printable_data.modelfamily, + fill=0, + font=font_regular, + ) + + drawable.text((label_x, y2), "Model:", fill=0, font=font_bold) + drawable.text( + (label_x + value_offset, y2), + printable_data.modelname, + fill=0, + font=font_regular, + ) + + drawable.text((label_x, y3), "Hours:", fill=0, font=font_bold) + drawable.text( + (label_x + value_offset, y3), + printable_data.power_on_hours, + fill=0, + font=font_regular, + ) + + # Cycles and Errors on the same line + drawable.text((label_x, y4), "Cycles:", fill=0, font=font_bold) + drawable.text( + (label_x + value_offset, y4), + printable_data.power_cycle, + fill=0, + font=font_regular, + ) drawable.text( - (TEXT_X_OFFSET, text_y_offset), + (label_x + right_field_spacing, y4), "Errors:", fill=0, font=font_bold + ) + drawable.text( + (label_x + right_field_spacing + value_offset, y4), + printable_data.smart_error_count, + fill=0, + font=font_regular, + ) + + # Continue remaining fields + drawable.text((label_x, y5), "Shred on:", fill=0, font=font_bold) + drawable.text( + (label_x + value_offset, y5), + printable_data.shred_timestamp, + fill=0, + font=font_regular, + ) + + drawable.text((label_x, y6), "Duration:", fill=0, font=font_bold) + drawable.text( + (label_x + value_offset, y6), + printable_data.shred_duration, + fill=0, + font=font_regular, + ) + + # Capacity at the bottom + drawable.text( + (x_capacity, y_capacity), printable_data.capacity, - (0), + fill=0, font=font_bold_bigger, ) @@ -243,7 +300,7 @@ def generate_image(drive, rehdd_info, output_file): font_regular = ImageFont.truetype(find_font_path(DEFAULT_FONT_REGULAR), 20) font_bold = ImageFont.truetype(find_font_path(DEFAULT_FONT_BOLD), 20) - font_bold_bigger = ImageFont.truetype(find_font_path(DEFAULT_FONT_BOLD), 60) + font_bold_bigger = ImageFont.truetype(find_font_path(DEFAULT_FONT_BOLD), 45) draw_outline(draw, 1, 4, OUTPUT_WIDTH, OUTPUT_HEIGHT) draw_text(draw, printable_data, font_regular, font_bold, font_bold_bigger) @@ -264,7 +321,7 @@ def main(): drive_state="shredded", modelfamily='Toshiba 2.5" HDD MK..65GSSX', modelname="TOSHIBA MK3265GSDX", - capacity=343597383680, + capacity=343597383600, serialnumber="YG6742U56UDRL123456789ABCDEFGJKL", power_on_hours=7074, power_cycle=4792, @@ -275,5 +332,6 @@ def main(): generate_image(temp_drive, rehdd_info, "output.png") + if __name__ == "__main__": main() diff --git a/output.png b/output.png index 59eb1bcba7d7bcac418aa256507df2c881470032..77808a0080a7ef7dfbac07cb5840118567be8109 100644 GIT binary patch literal 5129 zcmV+k6!z?zGT&_gXY-1qjW#`^G_dox+bMHOpo_k0HYa#lYpn|5Z5%5~!D!RKCutT4;e)tRS zUvU3#a04Ymal^jtYNvesOs7F1&M*bV00k&O&zyE4qsVxt(JA867%_@Qr~mheS7`J?0Ax!+ISt95j59o34F_Rdym<2Nq> zbxG5HK-RstE%cO=1vl2Nx%%m(z!OVxmzDciyg)nP9m2TPe-L0aPBRdi7KO!aRmh6F zpL*!Ia~yf`2geFW8rM7Dl3jEHN?;6bFPIp!+Hoof!U7vYzz0UF;4Uk+KON$_^J^Hw z2$d@)z7G*F0W26=3GR?*E4JP~ucntkPGde}0rGx;z${p$7g;E!@h~ws6E#Ka<%SXc z`KxyZ{-J*dB0*vE=)6t!tRGgUO4O9Knc&CuWbQ%^4807U~{E5TKaZ3%9pqj z!eue9re^>^fQtz}IOQ8Hi`zyZea8>vZGGST(`VlH3!nMB-)&a3@YnCRiYKKA-Mv+fv5W=b`?>)N4?Cb!j-U~xHy|Vh5*$8Lo8~nf?{s3KQ)}% z(sAU;)?>lM*M!1>7)trKHVtx1P00|#O;GO%r~M%B8!=* zS|sjZpNWpfMO{2j3czk7;w)~wJg(;B0qvA#MmrGe?8JpM9`yI)lEH;^^I%uk5?oE9 zJFkBI$hzAn|Kt3`7k>HQpVp0}DVKlVQdu&}J|=rHVO7BmvJrbAaDw$yN=)UoJGbsU zY>&LAtOQpPRd7EB*}Sw$MT_oJ#MS4KhE>mi?&V|8M72kp{OTUHR`wWOrX6-`MPGKI zoo~w(b7(PfK9-iNk-<-zUxMySsrS2&560XU3Vn98In0oxEw^U<5GVk0lLdfOOqgI7 zP&84Qn9f?AV%f$j43B+oME~Aim}&c}^YC}BPE6a#zP-yo&~r<_c?Oo%sj=>mo?lR= z>HusYc7hf_Z%??jaGM(bGj{Huf1&oC4c0wAn18V8o%K)N{kOdpJm<@c+r-V%Z`%ob zS=^fAp=bztjxR!_~s^_h4X1`uBG4+ILTDCVSLs`$1tZ z;CbN(&aBTdGm-Wk4!AaD|Hi<)DZbg*N#(mPbe4*W)1vLAU3Zuuq-fN7)7t$IM~yJ+ zLd?`D5sNNEVDoHEPyk)FWYXR8l~l}^PQmk&c4Du*oXSY)r#)@3dt*cM6H-bkr>3T~ z@m#a-CS_9ka(pT`)jxi7>%-#D@+Kwr=5^Vk5)6<0lnui=|1|TXjYPh-e^?tn`HnDv zf(@YB73G}(ABn&!72R2PryB0{Wvt@emM4)fD#a!4>3rO4&FOtV6Tt<+KJ`_5VCb$F zb~>p}7fQ2hR-)4a=s*;a0l)y(&GFR*l(t&{(mVw86p-w)fV;t@x`(6zqfoMQp;Qk(MIMiX7YK~sPd1xV4hETvlhj?GD$+relCsKbH8 zAhhA(ksxgYbt!upzSk9LTwkXOZZMO~3geq!{_Hb$z=R#;&cHi#H@&keGdBTyL*vZ6 zIo#;j0o=s2JX*YbzHL{hecNq3u`y=Ns>JM@!(9_m(OzhpY_kTM6%lJX!&LI|bswI6 zIeW}rE$-Tg3dJXn?mPa6*EShvcONL88|fdWaZGlnR*kzRvW9+CV?!#YIhypdPEO{$ z9q(tdFK-t)=_k9S43pB8Qc4+;)O*P-|?Yj=GOBYNPZFo#CeCefA%Co!fD2VOrPc<2hY zLfK@>Em!otIlO{5Znrq^iKVzV&iDC)aUdd7)aAqb;)Z1iqLH|%i2X~HRRS-Q6}kA1 zqR}cgj_8-H;@G*D(#Q4!6s#U1mEesx-+cH25akWMyS)nT@^Tf|c}~uT(NrY_@IwzM z;(>_~#{+BWlBYs+EY-6??*+uz6huSG%JRNwFPM8C$nSv2KkmG zQ$Y{QdwgjC5y6b0>}uJ+se-Fnos-lN#KcbXHD~*0#~KfXW7$3n)|Yk4<1AjDRbB|F zHbp3ZF=KJ`p*G(r%`aSuoURnL=h|H$)I2nyyys8ym_Pj~99s%gEN-h3ypc@p)|@); z<+sIwkz8QBzh7%kkM{y>GN#otv${RSt-zrY#<$l8#^^3H_NkHHGs*i_#1{d zp=t3rpiFB3_eP=ZP$E)in!LHtkpn>YTL^c%y9cF+w#n|PzUKO=w=}(PRol%^-o9G} zyFoejtABY&@r!9Saltuz?y$9gi?e#%wGrJ{9NJQCb(`Uduq|D5>$}1yq+D#V{*1oc zX_vYm^M|8vHMHK<`=b7Pp*0yV^{yUwO+@z_wexMw(Ueoym`OWR()XTDUzXk{Z(amx zbAC~=jI2>C*^n%8dP~cuL3ZI;#4N7z@{UHH?p3;a29EY$9EpAO!kLp&ELD}>?2g&a z%#`Ef(!=gp8Q(<`wtSH8ExTPUZ?=~g`S1f?vF)YW5wxB&r(ZpOG_~zr_3!W4^MyaU zckYhf-&#c#!2L7;t#r)=p0`v}tj+ge@u|^G@$!LT5QR7fLsJ%jI747<4Wa-8`6{@L z^#>A|h zHWfqOcaTu+QTZX$2@|jd-oQ%umJfZb(m6u_(kfH)JL~4&V)M%VGl2N;+_khyzY6a3 zY~>Gau2sX`{<8J8otZ~s4c^#$w>8V`WpOTx?xh1P#?e$EVI5a@<{>rP}Uiuw^f^{p55?H9W zPkbYN_tK^+H17ZDgmLY|WF+=(YdpoYd1O*ECIIMEQ^d>RooOXr+7b)`N*%OPmqLkS z36`GD)Qaz9f!u6(GJy-47Nr?78AxGcgG++2N+;{GscU0f>OeXv(lQkr>`Ny!#g{@~ ziFqijk-hlklA4bPcWG}%K>FL$-@fI=y2E#OWWT?DxG>)Nz#ShIhpRMSRvMSotYIEV zE;9Kw>xcH0t8e@$pZIdi#hE(gNw?ivE$$kL?uSWTxJg@1wd^m9=cJu<-$D^L>5zQ9 z_D3sSM8UeZoVM^9+6%kEm9>vaN^SULpz)PjgW<)CX;mgJT|?e8YU{E`oD z|I&>x)ep5)g7D-wcBkrlJst>@Jsa*!o!|RG=O?)#NjxAP7)sXO`e!CM3A z$9n-fFWY|GWe0!>@a&SsIK$qC!}e#FB!4WxttIY|=^ZV*%?8wqiZ>#Xw>swh6p<>p z_Sm)@iPV;WxceQp*CiVgm6)*zD0kD}c>`7qO5t^uxHG2c|*faqc0DZyd zP>MAg)y%t6Z9tY!UC#`F{cj8Ii<-FiHsoL0`43!r=7HCzx;62o@ey0wNG}l>1Bl5I zVe%Ng^V>Go7-u#3s*a%9i63xE#jp)GV^(e|S8AuAsA%UqTR64j$ol%bwcN4S?!?sY zuFs0SC?g7+tjM7eqoQ0evjAj)XDs3ZfV0-h_##ByFjdv8kQ^}Vxto?yYUZHm(r!qP zPldXt$(OfF4y2O)TMcqNC#977+SrSmI>{=D3hiTd@xl`yUa7lR+wl0{U+LMdr_W~l zEN=27YZkYLm}`T3Qzuzv(WSTFMem<-^l<<7aq4qXP4;i(ra##Ye79AI3b}~h=e9nS zU@($9mfjOMfs&m}*sI1}8_{JnsrT?sBpyUpXT^#|GcY z3(vL146g9KX$N=4T^a78eC7QIK1ez(T>D9m*ohWf5g*yw#VMP3(W#F6cJpZ4ab-|G z^FX~~p3~iRA2$AI@+nIB%5!oMN)C`A;$|yRAYw#J9MxDEUlfK1cNwE_u=wO?DZT^K z2~obCZv&^2Wx5nMxH@#{+rj5|DSo!A^TO`mX3gGWcJr$i*ffX!^d&)tSIX)`%v+44 zaN}5ZRhOw2-yt4VPS_eUA-0v{Mj=puiE@DBi-EaVr#&>iw|1 z!~td2^Zzycsg%kRJ7xWGPAev=wXHQT<`+g8)@CMwx(V>b7?2vM!AV8q_3iOMoUJ$P zfqd-Cign3t64`xu0uRvrW}#lRfL<7r0q___O1pC3OW0cRu(LA07y{z)0A)e|BL{CU znsL_s&8Q{g1uJ;+mUPFh#a@fx!Rok~v)jF^cYPS&zpH=So>b=47NzC>v`i7vfJkJE zC?}vPag-<#vrSYU8>vf}P-j%Zt(~u|Z^omY0~`g3zyZw$-6Mk!U0v8zJ2eG#Nrtxc zxbJCaMQ+@WrW2X7FBg{0Ec<`97wCShi``S69y=OslikwO#$}VFE&b=ocdc+EP%MU9 ze)HJ$|3n*48ok*^*B8avj>1RVR)@Qm`8yFMd&F74E|M;e3~Rp|Pb)2lzS`%m8h1@Z zg>^E2;+}s!t{nEp6cNN88r9yG2M2Dbb*C}ERG3GymS0l7S2h_30|ROGFk&67XcWa{ zDcVz10eYnwD3#oMT`HHe-F`I1(@l=-){4JKWTKh0OiQ1Plu~*Jl2S@3@nX_%iAg6- zW%RosrH7QRBBcx==2LRWYtD;idwywu*F_ZCh@Ea0bG7p>%ex%!di{Xv08k1Oa4=%v zD}sf7kc~|(2VB{LI&me+S+TpNsP!H>7}t^fS!`!6x@%c2c@w5dUV<5Ks)*oXgB za@LlzaB!()@sw)9>+)5A(-LGz$pxJ7V7l1(rl@Ev*m^tKJd3EpnXhd3jz6|5_H1lu zW9#uh_)QV-e*G@1bidK-YY(^aD1>6V6gjg0y3#m?UE*p3*matX=F98y1!x8Q2ZaD1 zClQA_-N{sL#xYBnr58w%ngvuLY|s^5{Hka)4&2fA$ZyY%cU&{m`+8^F0?aH38m37~KqNUA_xlrs% zK{OR=X+bh~Bj#L?annfWfFfn6NTJ=(dUhjXyDV~~rsr7aW9i9@iMsRkdcQ2%ir?LT zek65cxQ=5j3MgKG-MPMG0KvlJ!g=e%WFpeN)0zIxR|E`2)cfz?N*6vAQj?)Dh(9a50%-hLR#eZ*omeI{pTI;9JBWQ?8?4tT^lEE z;vr(*^&0xWXdBy!`Qt~^lH_1tI-$j6q3_20Uq=@Z19T}x+Shzdip;9#g}bom0JFWJ z-w>~5*h-O{<7;ca=4&AtDdphma3LurQie*Yr1^kcbw99RB{SyNuNK#uyDVGS*>!zY zBIYh5C7Yyv9Jt!T>qaU&*j3>+u;35I9nGe4roMvw^`)Xo09lECB>i#?pTNHlSQ}Zp r|2rer1h#Ii_$n* z&u<%Pn%_S!i>u-QZWep82laqbvExRvhXf-p_CN)+tGasu&mo8T3ufFqxew`Hq~(cQ z_0nyOwLvT@IpvTUdveMpz~RT5E<(=?zAIZkASFK+0&xzOPB+fMs#2PGMpx*lPC@3Kd{b#q1t<;A4wdF010o;< zDV@n3Q-ubEAyiPqj9KMXaP$8WV7CI$;SPX*CfAlkRB5}pjoZFRGGcgNjD!x%j~M=amDLziVYy z)VsA!xH-G=t9SeJjT&t;yCHs^W@Th+>mCpyqrB1cyvh9S`&j=4*0o*80VQA-RC2bz zW2zo4Ia*X?vI>J9&FxpgE&L`1c1sPt?sqhW5?t$-Uc}ukJJ@e5RC+3Dm|X%(&tKp2 zlsT}RnkxOURO5#4D-BFp;GXWqc;#!Y0ST)h;C+Mu=~fLldXc{`q42DeLw{>4#Q)&K zJmEi%3-zn-(6pA?+dueQ=ZZPK>3%0Y_0+liy>!;eb8w?G&pOhUq)re9u67fZ#3Dwe zK^UY^Rnl6MG?0n4_WwQ}Pt5J9f?9KG@w(mj!_Arbo7VkGY!xciPV2S#t-cz+$veuu z5RJ#}D*&1C2gz6g{<9rmm0k(|L9T!7Tb(EGC8+bTAT4I zaXf4;VkvDs>sRjXpAU}((Hv|jwaf}}NT;v`t3keAZeG4Ov+!n{-t4NX03=EFcOivQ zwnzUg`I0nR1f&9>)l2!iYX4UKs|cFIw4PmEnQ?r2kU>9;=>n{{cvMQZ`6-fIiQj^LH#c8aOD;xL<+3zeMca z@`1a4LG$1jlXDCH;A7=@oW&&r=RNJE36|meP6{ z$ZdES20Sa|CgDcvr}WtA zE>SIQ2Jh;QhKk>fE@g9vuJorg>Hp}D;Ga_J|8=I9FsP0FkTP~Ttbg$R^hf$2?H>A@ zFqPX*D5ZlyG$wb@@GddCe`MAKSij%70Yuhc_xQS`;e$~rlY{DB>-}D%hLu1CJeB{q zDV5&L_0H0h1!bC^hLYx()C~qh!yiy(I;RSt%#51-(V4ofh`#-S;%J4TZ=n7<+ znS}ej;peEH`NMoB0*bJ~=oh;^J>vHIjUexIqZ!4O+127|{Hfj!LgbUmmDkO$=c8?4 zirQa&o&RkAI)D5(Mgx&+C}T(Aij{;9e=HeKhquw#bneB(zQ z{rwJCew+_pe^#1|TdMq09dsV2r+ptNJe&q{kLIxQ6;pXnF%=E(L`RaW3XVk3OSSjX}j&L8l-`Uq}SZT-!f6jB0+moL?p8l zFAaJkB1w?hNpP-mNX%&Dm8Hp}baXIFcZLQp#kF_8c`wx!0MyreW(fJ_M*8(=dgC1B zs|SEWetLiKtP0Zy+||f#nvYiXW95F5ZR{n#dbbrieWwCdtCef384Yl!*VvjVj8=qp z=D_c1sr);Dyp-5_R@s>Y`l2WDHvmaTU8<+h7ZUSqCjyAFga-j&JtMa`3HNiE*6{no zvjv&9LlqWzmWDe-%o0NGk4I;7P%ZUJwbw2;Y6~6TUFa9;t9rYcU+64+PSksHwHX3r zZyD5)S#w1}Kf6>Sdd)BO3;bpk$Wr)p#2rW11|R;y;ByC_jml)ZaKr4|MHBa<016w2 z5~Hza!PXB)$NE$7`w@3D@}AgHUqahWKJO_*Ev^LN61}Vb%=OphzO6^urVe+7`#%_b z{+RIdhlh^encQDxhV|^x^rNT4V^Z0lJeYoTU^*^0_k|xFojh{>7N(w(`H9JXmhe*_ zkOcm0pIhuTKfPIw>Gl0<#0z_Cucxu4-4+|MsSl%&+PV9X-k*=4-+MT6mOH%_D6s|K zd-&(y-(8u^Uz)i&3ZrlQu;A|iOicrY8{`VSrz!Zk{AfyL%ypbqVDn(Q&!Ay?dX5k> zG|eWnU~3K0qsjaoTV|hIvV&mRDq&kD+;mOLFXGT!@2OZVtkibP6Jcd#pZjW6xft$f z$U6wL_&&HN1DtS^zZ3Sn)|;Q;HJcHDUmyyzXHhiBrFr;b?s#f;O?smn0w6y8j-9j2 z$L2=sm83;!kkF|0vvz?1ju@3d-O?ecCkfRcty_`?R6{ST1|nUNBuIaDFP*~-YEinE z1-}g3^VhSHDir|wz{1%--k4mIGk{D-0LW{Q9lHHak|Rd7#ni3Hx|iCaUG!pUrhz3Q zR8?Dh%jG~)FSGBZb0S4oL?j`VGZ!Xl-!op%WNZNaFyLWbuvAC+EnDO&>JEi?Y zeU+-LaWwu4&Sc#2S8xuvs(rIP3%%Gfc%_ZkZnYjq9aY=xEaf(JUk?l` zlXJ(>_$xS*aVM4|qRb)<(IT#7Ugovd;xI^qay7(B8fV>AudLk}Ul+;kU$@fYcF@;- z|IOwu_4(y8m8H zOLAZrS7TW&KcES-8>$t5+U!MgZ=Ej}ioNAp5bhhRvt#f}_&d~am(?rhR>!VqIauAY z@8|!b(+Go3LCrf0cdVSHVaDIu+~PfdcW9};uE<%WqZ+gRt^$9Vem+=zME*28(|UX^ zfM0v}v|T_a$Pp8py4Or`CG|o?Vxv;0Y^PPKN?M{1?=SiPIu2ck9BD^hoH}U$VO5#T zYppfYdT3h`+C@96sXvJQ8ae2>P2GNyhoG`4!S2S-{o=Oc-3oiks83pEar?!T6S)_n zi>wcs9eLW-u5=}Fe$*+<6uRx*jh|ngwRESD_HtKL5`5ZP2i`ft&6gPNV!jL9z%7r@`Yb*MR-auf0E;(BC6lq_)WX=|?NTPkoqs2-|}?aad#C z#|hx1HJ$sy2U3kxk{z%T;5MUWF89A4WO2k~USuu1QHYyJ64}~nr9n5b+MRZhhUju2 z2~lS)v5YMw^^PP~bdAUnlUfokD$$;`7diTtY#MK(b|-HE`TU!Dv~j!OQ<&pTD^IDJ zV{kto%`q0&N^xdMSYVMB*eT5>hFKCEQi6a%m6_WgDdoVXr~BP-rEK^8+-B*D^g8*t zU+B$Ot|+szUOc>ybZmXw;?PCL`CVJ{>+RsH#4Pce`q#r+WV!BX1DK?JNc+xJ~Es4`W(!m%bS#(82B(aSroyZfF*r$}knB$?EIh?Y-NJ9!1To*Uk5*0U@1a?O5<1fW&rW+Na!jrOS#>}4@PEU>wv*Gi#Vbu&c1!KTdKIi@ zaP|IW+2$+5s%n(hi{*ib`&uX4pX@kQW8QCB<$pi|`HxKusop4Cy(wS%+3qO?F>e3& z?HzKDSjqjjfj7O1PjBO4!G7zM3^`bJt~c^(J$@s8qcBr=613Kuj~kXVKcCq}Th`(b zQ2O7X3VGBKKh#wIv_+yZ`z0CgzmMi4z?sEP34w$gr#{Sjk?nfi%=*EMZ1YunEm6&_ z`I~O5cdKi0ggOy=iGlI{s=Q zyK=KHT@64s>Y*79e;k{nncUyw(xX34T+^9|n;inaXbsAd1TUiQibyxXb4<~TC9>|N zRacyLYb_QLF`^MkP$Jo&2Bav_UJ9IaLylV?+=Cg|eN9mZ0&}A0V{$8$82<9Z;!K&Q z2rzeY4o8e*>Q+-)AzkStgMEXN;Ede1NR)n&cjtKj$#)`mNH zlH+TTXRk?)zrPRAKEuK|q~|U;8TVlhK{G6jLvP=Cbh5o8?btYJyW2N|cCRBoGl}jT+&T=6@!rXN4op!;3UNw@#XaVPPEB$s;&N+L@Qt zicns#l8$6mXDv>_4hgG{WE6+x;7MX9N-~v=$|1x_83d?vl*6MV&BGy`xSw=XEe3U#- z`-^Bf(md=d2v4keWBXfY*esTgotWk%<$!FnR9o5RapK0R#pV;W%zKv$ms`L_aa{%z zTZQ9pjf(Z;e$+(mWV0XzIyvqD6>!afV9vvx^sP*eBr1U*CA1-|QVr628B0Ph^s;Il zrz?XNCeVN#GKlOUBF0GxGQ3wA-%4knK1bZtFW}ml9eJt}fSb$`*}A>F9X!5O+o){p zEh!1+HJo&}n!(4(TW-em_j%t6qlj_x+ttS8uCQ~AogcMhJ16%d95E2AX)Cg%T+PU; zL0T`@!-Wu)I7Y3tL_`pch$KoxvSGgu(M}2{4g|)XUw=NT=RlqDy5sTdgE}>-&&54% zxlcQ-|6ofJUyak1$G0q_q_oj`cNxbjTyAHZySA>$;JMJ}Ze;&V*CvVcM>WT30c0}n z+_Cf}hMk_18(>G;R2ze)2C!q(Fo1Q>5~^arNdplBax?4O4_top$$Q4ucX3H_Xd{4=1e(T-)dD4a2rn|If z>a`ax*__I~2wmhlIy6k9+v+CWb|(>ua7O!69g(%=Z{a%nvHd+7x -- 2.47.1 From 6ec782609c226f867d6eb22bb3cfb48cfa388bcf Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 22 Jun 2025 12:54:48 +0200 Subject: [PATCH 2/4] shrink more --- layouter.py | 21 ++++++++++----------- output.png | Bin 5129 -> 4554 bytes 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/layouter.py b/layouter.py index deebd6e..a746ea0 100644 --- a/layouter.py +++ b/layouter.py @@ -21,15 +21,14 @@ FONT_PATH = "/usr/share/fonts" DEFAULT_FONT_REGULAR = "DejaVuSans.ttf" DEFAULT_FONT_BOLD = "DejaVuSans-Bold.ttf" OUTPUT_WIDTH = 696 # px -OUTPUT_HEIGHT = 212 # px -TEXT_X_OFFSET = 212 # px -QR_CODE_SIZE = 200 # px +OUTPUT_HEIGHT = 190 # px +TEXT_X_OFFSET = 190 # px +QR_CODE_SIZE = 179 # px # Configure logging logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" ) - @dataclasses.dataclass class DriveData: drive_index: int @@ -143,9 +142,9 @@ def draw_text(drawable, printable_data, font_regular, font_bold, font_bold_bigge label_x = TEXT_X_OFFSET value_offset = 115 right_field_spacing = 200 # Horizontal gap between Cycles and Errors - x_capacity = 480 - y_capacity = 161 - y_start = 10 + x_capacity = 510 + y_capacity = 142 + y_start = 4 # Serial Number drawable.text((label_x, y_start), "Serial:", fill=0, font=font_bold) @@ -298,11 +297,11 @@ def generate_image(drive, rehdd_info, output_file): output_image = Image.new("1", (OUTPUT_WIDTH, OUTPUT_HEIGHT), "white") draw = ImageDraw.Draw(output_image) - font_regular = ImageFont.truetype(find_font_path(DEFAULT_FONT_REGULAR), 20) - font_bold = ImageFont.truetype(find_font_path(DEFAULT_FONT_BOLD), 20) - font_bold_bigger = ImageFont.truetype(find_font_path(DEFAULT_FONT_BOLD), 45) + font_regular = ImageFont.truetype(find_font_path(DEFAULT_FONT_REGULAR), 18) + font_bold = ImageFont.truetype(find_font_path(DEFAULT_FONT_BOLD), 18) + font_bold_bigger = ImageFont.truetype(find_font_path(DEFAULT_FONT_BOLD), 42) - draw_outline(draw, 1, 4, OUTPUT_WIDTH, OUTPUT_HEIGHT) + draw_outline(draw, 0, 3, OUTPUT_WIDTH+1, OUTPUT_HEIGHT+1) draw_text(draw, printable_data, font_regular, font_bold, font_bold_bigger) draw_qr_code(output_image, qr_data) diff --git a/output.png b/output.png index 77808a0080a7ef7dfbac07cb5840118567be8109..e205a0c342bf0777cafd3bec63e0c5028e3a2916 100644 GIT binary patch literal 4554 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 literal 5129 zcmV+k6!z?zGT&_gXY-1qjW#`^G_dox+bMHOpo_k0HYa#lYpn|5Z5%5~!D!RKCutT4;e)tRS zUvU3#a04Ymal^jtYNvesOs7F1&M*bV00k&O&zyE4qsVxt(JA867%_@Qr~mheS7`J?0Ax!+ISt95j59o34F_Rdym<2Nq> zbxG5HK-RstE%cO=1vl2Nx%%m(z!OVxmzDciyg)nP9m2TPe-L0aPBRdi7KO!aRmh6F zpL*!Ia~yf`2geFW8rM7Dl3jEHN?;6bFPIp!+Hoof!U7vYzz0UF;4Uk+KON$_^J^Hw z2$d@)z7G*F0W26=3GR?*E4JP~ucntkPGde}0rGx;z${p$7g;E!@h~ws6E#Ka<%SXc z`KxyZ{-J*dB0*vE=)6t!tRGgUO4O9Knc&CuWbQ%^4807U~{E5TKaZ3%9pqj z!eue9re^>^fQtz}IOQ8Hi`zyZea8>vZGGST(`VlH3!nMB-)&a3@YnCRiYKKA-Mv+fv5W=b`?>)N4?Cb!j-U~xHy|Vh5*$8Lo8~nf?{s3KQ)}% z(sAU;)?>lM*M!1>7)trKHVtx1P00|#O;GO%r~M%B8!=* zS|sjZpNWpfMO{2j3czk7;w)~wJg(;B0qvA#MmrGe?8JpM9`yI)lEH;^^I%uk5?oE9 zJFkBI$hzAn|Kt3`7k>HQpVp0}DVKlVQdu&}J|=rHVO7BmvJrbAaDw$yN=)UoJGbsU zY>&LAtOQpPRd7EB*}Sw$MT_oJ#MS4KhE>mi?&V|8M72kp{OTUHR`wWOrX6-`MPGKI zoo~w(b7(PfK9-iNk-<-zUxMySsrS2&560XU3Vn98In0oxEw^U<5GVk0lLdfOOqgI7 zP&84Qn9f?AV%f$j43B+oME~Aim}&c}^YC}BPE6a#zP-yo&~r<_c?Oo%sj=>mo?lR= z>HusYc7hf_Z%??jaGM(bGj{Huf1&oC4c0wAn18V8o%K)N{kOdpJm<@c+r-V%Z`%ob zS=^fAp=bztjxR!_~s^_h4X1`uBG4+ILTDCVSLs`$1tZ z;CbN(&aBTdGm-Wk4!AaD|Hi<)DZbg*N#(mPbe4*W)1vLAU3Zuuq-fN7)7t$IM~yJ+ zLd?`D5sNNEVDoHEPyk)FWYXR8l~l}^PQmk&c4Du*oXSY)r#)@3dt*cM6H-bkr>3T~ z@m#a-CS_9ka(pT`)jxi7>%-#D@+Kwr=5^Vk5)6<0lnui=|1|TXjYPh-e^?tn`HnDv zf(@YB73G}(ABn&!72R2PryB0{Wvt@emM4)fD#a!4>3rO4&FOtV6Tt<+KJ`_5VCb$F zb~>p}7fQ2hR-)4a=s*;a0l)y(&GFR*l(t&{(mVw86p-w)fV;t@x`(6zqfoMQp;Qk(MIMiX7YK~sPd1xV4hETvlhj?GD$+relCsKbH8 zAhhA(ksxgYbt!upzSk9LTwkXOZZMO~3geq!{_Hb$z=R#;&cHi#H@&keGdBTyL*vZ6 zIo#;j0o=s2JX*YbzHL{hecNq3u`y=Ns>JM@!(9_m(OzhpY_kTM6%lJX!&LI|bswI6 zIeW}rE$-Tg3dJXn?mPa6*EShvcONL88|fdWaZGlnR*kzRvW9+CV?!#YIhypdPEO{$ z9q(tdFK-t)=_k9S43pB8Qc4+;)O*P-|?Yj=GOBYNPZFo#CeCefA%Co!fD2VOrPc<2hY zLfK@>Em!otIlO{5Znrq^iKVzV&iDC)aUdd7)aAqb;)Z1iqLH|%i2X~HRRS-Q6}kA1 zqR}cgj_8-H;@G*D(#Q4!6s#U1mEesx-+cH25akWMyS)nT@^Tf|c}~uT(NrY_@IwzM z;(>_~#{+BWlBYs+EY-6??*+uz6huSG%JRNwFPM8C$nSv2KkmG zQ$Y{QdwgjC5y6b0>}uJ+se-Fnos-lN#KcbXHD~*0#~KfXW7$3n)|Yk4<1AjDRbB|F zHbp3ZF=KJ`p*G(r%`aSuoURnL=h|H$)I2nyyys8ym_Pj~99s%gEN-h3ypc@p)|@); z<+sIwkz8QBzh7%kkM{y>GN#otv${RSt-zrY#<$l8#^^3H_NkHHGs*i_#1{d zp=t3rpiFB3_eP=ZP$E)in!LHtkpn>YTL^c%y9cF+w#n|PzUKO=w=}(PRol%^-o9G} zyFoejtABY&@r!9Saltuz?y$9gi?e#%wGrJ{9NJQCb(`Uduq|D5>$}1yq+D#V{*1oc zX_vYm^M|8vHMHK<`=b7Pp*0yV^{yUwO+@z_wexMw(Ueoym`OWR()XTDUzXk{Z(amx zbAC~=jI2>C*^n%8dP~cuL3ZI;#4N7z@{UHH?p3;a29EY$9EpAO!kLp&ELD}>?2g&a z%#`Ef(!=gp8Q(<`wtSH8ExTPUZ?=~g`S1f?vF)YW5wxB&r(ZpOG_~zr_3!W4^MyaU zckYhf-&#c#!2L7;t#r)=p0`v}tj+ge@u|^G@$!LT5QR7fLsJ%jI747<4Wa-8`6{@L z^#>A|h zHWfqOcaTu+QTZX$2@|jd-oQ%umJfZb(m6u_(kfH)JL~4&V)M%VGl2N;+_khyzY6a3 zY~>Gau2sX`{<8J8otZ~s4c^#$w>8V`WpOTx?xh1P#?e$EVI5a@<{>rP}Uiuw^f^{p55?H9W zPkbYN_tK^+H17ZDgmLY|WF+=(YdpoYd1O*ECIIMEQ^d>RooOXr+7b)`N*%OPmqLkS z36`GD)Qaz9f!u6(GJy-47Nr?78AxGcgG++2N+;{GscU0f>OeXv(lQkr>`Ny!#g{@~ ziFqijk-hlklA4bPcWG}%K>FL$-@fI=y2E#OWWT?DxG>)Nz#ShIhpRMSRvMSotYIEV zE;9Kw>xcH0t8e@$pZIdi#hE(gNw?ivE$$kL?uSWTxJg@1wd^m9=cJu<-$D^L>5zQ9 z_D3sSM8UeZoVM^9+6%kEm9>vaN^SULpz)PjgW<)CX;mgJT|?e8YU{E`oD z|I&>x)ep5)g7D-wcBkrlJst>@Jsa*!o!|RG=O?)#NjxAP7)sXO`e!CM3A z$9n-fFWY|GWe0!>@a&SsIK$qC!}e#FB!4WxttIY|=^ZV*%?8wqiZ>#Xw>swh6p<>p z_Sm)@iPV;WxceQp*CiVgm6)*zD0kD}c>`7qO5t^uxHG2c|*faqc0DZyd zP>MAg)y%t6Z9tY!UC#`F{cj8Ii<-FiHsoL0`43!r=7HCzx;62o@ey0wNG}l>1Bl5I zVe%Ng^V>Go7-u#3s*a%9i63xE#jp)GV^(e|S8AuAsA%UqTR64j$ol%bwcN4S?!?sY zuFs0SC?g7+tjM7eqoQ0evjAj)XDs3ZfV0-h_##ByFjdv8kQ^}Vxto?yYUZHm(r!qP zPldXt$(OfF4y2O)TMcqNC#977+SrSmI>{=D3hiTd@xl`yUa7lR+wl0{U+LMdr_W~l zEN=27YZkYLm}`T3Qzuzv(WSTFMem<-^l<<7aq4qXP4;i(ra##Ye79AI3b}~h=e9nS zU@($9mfjOMfs&m}*sI1}8_{JnsrT?sBpyUpXT^#|GcY z3(vL146g9KX$N=4T^a78eC7QIK1ez(T>D9m*ohWf5g*yw#VMP3(W#F6cJpZ4ab-|G z^FX~~p3~iRA2$AI@+nIB%5!oMN)C`A;$|yRAYw#J9MxDEUlfK1cNwE_u=wO?DZT^K z2~obCZv&^2Wx5nMxH@#{+rj5|DSo!A^TO`mX3gGWcJr$i*ffX!^d&)tSIX)`%v+44 zaN}5ZRhOw2-yt4VPS_eUA-0v{Mj=puiE@DBi-EaVr#&>iw|1 z!~td2^Zzycsg%kRJ7xWGPAev=wXHQT<`+g8)@CMwx(V>b7?2vM!AV8q_3iOMoUJ$P zfqd-Cign3t64`xu0uRvrW}#lRfL<7r0q___O1pC3OW0cRu(LA07y{z)0A)e|BL{CU znsL_s&8Q{g1uJ;+mUPFh#a@fx!Rok~v)jF^cYPS&zpH=So>b=47NzC>v`i7vfJkJE zC?}vPag-<#vrSYU8>vf}P-j%Zt(~u|Z^omY0~`g3zyZw$-6Mk!U0v8zJ2eG#Nrtxc zxbJCaMQ+@WrW2X7FBg{0Ec<`97wCShi``S69y=OslikwO#$}VFE&b=ocdc+EP%MU9 ze)HJ$|3n*48ok*^*B8avj>1RVR)@Qm`8yFMd&F74E|M;e3~Rp|Pb)2lzS`%m8h1@Z zg>^E2;+}s!t{nEp6cNN88r9yG2M2Dbb*C}ERG3GymS0l7S2h_30|ROGFk&67XcWa{ zDcVz10eYnwD3#oMT`HHe-F`I1(@l=-){4JKWTKh0OiQ1Plu~*Jl2S@3@nX_%iAg6- zW%RosrH7QRBBcx==2LRWYtD;idwywu*F_ZCh@Ea0bG7p>%ex%!di{Xv08k1Oa4=%v zD}sf7kc~|(2VB{LI&me+S+TpNsP!H>7}t^fS!`!6x@%c2c@w5dUV<5Ks)*oXgB za@LlzaB!()@sw)9>+)5A(-LGz$pxJ7V7l1(rl@Ev*m^tKJd3EpnXhd3jz6|5_H1lu zW9#uh_)QV-e*G@1bidK-YY(^aD1>6V6gjg0y3#m?UE*p3*matX=F98y1!x8Q2ZaD1 zClQA_-N{sL#xYBnr58w%ngvuLY|s^5{Hka)4&2fA$ZyY%cU&{m`+8^F0?aH38m37~KqNUA_xlrs% zK{OR=X+bh~Bj#L?annfWfFfn6NTJ=(dUhjXyDV~~rsr7aW9i9@iMsRkdcQ2%ir?LT zek65cxQ=5j3MgKG-MPMG0KvlJ!g=e%WFpeN)0zIxR|E`2)cfz?N*6vAQj?)Dh(9a50%-hLR#eZ*omeI{pTI;9JBWQ?8?4tT^lEE z;vr(*^&0xWXdBy!`Qt~^lH_1tI-$j6q3_20Uq=@Z19T}x+Shzdip;9#g}bom0JFWJ z-w>~5*h-O{<7;ca=4&AtDdphma3LurQie*Yr1^kcbw99RB{SyNuNK#uyDVGS*>!zY zBIYh5C7Yyv9Jt!T>qaU&*j3>+u;35I9nGe4roMvw^`)Xo09lECB>i#?pTNHlSQ}Zp r|2rer1h#Ii_$n* Date: Sun, 22 Jun 2025 12:56:40 +0200 Subject: [PATCH 3/4] increase font size --- layouter.py | 8 ++++---- output.png | Bin 4554 -> 4792 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/layouter.py b/layouter.py index a746ea0..f8dc7f3 100644 --- a/layouter.py +++ b/layouter.py @@ -142,7 +142,7 @@ def draw_text(drawable, printable_data, font_regular, font_bold, font_bold_bigge label_x = TEXT_X_OFFSET value_offset = 115 right_field_spacing = 200 # Horizontal gap between Cycles and Errors - x_capacity = 510 + x_capacity = 520 y_capacity = 142 y_start = 4 @@ -297,8 +297,8 @@ def generate_image(drive, rehdd_info, output_file): output_image = Image.new("1", (OUTPUT_WIDTH, OUTPUT_HEIGHT), "white") draw = ImageDraw.Draw(output_image) - font_regular = ImageFont.truetype(find_font_path(DEFAULT_FONT_REGULAR), 18) - font_bold = ImageFont.truetype(find_font_path(DEFAULT_FONT_BOLD), 18) + font_regular = ImageFont.truetype(find_font_path(DEFAULT_FONT_REGULAR), 20) + font_bold = ImageFont.truetype(find_font_path(DEFAULT_FONT_BOLD), 20) font_bold_bigger = ImageFont.truetype(find_font_path(DEFAULT_FONT_BOLD), 42) draw_outline(draw, 0, 3, OUTPUT_WIDTH+1, OUTPUT_HEIGHT+1) @@ -320,7 +320,7 @@ def main(): drive_state="shredded", modelfamily='Toshiba 2.5" HDD MK..65GSSX', modelname="TOSHIBA MK3265GSDX", - capacity=343597383600, + capacity=343597383000, serialnumber="YG6742U56UDRL123456789ABCDEFGJKL", power_on_hours=7074, power_cycle=4792, diff --git a/output.png b/output.png index e205a0c342bf0777cafd3bec63e0c5028e3a2916..57e971ca9725b3caaaacbf29700fe6a9180dbdbe 100644 GIT binary patch literal 4792 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 -- 2.47.1 From e06d10caee932c6fd50483ce6dcd832da577e1f0 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 22 Jun 2025 13:32:56 +0200 Subject: [PATCH 4/4] shorten qrcode data --- layouter.py | 41 +++++++++++++++++++++++++++++++++++------ output.png | Bin 4792 -> 4530 bytes 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/layouter.py b/layouter.py index f8dc7f3..3e9f38f 100644 --- a/layouter.py +++ b/layouter.py @@ -29,6 +29,7 @@ logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" ) + @dataclasses.dataclass class DriveData: drive_index: int @@ -44,6 +45,20 @@ class DriveData: shred_duration: int +@dataclasses.dataclass +class DriveDataJson: + state: str + fam: str + name: str + cap: int + sn: str + poh: int + pc: int + err: int + time: int + dur: int + + @dataclasses.dataclass class DriveDataPrintable: modelfamily: str @@ -59,13 +74,13 @@ class DriveDataPrintable: @dataclasses.dataclass class ReHddInfo: - link: str - version: str + ref: str + ver: str @dataclasses.dataclass -class DriveDataJson: - drive: DriveData +class QrDataJson: + drive: DriveDataJson rehdd: ReHddInfo @@ -288,7 +303,21 @@ def draw_outline(drawable, margin, width, output_width, output_height): def generate_image(drive, rehdd_info, output_file): """Generates an image containing drive data and a QR code.""" try: - qr_data = json.dumps(dataclasses.asdict(DriveDataJson(drive, rehdd_info))) + + drive_json = DriveDataJson( + state=drive.drive_state, + fam=drive.modelfamily, + name=drive.modelname, + cap=drive.capacity, + sn=drive.serialnumber, + poh=drive.power_on_hours, + pc=drive.power_cycle, + err=drive.smart_error_count, + time=int(drive.shred_timestamp), + dur=drive.shred_duration, + ) + + qr_data = json.dumps(dataclasses.asdict(QrDataJson(drive_json, rehdd_info))) printable_data = format_to_printable(drive) except Exception as e: logging.error(f"Error preparing data: {e}") @@ -301,7 +330,7 @@ def generate_image(drive, rehdd_info, output_file): font_bold = ImageFont.truetype(find_font_path(DEFAULT_FONT_BOLD), 20) font_bold_bigger = ImageFont.truetype(find_font_path(DEFAULT_FONT_BOLD), 42) - draw_outline(draw, 0, 3, OUTPUT_WIDTH+1, OUTPUT_HEIGHT+1) + draw_outline(draw, 0, 3, OUTPUT_WIDTH + 1, OUTPUT_HEIGHT + 1) draw_text(draw, printable_data, font_regular, font_bold, font_bold_bigger) draw_qr_code(output_image, qr_data) diff --git a/output.png b/output.png index 57e971ca9725b3caaaacbf29700fe6a9180dbdbe..7f9d9dc9308fb55d22e15eeb4fef43c8b265cc95 100644 GIT binary patch literal 4530 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 SEvje$0000