diff --git a/manim/__main__.py b/manim/__main__.py index 85bcbfae3b..37f7572081 100644 --- a/manim/__main__.py +++ b/manim/__main__.py @@ -18,7 +18,7 @@ def open_file_if_needed(file_writer): - if file_writer_config["quiet"]: + if file_writer_config["verbose"] != "DEBUG": curr_stdout = sys.stdout sys.stdout = open(os.devnull, "w") @@ -59,7 +59,7 @@ def open_file_if_needed(file_writer): sp.call(commands, stdout=FNULL, stderr=sp.STDOUT) FNULL.close() - if file_writer_config["quiet"]: + if file_writer_config["verbose"] != "DEBUG": sys.stdout.close() sys.stdout = curr_stdout diff --git a/manim/config.py b/manim/config.py index a6584a49d6..e9216deffb 100644 --- a/manim/config.py +++ b/manim/config.py @@ -88,6 +88,7 @@ def _parse_config(config_parser, args): args, config_parser, file_writer_config, successfully_read_files = _run_config() +logger.setLevel(file_writer_config["verbose"]) if _from_command_line(): logger.info( f"Read configuration files: {[os.path.abspath(cfgfile) for cfgfile in successfully_read_files]}" diff --git a/manim/constants.py b/manim/constants.py index e9f41a79f6..81674b220d 100644 --- a/manim/constants.py +++ b/manim/constants.py @@ -152,3 +152,11 @@ class MyText(Text): ) PALETTE = list(COLOR_MAP.values()) locals().update(COLOR_MAP) +VERBOSE_FFMPEG_MAP = { + "DEBUG": "error", + "INFO": "error", + "WARNING": "error", + "ERROR": "error", + "CRITICAL": "fatal", +} +VERBOSE_CHOICES = VERBOSE_FFMPEG_MAP.keys() diff --git a/manim/default.cfg b/manim/default.cfg index c642acd38d..d978e31b93 100644 --- a/manim/default.cfg +++ b/manim/default.cfg @@ -36,8 +36,11 @@ preview = False # -f, --show_file_in_finder show_file_in_finder = False -# -q, --quiet -quiet = False +# -v, --verbose +verbose = INFO + +# --progress_bar +progress_bar = True # --sound sound = False @@ -155,9 +158,13 @@ logging_level_info = blue logging_level_warning = red logging_level_error = red bold logging_level_critical = red bold reverse -log_level = +log_level = log_time = cyan dim -log_message = +log_message = log_path = dim log_width = -1 -log_height = -1 \ No newline at end of file +log_height = -1 + +[ffmpeg] +# Uncomment the following line to manually set the loglevel for ffmpeg. See ffmpeg manpage for accepted values +# loglevel = error diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 2985b4bdde..70ba5bc4ee 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -681,6 +681,7 @@ def get_time_progression( total=n_iterations, leave=file_writer_config["leave_progress_bars"], ascii=True if platform.system() == "Windows" else None, + disable=not file_writer_config["progress_bar"], ) return time_progression diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index 67d084c5a7..ad5512e1f9 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -389,7 +389,7 @@ def open_movie_pipe(self): "-", # The imput comes from a pipe "-an", # Tells FFMPEG not to expect any audio "-loglevel", - "error", + file_writer_config["ffmpeg_loglevel"], ] # TODO, the test for a transparent background should not be based on # the file extension. @@ -474,7 +474,7 @@ def combine_movie_files(self): "-i", file_list, "-loglevel", - "error", + file_writer_config["ffmpeg_loglevel"], ] if self.write_to_movie: @@ -518,7 +518,7 @@ def combine_movie_files(self): "-map", "1:a:0", "-loglevel", - "error", + file_writer_config["ffmpeg_loglevel"], # "-shortest", temp_file_path, ] diff --git a/manim/utils/config_utils.py b/manim/utils/config_utils.py index 5ab68cfd16..40997854ea 100644 --- a/manim/utils/config_utils.py +++ b/manim/utils/config_utils.py @@ -52,7 +52,6 @@ def _parse_file_writer_config(config_parser, args): for boolean_opt in [ "preview", "show_file_in_finder", - "quiet", "sound", "leave_progress_bars", "write_to_movie", @@ -135,6 +134,24 @@ def _parse_file_writer_config(config_parser, args): [fw_config["save_last_frame"], fw_config["from_animation_number"]] ) + # Parse the verbose flag to read in the log level + verbose = getattr(args, "verbose") + verbose = default["verbose"] if verbose is None else verbose + fw_config["verbose"] = verbose + + # Parse the ffmpeg log level in the config + ffmpeg_loglevel = config_parser["ffmpeg"].get("loglevel", None) + fw_config["ffmpeg_loglevel"] = ( + constants.VERBOSE_FFMPEG_MAP[verbose] + if ffmpeg_loglevel is None + else ffmpeg_loglevel + ) + + # Parse the progress_bar flag + progress_bar = getattr(args, "progress_bar") + if progress_bar is None: + progress_bar = default.getboolean("progress_bar") + fw_config["progress_bar"] = progress_bar return fw_config @@ -205,9 +222,6 @@ def _parse_cli(arg_list, input=True): const=True, help="Show the output file in finder", ) - parser.add_argument( - "-q", "--quiet", action="store_const", const=True, help="Quiet mode", - ) parser.add_argument( "--sound", action="store_const", @@ -363,6 +377,31 @@ def _parse_cli(arg_list, input=True): parser.add_argument( "--config_file", help="Specify the configuration file", ) + + # Specify the verbosity + parser.add_argument( + "-v", + "--verbose", + type=str, + help="Verbosity level. Also changes the ffmpeg log level unless the latter is specified in the config", + choices=constants.VERBOSE_CHOICES, + ) + + # Specify if the progress bar should be displayed + def _str2bool(s): + if s == "True": + return True + elif s == "False": + return False + else: + raise argparse.ArgumentTypeError("True or False expected") + + parser.add_argument( + "--progress_bar", + type=_str2bool, + help="Display the progress bar", + metavar="True/False", + ) parsed = parser.parse_args(arg_list) if hasattr(parsed, "subcommands"): setattr(