diff --git a/udev-device-plug-handler/udev-device-plug-handler b/udev-device-plug-handler/udev-device-plug-handler index 2a84f1d..76eaf2e 100644 --- a/udev-device-plug-handler/udev-device-plug-handler +++ b/udev-device-plug-handler/udev-device-plug-handler @@ -1,5 +1,7 @@ #!/usr/bin/env python3 +from datetime import datetime import inspect +from pathlib import Path import subprocess from typing import Dict, List, Optional, Union @@ -96,6 +98,61 @@ class UsbLogitechG930(KnownDevice): print("Handled Logitech G930 Headset") +class CanonLIDE400(KnownDevice): + """Represents our 2023-bought Canon flatbed scanner""" + UDEV_PROPS = {'PRODUCT': '4a9/1912/100'} + + __process = None + + @staticmethod + def check_available() -> bool: + cmd = "lsusb | grep 'LiDE 400'" + cp = subprocess.run(cmd, shell=True, stdout=subprocess.DEVNULL) + return cp.returncode == 0 + + @staticmethod + def handle_bind(device: Optional[pyudev.Device] = None) -> None: + if CanonLIDE400.__process is not None: + # in theory, uplugging the Scanner should have terminated/killed the process, but if something went wrong, + # we just try to kill it and proceed + CanonLIDE400.__process.kill() + + now = datetime.now() + directory = Path('/srv/paperless/later/scanned/') / now.strftime('%Y-%m-%d') + # directory = Path('/home/joker/tmp/scanned/') / now.strftime('%Y-%m-%d') + directory.mkdir(exist_ok=True) + + # TODO read config from ~/.config/udev-device-plug-handler/ + # How should that look like? Directory list of arguments? Would be easiest and we just default to something. + # Could be nice to read the directory from there, too. + cmd = [ + 'scanimage', + '-d', 'pixma:04A91912_4B9054', + '-l', '0mm', + '-t', '0mm', + '-x', '210mm', + '-y', '297mm', + '--mode=Color', + '--resolution', '300dpi', + '--button-controlled=yes', + # '-p', # progress + f"--batch=scan_{now.strftime('%H%M%S')}_%04d.pnm" + ] + CanonLIDE400.__process = subprocess.Popen(cmd, stdout=subprocess.DEVNULL, cwd=directory) + print("Handled Canon LiDE 400") + + @staticmethod + def handle_remove(device: pyudev.Device) -> None: + if CanonLIDE400.__process is not None: + p = CanonLIDE400.__process + p.terminate() + try: + p.wait(timeout=3) + except subprocess.TimeoutExpired: + p.kill() + print("Handled Canon LiDE 400 unplug") + + @click.command() @click.option('--debug', is_flag=True, help='Show all device changes instead of only handled.') def main(debug: bool) -> None: