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.

Answer

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 foundn")

    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()

Leave a Reply

Your email address will not be published. Required fields are marked *