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,570 @@
|
|
|
1
|
+
import ipaddress
|
|
2
|
+
import os
|
|
3
|
+
import platform
|
|
4
|
+
import socket
|
|
5
|
+
import subprocess
|
|
6
|
+
import threading
|
|
7
|
+
import time
|
|
8
|
+
|
|
9
|
+
import psutil
|
|
10
|
+
|
|
11
|
+
from ..base import BaseBox
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class SysInfoBox(BaseBox):
|
|
15
|
+
LINE_CHARS = set("┌─│├└┐┘┤┬┴┼")
|
|
16
|
+
TITLES = {"SYSTEM", "DISPLAY", "HARDWARE", "DISK", "CONNECTIVITY"}
|
|
17
|
+
|
|
18
|
+
def __init__(self, stdscr, config, boxes_config, colors, renderer):
|
|
19
|
+
super().__init__(stdscr, config, boxes_config, colors, renderer)
|
|
20
|
+
self.lock = threading.Lock()
|
|
21
|
+
self.stop_event = threading.Event()
|
|
22
|
+
self.static = {
|
|
23
|
+
"os": f"macOS {platform.mac_ver()[0]} {platform.machine()}",
|
|
24
|
+
"host": "Loading...",
|
|
25
|
+
"kernel": f"Darwin {platform.release()}",
|
|
26
|
+
"packages": "Loading...",
|
|
27
|
+
"shell": "Loading...",
|
|
28
|
+
"displays": [],
|
|
29
|
+
"de": "Liquid Glass",
|
|
30
|
+
"terminal": self._terminal(),
|
|
31
|
+
"cpu_brand": "Loading...",
|
|
32
|
+
"cpu_cores": "Loading...",
|
|
33
|
+
"memory_total": 0,
|
|
34
|
+
}
|
|
35
|
+
self.lines = self._build_lines(
|
|
36
|
+
"Loading...",
|
|
37
|
+
"Loading...",
|
|
38
|
+
[],
|
|
39
|
+
"Loading...",
|
|
40
|
+
"Loading",
|
|
41
|
+
False,
|
|
42
|
+
"Loading...",
|
|
43
|
+
)
|
|
44
|
+
self.thread = threading.Thread(
|
|
45
|
+
target=self._initialize,
|
|
46
|
+
daemon=True,
|
|
47
|
+
)
|
|
48
|
+
self.thread.start()
|
|
49
|
+
|
|
50
|
+
def _command(self, *args):
|
|
51
|
+
try:
|
|
52
|
+
return subprocess.check_output(
|
|
53
|
+
args,
|
|
54
|
+
text=True,
|
|
55
|
+
stderr=subprocess.DEVNULL,
|
|
56
|
+
).strip()
|
|
57
|
+
except (OSError, subprocess.CalledProcessError):
|
|
58
|
+
return ""
|
|
59
|
+
|
|
60
|
+
def _bytes(self, value):
|
|
61
|
+
value = float(value)
|
|
62
|
+
|
|
63
|
+
for unit in ("B", "KiB", "MiB", "GiB", "TiB"):
|
|
64
|
+
if value < 1024:
|
|
65
|
+
return f"{value:.2f} {unit}"
|
|
66
|
+
value /= 1024
|
|
67
|
+
|
|
68
|
+
return f"{value:.2f} PiB"
|
|
69
|
+
|
|
70
|
+
def _uptime(self):
|
|
71
|
+
try:
|
|
72
|
+
seconds = int(time.time() - psutil.boot_time())
|
|
73
|
+
except (OSError, RuntimeError):
|
|
74
|
+
return "Unknown"
|
|
75
|
+
|
|
76
|
+
days, seconds = divmod(seconds, 86400)
|
|
77
|
+
hours, seconds = divmod(seconds, 3600)
|
|
78
|
+
minutes = seconds // 60
|
|
79
|
+
|
|
80
|
+
if days:
|
|
81
|
+
return f"{days}d {hours}h {minutes}m"
|
|
82
|
+
if hours:
|
|
83
|
+
return f"{hours}h {minutes}m"
|
|
84
|
+
return f"{minutes}m"
|
|
85
|
+
|
|
86
|
+
def _host(self):
|
|
87
|
+
identifier = self._command("sysctl", "-n", "hw.model")
|
|
88
|
+
|
|
89
|
+
if identifier == "MacBookPro18,1":
|
|
90
|
+
return "MacBook Pro (16-inch, 2021)"
|
|
91
|
+
|
|
92
|
+
model = "Unknown"
|
|
93
|
+
|
|
94
|
+
for line in self._command(
|
|
95
|
+
"system_profiler",
|
|
96
|
+
"SPHardwareDataType",
|
|
97
|
+
).splitlines():
|
|
98
|
+
line = line.strip()
|
|
99
|
+
|
|
100
|
+
if line.startswith("Model Name:"):
|
|
101
|
+
model = line.split(":", 1)[1].strip()
|
|
102
|
+
break
|
|
103
|
+
|
|
104
|
+
return model
|
|
105
|
+
|
|
106
|
+
def _packages(self):
|
|
107
|
+
output = self._command("brew", "list", "--formula")
|
|
108
|
+
return f"{len(output.splitlines()) if output else 0} brew formulas"
|
|
109
|
+
|
|
110
|
+
def _shell(self):
|
|
111
|
+
shell = os.path.basename(os.environ.get("SHELL", ""))
|
|
112
|
+
|
|
113
|
+
if not shell:
|
|
114
|
+
return "Unknown"
|
|
115
|
+
|
|
116
|
+
version = self._command(shell, "--version")
|
|
117
|
+
|
|
118
|
+
if version:
|
|
119
|
+
version = version.splitlines()[0]
|
|
120
|
+
|
|
121
|
+
if " " in version:
|
|
122
|
+
version = version.split(" ", 1)[1]
|
|
123
|
+
|
|
124
|
+
version = version.split(" (", 1)[0]
|
|
125
|
+
|
|
126
|
+
return f"{shell} {version}".strip()
|
|
127
|
+
|
|
128
|
+
def _format_displays(self):
|
|
129
|
+
displays = []
|
|
130
|
+
current = None
|
|
131
|
+
|
|
132
|
+
for raw in self._command(
|
|
133
|
+
"system_profiler",
|
|
134
|
+
"SPDisplaysDataType",
|
|
135
|
+
).splitlines():
|
|
136
|
+
line = raw.strip()
|
|
137
|
+
|
|
138
|
+
if raw.startswith(" ") and line.endswith(":"):
|
|
139
|
+
name = line[:-1]
|
|
140
|
+
|
|
141
|
+
if name not in {"Displays", "Apple M1 Pro"}:
|
|
142
|
+
current = {"name": name}
|
|
143
|
+
displays.append(current)
|
|
144
|
+
|
|
145
|
+
elif current and line.startswith("Resolution:"):
|
|
146
|
+
current["resolution"] = line.split(":", 1)[1].strip()
|
|
147
|
+
|
|
148
|
+
elif current and line.startswith("UI Looks like:"):
|
|
149
|
+
current["ui"] = line.split(":", 1)[1].strip()
|
|
150
|
+
|
|
151
|
+
lines = []
|
|
152
|
+
|
|
153
|
+
for display in displays:
|
|
154
|
+
name = "MacBook Pro" if display["name"] == "Color LCD" else display["name"]
|
|
155
|
+
resolution = display.get("resolution", "")
|
|
156
|
+
ui = display.get("ui")
|
|
157
|
+
|
|
158
|
+
if ui:
|
|
159
|
+
lines.append(f"{name}: {ui.replace('.00Hz', ' Hz')}")
|
|
160
|
+
elif name == "MacBook Pro":
|
|
161
|
+
lines.append(f"{name}: {resolution.replace(' Retina', '')} @ 120 Hz")
|
|
162
|
+
elif resolution:
|
|
163
|
+
lines.append(f"{name}: {resolution}")
|
|
164
|
+
|
|
165
|
+
return lines
|
|
166
|
+
|
|
167
|
+
def _cpu(self):
|
|
168
|
+
brand = self.static["cpu_brand"]
|
|
169
|
+
cores = self.static["cpu_cores"]
|
|
170
|
+
|
|
171
|
+
try:
|
|
172
|
+
frequency = psutil.cpu_freq()
|
|
173
|
+
|
|
174
|
+
if frequency:
|
|
175
|
+
frequency = f"{frequency.current / 1000:.2f} GHz"
|
|
176
|
+
else:
|
|
177
|
+
frequency = "Unknown"
|
|
178
|
+
except (AttributeError, OSError, RuntimeError, TypeError):
|
|
179
|
+
frequency = "Unknown"
|
|
180
|
+
|
|
181
|
+
try:
|
|
182
|
+
usage = psutil.cpu_percent()
|
|
183
|
+
except (OSError, RuntimeError):
|
|
184
|
+
usage = 0
|
|
185
|
+
|
|
186
|
+
return f"{brand} ({cores}) @ {frequency} ({usage:.0f}%)"
|
|
187
|
+
|
|
188
|
+
def _memory(self):
|
|
189
|
+
values = {}
|
|
190
|
+
|
|
191
|
+
for line in self._command("vm_stat").splitlines():
|
|
192
|
+
if ":" not in line:
|
|
193
|
+
continue
|
|
194
|
+
|
|
195
|
+
key, value = line.split(":", 1)
|
|
196
|
+
|
|
197
|
+
try:
|
|
198
|
+
values[key] = int(value.strip().rstrip("."))
|
|
199
|
+
except ValueError:
|
|
200
|
+
pass
|
|
201
|
+
|
|
202
|
+
total = self.static["memory_total"]
|
|
203
|
+
|
|
204
|
+
if not total:
|
|
205
|
+
return "Unknown"
|
|
206
|
+
|
|
207
|
+
available = (
|
|
208
|
+
sum(
|
|
209
|
+
values.get(key, 0)
|
|
210
|
+
for key in (
|
|
211
|
+
"Pages free",
|
|
212
|
+
"Pages inactive",
|
|
213
|
+
"Pages speculative",
|
|
214
|
+
)
|
|
215
|
+
)
|
|
216
|
+
* 4096
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
used = max(0, total - available)
|
|
220
|
+
|
|
221
|
+
return f"{self._bytes(used)} / {self._bytes(total)} ({used / total * 100:.0f}%)"
|
|
222
|
+
|
|
223
|
+
def _disks(self):
|
|
224
|
+
results = []
|
|
225
|
+
seen = set()
|
|
226
|
+
|
|
227
|
+
for line in self._command("df", "-k").splitlines()[1:]:
|
|
228
|
+
parts = line.split()
|
|
229
|
+
|
|
230
|
+
if len(parts) < 6:
|
|
231
|
+
continue
|
|
232
|
+
|
|
233
|
+
mount = " ".join(parts[8:]) if len(parts) > 8 else parts[5]
|
|
234
|
+
|
|
235
|
+
if mount != "/" and not mount.startswith("/Volumes/RYX "):
|
|
236
|
+
continue
|
|
237
|
+
|
|
238
|
+
if mount in seen:
|
|
239
|
+
continue
|
|
240
|
+
|
|
241
|
+
try:
|
|
242
|
+
used = int(parts[2]) * 1024
|
|
243
|
+
total = int(parts[1]) * 1024
|
|
244
|
+
percent = int(parts[4].rstrip("%"))
|
|
245
|
+
except ValueError:
|
|
246
|
+
continue
|
|
247
|
+
|
|
248
|
+
seen.add(mount)
|
|
249
|
+
results.append((mount, self._bytes(used), self._bytes(total), percent))
|
|
250
|
+
|
|
251
|
+
return results
|
|
252
|
+
|
|
253
|
+
def _network(self):
|
|
254
|
+
try:
|
|
255
|
+
addresses = psutil.net_if_addrs().get("en0", [])
|
|
256
|
+
except (OSError, RuntimeError):
|
|
257
|
+
return "Unknown"
|
|
258
|
+
|
|
259
|
+
for address in addresses:
|
|
260
|
+
if address.family != socket.AF_INET:
|
|
261
|
+
continue
|
|
262
|
+
|
|
263
|
+
try:
|
|
264
|
+
prefix = ipaddress.IPv4Network(f"0.0.0.0/{address.netmask}").prefixlen
|
|
265
|
+
except ValueError:
|
|
266
|
+
continue
|
|
267
|
+
|
|
268
|
+
return f"{address.address}/{prefix}"
|
|
269
|
+
|
|
270
|
+
return "Unknown"
|
|
271
|
+
|
|
272
|
+
def _battery(self):
|
|
273
|
+
percent = "Unknown"
|
|
274
|
+
connected = False
|
|
275
|
+
adapter = "Unknown"
|
|
276
|
+
|
|
277
|
+
for line in self._command(
|
|
278
|
+
"system_profiler",
|
|
279
|
+
"SPPowerDataType",
|
|
280
|
+
).splitlines():
|
|
281
|
+
line = line.strip()
|
|
282
|
+
|
|
283
|
+
if line.startswith("State of Charge (%):"):
|
|
284
|
+
percent = line.split(":", 1)[1].strip()
|
|
285
|
+
|
|
286
|
+
elif line.startswith("Connected:"):
|
|
287
|
+
connected = line.split(":", 1)[1].strip() == "Yes"
|
|
288
|
+
|
|
289
|
+
elif line.startswith("Wattage (W):"):
|
|
290
|
+
adapter = f"{line.split(':', 1)[1].strip()}W USB-C Power Adapter"
|
|
291
|
+
|
|
292
|
+
return percent, connected, adapter
|
|
293
|
+
|
|
294
|
+
def _terminal(self):
|
|
295
|
+
name = os.environ.get("TERM_PROGRAM", "Unknown")
|
|
296
|
+
version = os.environ.get("TERM_PROGRAM_VERSION", "")
|
|
297
|
+
|
|
298
|
+
if name == "iTerm.app":
|
|
299
|
+
name = "iTerm"
|
|
300
|
+
|
|
301
|
+
return f"{name} {version}".strip()
|
|
302
|
+
|
|
303
|
+
def _set_static(self, key, value):
|
|
304
|
+
with self.lock:
|
|
305
|
+
self.static[key] = value
|
|
306
|
+
|
|
307
|
+
def _collect_static(self):
|
|
308
|
+
values = {
|
|
309
|
+
"host": self._host(),
|
|
310
|
+
"packages": self._packages(),
|
|
311
|
+
"shell": self._shell(),
|
|
312
|
+
"cpu_brand": self._command(
|
|
313
|
+
"sysctl",
|
|
314
|
+
"-n",
|
|
315
|
+
"machdep.cpu.brand_string",
|
|
316
|
+
)
|
|
317
|
+
or "Unknown",
|
|
318
|
+
"cpu_cores": self._command(
|
|
319
|
+
"sysctl",
|
|
320
|
+
"-n",
|
|
321
|
+
"hw.ncpu",
|
|
322
|
+
)
|
|
323
|
+
or "Unknown",
|
|
324
|
+
"displays": self._format_displays(),
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
try:
|
|
328
|
+
values["memory_total"] = int(
|
|
329
|
+
self._command(
|
|
330
|
+
"sysctl",
|
|
331
|
+
"-n",
|
|
332
|
+
"hw.memsize",
|
|
333
|
+
)
|
|
334
|
+
)
|
|
335
|
+
except (TypeError, ValueError):
|
|
336
|
+
values["memory_total"] = 0
|
|
337
|
+
|
|
338
|
+
with self.lock:
|
|
339
|
+
self.static.update(values)
|
|
340
|
+
|
|
341
|
+
def _section(self, title, items):
|
|
342
|
+
lines = [f"├─ {title}"]
|
|
343
|
+
|
|
344
|
+
for index, item in enumerate(items):
|
|
345
|
+
prefix = "└─" if index == len(items) - 1 else "├─"
|
|
346
|
+
lines.append(f"│ {prefix} {item}")
|
|
347
|
+
|
|
348
|
+
return lines
|
|
349
|
+
|
|
350
|
+
def _build_lines(
|
|
351
|
+
self,
|
|
352
|
+
cpu,
|
|
353
|
+
memory,
|
|
354
|
+
disks,
|
|
355
|
+
ip,
|
|
356
|
+
battery,
|
|
357
|
+
connected,
|
|
358
|
+
adapter,
|
|
359
|
+
):
|
|
360
|
+
lines = [
|
|
361
|
+
"┌─ SYSTEM",
|
|
362
|
+
f"│ ├─ OS {self.static['os']}",
|
|
363
|
+
f"│ ├─ Host {self.static['host']}",
|
|
364
|
+
f"│ ├─ Kernel {self.static['kernel']}",
|
|
365
|
+
f"│ ├─ Uptime {self._uptime()}",
|
|
366
|
+
f"│ ├─ Packages {self.static['packages']}",
|
|
367
|
+
f"│ ├─ Shell {self.static['shell']}",
|
|
368
|
+
f"│ ├─ Terminal {self.static['terminal']}",
|
|
369
|
+
f"│ └─ DE {self.static['de']}",
|
|
370
|
+
"│",
|
|
371
|
+
]
|
|
372
|
+
|
|
373
|
+
displays = self.static["displays"]
|
|
374
|
+
|
|
375
|
+
lines.extend(
|
|
376
|
+
self._section("DISPLAY", displays)
|
|
377
|
+
if displays
|
|
378
|
+
else ["├─ DISPLAY", "│ └─ Loading..."]
|
|
379
|
+
)
|
|
380
|
+
|
|
381
|
+
lines.extend(
|
|
382
|
+
[
|
|
383
|
+
"│",
|
|
384
|
+
"├─ HARDWARE",
|
|
385
|
+
f"│ ├─ CPU {cpu}",
|
|
386
|
+
f"│ └─ Memory {memory}",
|
|
387
|
+
"│",
|
|
388
|
+
"├─ DISK",
|
|
389
|
+
]
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
if disks:
|
|
393
|
+
for index, (mount, used, total, percent) in enumerate(disks):
|
|
394
|
+
name = "/" if mount == "/" else mount.removeprefix("/Volumes/RYX ")
|
|
395
|
+
prefix = "└─" if index == len(disks) - 1 else "├─"
|
|
396
|
+
|
|
397
|
+
lines.append(f"│ {prefix} {name:<10} {used} / {total} ({percent}%)")
|
|
398
|
+
else:
|
|
399
|
+
lines.append("│ └─ Loading...")
|
|
400
|
+
|
|
401
|
+
lines.extend(
|
|
402
|
+
[
|
|
403
|
+
"│",
|
|
404
|
+
"├─ CONNECTIVITY",
|
|
405
|
+
f"│ ├─ Network {ip}",
|
|
406
|
+
f"│ ├─ Battery {battery}% "
|
|
407
|
+
f"[{'AC connected' if connected else 'Battery'}]",
|
|
408
|
+
f"│ └─ Adapter {adapter}",
|
|
409
|
+
]
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
return lines
|
|
413
|
+
|
|
414
|
+
def _refresh(self):
|
|
415
|
+
with self.lock:
|
|
416
|
+
cpu_brand = self.static["cpu_brand"]
|
|
417
|
+
cpu_cores = self.static["cpu_cores"]
|
|
418
|
+
memory_total = self.static["memory_total"]
|
|
419
|
+
static = self.static.copy()
|
|
420
|
+
|
|
421
|
+
try:
|
|
422
|
+
frequency = psutil.cpu_freq()
|
|
423
|
+
|
|
424
|
+
if frequency:
|
|
425
|
+
frequency = f"{frequency.current / 1000:.2f} GHz"
|
|
426
|
+
else:
|
|
427
|
+
frequency = "Unknown"
|
|
428
|
+
except (AttributeError, OSError, RuntimeError, TypeError):
|
|
429
|
+
frequency = "Unknown"
|
|
430
|
+
|
|
431
|
+
try:
|
|
432
|
+
usage = psutil.cpu_percent()
|
|
433
|
+
except (OSError, RuntimeError):
|
|
434
|
+
usage = 0
|
|
435
|
+
|
|
436
|
+
cpu = f"{cpu_brand} ({cpu_cores}) @ {frequency} ({usage:.0f}%)"
|
|
437
|
+
|
|
438
|
+
values = {}
|
|
439
|
+
|
|
440
|
+
for line in self._command("vm_stat").splitlines():
|
|
441
|
+
if ":" not in line:
|
|
442
|
+
continue
|
|
443
|
+
|
|
444
|
+
key, value = line.split(":", 1)
|
|
445
|
+
|
|
446
|
+
try:
|
|
447
|
+
values[key] = int(value.strip().rstrip("."))
|
|
448
|
+
except ValueError:
|
|
449
|
+
pass
|
|
450
|
+
|
|
451
|
+
if memory_total:
|
|
452
|
+
available = (
|
|
453
|
+
sum(
|
|
454
|
+
values.get(key, 0)
|
|
455
|
+
for key in (
|
|
456
|
+
"Pages free",
|
|
457
|
+
"Pages inactive",
|
|
458
|
+
"Pages speculative",
|
|
459
|
+
)
|
|
460
|
+
)
|
|
461
|
+
* 4096
|
|
462
|
+
)
|
|
463
|
+
used = max(0, memory_total - available)
|
|
464
|
+
memory = (
|
|
465
|
+
f"{self._bytes(used)} / {self._bytes(memory_total)} "
|
|
466
|
+
f"({used / memory_total * 100:.0f}%)"
|
|
467
|
+
)
|
|
468
|
+
else:
|
|
469
|
+
memory = "Unknown"
|
|
470
|
+
|
|
471
|
+
disks = self._disks()
|
|
472
|
+
ip = self._network()
|
|
473
|
+
battery, connected, adapter = self._battery()
|
|
474
|
+
|
|
475
|
+
with self.lock:
|
|
476
|
+
old_static = self.static
|
|
477
|
+
self.static = static
|
|
478
|
+
self.lines = self._build_lines(
|
|
479
|
+
cpu,
|
|
480
|
+
memory,
|
|
481
|
+
disks,
|
|
482
|
+
ip,
|
|
483
|
+
battery,
|
|
484
|
+
connected,
|
|
485
|
+
adapter,
|
|
486
|
+
)
|
|
487
|
+
self.static = old_static
|
|
488
|
+
|
|
489
|
+
def _initialize(self):
|
|
490
|
+
try:
|
|
491
|
+
self._collect_static()
|
|
492
|
+
self._refresh()
|
|
493
|
+
except Exception:
|
|
494
|
+
pass
|
|
495
|
+
|
|
496
|
+
while not self.stop_event.wait(1):
|
|
497
|
+
try:
|
|
498
|
+
self._refresh()
|
|
499
|
+
except Exception:
|
|
500
|
+
pass
|
|
501
|
+
|
|
502
|
+
def _line_type(self, line):
|
|
503
|
+
stripped = line.lstrip("│ ")
|
|
504
|
+
|
|
505
|
+
if stripped.startswith(("┌─", "├─")):
|
|
506
|
+
if stripped[2:].strip() in self.TITLES:
|
|
507
|
+
return "title"
|
|
508
|
+
|
|
509
|
+
return "text"
|
|
510
|
+
|
|
511
|
+
def _draw_line(self, x, y, line):
|
|
512
|
+
if not line:
|
|
513
|
+
return
|
|
514
|
+
|
|
515
|
+
if self._line_type(line) == "title":
|
|
516
|
+
self.renderer.draw(x, y, line, self.colors.title)
|
|
517
|
+
return
|
|
518
|
+
|
|
519
|
+
index = 0
|
|
520
|
+
|
|
521
|
+
while index < len(line):
|
|
522
|
+
if line[index] in self.LINE_CHARS:
|
|
523
|
+
start = index
|
|
524
|
+
|
|
525
|
+
while index < len(line) and line[index] in self.LINE_CHARS:
|
|
526
|
+
index += 1
|
|
527
|
+
|
|
528
|
+
self.renderer.draw(
|
|
529
|
+
x + start,
|
|
530
|
+
y,
|
|
531
|
+
line[start:index],
|
|
532
|
+
self.colors.line,
|
|
533
|
+
)
|
|
534
|
+
else:
|
|
535
|
+
start = index
|
|
536
|
+
|
|
537
|
+
while index < len(line) and line[index] not in self.LINE_CHARS:
|
|
538
|
+
index += 1
|
|
539
|
+
|
|
540
|
+
self.renderer.draw(
|
|
541
|
+
x + start,
|
|
542
|
+
y,
|
|
543
|
+
line[start:index],
|
|
544
|
+
self.colors.text,
|
|
545
|
+
)
|
|
546
|
+
|
|
547
|
+
def dimensions(self):
|
|
548
|
+
with self.lock:
|
|
549
|
+
lines = self.lines[:]
|
|
550
|
+
|
|
551
|
+
return (
|
|
552
|
+
max((len(line) for line in lines), default=0),
|
|
553
|
+
len(lines),
|
|
554
|
+
)
|
|
555
|
+
|
|
556
|
+
def draw_content(self, x, y, width, height):
|
|
557
|
+
with self.lock:
|
|
558
|
+
lines = self.lines[:]
|
|
559
|
+
|
|
560
|
+
for index, line in enumerate(lines[:height]):
|
|
561
|
+
self._draw_line(x, y + index, line[:width])
|
|
562
|
+
|
|
563
|
+
def update(self):
|
|
564
|
+
pass
|
|
565
|
+
|
|
566
|
+
def close(self):
|
|
567
|
+
self.stop_event.set()
|
|
568
|
+
|
|
569
|
+
if self.thread.is_alive():
|
|
570
|
+
self.thread.join(timeout=1)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from ..base import BaseBox
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TextBox(BaseBox):
|
|
5
|
+
def _lines(self):
|
|
6
|
+
return str(self.config.get("text", "")).splitlines()
|
|
7
|
+
|
|
8
|
+
def dimensions(self):
|
|
9
|
+
lines = self._lines()
|
|
10
|
+
return max((len(line) for line in lines), default=0), len(lines)
|
|
11
|
+
|
|
12
|
+
def draw_content(self, x, y, width, height):
|
|
13
|
+
for index, line in enumerate(self._lines()[:height]):
|
|
14
|
+
line = line[:width]
|
|
15
|
+
column = x + max(0, (width - len(line)) // 2)
|
|
16
|
+
self.renderer.draw(column, y + index, line, self.colors.text)
|