Search code examples
pythonpython-3.xyoutube-dl

youtbe-dl multiple downloads at the same time


I have a python app, where I have a variable that contains multiple urls.

At this moment I use something like this:

for v in arr:
        cmd = 'youtube-dl -u ' + email + ' -p ' + password + ' -o "' + v['path'] + '" ' + v['url']

        os.system(cmd)

But this way I download just one video after another. How can I download, let's say 3 videos at the same time ? (Is not from youtube so no playlist or channels)

I not necessary need multi threading in python, but to call the youtube-dl multiple times, splitting the array. So from a python perspective can be on thread.


Solution

  • I achieved the same thing using threading library, which is considered a lighter way to spawn new processes.

    Assumption:

    • Each task will download videos to a different directory.
    import os
    import threading
    import youtube_dl
    
    COOKIE_JAR = "path_to_my_cookie_jar"
    
    def download_task(videos, output_dir):
    
        if not os.path.isdir(output_dir):
            os.makedirs(output_dir)
    
        if not os.path.isfile(COOKIE_JAR):
            raise FileNotFoundError("Cookie Jar not found\n")
    
        ydl_opts = { 
            'cookiefile': COOKIE_JAR, 
            'outtmpl': f'{output_dir}/%(title)s.%(ext)s'
        }
    
        with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            ydl.download(videos)
    
    
    if __name__ == "__main__":
    
        output_dir = "./root_dir"
    
        threads = []
        for playlist in many_playlists:
            output_dir = f"{output_dir}/playlist.name"
            thread = threading.Thread(target=download_task, args=(playlist, output_dir))
            threads.append(thread)
        
        # Actually start downloading
        for thread in threads:
            thread.start()
         
        # Wait for all the downloads to complete
        for thread in threads: 
            thread.join()