manim-slides icon indicating copy to clipboard operation
manim-slides copied to clipboard

[BUG] ValueError: [Errno 22] Invalid argument

Open JoacoAnselmo opened this issue 1 year ago • 15 comments

Terms

Describe the issue

Hi! I installed manim slides, everything went well, but whenever I try to render my scene it gives an error message (although it does render, so manim is working).

Then, if I try to run manim-slides, it tells me the JSON doesn't exist.

I haven't found anything on the other issues about this. Any help would be appreciated!

(I inserted the corresponding code and error messages below, I'm hoping it shows up on the issue report, it is my first time submitting one).

Command

manim -pqh scene.py EjemploSlides

Issue Type

Other

Python version

Python 3.11.3

Python environment

Manim Slides version: 5.1.9
Python executable: C:\Users\Joaquín\AppData\Local\Programs\Python\Python311\python.exe
Manim bindings:
"sox" no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.
SoX could not be found!

    If you do not have SoX, proceed here:
     - - - http://sox.sourceforge.net/ - - -

    If you do (or think that you should) have SoX, double-check your
    path variables.

        manim (version: 0.18.1)
        manimgl not found
No Qt API found, some Manim Slides commands will not be available

What is your platform?

Windows

Other platform

No response

Manim Slides Python code

class EjemploSlides(Slide):
    def construct(self):
        punto = Dot(ORIGIN, color=BLUE)
        self.play(Create(punto))
        self.next_slide()

        self.play(punto.animate.shift(RIGHT))
        self.next_slide()

        self.play(FadeOut(punto))

Relevant log output

C:\Users\Joaquín\AppData\Local\Programs\Python\Python311\Lib\site-packages\manim\cli\render\comm │
│ ands.py:120 in render                                                                            │
│                                                                                                  │
│   117 │   │   │   try:                                                                           │
│   118 │   │   │   │   with tempconfig({}):                                                       │
│   119 │   │   │   │   │   scene = SceneClass()                                                   │
│ ❱ 120 │   │   │   │   │   scene.render()                                                         │
│   121 │   │   │   except Exception:                                                              │
│   122 │   │   │   │   error_console.print_exception()                                            │
│   123 │   │   │   │   sys.exit(1)                                                                │
│                                                                                                  │
│ C:\Users\Joaquín\AppData\Local\Programs\Python\Python311\Lib\site-packages\manim_slides\slide\ma │
│ nim.py:136 in render                                                                             │
│                                                                                                  │
│   133 │   │                                                                                      │
│   134 │   │   config["max_files_cached"] = max_files_cached                                      │
│   135 │   │                                                                                      │
│ ❱ 136 │   │   self._save_slides(                                                                 │
│   137 │   │   │   use_cache=not (config["disable_caching"] or self.disable_caching),             │
│   138 │   │   │   flush_cache=(config["flush_cache"] or self.flush_cache),                       │
│   139 │   │   │   skip_reversing=self.skip_reversing,                                            │
│                                                                                                  │
│ C:\Users\Joaquín\AppData\Local\Programs\Python\Python311\Lib\site-packages\manim_slides\slide\ba │
│ se.py:532 in _save_slides                                                                        │
│                                                                                                  │
│   529 │   │   │                                                                                  │
│   530 │   │   │   # We only concat animations if it was not present                              │
│   531 │   │   │   if not use_cache or not dst_file.exists():                                     │
│ ❱ 532 │   │   │   │   concatenate_video_files(slide_files, dst_file)                             │
│   533 │   │   │                                                                                  │
│   534 │   │   │   # We only reverse video if it was not present                                  │
│   535 │   │   │   if not use_cache or not rev_file.exists():                                     │
│                                                                                                  │
│ C:\Users\Joaquín\AppData\Local\Programs\Python\Python311\Lib\site-packages\manim_slides\utils.py │
│ :34 in concatenate_video_files                                                                   │
│                                                                                                  │
│    31 │   │   tmp_file = f.name                                                                  │
│    32 │                                                                                          │
│    33 │   with (                                                                                 │
│ ❱  34 │   │   av.open(tmp_file, format="concat", options={"safe": "0"}) as input_container,      │
│    35 │   │   av.open(str(dest), mode="w") as output_container,                                  │
│    36 │   ):                                                                                     │
│    37 │   │   input_video_stream = input_container.streams.video[0]                              │
│                                                                                                  │
│ in av.container.core.open:420                                                                    │
│                                                                                                  │
│ in av.container.core.Container.__cinit__:266                                                     │
│                                                                                                  │
│ in av.container.core.Container.err_check:286                                                     │
│                                                                                                  │
│ in av.error.err_check:326                                                                        │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
ValueError: [Errno 22] Invalid argument: 'C:\\Users\\JOAQUN~1\\AppData\\Local\\Temp\\tmp519hqu_y.txt'

# And then I get
Usage: manim-slides present [OPTIONS] [SCENES]...

Error: File slides\EjemploSlides.json does not exist, check the scene name and make sure to use Slide as your scene base class

Screenshots

No response

Additional information

This is the first time I'm using it, so there may be an installation bug or something like that

Recommended fix or suggestions

No response

JoacoAnselmo avatar Oct 22 '24 01:10 JoacoAnselmo

Hello @JoacoAnselmo, thanks for reporting your bug!

~~Can you provide the command that you run for rendering the animations?~~ Nevermind, you did provide it :-)

Can you try running

manim-slides render -pqh scene.py EjemploSlides

instead?

As indicated by the last line in your error traceback, the JSON file does not exist, which indicates that the rendering failed.

jeertmans avatar Oct 22 '24 09:10 jeertmans

Hi, thanks for answering! After running that coide, I get this output: `Usage: manim-slides render [-h] [--CE|--GL] [RENDERER_ARGS]...

Render SCENE(s) from the input FILE, using the specified renderer.

Use manim-slides render --help to see help information for a specific renderer.

Options: --CE If set, use Manim Community Edition (CE) renderer. If this or --GL is not set, defaults to CE renderer. [env var: MANIM_RENDERER] --GL If set, use ManimGL renderer. [env var: MANIMGL_RENDERER] -h Show this message and exit.`

It's as if it didn't really run at all, I think.

A couple things that may be of interest: At first I installed manim_presentation, but after some quality issues I decided to try this instead, so maybe there's some clash there. One other thing, I've noticed that the import doesn't get properly colored in VSCode, maybe it's just visual but I thought it was worth mentioning. The "Slide" stays not colored.

image

JoacoAnselmo avatar Oct 22 '24 11:10 JoacoAnselmo

My bad, this is because -pqh is understood as -p -q -h by manim-slides, and -h triggers the help menu. A possible workaround is:

manim-slides render -p --quality=h scene.py EjemploSlides

For your example, I can't say much unless you include a full code that I can run locally :-)

jeertmans avatar Oct 22 '24 11:10 jeertmans

Same output :( Could it be that it isn't interpreting the file address correctly for some reason? The .txt at the address that is an "invalid argument" does exist, and it itself contains an address to a partial movie file that again, does exist.

JoacoAnselmo avatar Oct 22 '24 11:10 JoacoAnselmo

Which error message, the first one of the second one?

jeertmans avatar Oct 22 '24 16:10 jeertmans

Sorry, the first one.

JoacoAnselmo avatar Oct 22 '24 18:10 JoacoAnselmo

I think the error comes from Manim, not Manim Slides, but maybe I am wrong. Can you try rendering the animations without Manim Slides (so with Scene as a base class)?

If possible, use the same Python environnement, and put the output here :)

jeertmans avatar Oct 22 '24 21:10 jeertmans

Hi! Got a similar issue, but with ThreeDSlide instead. Changing to ThreeDScene allowed the scene to render without errors, but I (as expected) cannot use the mp4 output alone to do a presentation (no json is generated).

When I use ThreeDSlide and not ThreeDScene, I get the same error that Joaco described above, except it redirects me to a temporary video file that doesn't exist:

╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /nix/store/fdqig8w0q2dm8xvxqqncpfv7r73766ly-python3-3.12.8-env/lib/python3.12/site-packages/mani │
│ m/cli/render/commands.py:120 in render                                                           │
│                                                                                                  │
│   117 │   │   │   try:                                                                           │
│   118 │   │   │   │   with tempconfig({}):                                                       │
│   119 │   │   │   │   │   scene = SceneClass()                                                   │
│ ❱ 120 │   │   │   │   │   scene.render()                                                         │
│   121 │   │   │   except Exception:                                                              │
│   122 │   │   │   │   error_console.print_exception()                                            │
│   123 │   │   │   │   sys.exit(1)                                                                │
│                                                                                                  │
│ /nix/store/fdqig8w0q2dm8xvxqqncpfv7r73766ly-python3-3.12.8-env/lib/python3.12/site-packages/mani │
│ m_slides/slide/manim.py:136 in render                                                            │
│                                                                                                  │
│   133 │   │                                                                                      │
│   134 │   │   config["max_files_cached"] = max_files_cached                                      │
│   135 │   │                                                                                      │
│ ❱ 136 │   │   self._save_slides(                                                                 │
│   137 │   │   │   use_cache=not (config["disable_caching"] or self.disable_caching),             │
│   138 │   │   │   flush_cache=(config["flush_cache"] or self.flush_cache),                       │
│   139 │   │   │   skip_reversing=self.skip_reversing,                                            │
│                                                                                                  │
│ /nix/store/fdqig8w0q2dm8xvxqqncpfv7r73766ly-python3-3.12.8-env/lib/python3.12/site-packages/mani │
│ m_slides/slide/base.py:532 in _save_slides                                                       │
│                                                                                                  │
│   529 │   │   │                                                                                  │
│   530 │   │   │   # We only concat animations if it was not present                              │
│   531 │   │   │   if not use_cache or not dst_file.exists():                                     │
│ ❱ 532 │   │   │   │   concatenate_video_files(slide_files, dst_file)                             │
│   533 │   │   │                                                                                  │
│   534 │   │   │   # We only reverse video if it was not present                                  │
│   535 │   │   │   if not use_cache or not rev_file.exists():                                     │
│                                                                                                  │
│ /nix/store/fdqig8w0q2dm8xvxqqncpfv7r73766ly-python3-3.12.8-env/lib/python3.12/site-packages/mani │
│ m_slides/utils.py:60 in concatenate_video_files                                                  │
│                                                                                                  │
│    57 │   │   │   │   packet.stream = output_audio_stream                                        │
│    58 │   │   │   else:                                                                          │
│    59 │   │   │   │   continue  # We don't support subtitles                                     │
│ ❱  60 │   │   │   output_container.mux(packet)                                                   │
│    61 │                                                                                          │
│    62 │   os.unlink(tmp_file)  # https://stackoverflow.com/a/54768241                            │
│    63                                                                                            │
│                                                                                                  │
│ in av.container.output.OutputContainer.mux:257                                                   │
│                                                                                                  │
│ in av.container.output.OutputContainer.mux_one:278                                               │
│                                                                                                  │
│ in av.container.core.Container.err_check:286                                                     │
│                                                                                                  │
│ in av.error.err_check:326                                                                        │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
ValueError: [Errno 22] Invalid argument:
'slides/files/PresentationSlides_4/e7c14481ec1f7ec66fa586570ace31ac2f54e35a0c34e9da623b413e240cc1cb.m
p4'

Checking the directory it tries getting Invalid argument from, I get a bunch of short <1sec clips on which nothing is happening, which is much less than the total animation.

What is interesting, is that the entire animation gets generated (i.e. when I run with preview, it works and displays everything perfectly). But still that hashed video file is not present, so json isn't getting created.

For me, this happens when I have a "complex" 3D scene - i.e. with camera rotation in 3D mainly. When I use ThreeDSlide, but work on 2D animation, this issue doesn't appear and the code performs 100% as expected.

Any ideas what might be causing this? I'm on manim-slides v5.1.9, because it's the latest one in nixpkgs. Manim-community version v0.18.1.

Vasissualiyp avatar Feb 24 '25 02:02 Vasissualiyp

Hi @Vasissualiyp, could you provide a pip freeze of your Python environment, a MWE (the simplest version of your code), your Python version, and your OS?

jeertmans avatar Feb 24 '25 10:02 jeertmans

Hi @jeertmans and @JoacoAnselmo! I have had the same problem, and I think I know the cause of the problem. It is something that happens frequently to Spanish speakers and gives us a lot of problems: tildes and blank spaces in absolute paths.

In @JoacoAnselmo case, he has a tilde in the word "Joaquín" in the path. If you open the temporary file, you will see a question mark in the path. In my case, something like: file ‘C:\Users...\Presentaci�n...’.

In my case, I solved the problem by modifying the utils.py file (in the @JoacoAnselmo case, C:\Users\Joaquín\AppData\Local\Programs\Python\Python311\Lib\site-packages\manim_slides\utils.py), by modifying the line

with tempfile.NamedTemporaryFile(mode="w", suffix=".txt", delete=False) as f:

by

with tempfile.NamedTemporaryFile(mode="w", suffix=".txt", delete=False, encoding="utf-8") as f:

This has fixed the error. I hope you find this helpful.

candreuv avatar Feb 26 '25 12:02 candreuv

Hi @candreuv, that's an interesting bug! If that's okay for you, I would happily receive a pull request fixing this bug :-)

We could also include a test, I think, inside the tests folder, by creating a temporary directory that uses accents (e.g., with isolated_filesystem)

jeertmans avatar Feb 26 '25 13:02 jeertmans

Hi! I got the same error but it got fixed with @candreuv 's solution. Thanks!

davidil98 avatar Oct 17 '25 19:10 davidil98

I am still open to receive a pull request for this fix :)

jeertmans avatar Oct 17 '25 19:10 jeertmans

Hi @jeertmans! I'm so sorry for not responding to your request. These past few months have been very busy, and I completely forgot to make the pull request. I'll try to do it for you in the next few weeks.

candreuv avatar Oct 18 '25 22:10 candreuv

No issue, thank you very much @candreuv!

jeertmans avatar Oct 19 '25 09:10 jeertmans