def main(args=None): """Main program entry point""" logging.basicConfig() args = parse_args(args or sys.argv[1:]) config = load_config() if args.debug or config["larry"].getboolean("debug", fallback=False): LOGGER.setLevel("DEBUG") LOGGER.debug("args=%s", args) if args.list_plugins: list_plugins() return if args.list_filters: list_filters() return loop = asyncio.get_event_loop() loop.add_signal_handler(signal.SIGUSR1, run_every, args.interval, loop) loop.call_soon(run_every, args.interval, loop) try: loop.run_forever() except KeyboardInterrupt: LOGGER.info("User interrupted") loop.stop() finally: loop.close()
def list_filters(output=sys.stdout): config = load_config() enabled_filter = config["larry"].get("filter", "gradient").split() for name, func in filters_list(): doc = func.__doc__.split("\n", 1)[0].strip() enabled = "X" if name in enabled_filter else " " print(f"[{enabled}] {name:20} {doc}", file=output)
def list_plugins(output=sys.stdout): """List all the beautiful plugins""" config = load_config() enabled_plugins = config["larry"].get("plugins", "").split() for name, func in plugins_list(): doc = func.__doc__.split("\n", 1)[0].strip() enabled = "X" if name in enabled_plugins else " " print(f"[{enabled}] {name:20} {doc}", file=output)
def get_config(plugin_name: str) -> ConfigType: config = load_config() plugin_config_name = f"plugins:{plugin_name}" if plugin_config_name in config: plugin_config = config[plugin_config_name] else: plugin_config = config[plugin_config_name] = config["DEFAULT"] return plugin_config
def run() -> None: config = load_config() if config["larry"].getboolean("pause", False): LOGGER.info("Larry is paused") return raw_image_data = read_file(os.path.expanduser(config["larry"]["input"])) image = Image.from_bytes(raw_image_data) orig_colors = list(image.get_colors()) orig_colors.sort(key=Color.luminocity) colors_str = config["larry"].get("colors", "").strip().split() if colors_str: LOGGER.debug("using colors from config") colors = [Color(i.strip()) for i in colors_str] else: colors = orig_colors.copy() filter_names = config["larry"].get("filter", "gradient").split() for filter_name in filter_names: try: filter_ = load_filter(filter_name) except FilterNotFound: error_message = f"Color filter {filter_name} not found. Skipping." LOGGER.exception(error_message) else: LOGGER.debug("Calling filter %s", filter_name) colors = filter_(colors, config) LOGGER.debug("new colors: %s", colors) if colors != orig_colors: image.replace(orig_colors, colors) outfile = os.path.expanduser(config["larry"]["output"]) write_file(outfile, bytes(image)) # now run any plugins if "larry" not in config.sections(): return plugins = config["larry"].get("plugins", "").split() loop = asyncio.get_event_loop() for plugin_name in plugins: loop.call_soon(do_plugin, plugin_name, colors)