#!/usr/bin/env python3 import logging from pathlib import Path from subprocess import Popen from sys import argv from sys import exit as sysexit from rofi import Rofi DEFAULT = Path.home().expanduser() / "Videos" / "sauce" logger = logging.getLogger("rofi-syncfin") logger.setLevel(logging.DEBUG) sh = logging.StreamHandler() sh.setFormatter( logging.Formatter("%(asctime)s | %(name)s | %(levelname)s | %(message)s") ) logger.addHandler(sh) def notification(title: str, message: str) -> None: """Sends a notification.""" Popen(["dunstify", title, message]) def run_syncfin(pth: Path | str) -> None: """Runs syncfin in the given path.""" pth = Path(pth) if not pth.exists() or not pth.is_dir(): notification("Syncfin:", f"Path {pth} does not exist.") logger.error("Invalid path: %s", pth) sysexit(1) with Popen(["/home/sudacode/.bin/syncfin", pth]) as proc: ret = proc.wait() if ret != 0: notification("Syncfin:", f"Syncfin failed with exit code {ret}.") logger.error("syncfin returned non-zero exit code: %s", ret) sysexit(1) def get_dirs(in_pth: Path | str) -> list[Path]: """Returns a list of directories in the given path.""" path = Path(in_pth) return [x for x in path.iterdir() if x.is_dir()] if __name__ == "__main__": rofi = Rofi( rofi_args=[ "-dmenu", "-i", "-config", "/home/sudacode/.config/aniwrapper/themes/aniwrapper-nord2.rasi", "-dpi", "144", ], theme_str="window { width: 85%; } listview { lines: 10; }", ) logger.debug("Starting rofi-syncfin.py") logger.debug("HOME: %s", DEFAULT) dirs = get_dirs(DEFAULT) dirs = [x.name for x in dirs] choice, status = rofi.select("Select a directory", dirs) if status == -1: notification("rofi-syncfin", "Failed") sysexit(1) else: logger.debug("Selected dir: %s", choice) logger.info("Running syncfin on %s", dirs[choice]) pth = str(DEFAULT / dirs[choice]) logger.debug("Path: %s", pth) notification("rofi-syncfin:", f"Syncing {dirs[choice]}") run_syncfin(pth) notification("rofi-syncfin", f"Finished syncing {dirs[choice]}")