dotfiles/local/bin/screenie
2025-07-31 01:51:10 +03:30

93 lines
3.5 KiB
Python
Executable file

#!/usr/bin/env python3
import os
import sys
import subprocess
import tempfile
from pathlib import Path
from datetime import datetime
def check_cmds(cmds):
for cmd in cmds:
if subprocess.call(["which", cmd], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) != 0:
print(f"Missing: {cmd}", file=sys.stderr)
sys.exit(1)
def show_help():
print(f"""Usage: {sys.argv[0]} [color|full|window] [output_dir]\nEnvironment options:\n WATERMARK=1\n WATERMARK_TEXT='text'\n WATERMARK_POS=position\n WATERMARK_SIZE=px\n WATERMARK_BG='#rrggbbaa'\n""")
def post(file):
if os.environ.get("WATERMARK") == "1":
check_cmds(["magick"])
watermark_text = os.environ.get("WATERMARK_TEXT", datetime.now().strftime("%Y-%m-%d %H:%M"))
watermark_pos = os.environ.get("WATERMARK_POS", "southeast")
watermark_size = os.environ.get("WATERMARK_SIZE", "28")
watermark_bg = os.environ.get("WATERMARK_BG", "#00000080")
subprocess.run([
"magick", file,
"-gravity", watermark_pos,
"-pointsize", watermark_size,
"-fill", "white",
"-undercolor", watermark_bg,
"-annotate", "+20+20", watermark_text,
file
], check=True)
subprocess.run(["xclip", "-selection", "clipboard", "-t", "image/png", "-i", file], check=True)
subprocess.run(["notify-send", "-i", file, f"Screenshot: {os.path.basename(file)}"], check=True)
def colorpicker(tmp):
check_cmds(["magick"])
if subprocess.call(["which", "slop"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) == 0:
slop = subprocess.run(["slop", "--tolerance=0"], capture_output=True, text=True)
if slop.returncode != 0:
sys.exit(1)
crop = slop.stdout.strip()
subprocess.run(["import", "-window", "root", "-crop", crop, tmp], check=True)
else:
subprocess.run(["import", tmp], check=True)
try:
hexcolor = subprocess.check_output([
"magick", tmp, "-scale", "1x1!", "-format", "#%[hex:p{0,0}]", "info:"
], stderr=subprocess.DEVNULL, text=True).strip()
except subprocess.CalledProcessError:
hexcolor = "#??????"
subprocess.run(["xclip", "-selection", "clipboard", "-i"], input=hexcolor.encode(), check=True)
subprocess.run(["notify-send", "-i", tmp, f"Color: {hexcolor}"], check=True)
def capture_full(file):
subprocess.run(["import", "-window", "root", file], check=True)
post(file)
def capture_window(file):
check_cmds(["xdotool"])
winid = subprocess.check_output(["xdotool", "getwindowfocus", "-f"], text=True).strip()
subprocess.run(["import", "-window", winid, file], check=True)
post(file)
def capture_selection(file):
subprocess.run(["import", file], check=True)
post(file)
def main():
check_cmds(["xclip", "import", "notify-send"])
outdir = Path(sys.argv[2]) if len(sys.argv) > 2 else Path.home() / "files" / "pics" / "screenies"
outdir.mkdir(parents=True, exist_ok=True)
file = str(outdir / (datetime.now().strftime("%Y%m%d_%H%M%S") + ".png"))
with tempfile.NamedTemporaryFile(suffix=".png", delete=True) as tmp:
if len(sys.argv) > 1:
arg = sys.argv[1]
else:
arg = ""
if arg in ("-h", "--help"):
show_help()
elif arg.startswith("color"):
colorpicker(tmp.name)
elif arg == "full":
capture_full(file)
elif arg == "window":
capture_window(file)
else:
capture_selection(file)
if __name__ == "__main__":
main()