Skip to content

Commit 7248cf5

Browse files
Fix CLI bugs (#1431)
* First draft at fixing CLI bugs Fixed output_file option Removed -h help flag from manim/manim render * Updated play logic test to use format = png * Added suggestions, fixed test cases * Revert file * Fix? * Append format to end of config_code * Update manim/cli/render/render_options.py Co-authored-by: Benjamin Hackl <[email protected]> * Add format to default.cfg Co-authored-by: Benjamin Hackl <[email protected]>
1 parent 7fa446c commit 7248cf5

File tree

13 files changed

+140
-60
lines changed

13 files changed

+140
-60
lines changed

docs/source/manim_directive.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,13 @@ def run(self):
218218
f'config["pixel_height"] = {pixel_height}',
219219
f'config["pixel_width"] = {pixel_width}',
220220
f'config["save_last_frame"] = {save_last_frame}',
221-
f'config["save_as_gif"] = {save_as_gif}',
222221
f'config["write_to_movie"] = {not save_last_frame}',
223222
f'config["output_file"] = r"{output_file}"',
224223
]
224+
if save_last_frame:
225+
config_code.append('config["format"] = None')
226+
if save_as_gif:
227+
config_code.append('config["format"] = "gif"')
225228

226229
user_code = self.content
227230
if user_code[0].startswith(">>> "): # check whether block comes from doctest

manim/__main__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from .cli.cfg.commands import cfg
88
from .cli.plugins.commands import plugins
99
from .cli.render.commands import render
10-
from .constants import CONTEXT_SETTINGS, EPILOG
10+
from .constants import EPILOG
1111

1212

1313
def exit_early(ctx, param, value):
@@ -22,7 +22,6 @@ def exit_early(ctx, param, value):
2222
cls=DefaultGroup,
2323
default="render",
2424
no_args_is_help=True,
25-
context_settings=CONTEXT_SETTINGS,
2625
help="Animation engine for explanatory math videos",
2726
epilog=EPILOG,
2827
)

manim/_config/default.cfg

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ notify_outdated_version = True
2020
# -w, --write_to_movie
2121
write_to_movie = True
2222

23+
format = mp4
24+
2325
# -s, --save_last_frame
2426
# setting save_last_frame to True forces write_to_movie to False
2527
save_last_frame = False

manim/_config/utils.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ class MyScene(Scene):
244244
"custom_folders",
245245
"disable_caching",
246246
"ffmpeg_loglevel",
247+
"format",
247248
"flush_cache",
248249
"frame_height",
249250
"frame_rate",
@@ -261,6 +262,7 @@ class MyScene(Scene):
261262
"media_dir",
262263
"movie_file_extension",
263264
"notify_outdated_version",
265+
"output_file",
264266
"partial_movie_dir",
265267
"pixel_height",
266268
"pixel_width",
@@ -626,6 +628,7 @@ def digest_args(self, args: argparse.Namespace) -> "ManimConfig":
626628
"save_as_gif",
627629
"write_all",
628630
"disable_caching",
631+
"format",
629632
"flush_cache",
630633
"progress_bar",
631634
"transparent",
@@ -660,7 +663,6 @@ def digest_args(self, args: argparse.Namespace) -> "ManimConfig":
660663
if attr is not None:
661664
self[key] = attr
662665

663-
# The -s (--save_last_frame) flag invalidates -w (--write_to_movie).
664666
if self["save_last_frame"]:
665667
self["write_to_movie"] = False
666668

@@ -842,6 +844,20 @@ def verbosity(self, val: str) -> None:
842844
)
843845
logging.getLogger("manim").setLevel(val)
844846

847+
@property
848+
def format(self):
849+
"""File format; "png", "gif", "mp4", or "mov"."""
850+
return self._d["format"]
851+
852+
@format.setter
853+
def format(self, val: str) -> None:
854+
"""File format the renderer will output."""
855+
self._set_from_list(
856+
"format",
857+
val,
858+
[None, "png", "gif", "mp4", "mov"],
859+
)
860+
845861
ffmpeg_loglevel = property(
846862
lambda self: self._d["ffmpeg_loglevel"],
847863
lambda self, val: self._set_from_list(

manim/cli/render/commands.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626

2727
@cloup.command(
28-
context_settings=CONTEXT_SETTINGS,
28+
context_settings=None,
2929
epilog=EPILOG,
3030
)
3131
@click.argument("file", type=Path, required=True)
@@ -34,9 +34,7 @@
3434
@output_options
3535
@render_options
3636
@ease_of_access_options
37-
@click.pass_context
3837
def render(
39-
ctx,
4038
**args,
4139
):
4240
"""Render SCENE(S) from the input FILE.
@@ -71,18 +69,31 @@ def render(
7169
logger.warning(
7270
"--use_opengl_renderer is deprecated, please use --renderer=opengl instead!"
7371
)
74-
renderer = "opengl"
72+
args["renderer"] = "opengl"
7573

7674
if args["use_webgl_renderer"]:
7775
logger.warning(
7876
"--use_webgl_renderer is deprecated, please use --renderer=webgl instead!"
7977
)
80-
renderer = "webgl"
78+
args["renderer"] = "webgl"
8179

8280
if args["use_webgl_renderer"] and args["use_opengl_renderer"]:
8381
logger.warning("You may select only one renderer!")
8482
sys.exit()
8583

84+
if args["save_as_gif"]:
85+
logger.warning("--save_as_gif is deprecated, please use --format=gif instead!")
86+
args["format"] = "gif"
87+
88+
if args["save_pngs"]:
89+
logger.warning("--save_pngs is deprecated, please use --format=png instead!")
90+
args["format"] = "png"
91+
92+
if args["show_in_file_browser"]:
93+
logger.warning(
94+
"The short form of show_in_file_browser is deprecated and will be moved to support --format."
95+
)
96+
8697
class ClickArgs:
8798
def __init__(self, args):
8899
for name in args:

manim/cli/render/output_options.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
option(
77
"-o",
88
"--output_file",
9-
multiple=True,
9+
type=str,
1010
help="Specify the filename(s) of the rendered scene(s).",
1111
),
1212
option(

manim/cli/render/render_options.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,7 @@ def validate_resolution(ctx, param, value):
5151
help="Render all scenes in the input file.",
5252
),
5353
option(
54-
"-f",
5554
"--format",
56-
"file_format",
57-
default="mp4",
5855
type=click.Choice(["png", "gif", "mp4"], case_sensitive=False),
5956
),
6057
option("-s", "--save_last_frame", is_flag=True),
@@ -106,6 +103,27 @@ def validate_resolution(ctx, param, value):
106103
type=click.Path(),
107104
help="The path to the WebGL frontend.",
108105
),
106+
option(
107+
"-g",
108+
"--save_pngs",
109+
is_flag=True,
110+
default=None,
111+
help="Save each frame as png (Deprecated).",
112+
),
113+
option(
114+
"-i",
115+
"--save_as_gif",
116+
default=None,
117+
is_flag=True,
118+
help="Save as a gif (Deprecated).",
119+
),
120+
option(
121+
"-s",
122+
"--save_last_frame",
123+
default=None,
124+
is_flag=True,
125+
help="Save last frame as png (Deprecated).",
126+
),
109127
option(
110128
"-t", "--transparent", is_flag=True, help="Render scenes with alpha channel."
111129
),

manim/scene/scene.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,11 @@ def render(self, preview=False):
209209
self.renderer.scene_finished(self)
210210

211211
# Show info only if animations are rendered or to get image
212-
if self.renderer.num_plays or config["save_last_frame"] or config["save_pngs"]:
212+
if (
213+
self.renderer.num_plays
214+
or config["format"] == "png"
215+
or config["save_last_frame"]
216+
):
213217
logger.info(
214218
f"Rendered {str(self)}\nPlayed {self.renderer.num_plays} animations"
215219
)

manim/scene/scene_file_writer.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ def init_output_directories(self, scene_name):
9797
default_name, config["movie_file_extension"]
9898
),
9999
)
100-
if config["save_as_gif"]:
100+
if config["format"] == "gif":
101101
self.gif_file_path = os.path.join(
102102
movie_dir,
103103
add_extension_if_not_present(default_name, GIF_FILE_EXTENSION),
@@ -287,7 +287,7 @@ def write_frame(self, frame_or_renderer):
287287
frame = frame_or_renderer
288288
if config["write_to_movie"]:
289289
self.writing_process.stdin.write(frame.tobytes())
290-
if config["save_pngs"]:
290+
if config["format"] == "png":
291291
path, extension = os.path.splitext(self.image_file_path)
292292
Image.fromarray(frame).save(f"{path}{self.frame_count}{extension}")
293293
self.frame_count += 1
@@ -474,10 +474,10 @@ def combine_movie_files(self, partial_movie_files=None):
474474
"-nostdin",
475475
]
476476

477-
if config["write_to_movie"] and not config["save_as_gif"]:
477+
if config["write_to_movie"] and not config["format"] == "gif":
478478
commands += ["-c", "copy", movie_file_path]
479479

480-
if config["save_as_gif"]:
480+
if config["format"] == "gif":
481481
if not config["output_file"]:
482482
self.gif_file_path = str(
483483
add_version_before_extension(self.gif_file_path)

manim/utils/file_ops.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ def open_media_file(file_writer):
8484

8585
if config["save_last_frame"]:
8686
file_paths.append(file_writer.image_file_path)
87-
if config["write_to_movie"] and not config["save_as_gif"]:
87+
if config["write_to_movie"] and not config["format"] == "gif":
8888
file_paths.append(file_writer.movie_file_path)
89-
if config["save_as_gif"]:
89+
if config["format"] == "gif":
9090
file_paths.append(file_writer.gif_file_path)
9191

9292
for file_path in file_paths:

0 commit comments

Comments
 (0)