dripfetch 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (519) hide show
  1. dripfetch/__init__.py +1 -0
  2. dripfetch/__main__.py +4 -0
  3. dripfetch/app.py +111 -0
  4. dripfetch/assets/logos/adelie.txt +16 -0
  5. dripfetch/assets/logos/aeon.txt +14 -0
  6. dripfetch/assets/logos/aeros.txt +21 -0
  7. dripfetch/assets/logos/aerynos.txt +16 -0
  8. dripfetch/assets/logos/afterglow.txt +15 -0
  9. dripfetch/assets/logos/aix.txt +20 -0
  10. dripfetch/assets/logos/almalinux.txt +20 -0
  11. dripfetch/assets/logos/alpine.txt +20 -0
  12. dripfetch/assets/logos/alpine2.txt +16 -0
  13. dripfetch/assets/logos/alpine2_small.txt +6 -0
  14. dripfetch/assets/logos/alpine3_small.txt +6 -0
  15. dripfetch/assets/logos/alpine_small.txt +6 -0
  16. dripfetch/assets/logos/alter.txt +20 -0
  17. dripfetch/assets/logos/altlinux.txt +22 -0
  18. dripfetch/assets/logos/amazon.txt +19 -0
  19. dripfetch/assets/logos/amazon_linux.txt +10 -0
  20. dripfetch/assets/logos/amogos.txt +19 -0
  21. dripfetch/assets/logos/anarchy.txt +28 -0
  22. dripfetch/assets/logos/android.txt +18 -0
  23. dripfetch/assets/logos/android_small.txt +6 -0
  24. dripfetch/assets/logos/anduinos.txt +19 -0
  25. dripfetch/assets/logos/antergos.txt +19 -0
  26. dripfetch/assets/logos/antix.txt +12 -0
  27. dripfetch/assets/logos/anushos.txt +20 -0
  28. dripfetch/assets/logos/aoscos.txt +17 -0
  29. dripfetch/assets/logos/aoscos_old.txt +20 -0
  30. dripfetch/assets/logos/aoscosretro.txt +18 -0
  31. dripfetch/assets/logos/aoscosretro_small.txt +9 -0
  32. dripfetch/assets/logos/aperture.txt +20 -0
  33. dripfetch/assets/logos/apricity.txt +18 -0
  34. dripfetch/assets/logos/arch.txt +19 -0
  35. dripfetch/assets/logos/arch2.txt +19 -0
  36. dripfetch/assets/logos/arch3.txt +19 -0
  37. dripfetch/assets/logos/arch_old.txt +16 -0
  38. dripfetch/assets/logos/arch_small.txt +7 -0
  39. dripfetch/assets/logos/archbox.txt +19 -0
  40. dripfetch/assets/logos/archcraft.txt +20 -0
  41. dripfetch/assets/logos/archcraft2.txt +20 -0
  42. dripfetch/assets/logos/archlabs.txt +21 -0
  43. dripfetch/assets/logos/archstrike.txt +17 -0
  44. dripfetch/assets/logos/arco.txt +20 -0
  45. dripfetch/assets/logos/arco_small.txt +11 -0
  46. dripfetch/assets/logos/arkane.txt +23 -0
  47. dripfetch/assets/logos/armbian.txt +22 -0
  48. dripfetch/assets/logos/armbian2.txt +14 -0
  49. dripfetch/assets/logos/arselinux.txt +15 -0
  50. dripfetch/assets/logos/artix.txt +20 -0
  51. dripfetch/assets/logos/artix2_small.txt +13 -0
  52. dripfetch/assets/logos/artix_small.txt +7 -0
  53. dripfetch/assets/logos/arya.txt +15 -0
  54. dripfetch/assets/logos/asahi.txt +18 -0
  55. dripfetch/assets/logos/asahi2.txt +18 -0
  56. dripfetch/assets/logos/aster.txt +18 -0
  57. dripfetch/assets/logos/asteroidos.txt +17 -0
  58. dripfetch/assets/logos/astos.txt +23 -0
  59. dripfetch/assets/logos/astra_linux.txt +22 -0
  60. dripfetch/assets/logos/athenaos.txt +29 -0
  61. dripfetch/assets/logos/athenaos_old.txt +24 -0
  62. dripfetch/assets/logos/aurora.txt +28 -0
  63. dripfetch/assets/logos/axos.txt +16 -0
  64. dripfetch/assets/logos/azos.txt +17 -0
  65. dripfetch/assets/logos/bedrock.txt +17 -0
  66. dripfetch/assets/logos/bedrock_small.txt +6 -0
  67. dripfetch/assets/logos/biglinux.txt +19 -0
  68. dripfetch/assets/logos/bitrig.txt +17 -0
  69. dripfetch/assets/logos/blackarch.txt +21 -0
  70. dripfetch/assets/logos/blackmesa.txt +20 -0
  71. dripfetch/assets/logos/blackpanther.txt +23 -0
  72. dripfetch/assets/logos/blag.txt +17 -0
  73. dripfetch/assets/logos/blankon.txt +17 -0
  74. dripfetch/assets/logos/bluelight.txt +19 -0
  75. dripfetch/assets/logos/bodhi.txt +18 -0
  76. dripfetch/assets/logos/bonsai.txt +16 -0
  77. dripfetch/assets/logos/bredos.txt +9 -0
  78. dripfetch/assets/logos/bsd.txt +19 -0
  79. dripfetch/assets/logos/bunsenlabs.txt +20 -0
  80. dripfetch/assets/logos/cachyos.txt +22 -0
  81. dripfetch/assets/logos/cachyos_small.txt +8 -0
  82. dripfetch/assets/logos/calculate.txt +20 -0
  83. dripfetch/assets/logos/calinixos.txt +25 -0
  84. dripfetch/assets/logos/calinixos_small.txt +15 -0
  85. dripfetch/assets/logos/carbs.txt +18 -0
  86. dripfetch/assets/logos/cbl_mariner.txt +18 -0
  87. dripfetch/assets/logos/celos.txt +15 -0
  88. dripfetch/assets/logos/center.txt +13 -0
  89. dripfetch/assets/logos/centos.txt +19 -0
  90. dripfetch/assets/logos/centos_small.txt +7 -0
  91. dripfetch/assets/logos/cereus.txt +27 -0
  92. dripfetch/assets/logos/chakra.txt +18 -0
  93. dripfetch/assets/logos/chaletos.txt +20 -0
  94. dripfetch/assets/logos/chapeau.txt +18 -0
  95. dripfetch/assets/logos/chimera_linux.txt +18 -0
  96. dripfetch/assets/logos/chonkysealos.txt +21 -0
  97. dripfetch/assets/logos/chrom.txt +18 -0
  98. dripfetch/assets/logos/cleanjaro.txt +12 -0
  99. dripfetch/assets/logos/cleanjaro_small.txt +7 -0
  100. dripfetch/assets/logos/clear_linux.txt +20 -0
  101. dripfetch/assets/logos/clearos.txt +20 -0
  102. dripfetch/assets/logos/clover.txt +20 -0
  103. dripfetch/assets/logos/cobalt.txt +16 -0
  104. dripfetch/assets/logos/codex.txt +12 -0
  105. dripfetch/assets/logos/condres.txt +17 -0
  106. dripfetch/assets/logos/cosmic.txt +11 -0
  107. dripfetch/assets/logos/crux.txt +18 -0
  108. dripfetch/assets/logos/crux_small.txt +7 -0
  109. dripfetch/assets/logos/crystal.txt +20 -0
  110. dripfetch/assets/logos/cucumber.txt +20 -0
  111. dripfetch/assets/logos/cuerdos.txt +13 -0
  112. dripfetch/assets/logos/cutefishos.txt +9 -0
  113. dripfetch/assets/logos/cuteos.txt +14 -0
  114. dripfetch/assets/logos/cyberos.txt +15 -0
  115. dripfetch/assets/logos/cycledream.txt +21 -0
  116. dripfetch/assets/logos/dahlia.txt +17 -0
  117. dripfetch/assets/logos/darkos.txt +20 -0
  118. dripfetch/assets/logos/debian.txt +17 -0
  119. dripfetch/assets/logos/debian_small.txt +6 -0
  120. dripfetch/assets/logos/deepin.txt +18 -0
  121. dripfetch/assets/logos/desaos.txt +16 -0
  122. dripfetch/assets/logos/devuan.txt +15 -0
  123. dripfetch/assets/logos/devuan_small.txt +7 -0
  124. dripfetch/assets/logos/dietpi.txt +19 -0
  125. dripfetch/assets/logos/dracos.txt +13 -0
  126. dripfetch/assets/logos/dragonfly.txt +15 -0
  127. dripfetch/assets/logos/dragonfly_old.txt +17 -0
  128. dripfetch/assets/logos/dragonfly_small.txt +7 -0
  129. dripfetch/assets/logos/drauger.txt +16 -0
  130. dripfetch/assets/logos/droidian.txt +15 -0
  131. dripfetch/assets/logos/elbrus.txt +14 -0
  132. dripfetch/assets/logos/elementary.txt +17 -0
  133. dripfetch/assets/logos/elementary_small.txt +6 -0
  134. dripfetch/assets/logos/elive.txt +17 -0
  135. dripfetch/assets/logos/encryptos.txt +13 -0
  136. dripfetch/assets/logos/endeavouros.txt +15 -0
  137. dripfetch/assets/logos/endeavouros_small.txt +7 -0
  138. dripfetch/assets/logos/endless.txt +20 -0
  139. dripfetch/assets/logos/enso.txt +19 -0
  140. dripfetch/assets/logos/eshanizedos.txt +27 -0
  141. dripfetch/assets/logos/eurolinux.txt +18 -0
  142. dripfetch/assets/logos/evolutionos.txt +21 -0
  143. dripfetch/assets/logos/evolutionos_old.txt +18 -0
  144. dripfetch/assets/logos/evolutionos_small.txt +9 -0
  145. dripfetch/assets/logos/eweos.txt +15 -0
  146. dripfetch/assets/logos/exherbo.txt +22 -0
  147. dripfetch/assets/logos/exodia_predator.txt +24 -0
  148. dripfetch/assets/logos/fastfetch.txt +11 -0
  149. dripfetch/assets/logos/fedora.txt +19 -0
  150. dripfetch/assets/logos/fedora2_small.txt +5 -0
  151. dripfetch/assets/logos/fedora_coreos.txt +20 -0
  152. dripfetch/assets/logos/fedora_kinoite.txt +18 -0
  153. dripfetch/assets/logos/fedora_old.txt +17 -0
  154. dripfetch/assets/logos/fedora_sericea.txt +17 -0
  155. dripfetch/assets/logos/fedora_silverblue.txt +17 -0
  156. dripfetch/assets/logos/fedora_small.txt +9 -0
  157. dripfetch/assets/logos/femboyos.txt +20 -0
  158. dripfetch/assets/logos/feren.txt +16 -0
  159. dripfetch/assets/logos/filotimo.txt +20 -0
  160. dripfetch/assets/logos/finnix.txt +17 -0
  161. dripfetch/assets/logos/floflis.txt +19 -0
  162. dripfetch/assets/logos/freebsd.txt +15 -0
  163. dripfetch/assets/logos/freebsd_small.txt +6 -0
  164. dripfetch/assets/logos/freemint.txt +15 -0
  165. dripfetch/assets/logos/frugalware.txt +23 -0
  166. dripfetch/assets/logos/funtoo.txt +10 -0
  167. dripfetch/assets/logos/furreto.txt +22 -0
  168. dripfetch/assets/logos/galliumos.txt +19 -0
  169. dripfetch/assets/logos/garuda.txt +18 -0
  170. dripfetch/assets/logos/garuda_dragon.txt +24 -0
  171. dripfetch/assets/logos/garuda_small.txt +5 -0
  172. dripfetch/assets/logos/gentoo.txt +18 -0
  173. dripfetch/assets/logos/gentoo_small.txt +7 -0
  174. dripfetch/assets/logos/ghostbsd.txt +13 -0
  175. dripfetch/assets/logos/ghostfreak.txt +19 -0
  176. dripfetch/assets/logos/glaucus.txt +12 -0
  177. dripfetch/assets/logos/gnewsense.txt +12 -0
  178. dripfetch/assets/logos/gnome.txt +21 -0
  179. dripfetch/assets/logos/gnu.txt +18 -0
  180. dripfetch/assets/logos/gobolinux.txt +6 -0
  181. dripfetch/assets/logos/goldendoglinux.txt +19 -0
  182. dripfetch/assets/logos/grapheneos.txt +23 -0
  183. dripfetch/assets/logos/grombyang.txt +18 -0
  184. dripfetch/assets/logos/guix.txt +10 -0
  185. dripfetch/assets/logos/guix_small.txt +7 -0
  186. dripfetch/assets/logos/haiku.txt +12 -0
  187. dripfetch/assets/logos/haiku2.txt +17 -0
  188. dripfetch/assets/logos/haiku_small.txt +8 -0
  189. dripfetch/assets/logos/hamonikr.txt +23 -0
  190. dripfetch/assets/logos/hardclanz.txt +19 -0
  191. dripfetch/assets/logos/harmonyos.txt +19 -0
  192. dripfetch/assets/logos/hash.txt +13 -0
  193. dripfetch/assets/logos/hce.txt +24 -0
  194. dripfetch/assets/logos/heliumos.txt +20 -0
  195. dripfetch/assets/logos/huayra.txt +17 -0
  196. dripfetch/assets/logos/hybrid.txt +16 -0
  197. dripfetch/assets/logos/hydrapwk.txt +11 -0
  198. dripfetch/assets/logos/hydroos.txt +8 -0
  199. dripfetch/assets/logos/hyperbola.txt +16 -0
  200. dripfetch/assets/logos/hyperbola_small.txt +7 -0
  201. dripfetch/assets/logos/hypros.txt +17 -0
  202. dripfetch/assets/logos/iglunix.txt +12 -0
  203. dripfetch/assets/logos/instantos.txt +20 -0
  204. dripfetch/assets/logos/interix.txt +17 -0
  205. dripfetch/assets/logos/irix.txt +19 -0
  206. dripfetch/assets/logos/ironclad.txt +11 -0
  207. dripfetch/assets/logos/itc.txt +10 -0
  208. dripfetch/assets/logos/januslinux.txt +24 -0
  209. dripfetch/assets/logos/kaisen.txt +17 -0
  210. dripfetch/assets/logos/kali.txt +21 -0
  211. dripfetch/assets/logos/kali_small.txt +16 -0
  212. dripfetch/assets/logos/kalpa_desktop.txt +22 -0
  213. dripfetch/assets/logos/kaos.txt +16 -0
  214. dripfetch/assets/logos/kdelinux.txt +14 -0
  215. dripfetch/assets/logos/kdeneon.txt +19 -0
  216. dripfetch/assets/logos/kernelos.txt +19 -0
  217. dripfetch/assets/logos/kibojoe.txt +13 -0
  218. dripfetch/assets/logos/kiss.txt +7 -0
  219. dripfetch/assets/logos/kogaion.txt +20 -0
  220. dripfetch/assets/logos/korora.txt +16 -0
  221. dripfetch/assets/logos/krassos.txt +19 -0
  222. dripfetch/assets/logos/kslinux.txt +11 -0
  223. dripfetch/assets/logos/kubuntu.txt +20 -0
  224. dripfetch/assets/logos/kylin.txt +22 -0
  225. dripfetch/assets/logos/lainos.txt +20 -0
  226. dripfetch/assets/logos/langitketujuh.txt +11 -0
  227. dripfetch/assets/logos/laxeros.txt +20 -0
  228. dripfetch/assets/logos/lede.txt +9 -0
  229. dripfetch/assets/logos/lfs.txt +18 -0
  230. dripfetch/assets/logos/libreelec.txt +20 -0
  231. dripfetch/assets/logos/lilidog.txt +16 -0
  232. dripfetch/assets/logos/lingmo.txt +20 -0
  233. dripfetch/assets/logos/linspire.txt +12 -0
  234. dripfetch/assets/logos/linux.txt +12 -0
  235. dripfetch/assets/logos/linux_small.txt +7 -0
  236. dripfetch/assets/logos/linuxlite.txt +20 -0
  237. dripfetch/assets/logos/linuxlite_small.txt +7 -0
  238. dripfetch/assets/logos/linuxmint.txt +19 -0
  239. dripfetch/assets/logos/linuxmint_old.txt +16 -0
  240. dripfetch/assets/logos/linuxmint_small.txt +7 -0
  241. dripfetch/assets/logos/live_raizo.txt +20 -0
  242. dripfetch/assets/logos/lliurex.txt +16 -0
  243. dripfetch/assets/logos/lmde.txt +17 -0
  244. dripfetch/assets/logos/locos.txt +18 -0
  245. dripfetch/assets/logos/lubuntu.txt +20 -0
  246. dripfetch/assets/logos/lunar.txt +13 -0
  247. dripfetch/assets/logos/macos.txt +17 -0
  248. dripfetch/assets/logos/macos2.txt +17 -0
  249. dripfetch/assets/logos/macos2_small.txt +7 -0
  250. dripfetch/assets/logos/macos3.txt +16 -0
  251. dripfetch/assets/logos/macos_small.txt +7 -0
  252. dripfetch/assets/logos/mageia.txt +19 -0
  253. dripfetch/assets/logos/mageia_small.txt +7 -0
  254. dripfetch/assets/logos/magix.txt +19 -0
  255. dripfetch/assets/logos/magpieos.txt +20 -0
  256. dripfetch/assets/logos/mainsailos.txt +18 -0
  257. dripfetch/assets/logos/mainsailos_small.txt +7 -0
  258. dripfetch/assets/logos/mandriva.txt +15 -0
  259. dripfetch/assets/logos/manjaro.txt +14 -0
  260. dripfetch/assets/logos/manjaro_small.txt +7 -0
  261. dripfetch/assets/logos/massos.txt +18 -0
  262. dripfetch/assets/logos/matuusos.txt +20 -0
  263. dripfetch/assets/logos/maui.txt +20 -0
  264. dripfetch/assets/logos/mauna.txt +15 -0
  265. dripfetch/assets/logos/meowix.txt +10 -0
  266. dripfetch/assets/logos/mer.txt +27 -0
  267. dripfetch/assets/logos/midnightbsd.txt +16 -0
  268. dripfetch/assets/logos/midos.txt +20 -0
  269. dripfetch/assets/logos/midos_old.txt +20 -0
  270. dripfetch/assets/logos/minimal.txt +18 -0
  271. dripfetch/assets/logos/minix.txt +17 -0
  272. dripfetch/assets/logos/miracle_linux.txt +16 -0
  273. dripfetch/assets/logos/mos.txt +18 -0
  274. dripfetch/assets/logos/msys2.txt +25 -0
  275. dripfetch/assets/logos/mx.txt +17 -0
  276. dripfetch/assets/logos/mx2.txt +18 -0
  277. dripfetch/assets/logos/mx_small.txt +7 -0
  278. dripfetch/assets/logos/namib.txt +20 -0
  279. dripfetch/assets/logos/nekos.txt +23 -0
  280. dripfetch/assets/logos/neptune.txt +17 -0
  281. dripfetch/assets/logos/netbsd.txt +17 -0
  282. dripfetch/assets/logos/netbsd2.txt +20 -0
  283. dripfetch/assets/logos/netbsd_small.txt +8 -0
  284. dripfetch/assets/logos/netrunner.txt +20 -0
  285. dripfetch/assets/logos/nexalinux.txt +19 -0
  286. dripfetch/assets/logos/nitrux.txt +18 -0
  287. dripfetch/assets/logos/nixos.txt +20 -0
  288. dripfetch/assets/logos/nixos_old.txt +28 -0
  289. dripfetch/assets/logos/nixos_old_small.txt +7 -0
  290. dripfetch/assets/logos/nixos_small.txt +7 -0
  291. dripfetch/assets/logos/nobara.txt +17 -0
  292. dripfetch/assets/logos/nomadbsd.txt +13 -0
  293. dripfetch/assets/logos/nuros.txt +12 -0
  294. dripfetch/assets/logos/nurunner.txt +19 -0
  295. dripfetch/assets/logos/nutyx.txt +23 -0
  296. dripfetch/assets/logos/obarun.txt +19 -0
  297. dripfetch/assets/logos/obrevenge.txt +18 -0
  298. dripfetch/assets/logos/obsidianos.txt +16 -0
  299. dripfetch/assets/logos/omnios.txt +8 -0
  300. dripfetch/assets/logos/opak.txt +13 -0
  301. dripfetch/assets/logos/openbsd.txt +23 -0
  302. dripfetch/assets/logos/openbsd_small.txt +7 -0
  303. dripfetch/assets/logos/openeuler.txt +23 -0
  304. dripfetch/assets/logos/openindiana.txt +16 -0
  305. dripfetch/assets/logos/openkylin.txt +18 -0
  306. dripfetch/assets/logos/openmamba.txt +21 -0
  307. dripfetch/assets/logos/openmandriva.txt +22 -0
  308. dripfetch/assets/logos/openstage.txt +17 -0
  309. dripfetch/assets/logos/opensuse.txt +18 -0
  310. dripfetch/assets/logos/opensuse_leap.txt +18 -0
  311. dripfetch/assets/logos/opensuse_leap_old.txt +16 -0
  312. dripfetch/assets/logos/opensuse_microos.txt +10 -0
  313. dripfetch/assets/logos/opensuse_slowroll.txt +20 -0
  314. dripfetch/assets/logos/opensuse_small.txt +7 -0
  315. dripfetch/assets/logos/opensuse_tumbleweed.txt +22 -0
  316. dripfetch/assets/logos/opensuse_tumbleweed_old.txt +13 -0
  317. dripfetch/assets/logos/opensuse_tumbleweed_small.txt +9 -0
  318. dripfetch/assets/logos/openwrt.txt +9 -0
  319. dripfetch/assets/logos/opnsense.txt +20 -0
  320. dripfetch/assets/logos/oracle.txt +11 -0
  321. dripfetch/assets/logos/orchid.txt +20 -0
  322. dripfetch/assets/logos/orchid_small.txt +13 -0
  323. dripfetch/assets/logos/oreon.txt +22 -0
  324. dripfetch/assets/logos/os_elbrus.txt +14 -0
  325. dripfetch/assets/logos/osmc.txt +20 -0
  326. dripfetch/assets/logos/pacbsd.txt +24 -0
  327. dripfetch/assets/logos/panwah.txt +21 -0
  328. dripfetch/assets/logos/parabola.txt +16 -0
  329. dripfetch/assets/logos/parabola_small.txt +6 -0
  330. dripfetch/assets/logos/parch.txt +25 -0
  331. dripfetch/assets/logos/pardus.txt +18 -0
  332. dripfetch/assets/logos/parrot.txt +24 -0
  333. dripfetch/assets/logos/parsix.txt +21 -0
  334. dripfetch/assets/logos/pcbsd.txt +27 -0
  335. dripfetch/assets/logos/pclinuxos.txt +19 -0
  336. dripfetch/assets/logos/pearos.txt +21 -0
  337. dripfetch/assets/logos/pengwin.txt +15 -0
  338. dripfetch/assets/logos/pentoo.txt +20 -0
  339. dripfetch/assets/logos/peppermint.txt +21 -0
  340. dripfetch/assets/logos/peropesis.txt +5 -0
  341. dripfetch/assets/logos/phyos.txt +17 -0
  342. dripfetch/assets/logos/pikaos.txt +18 -0
  343. dripfetch/assets/logos/pisi.txt +19 -0
  344. dripfetch/assets/logos/pnm_linux.txt +19 -0
  345. dripfetch/assets/logos/pop.txt +20 -0
  346. dripfetch/assets/logos/pop_small.txt +8 -0
  347. dripfetch/assets/logos/porteus.txt +23 -0
  348. dripfetch/assets/logos/postmarketos.txt +18 -0
  349. dripfetch/assets/logos/postmarketos_small.txt +9 -0
  350. dripfetch/assets/logos/proxmox.txt +20 -0
  351. dripfetch/assets/logos/puffos.txt +12 -0
  352. dripfetch/assets/logos/puppy.txt +18 -0
  353. dripfetch/assets/logos/pureos.txt +12 -0
  354. dripfetch/assets/logos/pureos_small.txt +6 -0
  355. dripfetch/assets/logos/q4os.txt +19 -0
  356. dripfetch/assets/logos/qts.txt +14 -0
  357. dripfetch/assets/logos/qubes.txt +21 -0
  358. dripfetch/assets/logos/qubyt.txt +15 -0
  359. dripfetch/assets/logos/quibian.txt +18 -0
  360. dripfetch/assets/logos/quirinux.txt +17 -0
  361. dripfetch/assets/logos/radix.txt +18 -0
  362. dripfetch/assets/logos/raspbian.txt +23 -0
  363. dripfetch/assets/logos/raspbian_small.txt +10 -0
  364. dripfetch/assets/logos/ravynos.txt +20 -0
  365. dripfetch/assets/logos/rebornos.txt +20 -0
  366. dripfetch/assets/logos/rebornos_small.txt +7 -0
  367. dripfetch/assets/logos/redcore.txt +16 -0
  368. dripfetch/assets/logos/redos.txt +18 -0
  369. dripfetch/assets/logos/redos_small.txt +8 -0
  370. dripfetch/assets/logos/redstar.txt +18 -0
  371. dripfetch/assets/logos/refracted_devuan.txt +18 -0
  372. dripfetch/assets/logos/regata.txt +20 -0
  373. dripfetch/assets/logos/regolith.txt +18 -0
  374. dripfetch/assets/logos/rhaymos.txt +14 -0
  375. dripfetch/assets/logos/rhel.txt +18 -0
  376. dripfetch/assets/logos/rhel_old.txt +16 -0
  377. dripfetch/assets/logos/rhel_small.txt +9 -0
  378. dripfetch/assets/logos/rhino.txt +12 -0
  379. dripfetch/assets/logos/rocky.txt +19 -0
  380. dripfetch/assets/logos/rocky_small.txt +12 -0
  381. dripfetch/assets/logos/rosa.txt +18 -0
  382. dripfetch/assets/logos/sabayon.txt +18 -0
  383. dripfetch/assets/logos/sabotage.txt +11 -0
  384. dripfetch/assets/logos/sailfish.txt +13 -0
  385. dripfetch/assets/logos/salentos.txt +20 -0
  386. dripfetch/assets/logos/salientos.txt +20 -0
  387. dripfetch/assets/logos/salix.txt +18 -0
  388. dripfetch/assets/logos/sambabox.txt +19 -0
  389. dripfetch/assets/logos/sasanqua.txt +18 -0
  390. dripfetch/assets/logos/scientific.txt +20 -0
  391. dripfetch/assets/logos/semc.txt +9 -0
  392. dripfetch/assets/logos/septor.txt +20 -0
  393. dripfetch/assets/logos/serene.txt +20 -0
  394. dripfetch/assets/logos/serpent_os.txt +18 -0
  395. dripfetch/assets/logos/sharklinux.txt +15 -0
  396. dripfetch/assets/logos/shastraos.txt +19 -0
  397. dripfetch/assets/logos/shebang.txt +20 -0
  398. dripfetch/assets/logos/siduction.txt +20 -0
  399. dripfetch/assets/logos/skiffos.txt +9 -0
  400. dripfetch/assets/logos/slackel.txt +22 -0
  401. dripfetch/assets/logos/slackware.txt +21 -0
  402. dripfetch/assets/logos/slackware_small.txt +7 -0
  403. dripfetch/assets/logos/sleeperos.txt +16 -0
  404. dripfetch/assets/logos/sleeperos_small.txt +7 -0
  405. dripfetch/assets/logos/slitaz.txt +17 -0
  406. dripfetch/assets/logos/smartos.txt +17 -0
  407. dripfetch/assets/logos/snigdhaos.txt +20 -0
  408. dripfetch/assets/logos/soda.txt +15 -0
  409. dripfetch/assets/logos/solaris.txt +8 -0
  410. dripfetch/assets/logos/solaris_small.txt +5 -0
  411. dripfetch/assets/logos/solus.txt +20 -0
  412. dripfetch/assets/logos/source_mage.txt +21 -0
  413. dripfetch/assets/logos/sparky.txt +20 -0
  414. dripfetch/assets/logos/spoinkos.txt +5 -0
  415. dripfetch/assets/logos/star.txt +19 -0
  416. dripfetch/assets/logos/steamdeck.txt +24 -0
  417. dripfetch/assets/logos/steamdeck_small.txt +5 -0
  418. dripfetch/assets/logos/steamos.txt +18 -0
  419. dripfetch/assets/logos/stock_linux.txt +19 -0
  420. dripfetch/assets/logos/sulin.txt +20 -0
  421. dripfetch/assets/logos/summitos.txt +22 -0
  422. dripfetch/assets/logos/suse.txt +11 -0
  423. dripfetch/assets/logos/swagarch.txt +15 -0
  424. dripfetch/assets/logos/t2.txt +14 -0
  425. dripfetch/assets/logos/t2_small.txt +6 -0
  426. dripfetch/assets/logos/tails.txt +19 -0
  427. dripfetch/assets/logos/tatra.txt +15 -0
  428. dripfetch/assets/logos/tearch.txt +21 -0
  429. dripfetch/assets/logos/templeos.txt +20 -0
  430. dripfetch/assets/logos/tileos.txt +20 -0
  431. dripfetch/assets/logos/torizoncore.txt +29 -0
  432. dripfetch/assets/logos/trisquel.txt +17 -0
  433. dripfetch/assets/logos/truenas_scale.txt +18 -0
  434. dripfetch/assets/logos/tuxedo_os.txt +16 -0
  435. dripfetch/assets/logos/twister.txt +23 -0
  436. dripfetch/assets/logos/ublinux.txt +19 -0
  437. dripfetch/assets/logos/ublinux_small.txt +11 -0
  438. dripfetch/assets/logos/ubuntu.txt +20 -0
  439. dripfetch/assets/logos/ubuntu_budgie.txt +20 -0
  440. dripfetch/assets/logos/ubuntu_cinnamon.txt +20 -0
  441. dripfetch/assets/logos/ubuntu_gnome.txt +16 -0
  442. dripfetch/assets/logos/ubuntu_kylin.txt +20 -0
  443. dripfetch/assets/logos/ubuntu_mate.txt +20 -0
  444. dripfetch/assets/logos/ubuntu_old.txt +20 -0
  445. dripfetch/assets/logos/ubuntu_old2.txt +18 -0
  446. dripfetch/assets/logos/ubuntu_old2_small.txt +6 -0
  447. dripfetch/assets/logos/ubuntu_small.txt +11 -0
  448. dripfetch/assets/logos/ubuntu_studio.txt +20 -0
  449. dripfetch/assets/logos/ubuntu_sway.txt +20 -0
  450. dripfetch/assets/logos/ubuntu_touch.txt +7 -0
  451. dripfetch/assets/logos/ubuntu_unity.txt +25 -0
  452. dripfetch/assets/logos/ultramarine.txt +20 -0
  453. dripfetch/assets/logos/ultramarine_small.txt +14 -0
  454. dripfetch/assets/logos/unifi.txt +6 -0
  455. dripfetch/assets/logos/univalent.txt +18 -0
  456. dripfetch/assets/logos/univention.txt +20 -0
  457. dripfetch/assets/logos/unknown.txt +18 -0
  458. dripfetch/assets/logos/uos.txt +20 -0
  459. dripfetch/assets/logos/urukos.txt +20 -0
  460. dripfetch/assets/logos/uwuntu.txt +20 -0
  461. dripfetch/assets/logos/valhalla.txt +10 -0
  462. dripfetch/assets/logos/vanilla.txt +18 -0
  463. dripfetch/assets/logos/vanilla2.txt +16 -0
  464. dripfetch/assets/logos/vanilla_small.txt +7 -0
  465. dripfetch/assets/logos/venom.txt +19 -0
  466. dripfetch/assets/logos/venom_small.txt +11 -0
  467. dripfetch/assets/logos/vnux.txt +20 -0
  468. dripfetch/assets/logos/void.txt +18 -0
  469. dripfetch/assets/logos/void2.txt +25 -0
  470. dripfetch/assets/logos/void2_small.txt +7 -0
  471. dripfetch/assets/logos/void_small.txt +7 -0
  472. dripfetch/assets/logos/vzlinux.txt +20 -0
  473. dripfetch/assets/logos/wii_linux.txt +16 -0
  474. dripfetch/assets/logos/windows.txt +16 -0
  475. dripfetch/assets/logos/windows_11.txt +17 -0
  476. dripfetch/assets/logos/windows_11_small.txt +7 -0
  477. dripfetch/assets/logos/windows_2025.txt +17 -0
  478. dripfetch/assets/logos/windows_8.txt +19 -0
  479. dripfetch/assets/logos/windows_95.txt +18 -0
  480. dripfetch/assets/logos/wolfos.txt +5 -0
  481. dripfetch/assets/logos/xcp_ng.txt +15 -0
  482. dripfetch/assets/logos/xenia.txt +15 -0
  483. dripfetch/assets/logos/xenia_old.txt +21 -0
  484. dripfetch/assets/logos/xeroarch.txt +19 -0
  485. dripfetch/assets/logos/xferience.txt +19 -0
  486. dripfetch/assets/logos/xray_os.txt +21 -0
  487. dripfetch/assets/logos/xubuntu.txt +19 -0
  488. dripfetch/assets/logos/yiffos.txt +19 -0
  489. dripfetch/assets/logos/zorin.txt +17 -0
  490. dripfetch/assets/logos/zos.txt +7 -0
  491. dripfetch/box/__init__.py +5 -0
  492. dripfetch/box/base.py +24 -0
  493. dripfetch/box/borders.py +41 -0
  494. dripfetch/box/colors.py +110 -0
  495. dripfetch/box/manager.py +181 -0
  496. dripfetch/box/placement.py +40 -0
  497. dripfetch/box/types/__init__.py +5 -0
  498. dripfetch/box/types/clock.py +487 -0
  499. dripfetch/box/types/logo.py +62 -0
  500. dripfetch/box/types/sysinfo.py +570 -0
  501. dripfetch/box/types/text.py +16 -0
  502. dripfetch/box/types/weather.py +181 -0
  503. dripfetch/cli.py +58 -0
  504. dripfetch/config.py +405 -0
  505. dripfetch/default_config.yaml +80 -0
  506. dripfetch/rain/__init__.py +3 -0
  507. dripfetch/rain/collision.py +23 -0
  508. dripfetch/rain/colors.py +51 -0
  509. dripfetch/rain/drop.py +16 -0
  510. dripfetch/rain/engine.py +190 -0
  511. dripfetch/rain/movement.py +46 -0
  512. dripfetch/rain/spawning.py +59 -0
  513. dripfetch/terminal.py +193 -0
  514. dripfetch-0.1.0.dist-info/METADATA +47 -0
  515. dripfetch-0.1.0.dist-info/RECORD +519 -0
  516. dripfetch-0.1.0.dist-info/WHEEL +5 -0
  517. dripfetch-0.1.0.dist-info/entry_points.txt +2 -0
  518. dripfetch-0.1.0.dist-info/licenses/LICENSE +21 -0
  519. dripfetch-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,80 @@
1
+ background: "#000000"
2
+
3
+ rain:
4
+ collision: true
5
+ intensity: 100
6
+ character: "│"
7
+ colors:
8
+ - [0.50, "#FFFFFF"]
9
+ - [0.50, "#8747FF"]
10
+ speeds:
11
+ - [0.20, 21]
12
+ - [0.20, 31]
13
+ - [0.20, 41]
14
+ - [0.20, 51]
15
+ - [0.20, 61]
16
+ lengths:
17
+ - [0.70, 5]
18
+ - [0.25, 15]
19
+ - [0.05, 25]
20
+
21
+ boxes:
22
+ border: single
23
+ border_color: "#FFFFFF"
24
+ text_color: "#FFFFFF"
25
+ accent_color: "#8747FF"
26
+ padding:
27
+ horizontal: 3
28
+ vertical: 1
29
+
30
+ items:
31
+ - type: logo
32
+ logo: macos3
33
+ colors:
34
+ - "#FFFFFF"
35
+ - "#5DFF9C"
36
+ - "#8747FF"
37
+ - "#FF5681"
38
+ position:
39
+ horizontal: -42
40
+ vertical: -12
41
+
42
+ - type: text
43
+ text: "Introducing Dripfetch | 0.1.0"
44
+ colors:
45
+ text: "#FFFFFF"
46
+ title: "#8747FF"
47
+ line: "#8747FF"
48
+ position:
49
+ horizontal: 4
50
+ vertical: -17
51
+
52
+
53
+
54
+ - type: sysinfo
55
+ colors:
56
+ text: "#FFFFFF"
57
+ title: "#8747FF"
58
+ line: "#8747FF"
59
+ position:
60
+ horizontal: 28
61
+ vertical: 3
62
+
63
+ - type: clock
64
+ position:
65
+ horizontal: -40
66
+ vertical: 17
67
+ clock_style: double
68
+ clock_size: medium
69
+ clock_24h: true
70
+ show_seconds: false
71
+ show_am_pm: false
72
+ blink_colon: true
73
+ show_date: true
74
+
75
+ - type: weather
76
+ location: Tehran
77
+ units: metric
78
+ position:
79
+ horizontal: -39
80
+ vertical: 5
@@ -0,0 +1,3 @@
1
+ from .engine import Rain
2
+
3
+ __all__ = ["Rain"]
@@ -0,0 +1,23 @@
1
+ BOX_PADDING = 2
2
+
3
+
4
+ def collision(x, old_y, new_y, bounds, enabled, width):
5
+ if not enabled:
6
+ return None
7
+ for left, top, right, bottom in bounds:
8
+ if old_y < top <= new_y and left <= x <= right:
9
+ targets = (
10
+ max(0, left - BOX_PADDING),
11
+ min(width - 1, right + BOX_PADDING),
12
+ )
13
+ return min(
14
+ targets,
15
+ key=lambda target: abs(x - target),
16
+ ), top
17
+ return None
18
+
19
+
20
+ def inside_box(x, y, bounds):
21
+ return any(
22
+ left <= x <= right and top <= y <= bottom for left, top, right, bottom in bounds
23
+ )
@@ -0,0 +1,51 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass(frozen=True)
5
+ class RGBA:
6
+ r: int
7
+ g: int
8
+ b: int
9
+ a: int = 255
10
+
11
+
12
+ def get_rgb(color):
13
+ color = color.lstrip("#")
14
+ if len(color) == 6:
15
+ color += "FF"
16
+ if len(color) != 8:
17
+ raise ValueError(f"Invalid color: #{color}")
18
+ try:
19
+ return RGBA(
20
+ int(color[0:2], 16),
21
+ int(color[2:4], 16),
22
+ int(color[4:6], 16),
23
+ int(color[6:8], 16),
24
+ )
25
+ except ValueError as exc:
26
+ raise ValueError(f"Invalid color: #{color}") from exc
27
+
28
+
29
+ class ColorManager:
30
+ def __init__(self):
31
+ self.colors = {}
32
+
33
+ def create_pairs(self, colors, background=None):
34
+ self.colors = {color: get_rgb(color) for color in colors}
35
+
36
+ def attribute(self, color, tail, length):
37
+ base = self.colors.get(color, get_rgb("#FFFFFF"))
38
+ brightness = (
39
+ 1.0
40
+ if length <= 1
41
+ else max(
42
+ 0.0,
43
+ min(1.0, 1 - tail / (length - 1)),
44
+ )
45
+ )
46
+ return RGBA(
47
+ round(base.r * brightness),
48
+ round(base.g * brightness),
49
+ round(base.b * brightness),
50
+ base.a,
51
+ )
dripfetch/rain/drop.py ADDED
@@ -0,0 +1,16 @@
1
+ import time
2
+ from collections import deque
3
+ from dataclasses import dataclass, field
4
+
5
+
6
+ @dataclass
7
+ class Drop:
8
+ x: int
9
+ head_y: int = -1
10
+ speed: float = 50
11
+ length: int = 5
12
+ color: str = "#FFFFFF"
13
+ path: deque = field(default_factory=deque)
14
+ redirect_target: int | None = None
15
+ active: bool = True
16
+ last_move: float = field(default_factory=time.monotonic)
@@ -0,0 +1,190 @@
1
+ import time
2
+
3
+ from .collision import collision, inside_box
4
+ from .colors import ColorManager
5
+ from .movement import move_down, move_horizontal
6
+ from .spawning import spawn
7
+
8
+
9
+ class Rain:
10
+ def __init__(self, stdscr, config, box, renderer):
11
+ self.stdscr = stdscr
12
+ self.config = config
13
+ self.box = box
14
+ self.renderer = renderer
15
+ self.height, self.width = stdscr.getmaxyx()
16
+ self.drops = []
17
+ self.colors = ColorManager()
18
+ self.paused_at = None
19
+ self.spawned = 0
20
+ self.spawned_at = time.monotonic()
21
+ rain = config.get("rain", {})
22
+ self.collision = rain.get("collision", True)
23
+ self.intensity = max(0, float(rain.get("intensity", 1)))
24
+ self.character = rain.get("character", "│")
25
+ self.speeds = rain.get("speeds", [])
26
+ self.lengths = rain.get("lengths", [])
27
+ self.rain_colors = rain.get("colors", [])
28
+ colors = dict.fromkeys(color for _, color in self.rain_colors)
29
+ self.colors.create_pairs(colors or ["#FFFFFF"])
30
+
31
+ def _spawn(self, now):
32
+ self.spawned, self.spawned_at = spawn(
33
+ self.drops,
34
+ self.width,
35
+ self.intensity,
36
+ self.spawned,
37
+ self.spawned_at,
38
+ now,
39
+ self.speeds,
40
+ self.lengths,
41
+ self.rain_colors,
42
+ )
43
+
44
+ def _collision(self, x, old_y, new_y, bounds):
45
+ return collision(
46
+ x,
47
+ old_y,
48
+ new_y,
49
+ bounds,
50
+ self.collision,
51
+ self.width,
52
+ )
53
+
54
+ @staticmethod
55
+ def _inside_box(x, y, bounds):
56
+ return inside_box(x, y, bounds)
57
+
58
+ @staticmethod
59
+ def _inside_box(x, y, bounds):
60
+ return inside_box(x, y, bounds)
61
+
62
+ def _move_horizontal(self, drop):
63
+ move_horizontal(drop)
64
+
65
+ def _move_down(self, drop, bounds):
66
+ move_down(
67
+ drop,
68
+ bounds,
69
+ self.collision,
70
+ self.width,
71
+ self.character,
72
+ )
73
+
74
+ def _update_drop(self, drop, now, bounds):
75
+ if not drop.active:
76
+ return
77
+ interval = max(1.0, float(drop.speed)) / 1000
78
+ elapsed = now - drop.last_move
79
+ if elapsed < interval:
80
+ return
81
+ steps = min(
82
+ max(1, int(elapsed / interval)),
83
+ 8,
84
+ )
85
+ for _ in range(steps):
86
+ if drop.redirect_target is None:
87
+ self._move_down(drop, bounds)
88
+ else:
89
+ self._move_horizontal(drop)
90
+ if drop.head_y - drop.length >= self.height:
91
+ drop.active = False
92
+ break
93
+ drop.last_move = now
94
+
95
+ def _draw_drop(self, drop, bounds):
96
+ if not drop.active:
97
+ return
98
+ for tail, (x, y, character) in enumerate(reversed(drop.path)):
99
+ if tail >= drop.length:
100
+ break
101
+ if not (0 <= x < self.width and 0 <= y < self.height):
102
+ continue
103
+ if not self.collision and self._inside_box(
104
+ x,
105
+ y,
106
+ bounds,
107
+ ):
108
+ continue
109
+ self.renderer.draw(
110
+ x,
111
+ y,
112
+ character,
113
+ self.colors.attribute(
114
+ drop.color,
115
+ tail,
116
+ drop.length,
117
+ ),
118
+ )
119
+
120
+ def update(self):
121
+ now = time.monotonic()
122
+ bounds = self.box.get_box_bounds_list()
123
+ self._spawn(now)
124
+ alive = []
125
+ for drop in self.drops:
126
+ self._update_drop(
127
+ drop,
128
+ now,
129
+ bounds,
130
+ )
131
+ if drop.active:
132
+ alive.append(drop)
133
+ self.drops = alive
134
+
135
+ def draw(self):
136
+ bounds = self.box.get_box_bounds_list()
137
+ for drop in self.drops:
138
+ self._draw_drop(
139
+ drop,
140
+ bounds,
141
+ )
142
+
143
+ def pause(self):
144
+ if self.paused_at is None:
145
+ self.paused_at = time.monotonic()
146
+
147
+ def resume(self):
148
+ if self.paused_at is None:
149
+ return
150
+ delay = time.monotonic() - self.paused_at
151
+ for drop in self.drops:
152
+ drop.last_move += delay
153
+ self.spawned_at += delay
154
+ self.paused_at = None
155
+
156
+ def reset_timing(self):
157
+ now = time.monotonic()
158
+ for drop in self.drops:
159
+ drop.last_move = now
160
+ self.spawned_at = now
161
+ self.spawned = 0
162
+
163
+ def resize(self):
164
+ height, width = self.stdscr.getmaxyx()
165
+ if (height, width) == (self.height, self.width):
166
+ return False
167
+ self.height = height
168
+ self.width = width
169
+ if self.width <= 0 or self.height <= 0:
170
+ self.drops.clear()
171
+ self.reset_timing()
172
+ return True
173
+ alive = []
174
+ for drop in self.drops:
175
+ if drop.x < 0 or drop.x >= self.width:
176
+ drop.active = False
177
+ continue
178
+ if drop.head_y - drop.length >= self.height:
179
+ drop.active = False
180
+ continue
181
+ if drop.redirect_target is not None:
182
+ if not 0 <= drop.redirect_target < self.width:
183
+ drop.redirect_target = None
184
+ alive.append(drop)
185
+ self.drops = alive
186
+ self.reset_timing()
187
+ return True
188
+
189
+ def close(self):
190
+ self.drops.clear()
@@ -0,0 +1,46 @@
1
+ from .collision import collision
2
+
3
+
4
+ def move_horizontal(drop):
5
+ target = drop.redirect_target
6
+ if target is None:
7
+ return
8
+ direction = 1 if target > drop.x else -1
9
+ drop.x += direction
10
+ drop.path.append((drop.x, drop.head_y, "─"))
11
+ if drop.x == target:
12
+ drop.path[-1] = (
13
+ drop.x,
14
+ drop.head_y,
15
+ "┐" if direction > 0 else "┌",
16
+ )
17
+ drop.redirect_target = None
18
+
19
+
20
+ def move_down(drop, bounds, collision_enabled, width, character):
21
+ old_x = drop.x
22
+ old_y = drop.head_y
23
+ hit = collision(
24
+ old_x,
25
+ old_y,
26
+ old_y + 1,
27
+ bounds,
28
+ collision_enabled,
29
+ width,
30
+ )
31
+ if hit:
32
+ target, top = hit
33
+ drop.head_y = top - 1
34
+ drop.redirect_target = target
35
+ corner = "└" if target > old_x else "┘"
36
+ if drop.path:
37
+ drop.path[-1] = (
38
+ old_x,
39
+ drop.head_y,
40
+ corner,
41
+ )
42
+ else:
43
+ drop.path.append((old_x, drop.head_y, corner))
44
+ return
45
+ drop.head_y += 1
46
+ drop.path.append((drop.x, drop.head_y, character))
@@ -0,0 +1,59 @@
1
+ import random
2
+ from collections import deque
3
+
4
+ from .drop import Drop
5
+
6
+ SPAWN_INTERVAL = 5
7
+
8
+
9
+ def choose(values, default):
10
+ if not values:
11
+ return default
12
+ return random.choices(
13
+ [value for _, value in values],
14
+ [weight for weight, _ in values],
15
+ )[0]
16
+
17
+
18
+ def new_drop(width, speeds, lengths, rain_colors):
19
+ if width <= 0:
20
+ return None
21
+ length = max(1, int(choose(lengths, 5)))
22
+ return Drop(
23
+ x=random.randrange(width),
24
+ head_y=-1,
25
+ speed=max(1, float(choose(speeds, 50))),
26
+ length=length,
27
+ color=choose(rain_colors, "#FFFFFF"),
28
+ path=deque(maxlen=length),
29
+ )
30
+
31
+
32
+ def spawn(
33
+ drops,
34
+ width,
35
+ intensity,
36
+ spawned,
37
+ spawned_at,
38
+ now,
39
+ speeds,
40
+ lengths,
41
+ rain_colors,
42
+ ):
43
+ if not intensity or not width:
44
+ return spawned, now
45
+ elapsed = min(now - spawned_at, 0.25)
46
+ spawned_at = now
47
+ spawned += elapsed * intensity / SPAWN_INTERVAL
48
+ count = int(spawned)
49
+ spawned -= count
50
+ for _ in range(count):
51
+ drop = new_drop(
52
+ width,
53
+ speeds,
54
+ lengths,
55
+ rain_colors,
56
+ )
57
+ if drop is not None:
58
+ drops.append(drop)
59
+ return spawned, spawned_at
dripfetch/terminal.py ADDED
@@ -0,0 +1,193 @@
1
+ import curses
2
+ import os
3
+ import sys
4
+
5
+
6
+ class RGBA:
7
+ __slots__ = ("a", "b", "g", "r")
8
+
9
+ def __init__(
10
+ self,
11
+ r,
12
+ g,
13
+ b,
14
+ a=255,
15
+ ):
16
+ self.r = r
17
+ self.g = g
18
+ self.b = b
19
+ self.a = a
20
+
21
+ def __eq__(self, other):
22
+ if not isinstance(other, RGBA):
23
+ return NotImplemented
24
+ return (
25
+ self.r == other.r
26
+ and self.g == other.g
27
+ and self.b == other.b
28
+ and self.a == other.a
29
+ )
30
+
31
+ def __hash__(self):
32
+ return hash(
33
+ (
34
+ self.r,
35
+ self.g,
36
+ self.b,
37
+ self.a,
38
+ )
39
+ )
40
+
41
+
42
+ def parse_color(value):
43
+ value = value.lstrip("#")
44
+ if len(value) == 6:
45
+ value += "FF"
46
+ if len(value) != 8:
47
+ raise ValueError(f"Invalid color: #{value}")
48
+ try:
49
+ return RGBA(
50
+ int(value[0:2], 16),
51
+ int(value[2:4], 16),
52
+ int(value[4:6], 16),
53
+ int(value[6:8], 16),
54
+ )
55
+ except ValueError as exc:
56
+ raise ValueError(f"Invalid color: #{value}") from exc
57
+
58
+
59
+ class Renderer:
60
+ def __init__(
61
+ self,
62
+ stdscr,
63
+ background,
64
+ ):
65
+ self.stdscr = stdscr
66
+ self.background = background
67
+ self.width = 0
68
+ self.height = 0
69
+ self.current = {}
70
+
71
+ def resize(self):
72
+ height, width = self.stdscr.getmaxyx()
73
+ if width == self.width and height == self.height:
74
+ return False
75
+ self.width = width
76
+ self.height = height
77
+ self.current.clear()
78
+ try:
79
+ curses.resizeterm(
80
+ height,
81
+ width,
82
+ )
83
+ except curses.error:
84
+ pass
85
+ return True
86
+
87
+ def begin(self):
88
+ resized = self.resize()
89
+ self.current = {
90
+ (x, y): (
91
+ " ",
92
+ None,
93
+ self.background,
94
+ )
95
+ for y in range(self.height)
96
+ for x in range(self.width)
97
+ }
98
+ return resized
99
+
100
+ def draw(
101
+ self,
102
+ x,
103
+ y,
104
+ text,
105
+ foreground=None,
106
+ background=None,
107
+ ):
108
+ if not text or y < 0 or y >= self.height:
109
+ return
110
+ background = self.background if background is None else background
111
+ start = max(0, x)
112
+ end = min(
113
+ x + len(text),
114
+ self.width,
115
+ )
116
+ for column in range(start, end):
117
+ self.current[(column, y)] = (
118
+ text[column - x],
119
+ foreground,
120
+ background,
121
+ )
122
+
123
+ def _foreground(self, color):
124
+ if color is None:
125
+ return "\x1b[39m"
126
+ return f"\x1b[38;2;{color.r};{color.g};{color.b}m"
127
+
128
+ def _background_color(self, color):
129
+ if color is None:
130
+ color = self.background
131
+ if not color.a:
132
+ return "\x1b[49m"
133
+ return f"\x1b[48;2;{color.r};{color.g};{color.b}m"
134
+
135
+ def end(self):
136
+ output = ["\x1b[H"]
137
+ foreground = None
138
+ background = None
139
+ last_x = -1
140
+ last_y = -1
141
+ for (x, y), (
142
+ character,
143
+ color,
144
+ bg,
145
+ ) in sorted(
146
+ self.current.items(),
147
+ key=lambda item: item[0][1],
148
+ ):
149
+ if y != last_y or x != last_x:
150
+ output.append(f"\x1b[{y + 1};{x + 1}H")
151
+ if color != foreground:
152
+ output.append(self._foreground(color))
153
+ foreground = color
154
+ if bg != background:
155
+ output.append(self._background_color(bg))
156
+ background = bg
157
+ output.append(character)
158
+ last_x = x + 1
159
+ last_y = y
160
+ output.append("\x1b[0m")
161
+ try:
162
+ os.write(
163
+ sys.stdout.fileno(),
164
+ "".join(output).encode(),
165
+ )
166
+ except OSError:
167
+ pass
168
+
169
+
170
+ def terminal_write(sequence):
171
+ try:
172
+ os.write(
173
+ sys.stdout.fileno(),
174
+ sequence.encode(),
175
+ )
176
+ except OSError:
177
+ pass
178
+
179
+
180
+ def setup(stdscr):
181
+ curses.curs_set(0)
182
+ curses.noecho()
183
+ curses.cbreak()
184
+ curses.start_color()
185
+ curses.use_default_colors()
186
+ curses.mousemask(curses.BUTTON1_CLICKED)
187
+ stdscr.keypad(True)
188
+ stdscr.leaveok(True)
189
+ terminal_write("\x1b[?1049h\x1b[?25l\x1b[0m\x1b[2J\x1b[H")
190
+
191
+
192
+ def cleanup():
193
+ terminal_write("\x1b[0m\x1b[?25h\x1b[?1049l")
@@ -0,0 +1,47 @@
1
+ Metadata-Version: 2.4
2
+ Name: dripfetch
3
+ Version: 0.1.0
4
+ Summary: A customizable terminal system information display with animated rain.
5
+ Author: Amir Shygun
6
+ License: MIT License
7
+
8
+ Copyright (c) 2026 Amir Shygun
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Keywords: terminal,system information,fetch,curses,cli
29
+ Classifier: Development Status :: 3 - Alpha
30
+ Classifier: Environment :: Console
31
+ Classifier: Intended Audience :: End Users/Desktop
32
+ Classifier: Operating System :: MacOS
33
+ Classifier: Operating System :: POSIX
34
+ Classifier: Programming Language :: Python :: 3
35
+ Classifier: Programming Language :: Python :: 3 :: Only
36
+ Classifier: Programming Language :: Python :: 3.12
37
+ Classifier: Topic :: System
38
+ Classifier: Topic :: Terminals
39
+ Requires-Python: >=3.12
40
+ Description-Content-Type: text/markdown
41
+ License-File: LICENSE
42
+ Requires-Dist: psutil
43
+ Requires-Dist: ruamel.yaml
44
+ Dynamic: license-file
45
+
46
+ # dripfetch
47
+ A customizable terminal system information display with animated rain.