93 lines
3.5 KiB
Python
Executable file
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()
|
|
|