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.
- dripfetch/__init__.py +1 -0
- dripfetch/__main__.py +4 -0
- dripfetch/app.py +111 -0
- dripfetch/assets/logos/adelie.txt +16 -0
- dripfetch/assets/logos/aeon.txt +14 -0
- dripfetch/assets/logos/aeros.txt +21 -0
- dripfetch/assets/logos/aerynos.txt +16 -0
- dripfetch/assets/logos/afterglow.txt +15 -0
- dripfetch/assets/logos/aix.txt +20 -0
- dripfetch/assets/logos/almalinux.txt +20 -0
- dripfetch/assets/logos/alpine.txt +20 -0
- dripfetch/assets/logos/alpine2.txt +16 -0
- dripfetch/assets/logos/alpine2_small.txt +6 -0
- dripfetch/assets/logos/alpine3_small.txt +6 -0
- dripfetch/assets/logos/alpine_small.txt +6 -0
- dripfetch/assets/logos/alter.txt +20 -0
- dripfetch/assets/logos/altlinux.txt +22 -0
- dripfetch/assets/logos/amazon.txt +19 -0
- dripfetch/assets/logos/amazon_linux.txt +10 -0
- dripfetch/assets/logos/amogos.txt +19 -0
- dripfetch/assets/logos/anarchy.txt +28 -0
- dripfetch/assets/logos/android.txt +18 -0
- dripfetch/assets/logos/android_small.txt +6 -0
- dripfetch/assets/logos/anduinos.txt +19 -0
- dripfetch/assets/logos/antergos.txt +19 -0
- dripfetch/assets/logos/antix.txt +12 -0
- dripfetch/assets/logos/anushos.txt +20 -0
- dripfetch/assets/logos/aoscos.txt +17 -0
- dripfetch/assets/logos/aoscos_old.txt +20 -0
- dripfetch/assets/logos/aoscosretro.txt +18 -0
- dripfetch/assets/logos/aoscosretro_small.txt +9 -0
- dripfetch/assets/logos/aperture.txt +20 -0
- dripfetch/assets/logos/apricity.txt +18 -0
- dripfetch/assets/logos/arch.txt +19 -0
- dripfetch/assets/logos/arch2.txt +19 -0
- dripfetch/assets/logos/arch3.txt +19 -0
- dripfetch/assets/logos/arch_old.txt +16 -0
- dripfetch/assets/logos/arch_small.txt +7 -0
- dripfetch/assets/logos/archbox.txt +19 -0
- dripfetch/assets/logos/archcraft.txt +20 -0
- dripfetch/assets/logos/archcraft2.txt +20 -0
- dripfetch/assets/logos/archlabs.txt +21 -0
- dripfetch/assets/logos/archstrike.txt +17 -0
- dripfetch/assets/logos/arco.txt +20 -0
- dripfetch/assets/logos/arco_small.txt +11 -0
- dripfetch/assets/logos/arkane.txt +23 -0
- dripfetch/assets/logos/armbian.txt +22 -0
- dripfetch/assets/logos/armbian2.txt +14 -0
- dripfetch/assets/logos/arselinux.txt +15 -0
- dripfetch/assets/logos/artix.txt +20 -0
- dripfetch/assets/logos/artix2_small.txt +13 -0
- dripfetch/assets/logos/artix_small.txt +7 -0
- dripfetch/assets/logos/arya.txt +15 -0
- dripfetch/assets/logos/asahi.txt +18 -0
- dripfetch/assets/logos/asahi2.txt +18 -0
- dripfetch/assets/logos/aster.txt +18 -0
- dripfetch/assets/logos/asteroidos.txt +17 -0
- dripfetch/assets/logos/astos.txt +23 -0
- dripfetch/assets/logos/astra_linux.txt +22 -0
- dripfetch/assets/logos/athenaos.txt +29 -0
- dripfetch/assets/logos/athenaos_old.txt +24 -0
- dripfetch/assets/logos/aurora.txt +28 -0
- dripfetch/assets/logos/axos.txt +16 -0
- dripfetch/assets/logos/azos.txt +17 -0
- dripfetch/assets/logos/bedrock.txt +17 -0
- dripfetch/assets/logos/bedrock_small.txt +6 -0
- dripfetch/assets/logos/biglinux.txt +19 -0
- dripfetch/assets/logos/bitrig.txt +17 -0
- dripfetch/assets/logos/blackarch.txt +21 -0
- dripfetch/assets/logos/blackmesa.txt +20 -0
- dripfetch/assets/logos/blackpanther.txt +23 -0
- dripfetch/assets/logos/blag.txt +17 -0
- dripfetch/assets/logos/blankon.txt +17 -0
- dripfetch/assets/logos/bluelight.txt +19 -0
- dripfetch/assets/logos/bodhi.txt +18 -0
- dripfetch/assets/logos/bonsai.txt +16 -0
- dripfetch/assets/logos/bredos.txt +9 -0
- dripfetch/assets/logos/bsd.txt +19 -0
- dripfetch/assets/logos/bunsenlabs.txt +20 -0
- dripfetch/assets/logos/cachyos.txt +22 -0
- dripfetch/assets/logos/cachyos_small.txt +8 -0
- dripfetch/assets/logos/calculate.txt +20 -0
- dripfetch/assets/logos/calinixos.txt +25 -0
- dripfetch/assets/logos/calinixos_small.txt +15 -0
- dripfetch/assets/logos/carbs.txt +18 -0
- dripfetch/assets/logos/cbl_mariner.txt +18 -0
- dripfetch/assets/logos/celos.txt +15 -0
- dripfetch/assets/logos/center.txt +13 -0
- dripfetch/assets/logos/centos.txt +19 -0
- dripfetch/assets/logos/centos_small.txt +7 -0
- dripfetch/assets/logos/cereus.txt +27 -0
- dripfetch/assets/logos/chakra.txt +18 -0
- dripfetch/assets/logos/chaletos.txt +20 -0
- dripfetch/assets/logos/chapeau.txt +18 -0
- dripfetch/assets/logos/chimera_linux.txt +18 -0
- dripfetch/assets/logos/chonkysealos.txt +21 -0
- dripfetch/assets/logos/chrom.txt +18 -0
- dripfetch/assets/logos/cleanjaro.txt +12 -0
- dripfetch/assets/logos/cleanjaro_small.txt +7 -0
- dripfetch/assets/logos/clear_linux.txt +20 -0
- dripfetch/assets/logos/clearos.txt +20 -0
- dripfetch/assets/logos/clover.txt +20 -0
- dripfetch/assets/logos/cobalt.txt +16 -0
- dripfetch/assets/logos/codex.txt +12 -0
- dripfetch/assets/logos/condres.txt +17 -0
- dripfetch/assets/logos/cosmic.txt +11 -0
- dripfetch/assets/logos/crux.txt +18 -0
- dripfetch/assets/logos/crux_small.txt +7 -0
- dripfetch/assets/logos/crystal.txt +20 -0
- dripfetch/assets/logos/cucumber.txt +20 -0
- dripfetch/assets/logos/cuerdos.txt +13 -0
- dripfetch/assets/logos/cutefishos.txt +9 -0
- dripfetch/assets/logos/cuteos.txt +14 -0
- dripfetch/assets/logos/cyberos.txt +15 -0
- dripfetch/assets/logos/cycledream.txt +21 -0
- dripfetch/assets/logos/dahlia.txt +17 -0
- dripfetch/assets/logos/darkos.txt +20 -0
- dripfetch/assets/logos/debian.txt +17 -0
- dripfetch/assets/logos/debian_small.txt +6 -0
- dripfetch/assets/logos/deepin.txt +18 -0
- dripfetch/assets/logos/desaos.txt +16 -0
- dripfetch/assets/logos/devuan.txt +15 -0
- dripfetch/assets/logos/devuan_small.txt +7 -0
- dripfetch/assets/logos/dietpi.txt +19 -0
- dripfetch/assets/logos/dracos.txt +13 -0
- dripfetch/assets/logos/dragonfly.txt +15 -0
- dripfetch/assets/logos/dragonfly_old.txt +17 -0
- dripfetch/assets/logos/dragonfly_small.txt +7 -0
- dripfetch/assets/logos/drauger.txt +16 -0
- dripfetch/assets/logos/droidian.txt +15 -0
- dripfetch/assets/logos/elbrus.txt +14 -0
- dripfetch/assets/logos/elementary.txt +17 -0
- dripfetch/assets/logos/elementary_small.txt +6 -0
- dripfetch/assets/logos/elive.txt +17 -0
- dripfetch/assets/logos/encryptos.txt +13 -0
- dripfetch/assets/logos/endeavouros.txt +15 -0
- dripfetch/assets/logos/endeavouros_small.txt +7 -0
- dripfetch/assets/logos/endless.txt +20 -0
- dripfetch/assets/logos/enso.txt +19 -0
- dripfetch/assets/logos/eshanizedos.txt +27 -0
- dripfetch/assets/logos/eurolinux.txt +18 -0
- dripfetch/assets/logos/evolutionos.txt +21 -0
- dripfetch/assets/logos/evolutionos_old.txt +18 -0
- dripfetch/assets/logos/evolutionos_small.txt +9 -0
- dripfetch/assets/logos/eweos.txt +15 -0
- dripfetch/assets/logos/exherbo.txt +22 -0
- dripfetch/assets/logos/exodia_predator.txt +24 -0
- dripfetch/assets/logos/fastfetch.txt +11 -0
- dripfetch/assets/logos/fedora.txt +19 -0
- dripfetch/assets/logos/fedora2_small.txt +5 -0
- dripfetch/assets/logos/fedora_coreos.txt +20 -0
- dripfetch/assets/logos/fedora_kinoite.txt +18 -0
- dripfetch/assets/logos/fedora_old.txt +17 -0
- dripfetch/assets/logos/fedora_sericea.txt +17 -0
- dripfetch/assets/logos/fedora_silverblue.txt +17 -0
- dripfetch/assets/logos/fedora_small.txt +9 -0
- dripfetch/assets/logos/femboyos.txt +20 -0
- dripfetch/assets/logos/feren.txt +16 -0
- dripfetch/assets/logos/filotimo.txt +20 -0
- dripfetch/assets/logos/finnix.txt +17 -0
- dripfetch/assets/logos/floflis.txt +19 -0
- dripfetch/assets/logos/freebsd.txt +15 -0
- dripfetch/assets/logos/freebsd_small.txt +6 -0
- dripfetch/assets/logos/freemint.txt +15 -0
- dripfetch/assets/logos/frugalware.txt +23 -0
- dripfetch/assets/logos/funtoo.txt +10 -0
- dripfetch/assets/logos/furreto.txt +22 -0
- dripfetch/assets/logos/galliumos.txt +19 -0
- dripfetch/assets/logos/garuda.txt +18 -0
- dripfetch/assets/logos/garuda_dragon.txt +24 -0
- dripfetch/assets/logos/garuda_small.txt +5 -0
- dripfetch/assets/logos/gentoo.txt +18 -0
- dripfetch/assets/logos/gentoo_small.txt +7 -0
- dripfetch/assets/logos/ghostbsd.txt +13 -0
- dripfetch/assets/logos/ghostfreak.txt +19 -0
- dripfetch/assets/logos/glaucus.txt +12 -0
- dripfetch/assets/logos/gnewsense.txt +12 -0
- dripfetch/assets/logos/gnome.txt +21 -0
- dripfetch/assets/logos/gnu.txt +18 -0
- dripfetch/assets/logos/gobolinux.txt +6 -0
- dripfetch/assets/logos/goldendoglinux.txt +19 -0
- dripfetch/assets/logos/grapheneos.txt +23 -0
- dripfetch/assets/logos/grombyang.txt +18 -0
- dripfetch/assets/logos/guix.txt +10 -0
- dripfetch/assets/logos/guix_small.txt +7 -0
- dripfetch/assets/logos/haiku.txt +12 -0
- dripfetch/assets/logos/haiku2.txt +17 -0
- dripfetch/assets/logos/haiku_small.txt +8 -0
- dripfetch/assets/logos/hamonikr.txt +23 -0
- dripfetch/assets/logos/hardclanz.txt +19 -0
- dripfetch/assets/logos/harmonyos.txt +19 -0
- dripfetch/assets/logos/hash.txt +13 -0
- dripfetch/assets/logos/hce.txt +24 -0
- dripfetch/assets/logos/heliumos.txt +20 -0
- dripfetch/assets/logos/huayra.txt +17 -0
- dripfetch/assets/logos/hybrid.txt +16 -0
- dripfetch/assets/logos/hydrapwk.txt +11 -0
- dripfetch/assets/logos/hydroos.txt +8 -0
- dripfetch/assets/logos/hyperbola.txt +16 -0
- dripfetch/assets/logos/hyperbola_small.txt +7 -0
- dripfetch/assets/logos/hypros.txt +17 -0
- dripfetch/assets/logos/iglunix.txt +12 -0
- dripfetch/assets/logos/instantos.txt +20 -0
- dripfetch/assets/logos/interix.txt +17 -0
- dripfetch/assets/logos/irix.txt +19 -0
- dripfetch/assets/logos/ironclad.txt +11 -0
- dripfetch/assets/logos/itc.txt +10 -0
- dripfetch/assets/logos/januslinux.txt +24 -0
- dripfetch/assets/logos/kaisen.txt +17 -0
- dripfetch/assets/logos/kali.txt +21 -0
- dripfetch/assets/logos/kali_small.txt +16 -0
- dripfetch/assets/logos/kalpa_desktop.txt +22 -0
- dripfetch/assets/logos/kaos.txt +16 -0
- dripfetch/assets/logos/kdelinux.txt +14 -0
- dripfetch/assets/logos/kdeneon.txt +19 -0
- dripfetch/assets/logos/kernelos.txt +19 -0
- dripfetch/assets/logos/kibojoe.txt +13 -0
- dripfetch/assets/logos/kiss.txt +7 -0
- dripfetch/assets/logos/kogaion.txt +20 -0
- dripfetch/assets/logos/korora.txt +16 -0
- dripfetch/assets/logos/krassos.txt +19 -0
- dripfetch/assets/logos/kslinux.txt +11 -0
- dripfetch/assets/logos/kubuntu.txt +20 -0
- dripfetch/assets/logos/kylin.txt +22 -0
- dripfetch/assets/logos/lainos.txt +20 -0
- dripfetch/assets/logos/langitketujuh.txt +11 -0
- dripfetch/assets/logos/laxeros.txt +20 -0
- dripfetch/assets/logos/lede.txt +9 -0
- dripfetch/assets/logos/lfs.txt +18 -0
- dripfetch/assets/logos/libreelec.txt +20 -0
- dripfetch/assets/logos/lilidog.txt +16 -0
- dripfetch/assets/logos/lingmo.txt +20 -0
- dripfetch/assets/logos/linspire.txt +12 -0
- dripfetch/assets/logos/linux.txt +12 -0
- dripfetch/assets/logos/linux_small.txt +7 -0
- dripfetch/assets/logos/linuxlite.txt +20 -0
- dripfetch/assets/logos/linuxlite_small.txt +7 -0
- dripfetch/assets/logos/linuxmint.txt +19 -0
- dripfetch/assets/logos/linuxmint_old.txt +16 -0
- dripfetch/assets/logos/linuxmint_small.txt +7 -0
- dripfetch/assets/logos/live_raizo.txt +20 -0
- dripfetch/assets/logos/lliurex.txt +16 -0
- dripfetch/assets/logos/lmde.txt +17 -0
- dripfetch/assets/logos/locos.txt +18 -0
- dripfetch/assets/logos/lubuntu.txt +20 -0
- dripfetch/assets/logos/lunar.txt +13 -0
- dripfetch/assets/logos/macos.txt +17 -0
- dripfetch/assets/logos/macos2.txt +17 -0
- dripfetch/assets/logos/macos2_small.txt +7 -0
- dripfetch/assets/logos/macos3.txt +16 -0
- dripfetch/assets/logos/macos_small.txt +7 -0
- dripfetch/assets/logos/mageia.txt +19 -0
- dripfetch/assets/logos/mageia_small.txt +7 -0
- dripfetch/assets/logos/magix.txt +19 -0
- dripfetch/assets/logos/magpieos.txt +20 -0
- dripfetch/assets/logos/mainsailos.txt +18 -0
- dripfetch/assets/logos/mainsailos_small.txt +7 -0
- dripfetch/assets/logos/mandriva.txt +15 -0
- dripfetch/assets/logos/manjaro.txt +14 -0
- dripfetch/assets/logos/manjaro_small.txt +7 -0
- dripfetch/assets/logos/massos.txt +18 -0
- dripfetch/assets/logos/matuusos.txt +20 -0
- dripfetch/assets/logos/maui.txt +20 -0
- dripfetch/assets/logos/mauna.txt +15 -0
- dripfetch/assets/logos/meowix.txt +10 -0
- dripfetch/assets/logos/mer.txt +27 -0
- dripfetch/assets/logos/midnightbsd.txt +16 -0
- dripfetch/assets/logos/midos.txt +20 -0
- dripfetch/assets/logos/midos_old.txt +20 -0
- dripfetch/assets/logos/minimal.txt +18 -0
- dripfetch/assets/logos/minix.txt +17 -0
- dripfetch/assets/logos/miracle_linux.txt +16 -0
- dripfetch/assets/logos/mos.txt +18 -0
- dripfetch/assets/logos/msys2.txt +25 -0
- dripfetch/assets/logos/mx.txt +17 -0
- dripfetch/assets/logos/mx2.txt +18 -0
- dripfetch/assets/logos/mx_small.txt +7 -0
- dripfetch/assets/logos/namib.txt +20 -0
- dripfetch/assets/logos/nekos.txt +23 -0
- dripfetch/assets/logos/neptune.txt +17 -0
- dripfetch/assets/logos/netbsd.txt +17 -0
- dripfetch/assets/logos/netbsd2.txt +20 -0
- dripfetch/assets/logos/netbsd_small.txt +8 -0
- dripfetch/assets/logos/netrunner.txt +20 -0
- dripfetch/assets/logos/nexalinux.txt +19 -0
- dripfetch/assets/logos/nitrux.txt +18 -0
- dripfetch/assets/logos/nixos.txt +20 -0
- dripfetch/assets/logos/nixos_old.txt +28 -0
- dripfetch/assets/logos/nixos_old_small.txt +7 -0
- dripfetch/assets/logos/nixos_small.txt +7 -0
- dripfetch/assets/logos/nobara.txt +17 -0
- dripfetch/assets/logos/nomadbsd.txt +13 -0
- dripfetch/assets/logos/nuros.txt +12 -0
- dripfetch/assets/logos/nurunner.txt +19 -0
- dripfetch/assets/logos/nutyx.txt +23 -0
- dripfetch/assets/logos/obarun.txt +19 -0
- dripfetch/assets/logos/obrevenge.txt +18 -0
- dripfetch/assets/logos/obsidianos.txt +16 -0
- dripfetch/assets/logos/omnios.txt +8 -0
- dripfetch/assets/logos/opak.txt +13 -0
- dripfetch/assets/logos/openbsd.txt +23 -0
- dripfetch/assets/logos/openbsd_small.txt +7 -0
- dripfetch/assets/logos/openeuler.txt +23 -0
- dripfetch/assets/logos/openindiana.txt +16 -0
- dripfetch/assets/logos/openkylin.txt +18 -0
- dripfetch/assets/logos/openmamba.txt +21 -0
- dripfetch/assets/logos/openmandriva.txt +22 -0
- dripfetch/assets/logos/openstage.txt +17 -0
- dripfetch/assets/logos/opensuse.txt +18 -0
- dripfetch/assets/logos/opensuse_leap.txt +18 -0
- dripfetch/assets/logos/opensuse_leap_old.txt +16 -0
- dripfetch/assets/logos/opensuse_microos.txt +10 -0
- dripfetch/assets/logos/opensuse_slowroll.txt +20 -0
- dripfetch/assets/logos/opensuse_small.txt +7 -0
- dripfetch/assets/logos/opensuse_tumbleweed.txt +22 -0
- dripfetch/assets/logos/opensuse_tumbleweed_old.txt +13 -0
- dripfetch/assets/logos/opensuse_tumbleweed_small.txt +9 -0
- dripfetch/assets/logos/openwrt.txt +9 -0
- dripfetch/assets/logos/opnsense.txt +20 -0
- dripfetch/assets/logos/oracle.txt +11 -0
- dripfetch/assets/logos/orchid.txt +20 -0
- dripfetch/assets/logos/orchid_small.txt +13 -0
- dripfetch/assets/logos/oreon.txt +22 -0
- dripfetch/assets/logos/os_elbrus.txt +14 -0
- dripfetch/assets/logos/osmc.txt +20 -0
- dripfetch/assets/logos/pacbsd.txt +24 -0
- dripfetch/assets/logos/panwah.txt +21 -0
- dripfetch/assets/logos/parabola.txt +16 -0
- dripfetch/assets/logos/parabola_small.txt +6 -0
- dripfetch/assets/logos/parch.txt +25 -0
- dripfetch/assets/logos/pardus.txt +18 -0
- dripfetch/assets/logos/parrot.txt +24 -0
- dripfetch/assets/logos/parsix.txt +21 -0
- dripfetch/assets/logos/pcbsd.txt +27 -0
- dripfetch/assets/logos/pclinuxos.txt +19 -0
- dripfetch/assets/logos/pearos.txt +21 -0
- dripfetch/assets/logos/pengwin.txt +15 -0
- dripfetch/assets/logos/pentoo.txt +20 -0
- dripfetch/assets/logos/peppermint.txt +21 -0
- dripfetch/assets/logos/peropesis.txt +5 -0
- dripfetch/assets/logos/phyos.txt +17 -0
- dripfetch/assets/logos/pikaos.txt +18 -0
- dripfetch/assets/logos/pisi.txt +19 -0
- dripfetch/assets/logos/pnm_linux.txt +19 -0
- dripfetch/assets/logos/pop.txt +20 -0
- dripfetch/assets/logos/pop_small.txt +8 -0
- dripfetch/assets/logos/porteus.txt +23 -0
- dripfetch/assets/logos/postmarketos.txt +18 -0
- dripfetch/assets/logos/postmarketos_small.txt +9 -0
- dripfetch/assets/logos/proxmox.txt +20 -0
- dripfetch/assets/logos/puffos.txt +12 -0
- dripfetch/assets/logos/puppy.txt +18 -0
- dripfetch/assets/logos/pureos.txt +12 -0
- dripfetch/assets/logos/pureos_small.txt +6 -0
- dripfetch/assets/logos/q4os.txt +19 -0
- dripfetch/assets/logos/qts.txt +14 -0
- dripfetch/assets/logos/qubes.txt +21 -0
- dripfetch/assets/logos/qubyt.txt +15 -0
- dripfetch/assets/logos/quibian.txt +18 -0
- dripfetch/assets/logos/quirinux.txt +17 -0
- dripfetch/assets/logos/radix.txt +18 -0
- dripfetch/assets/logos/raspbian.txt +23 -0
- dripfetch/assets/logos/raspbian_small.txt +10 -0
- dripfetch/assets/logos/ravynos.txt +20 -0
- dripfetch/assets/logos/rebornos.txt +20 -0
- dripfetch/assets/logos/rebornos_small.txt +7 -0
- dripfetch/assets/logos/redcore.txt +16 -0
- dripfetch/assets/logos/redos.txt +18 -0
- dripfetch/assets/logos/redos_small.txt +8 -0
- dripfetch/assets/logos/redstar.txt +18 -0
- dripfetch/assets/logos/refracted_devuan.txt +18 -0
- dripfetch/assets/logos/regata.txt +20 -0
- dripfetch/assets/logos/regolith.txt +18 -0
- dripfetch/assets/logos/rhaymos.txt +14 -0
- dripfetch/assets/logos/rhel.txt +18 -0
- dripfetch/assets/logos/rhel_old.txt +16 -0
- dripfetch/assets/logos/rhel_small.txt +9 -0
- dripfetch/assets/logos/rhino.txt +12 -0
- dripfetch/assets/logos/rocky.txt +19 -0
- dripfetch/assets/logos/rocky_small.txt +12 -0
- dripfetch/assets/logos/rosa.txt +18 -0
- dripfetch/assets/logos/sabayon.txt +18 -0
- dripfetch/assets/logos/sabotage.txt +11 -0
- dripfetch/assets/logos/sailfish.txt +13 -0
- dripfetch/assets/logos/salentos.txt +20 -0
- dripfetch/assets/logos/salientos.txt +20 -0
- dripfetch/assets/logos/salix.txt +18 -0
- dripfetch/assets/logos/sambabox.txt +19 -0
- dripfetch/assets/logos/sasanqua.txt +18 -0
- dripfetch/assets/logos/scientific.txt +20 -0
- dripfetch/assets/logos/semc.txt +9 -0
- dripfetch/assets/logos/septor.txt +20 -0
- dripfetch/assets/logos/serene.txt +20 -0
- dripfetch/assets/logos/serpent_os.txt +18 -0
- dripfetch/assets/logos/sharklinux.txt +15 -0
- dripfetch/assets/logos/shastraos.txt +19 -0
- dripfetch/assets/logos/shebang.txt +20 -0
- dripfetch/assets/logos/siduction.txt +20 -0
- dripfetch/assets/logos/skiffos.txt +9 -0
- dripfetch/assets/logos/slackel.txt +22 -0
- dripfetch/assets/logos/slackware.txt +21 -0
- dripfetch/assets/logos/slackware_small.txt +7 -0
- dripfetch/assets/logos/sleeperos.txt +16 -0
- dripfetch/assets/logos/sleeperos_small.txt +7 -0
- dripfetch/assets/logos/slitaz.txt +17 -0
- dripfetch/assets/logos/smartos.txt +17 -0
- dripfetch/assets/logos/snigdhaos.txt +20 -0
- dripfetch/assets/logos/soda.txt +15 -0
- dripfetch/assets/logos/solaris.txt +8 -0
- dripfetch/assets/logos/solaris_small.txt +5 -0
- dripfetch/assets/logos/solus.txt +20 -0
- dripfetch/assets/logos/source_mage.txt +21 -0
- dripfetch/assets/logos/sparky.txt +20 -0
- dripfetch/assets/logos/spoinkos.txt +5 -0
- dripfetch/assets/logos/star.txt +19 -0
- dripfetch/assets/logos/steamdeck.txt +24 -0
- dripfetch/assets/logos/steamdeck_small.txt +5 -0
- dripfetch/assets/logos/steamos.txt +18 -0
- dripfetch/assets/logos/stock_linux.txt +19 -0
- dripfetch/assets/logos/sulin.txt +20 -0
- dripfetch/assets/logos/summitos.txt +22 -0
- dripfetch/assets/logos/suse.txt +11 -0
- dripfetch/assets/logos/swagarch.txt +15 -0
- dripfetch/assets/logos/t2.txt +14 -0
- dripfetch/assets/logos/t2_small.txt +6 -0
- dripfetch/assets/logos/tails.txt +19 -0
- dripfetch/assets/logos/tatra.txt +15 -0
- dripfetch/assets/logos/tearch.txt +21 -0
- dripfetch/assets/logos/templeos.txt +20 -0
- dripfetch/assets/logos/tileos.txt +20 -0
- dripfetch/assets/logos/torizoncore.txt +29 -0
- dripfetch/assets/logos/trisquel.txt +17 -0
- dripfetch/assets/logos/truenas_scale.txt +18 -0
- dripfetch/assets/logos/tuxedo_os.txt +16 -0
- dripfetch/assets/logos/twister.txt +23 -0
- dripfetch/assets/logos/ublinux.txt +19 -0
- dripfetch/assets/logos/ublinux_small.txt +11 -0
- dripfetch/assets/logos/ubuntu.txt +20 -0
- dripfetch/assets/logos/ubuntu_budgie.txt +20 -0
- dripfetch/assets/logos/ubuntu_cinnamon.txt +20 -0
- dripfetch/assets/logos/ubuntu_gnome.txt +16 -0
- dripfetch/assets/logos/ubuntu_kylin.txt +20 -0
- dripfetch/assets/logos/ubuntu_mate.txt +20 -0
- dripfetch/assets/logos/ubuntu_old.txt +20 -0
- dripfetch/assets/logos/ubuntu_old2.txt +18 -0
- dripfetch/assets/logos/ubuntu_old2_small.txt +6 -0
- dripfetch/assets/logos/ubuntu_small.txt +11 -0
- dripfetch/assets/logos/ubuntu_studio.txt +20 -0
- dripfetch/assets/logos/ubuntu_sway.txt +20 -0
- dripfetch/assets/logos/ubuntu_touch.txt +7 -0
- dripfetch/assets/logos/ubuntu_unity.txt +25 -0
- dripfetch/assets/logos/ultramarine.txt +20 -0
- dripfetch/assets/logos/ultramarine_small.txt +14 -0
- dripfetch/assets/logos/unifi.txt +6 -0
- dripfetch/assets/logos/univalent.txt +18 -0
- dripfetch/assets/logos/univention.txt +20 -0
- dripfetch/assets/logos/unknown.txt +18 -0
- dripfetch/assets/logos/uos.txt +20 -0
- dripfetch/assets/logos/urukos.txt +20 -0
- dripfetch/assets/logos/uwuntu.txt +20 -0
- dripfetch/assets/logos/valhalla.txt +10 -0
- dripfetch/assets/logos/vanilla.txt +18 -0
- dripfetch/assets/logos/vanilla2.txt +16 -0
- dripfetch/assets/logos/vanilla_small.txt +7 -0
- dripfetch/assets/logos/venom.txt +19 -0
- dripfetch/assets/logos/venom_small.txt +11 -0
- dripfetch/assets/logos/vnux.txt +20 -0
- dripfetch/assets/logos/void.txt +18 -0
- dripfetch/assets/logos/void2.txt +25 -0
- dripfetch/assets/logos/void2_small.txt +7 -0
- dripfetch/assets/logos/void_small.txt +7 -0
- dripfetch/assets/logos/vzlinux.txt +20 -0
- dripfetch/assets/logos/wii_linux.txt +16 -0
- dripfetch/assets/logos/windows.txt +16 -0
- dripfetch/assets/logos/windows_11.txt +17 -0
- dripfetch/assets/logos/windows_11_small.txt +7 -0
- dripfetch/assets/logos/windows_2025.txt +17 -0
- dripfetch/assets/logos/windows_8.txt +19 -0
- dripfetch/assets/logos/windows_95.txt +18 -0
- dripfetch/assets/logos/wolfos.txt +5 -0
- dripfetch/assets/logos/xcp_ng.txt +15 -0
- dripfetch/assets/logos/xenia.txt +15 -0
- dripfetch/assets/logos/xenia_old.txt +21 -0
- dripfetch/assets/logos/xeroarch.txt +19 -0
- dripfetch/assets/logos/xferience.txt +19 -0
- dripfetch/assets/logos/xray_os.txt +21 -0
- dripfetch/assets/logos/xubuntu.txt +19 -0
- dripfetch/assets/logos/yiffos.txt +19 -0
- dripfetch/assets/logos/zorin.txt +17 -0
- dripfetch/assets/logos/zos.txt +7 -0
- dripfetch/box/__init__.py +5 -0
- dripfetch/box/base.py +24 -0
- dripfetch/box/borders.py +41 -0
- dripfetch/box/colors.py +110 -0
- dripfetch/box/manager.py +181 -0
- dripfetch/box/placement.py +40 -0
- dripfetch/box/types/__init__.py +5 -0
- dripfetch/box/types/clock.py +487 -0
- dripfetch/box/types/logo.py +62 -0
- dripfetch/box/types/sysinfo.py +570 -0
- dripfetch/box/types/text.py +16 -0
- dripfetch/box/types/weather.py +181 -0
- dripfetch/cli.py +58 -0
- dripfetch/config.py +405 -0
- dripfetch/default_config.yaml +80 -0
- dripfetch/rain/__init__.py +3 -0
- dripfetch/rain/collision.py +23 -0
- dripfetch/rain/colors.py +51 -0
- dripfetch/rain/drop.py +16 -0
- dripfetch/rain/engine.py +190 -0
- dripfetch/rain/movement.py +46 -0
- dripfetch/rain/spawning.py +59 -0
- dripfetch/terminal.py +193 -0
- dripfetch-0.1.0.dist-info/METADATA +47 -0
- dripfetch-0.1.0.dist-info/RECORD +519 -0
- dripfetch-0.1.0.dist-info/WHEEL +5 -0
- dripfetch-0.1.0.dist-info/entry_points.txt +2 -0
- dripfetch-0.1.0.dist-info/licenses/LICENSE +21 -0
- 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,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
|
+
)
|
dripfetch/rain/colors.py
ADDED
|
@@ -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)
|
dripfetch/rain/engine.py
ADDED
|
@@ -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.
|