0

I am trying to use MoviePy to convert an mp4 video to mp3 audio. In the below 'convertToMP3' function I pass in episode which is an RSS entry object that has a "title" attribute. I've already downloaded an mp4 video that shares the episode title save for some quotes around the file name.

    from moviepy.editor import AudioFileClip, VideoFileClip
    import os
    import feedparser


    #Input: episode, an RSS entry object; cleanup (boolean), a  flag indicating whether 
    or not the old video file should be deleted 
    #Output: None
    #Creates an MP3 version of the video file and optionally deletes the video (cleanup)
    def convertToMP3(self, episode, cleanup = False):

        #Establish path to files
            
        #Try absolute path with quotes
        try:
            path_to_files = os.path.abspath(self.dest)
            video_title = ("\'%s.mp4\'" % episode.title)
            video_dir = os.path.join(path_to_files, video_title)   
            video_version = VideoFileClip(video_dir) 
        except Exception as e: 
            print("ERROR: Absolute path with quotes doesn't work. %s" % e)
       #Try absolute path without quotes
        try:
            path_to_files = os.path.abspath(self.dest)
            video_title = ("%s.mp4" % episode.title)
            video_dir = os.path.join(path_to_files, video_title)   
            video_version = VideoFileClip(video_dir) 
        except Exception as e: 
            print("ERROR: Absolute path without doesn't work. %s" % e)

        #Try implicit path with quotes
        try:
            path_to_files = (self.dest)
            video_title = ("\'%s.mp4\'" % episode.title)
            video_dir = os.path.join(path_to_files, video_title)
            video_version = VideoFileClip(video_dir)
        except Exception as e:
            print("ERROR: Implicit path with quotes doesn't work. %s" % e)

        #Try implicit path without quotes
      
        try:
            path_to_files = (self.dest)
            video_title = ("%s.mp4" % episode.title)
            video_dir = os.path.join(path_to_files, video_title)
            video_version = VideoFileClip(video_dir)
        except Exception as e:
            print("ERROR: Implicit path without quotes doesn't work. %s" % e)  
        try:
            #Create MP3 version of episode
            #video_dir = str(video_dir)
            #TODO: Below line of code cannot find the video file
            mp3_version = video_version.audio
            mp3_version.write_audiofile(path_to_files / episode.title)
            
            #Close the files
            mp3_version.close()
            video_version.close()
        except Exception as e:
            print("ERROR: File conversion failed. %s" % e)

The problem I'm running into is that MoviePy can't find the video file. As you can see I'm using both implicit and absolute paths but neither works. I'm running on an Ubuntu 20.04 machine using Python 3.8.2 and I have all the optional MoviePy dependencies installed. Is there something else that I'm missing?

Traceback:

dLoader1b: Testing file conversion from MP4 to MP3
Traceback (most recent call last):
  File "/usr/lib/python3.8/runpy.py", line 193, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib/python3.8/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/home/caleb/.vscode/extensions/ms-python.python-2020.8.105369/pythonFiles/lib/python/debugpy/__main__.py", line 45, in <module>
    cli.main()
  File "/home/caleb/.vscode/extensions/ms-python.python-2020.8.105369/pythonFiles/lib/python/debugpy/../debugpy/server/cli.py", line 430, in main
    run()
  File "/home/caleb/.vscode/extensions/ms-python.python-2020.8.105369/pythonFiles/lib/python/debugpy/../debugpy/server/cli.py", line 267, in run_file
    runpy.run_path(options.target, run_name=compat.force_str("__main__"))
  File "/usr/lib/python3.8/runpy.py", line 263, in run_path
    return _run_module_code(code, init_globals, run_name,
  File "/usr/lib/python3.8/runpy.py", line 96, in _run_module_code
    _run_code(code, mod_globals, init_globals,
  File "/usr/lib/python3.8/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/home/caleb/Documents/Programming_Projects/Podcast_DLoader/dLoader_tester.py", line 46, in <module>
    dLoader1c.convertToMP3(latest_ep)
  File "/home/caleb/Documents/Programming_Projects/Podcast_DLoader/Podcast_DLoader.py", line 128, in convertToMP3
    video_version = VideoFileClip(video_dir) 
  File "/usr/local/lib/python3.8/dist-packages/moviepy/video/io/VideoFileClip.py", line 88, in __init__
    self.reader = FFMPEG_VideoReader(filename, pix_fmt=pix_fmt,
  File "/usr/local/lib/python3.8/dist-packages/moviepy/video/io/ffmpeg_reader.py", line 35, in __init__
    infos = ffmpeg_parse_infos(filename, print_infos, check_duration,
  File "/usr/local/lib/python3.8/dist-packages/moviepy/video/io/ffmpeg_reader.py", line 270, in ffmpeg_parse_infos
    raise IOError(("MoviePy error: the file %s could not be found!\n"
OSError: MoviePy error: the file /home/caleb/Documents/Programming_Projects/Podcast_DLoader/'NVIDIA CONFIRMS Your PSU Can't Handle RTX 3000 - WAN Show August 28, 2020.mp4' could not be found!
Please check that you entered the correct path.

EDIT

def convertToMP3(self, episode, cleanup = False):

path_to_files = (self.dest)
video_title = episode.title + ".mp4"
video_version = VideoFileClip(video_title)

try:
    #Create MP3 version of episode
    #video_dir = str(video_dir)
    #TODO: Below line of code cannot find the video file
    mp3_version = video_version.audio
    mp3_version.write_audiofile(path_to_files / episode.title)
    
    #Close the files
    mp3_version.close()
    video_version.close()
except Exception as e:
    print("ERROR: File conversion failed. %s" % e)

This still produced the same error:

Traceback (most recent call last):
  File "/usr/lib/python3.8/runpy.py", line 193, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib/python3.8/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/home/caleb/.vscode/extensions/ms-python.python-2020.8.106424/pythonFiles/lib/python/debugpy/__main__.py", line 45, in <module>
    cli.main()
  File "/home/caleb/.vscode/extensions/ms-python.python-2020.8.106424/pythonFiles/lib/python/debugpy/../debugpy/server/cli.py", line 430, in main
    run()
  File "/home/caleb/.vscode/extensions/ms-python.python-2020.8.106424/pythonFiles/lib/python/debugpy/../debugpy/server/cli.py", line 267, in run_file
    runpy.run_path(options.target, run_name=compat.force_str("__main__"))
  File "/usr/lib/python3.8/runpy.py", line 263, in run_path
    return _run_module_code(code, init_globals, run_name,
  File "/usr/lib/python3.8/runpy.py", line 96, in _run_module_code
    _run_code(code, mod_globals, init_globals,
  File "/usr/lib/python3.8/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/home/caleb/Documents/Programming_Projects/Podcast_DLoader/dLoader_tester.py", line 49, in <module>
    dLoader1c.convertToMP3(latest_ep)
  File "/home/caleb/Documents/Programming_Projects/Podcast_DLoader/Podcast_DLoader.py", line 156, in convertToMP3
    video_version = VideoFileClip(video_title)
  File "/usr/local/lib/python3.8/dist-packages/moviepy/video/io/VideoFileClip.py", line 88, in __init__
    self.reader = FFMPEG_VideoReader(filename, pix_fmt=pix_fmt,
  File "/usr/local/lib/python3.8/dist-packages/moviepy/video/io/ffmpeg_reader.py", line 35, in __init__
    infos = ffmpeg_parse_infos(filename, print_infos, check_duration,
  File "/usr/local/lib/python3.8/dist-packages/moviepy/video/io/ffmpeg_reader.py", line 270, in ffmpeg_parse_infos
    raise IOError(("MoviePy error: the file %s could not be found!\n"
OSError: MoviePy error: the file NVIDIA CONFIRMS Your PSU Can't Handle RTX 3000 - WAN Show August 28, 2020.mp4 could not be found!
Please check that you entered the correct path.
Caleb V.
  • 1
  • 2

2 Answers2

0

Most likely what is happening is that, this line:

video_title = ("\'%s.mp4\'" % episode.title)

is resulting in a file name like this: (assuming path_to_files is /opt/moviedir and episode.title is episode1)

`/opt/moviedir/'episode1.mp4'`

which may be different from the intended file name: /opt/moviedir/episode1.mp4

Edit:

After looking at the back trace and looking at the source of moviepy, in particular here (lines 244-272), it looks like the filename is passed a parameter to the ffmpeg command and the filename is not correct. So it is definitely an issue with how we are forming the file names.

Looks like the current way of trying to form a video_title is making single quotes as part of the file name, making it a different from the intended file name without single quotes.

Can you please try changing the video_title = line to this:

video_title = episode.title + ".mp4"

because it looks like we don't need to do explicit escaping of the string when it is being passed to subprocess.Popen without shell=True set (this is how the moviepy library is passing the filename argument). please see this for more information.

vshenoy
  • 1,153
  • 1
  • 8
  • 14
  • I've tried it both with and without the quotes (see updated code above). For whatever reason the videos just come with those in the title. Neither way seems to work. – Caleb V. Sep 01 '20 at 18:30
  • can you please print the full path of the file and check by doing `ls -l` in shell whether that file exists ? – vshenoy Sep 01 '20 at 19:58
  • the file exists at path ~/Documents/Programming_Projects/Podcast_DLoader and ls -l confirms that the file exists at that location – Caleb V. Sep 01 '20 at 20:33
  • ok. could you please paste the full backtrace of the error, showing what exception is actually being thrown ? – vshenoy Sep 02 '20 at 07:43
  • It didn't work. You can see the simplifications I made to the code in the edit along with the traceback which unfortunately leads back to the same error as before. – Caleb V. Sep 05 '20 at 00:01
0

I got this worked by adding complete address to the video file such as:

c = VideoFileClip(r"C:\Users\...\test.mp4").subclip(0, 5)
Suraj Rao
  • 29,388
  • 11
  • 94
  • 103
hammad
  • 1