From f81c275631b02d0914c3c83f26d2709dd770089d Mon Sep 17 00:00:00 2001 From: Devin Neal Date: Tue, 4 Jun 2019 20:51:18 -0700 Subject: [PATCH] make media, tex, and video directories configurable via flags --- manimlib/__init__.py | 2 ++ manimlib/config.py | 17 ++++++++- manimlib/constants.py | 56 ++++++++++++++++------------- manimlib/mobject/mobject.py | 3 +- manimlib/scene/scene_file_writer.py | 6 ++-- manimlib/utils/tex_file_writing.py | 8 ++--- stage_scenes.py | 4 +-- 7 files changed, 61 insertions(+), 35 deletions(-) diff --git a/manimlib/__init__.py b/manimlib/__init__.py index 3d3d6490..5eb9e228 100644 --- a/manimlib/__init__.py +++ b/manimlib/__init__.py @@ -1,5 +1,6 @@ #!/usr/bin/env python import manimlib.config +import manimlib.constants import manimlib.extract_scene import manimlib.stream_starter @@ -8,6 +9,7 @@ def main(): args = manimlib.config.parse_cli() if not args.livestream: config = manimlib.config.get_configuration(args) + manimlib.constants.initialize_directories(config) manimlib.extract_scene.main(config) else: manimlib.stream_starter.start_livestream( diff --git a/manimlib/config.py b/manimlib/config.py index eb124045..e02b374f 100644 --- a/manimlib/config.py +++ b/manimlib/config.py @@ -112,6 +112,18 @@ def parse_cli(): action="store_true", help="Leave progress bars displayed in terminal", ) + parser.add_argument( + "--media_dir", + help="directory to write media", + ) + parser.add_argument( + "--video_dir", + help="directory to write video", + ) + parser.add_argument( + "--tex_dir", + help="directory to write tex", + ) # For live streaming module_location.add_argument( @@ -192,7 +204,10 @@ def get_configuration(args): "start_at_animation_number": args.start_at_animation_number, "end_at_animation_number": None, "sound": args.sound, - "leave_progress_bars": args.leave_progress_bars + "leave_progress_bars": args.leave_progress_bars, + "media_dir": args.media_dir, + "video_dir": args.video_dir, + "tex_dir": args.tex_dir, } # Camera configuration diff --git a/manimlib/constants.py b/manimlib/constants.py index 9ce2db5e..c15618c4 100644 --- a/manimlib/constants.py +++ b/manimlib/constants.py @@ -1,32 +1,40 @@ import numpy as np import os -# Initialize directories -env_MEDIA_DIR = os.getenv("MEDIA_DIR") -if env_MEDIA_DIR: - MEDIA_DIR = env_MEDIA_DIR -elif os.path.isfile("media_dir.txt"): - with open("media_dir.txt", 'rU') as media_file: - MEDIA_DIR = media_file.readline().strip() -else: - MEDIA_DIR = os.path.join( - os.path.expanduser('~'), - "Dropbox (3Blue1Brown)/3Blue1Brown Team Folder" - ) -if not os.path.isdir(MEDIA_DIR): - MEDIA_DIR = "./media" - print( - f"Media will be stored in {MEDIA_DIR + os.sep}. You can change " - "this behavior by writing a different directory to media_dir.txt." - ) +MEDIA_DIR = "" +VIDEO_DIR = "" +TEX_DIR = "" -VIDEO_DIR = os.path.join(MEDIA_DIR, "video") -ASSETS_DIR = os.path.join(MEDIA_DIR, "assets") -TEX_DIR = os.path.join(MEDIA_DIR, "Tex") +def initialize_directories(config): + global MEDIA_DIR + global VIDEO_DIR + global TEX_DIR + if not (config["video_dir"] and config["tex_dir"]): + if config["media_dir"]: + MEDIA_DIR = config["media_dir"] + else: + MEDIA_DIR = os.path.join( + os.path.expanduser('~'), + "Dropbox (3Blue1Brown)/3Blue1Brown Team Folder" + ) + if not os.path.isdir(MEDIA_DIR): + MEDIA_DIR = "./media" + print( + f"Media will be written to {MEDIA_DIR + os.sep}. You can change " + "this behavior with the --media_dir flag." + ) + else: + if config["media_dir"]: + print( + "Ignoring --media_dir, since --video_dir and --tex_dir were " + "both passed" + ) + VIDEO_DIR = config["video_dir"] or os.path.join(MEDIA_DIR, "video") + TEX_DIR = config["tex_dir"] or os.path.join(MEDIA_DIR, "Tex") -for folder in [VIDEO_DIR, ASSETS_DIR, TEX_DIR]: - if not os.path.exists(folder): - os.makedirs(folder) + for folder in [VIDEO_DIR, TEX_DIR]: + if not os.path.exists(folder): + os.makedirs(folder) TEX_USE_CTEX = False TEX_TEXT_TO_REPLACE = "YourTextHere" diff --git a/manimlib/mobject/mobject.py b/manimlib/mobject/mobject.py index 4b03f490..af1fa9c0 100644 --- a/manimlib/mobject/mobject.py +++ b/manimlib/mobject/mobject.py @@ -9,6 +9,7 @@ import sys from colour import Color import numpy as np +import manimlib.constants as consts from manimlib.constants import * from manimlib.container.container import Container from manimlib.utils.color import color_gradient @@ -109,7 +110,7 @@ class Mobject(Container): def save_image(self, name=None): self.get_image().save( - os.path.join(VIDEO_DIR, (name or str(self)) + ".png") + os.path.join(consts.VIDEO_DIR, (name or str(self)) + ".png") ) def copy(self): diff --git a/manimlib/scene/scene_file_writer.py b/manimlib/scene/scene_file_writer.py index fb39c90e..bfb4b155 100644 --- a/manimlib/scene/scene_file_writer.py +++ b/manimlib/scene/scene_file_writer.py @@ -7,11 +7,11 @@ import _thread as thread from time import sleep import datetime +import manimlib.constants as consts from manimlib.constants import FFMPEG_BIN from manimlib.constants import STREAMING_IP from manimlib.constants import STREAMING_PORT from manimlib.constants import STREAMING_PROTOCOL -from manimlib.constants import VIDEO_DIR from manimlib.utils.config_ops import digest_config from manimlib.utils.file_ops import guarantee_existence from manimlib.utils.file_ops import add_extension_if_not_present @@ -50,7 +50,7 @@ class SceneFileWriter(object): scene_name = self.file_name or self.get_default_scene_name() if self.save_last_frame: image_dir = guarantee_existence(os.path.join( - VIDEO_DIR, + consts.VIDEO_DIR, module_directory, scene_name, "images", @@ -61,7 +61,7 @@ class SceneFileWriter(object): ) if self.write_to_movie: movie_dir = guarantee_existence(os.path.join( - VIDEO_DIR, + consts.VIDEO_DIR, module_directory, scene_name, self.get_resolution_directory(), diff --git a/manimlib/utils/tex_file_writing.py b/manimlib/utils/tex_file_writing.py index 1ebd3a82..84fd1e40 100644 --- a/manimlib/utils/tex_file_writing.py +++ b/manimlib/utils/tex_file_writing.py @@ -1,9 +1,9 @@ import os import hashlib -from manimlib.constants import TEX_DIR from manimlib.constants import TEX_TEXT_TO_REPLACE from manimlib.constants import TEX_USE_CTEX +import manimlib.constants as consts def tex_hash(expression, template_tex_file_body): @@ -22,7 +22,7 @@ def tex_to_svg_file(expression, template_tex_file_body): def generate_tex_file(expression, template_tex_file_body): result = os.path.join( - TEX_DIR, + consts.TEX_DIR, tex_hash(expression, template_tex_file_body) ) + ".tex" if not os.path.exists(result): @@ -44,7 +44,7 @@ def tex_to_dvi(tex_file): "latex", "-interaction=batchmode", "-halt-on-error", - "-output-directory=" + TEX_DIR, + "-output-directory=" + consts.TEX_DIR, tex_file, ">", os.devnull @@ -53,7 +53,7 @@ def tex_to_dvi(tex_file): "-no-pdf", "-interaction=batchmode", "-halt-on-error", - "-output-directory=" + TEX_DIR, + "-output-directory=" + consts.TEX_DIR, tex_file, ">", os.devnull diff --git a/stage_scenes.py b/stage_scenes.py index 8ef370d2..86d5a6c5 100644 --- a/stage_scenes.py +++ b/stage_scenes.py @@ -4,8 +4,8 @@ import os import sys import importlib +import manimlib.constants as consts from manimlib.constants import PRODUCTION_QUALITY_CAMERA_CONFIG -from manimlib.constants import VIDEO_DIR from manimlib.config import get_module from manimlib.extract_scene import is_child_scene @@ -43,7 +43,7 @@ def stage_scenes(module_name): # } # TODO, fix this animation_dir = os.path.join( - VIDEO_DIR, "ode", "part2", "1440p60" + consts.VIDEO_DIR, "ode", "part2", "1440p60" ) # files = os.listdir(animation_dir)