From c3b05c6bcb9d21d6bbcaf90dd6820c22109c07e8 Mon Sep 17 00:00:00 2001 From: Akbar Rahman Date: Fri, 22 May 2026 18:11:08 +0100 Subject: [PATCH] add dynamic config commands --- config.toml | 4 ++++ readme.md | 32 +++++++++++++++++++++++++++- res/autumn.gif | Bin 0 -> 1742 bytes res/iloveseason.py | 42 +++++++++++++++++++++++++++++++++++++ res/spring.gif | Bin 0 -> 2247 bytes res/summer.gif | Bin 0 -> 7412 bytes res/winter.gif | Bin 0 -> 2645 bytes src/main.py | 51 +++++++++++++++++++++++++++++---------------- 8 files changed, 110 insertions(+), 19 deletions(-) create mode 100644 res/autumn.gif create mode 100755 res/iloveseason.py create mode 100644 res/spring.gif create mode 100644 res/summer.gif create mode 100644 res/winter.gif diff --git a/config.toml b/config.toml index da4aac4..549c8be 100644 --- a/config.toml +++ b/config.toml @@ -30,3 +30,7 @@ font = "./res/curie.bdf" text_filters = [ "lowercase" ] text_offset = [45, 4] text_fill = [255, 255, 255] # your template image must have alpha channel to use alpha + +[[image]] +output = "out/iloveseason.gif" +command = [ "python", "./res/iloveseason.py" ] diff --git a/readme.md b/readme.md index 924501e..74f0911 100644 --- a/readme.md +++ b/readme.md @@ -12,7 +12,7 @@ such as nginx or caddy. 1. install requirements: `pip install -r requirements.txt` 2. run: `python main/src.py [-c config-file] [-L]`. -## docker +### docker a [dockerfile](./Dockerfile) and [compose file](./compose.yaml) have been provided. keep in mind the commands will run in the docker container, too. @@ -37,6 +37,36 @@ RUN apt-get update && apt-get install blahblahblah CMD [ "python", "-u", "./src/main.py", "-c", "/config.toml" ] ``` +## writing commands + +### basic + +basic commands return just text. +the text can end in 0 or 1 newlines but not multiple, +else it will be interpreted as a dynamic config command. + +### dynamic config commands + +any config can be dynamically set by preceeding the text to be printed +with TOML config: + +``` +template = "pat/to/templat.gif" +font = "fonts/custom_font.bdf" +text_offset = [20, 4] +hello world +``` + +if you do not want to print any text, +simply leave an extra blank/empty line +(the text ends in two newlines) +or a space character: + +``` +template = "pat/to/templat.gif" + +``` + ## config the provided [example config file](./config.toml) lists all the options that can be used. diff --git a/res/autumn.gif b/res/autumn.gif new file mode 100644 index 0000000000000000000000000000000000000000..73cda6e22af83523917dbc1c0b383a2783ee66e5 GIT binary patch literal 1742 zcmbW1dr*>T6vjUxl247uQa`+GqM49dnis^z4e|bEH_9Tii&48MwOOc{pS6S}h-gwI z-YPTE(Im8jw6#{-|2DnNV zq+~-%gHZBRY)Hk$s|-TL({S+`9{!pE1mBEcn}t||v41JzwCSqg_3Huy)&wtI?2a}v zJS9${L%qBJ;^YjB8Q=rBexA+&<^jOWX&TKQz?)|RqF&z!A6a{uJlt)SN=KU8rb|>m zefwZeq(qc@IayWd`w;DvvP#`G@}chV8O5dLhj|;&*rRD8oV7JhEXq2TEjxZfelkaK z92S$v((HY~Lh)%V&d%;MY-y3Jx}dJARysQ7E8X2owD3wH4y^w{S!!QaF1dKCwM~U{ zbt@-(db*bL;T0UEF^Dq3gQdh?`_3|3Mc_cT(QVPt@GYF%QXTB(<^2FAk@);n6DKB( z&lecm!G&>W=|c1UcB}@rmAXAB+{(qFk#g=tD&$Rn7#KhYi;RK+@qQrSh(IvUkI(Eb zE=A9A3gTyr*Rn&VCD!w){5eaT>j>VQ+x#PR5Hxp22p`7)lu$tM%Po4{6P#{NWXL4% zJKAp~Sl-EZD;Te2B?RJYPP$w<)m4*SW$_VWyf!0vu#zGgipl4U1~!=7c8?Ya1)%xj z%7ds#BV#jCwX!X5G%BfJ*{>EV?S+{3qEXZ$C)Eh!7>-e&Eo;NW#NyJ#&h{ihWTn%F zO5bP)dT}-FNS3xhOMP^|z*#1Gx$4=t>^CrfB6s!=lFv z&b;oQCMMWViNX@cNHV&q$M3sln|ij}2RipS`9xwQkRv|X>V2XG24Zqd507SsJX>uw zd1V{#k4TEd(>T$gzzkf>gb%ouR6X8f^dc>DE0Wo}Yp;9E^MI7B`pAcyCa4?rc_Wnx z+hiQ4@Ml{WU~3%Y9wlL^@?UnR*C)A(nF$9nbdQ&oVHp&@sl3O&=p*@CfjUCJRJO#~XyO9RUuF)y+R^b1 z4d}G3zG1bg$Y!K&TRnG#FaZao;fF4^t+>8^hS8UmL4UO}sE=m&G;2?UwKJY2?$FiJ zamn2abM$MdechLbO>e%7(2r;KUsVlF%{DU;U7YcoIAYNOnQ|2L{{~nqdY+sK=5)ns z`t9O1QC+@uE4&)}Hx_(IYr3ahi1;*X-+ik6uvg=prfHf`G$}CNNBi`o_Dqs5BFYzr~^W4{@OGRgC!!Mqi2I z6yKYbA-YpNDJ>}0@6OfE3jMJ+o>!aotYS1}@Tb`|URGhb@f*d^Wkt)YQ9bsS=l$qz z`pc@f?zOdz;dF3-kpHe(KyF?8kM`bv{;mIG4_F)7h~<(rI*vLcf1j+^0ZQ^$Y#EIH zH1@4N|G6(k75ikUJ7p?1enM|A9`jNz?9)59gmrXUJ%YkGnws~zCg<}0q&!_Mwmf*i zI6a1`p$_D>rrji4vjzyYL1pETO^CHs+oHj6?s*}z3^BQ_tuu{S_QpjHVmh@OeP*_~ zniOPC*uE)o3*DL} +# + +import sys +from datetime import datetime as dt + + +def get_args(): + """ Get command line arguments """ + + import argparse + parser = argparse.ArgumentParser() + return parser.parse_args() + + +def main(args): + """ Entry point for script """ + now = dt.now() + + template = "" + if now.month in [3, 4, 5]: + template = './res/spring.gif' + if now.month in [6, 7, 8]: + template = './res/summer.gif' + if now.month in [9, 10, 11]: + template = './res/autumn.gif' + if now.month in [12, 1, 2]: + template = './res/winter.gif' + + print(f'template = "{template}"') + print() + + return 0 + + +if __name__ == '__main__': + try: + sys.exit(main(get_args())) + except KeyboardInterrupt: + sys.exit(0) diff --git a/res/spring.gif b/res/spring.gif new file mode 100644 index 0000000000000000000000000000000000000000..6c1b364ec86db4432dce9021cd200951071e9fce GIT binary patch literal 2247 zcmeH{>sJ$Z8pkIWLI@NBhMU|b0RzPQT#n1cq)ds(l&D;Z$Zf8&J#e`S zQ_69r3RNm?jww~R62g=au7Yt0#vmA1DG8N|P(cI)kq}HkFsV`+V3kpb$i;|Eipe1a zhY$jugM?9=>tR$+Ktc?L5m=AHBN!^AP%edg;TS}rkRF36QcMzXKPEJiYy-hJ;Lr#K zTl7kc5wIGCr4WojFcQT{6w{*^h2bQI>oJ_d zZ4i2#pm0)et0V}DAZ;aP9J3I(nIH@VX(03l(gtPF&tatWvwDM(vSBnDC~}r04F=L` zrbb3)`z`&mMx({tZ?Tvy7K_ztnYEf{XJ_ZW=l}YjZNRo+{;cDsxGi6<7p25SEM3l^ z*?RG(n07p%1PGh!J9j1kdj?2n`-YSObl<3mkko{Ry7ppjpcGGNy!h~hmp#WVsOMAw z-9bIx0g8(_F6mFwa>4dMCvTs%pYptKzub7%H}gsNq}%20>UBq6^9FD4-CPq{x-gD& z=*p97zl#$0Puw79x_AHZ=23&=`8Bx@I&#l7UVnOfpYF<%A==3u_xxBRJTGEtJ|gHh z^`@9lp#B*x@A6XasV}r^9T)HFZfYERR2G<+jgBYRi4%en-*Sm1c%=HbyKh1QIbh7T zw{MyYP?Y zYe~em1tL~hl;Xbg(k5*_u%zLAE8y^EqJIC{-+vuCCGzkB*|`g!nsoM@De%JKO(7XY zXVNoFfAP~u1llj7!sEcwYz4#hKw2m_o|&LoPoIBwdArL>O$xwd@l0(_%8zBD0Lai8 zcyuPZ#v`caj{j6JIrA@$qPE$1-h3lx;_9^qF$?6|d2Ca>s;kND+zD=Nb=C5=2K_A^ z6zn=5>b$#LZSdZ?vL}YQaf>O25indQak~B~+l!wxobxMw%eixL!_gVew>PsnYsYUM z8}xaPc!t%+xW@r0h~4JDUJglpB6G~NU&VE0R|YvBI>U@itF`mniL0~h5_!F?%~?$% z*0m#CK~_Lg!(gjp8!gXr1E5b^j8WDhsA2lk)a_%mjjb`jS6(#0Jw9byEw)hM5*05h|S#x)hF4>CQr^Z-mSmn(UU`~+q(mIo|+=h!&dz3gX(`7Jn8E3&?| zw&eJn=x_ymhwmJhWeq%gD3GKVeYRic7*`og*NObWHg_)tmsW#RI4#*6QvJ+@ic!hjAc=E-wi|! zYs#2zU@Obm!!WKg(Uj$dF8-~H@*L`DBCV-gekowhWJ$8-#n7jZhnBT%NTB^)#l3jZ z&3^Q7aqMY9L2)bNbOFHSe?2AhI@(jnyAHC}sS6z=xG|NkFF22~s(gIz7oVK~FGsbD z1P9P7v4J%bQSL!!5CF91&mU<62b~{&TUOl{wk)`EZ0n^p2Kw^%pq&C>a3a)&{w;|P z?+*OzUaq+iy>a4XZg;)^Z{J)GVJc3IK6Tp1>01Td)$J%w?GUeg7@pKv%1u!)d?q^T zqibK5pT!dZ=B>_+(lljh+W2Q|4b6#N02HtMfjR%xqCCF^A<6tMnWB@oef7(VO+TiG z<^1?~7mEPTeG>#Y^pq($^Ww?R(cm+k-Fu}$wpstoH5xzzDgZZIt~CRH{3l`tXz`vd>|EPu zcU2VhdbsoU<>VTsQ} zyVtj`+uL`w;`?lJ=$?A4>x-+0ZaiyBvb=uw_}=fnoq{uf81TL1t6 literal 0 HcmV?d00001 diff --git a/res/summer.gif b/res/summer.gif new file mode 100644 index 0000000000000000000000000000000000000000..fd324430102dc5ba786967c1e945db220bf1fbd3 GIT binary patch literal 7412 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 D~I!svq zh6ezaR%&{aed18Hb@n1=(uBm)Y#{b*xX(U8nYV>!?3|xD(XB?!M;pyei1)lQ>K5nG zx^gEyN=-719t|UXbl69;*iIeB!}Ww(;&N!jXdAt>Yu1Q3kU=!weV>J;#)=0_;0$v)%sEe}(AtKU-KL761SM literal 0 HcmV?d00001 diff --git a/res/winter.gif b/res/winter.gif new file mode 100644 index 0000000000000000000000000000000000000000..ca1d6edea23bd5c37dd297604b62692486f5e4d1 GIT binary patch literal 2645 zcmeH{TU1kL7RLjG7zBoU2!u=G1&qR!yI^f0!EhV3T$F?mEFl!ZP!N$o2}Mb`g8~}4 zXpj^=M$ssWM;RqZ5F*ww1xAjJVhX4PTQI^%YGJd)NDdrqD*zh?Y$f0+v^)ji!6**~JSE^mTD}6|D^NZR_)3&-FlvwwYx7|=UkUQn zK&U{3uvQ4`gfJ>p>V--mG)N67SL(`@pj?fXt3kO2)T_1iYF)h=t=H)5HHHNB2#_e0 z5`|g3h)4jCPw za~=duaTBMWT>WOc-_`TE;lYMU#tDluhp`DYU^#It_1YPZ@?X;Go52IHzg|F z-{I~PvO{CVj;hCPRxV#A{r>Ulqlbkl%#$e@)l8G7il?k$2AW9eiW_$1fA`t}PwYIw zpqqpfJIipD7GneWdDk_gcHh2kk=0;*qZ&D`_@iryjq2f@W@(|eBJk9u@kR)$&AD8c(%(~`-RuVxze5JLXp%q>h;~L8CY$Q>XgFT>2&2ZN>3xQH{Q*Hz zF*!zerme00giPFXp{Ple|J(^l3SoOP+x&A7=faiCflKS0!!u?hO`I)k!Y#rxM+byC zFhga@t-L=|i;eTaHJM(9(i#@OoA9DNyynnR_b8^$8R9!5=^e!r@| z6J4LGGF=Yji;Ir;f5+*@7Nk}keE$W`C4Zi_>S?-#h|!%S^WD3Uo)i7K&w167xo1X& z#kKU_k|QM3R6(;`OXO8MitCn-G^O^Xb!}{PCtW)sZ8KifEq#NP7s!&^i_bP?`rf?P zadIf+o_F16b{BZVSAv%0y}8?(a7Bpg7zSJUQ59>uc#Tzk<+s7?&xBvq6XkMQp2K8q zMrcW+3U5^sq{)*1mIb+1?ZdmtSM@pULLyBG#0ihy%~A8E;D6JdUQB)jl$G8(uwo{TKhMhlgMOZ9e<&!XzR0N z>-&Y<+qv{?XN+d&&+Bf{cvM?%kgkRnFaY(N1j+XstVRYTVv< zV)L!FO}~^~4@nr?^6HXs;@5=nTg)Zom_0TNBAW*f7!%*BY)`%|XBgGSmHOEe&UIJN z@+k3pqV769eY+u8!u=DEc-QX3+bUd`MdvnSuWB2kzljt6fFjr{2v!xygTV0s zUC_sbAf)QVab7=rq``HQo7Z-q_7AFqu;qFAZ0wNc=Wx5Cm6>Yp$d3nP4Q2;?OYmN* zci}Z19ifl@N+c1spAn48LNgzIx-eX3B_I|$eNS^8N#HIFpOb#Q^j_jdH{bZ!F7-=l ztCLe?Nd%MgY0M$@kp1DQyUrHQRkGbfTq2U4`iU^jWv)+eH z)-nPOn-|wew<^HSk{w$byVGK~%=EHqD>I)w{`$*6?2}aD8|X=EvQd1M-CB%U+P?6J z*q2y))_#$#X-4!53A@IIQvYW9wS0GJ_jL2BD5D~_Kpsb?;XJAr-Nc6?e%Z}*dNb#l z-SXsWgu@n&Ps*WuhmfnTfBuDdX0G$~m+dY4duv1MIaxEeW`!zw26^K81JNV(iw zg}fsspGx$K+iw{DEf+7xoN-OV(o8J}~Hv$Iy8P t;|%$Zj_tw22aoRzd^IG9k;IM*CUc&hy=gv~`_n?<&xfDcTVpVv{~Jy # +import json import sys import subprocess import time @@ -22,31 +23,45 @@ def get_args(): def generate(config): - if config.get('template'): - img = Image.open(config['template']) - else: - img = Image.new(mode="RGBA", size = config['size']) - - draw = ImageDraw.Draw(img) - with open(config['font'], "rb") as fp: - font = BdfFontFile.BdfFontFile(fp).to_imagefont() - process = subprocess.run(config['command'], stdout=subprocess.PIPE, shell=False) if process.returncode != config.get('return_code', 0): # process did not run succesfully. # do not risk displaying that to user return + cmd_output = process.stdout.decode('utf-8').split('\n') + print(f"{cmd_output=}") + dynamic_config = {} + if len(cmd_output) > 2: + dynamic_config = tomllib.loads('\n'.join(cmd_output[:-2])) + text = cmd_output[-2] + else: + text = cmd_output[0] - text = process.stdout.decode('utf-8').split('\n')[0] - for filter in config.get('text_filters', []): - if filter == "lowercase": - text = text.lower() - elif filter == "uppercase": - text = text.upper() + print(f"{dynamic_config=}") + for key, val in dynamic_config.items(): + config[key] = val - fill = config.get('text_fill') - fill = tuple(fill) if fill else None - draw.text(config.get('text_offset', [0, 0]), text, font=font, fill=fill) + if config.get('template'): + img = Image.open(config['template']) + else: + img = Image.new(mode="RGBA", size = config['size']) + + print(f"{text=}") + + if text: + draw = ImageDraw.Draw(img) + with open(config['font'], "rb") as fp: + font = BdfFontFile.BdfFontFile(fp).to_imagefont() + + for filter in config.get('text_filters', []): + if filter == "lowercase": + text = text.lower() + elif filter == "uppercase": + text = text.upper() + + fill = config.get('text_fill') + fill = tuple(fill) if fill else None + draw.text(config.get('text_offset', [0, 0]), text, font=font, fill=fill) img.save(config['output'], save_all=True, loop=0)