Goal: Create a Python script that can download individual videos or an entire playlist from YouTube.
In this you will create a command-line tool, meaning you will run it from the terminal or command prompt.
What will you learn in this
- Importing and using external libraries
We will use a library called yt-dlp. It makes downloading videos and playlists from YouTube easy.
- Creating a user-friendly interface
Your program will ask the user what he wants, and then guide him step-by-step.
- Applying if/else logic
If the user says he wants a video, download the video, else the code for the playlist will run.
- Error Handling
If someone gives the wrong URL, the program will simply say “the URL is wrong” — and will not get confused.
- Breaking the code into parts (Functions)
Your code will be in small functions, so that it looks neat and it is easy to change later.
Prerequisites
- Python
You must have Python 3 installed on your system. If not, view this Python installation guide.
- yt-dlp library
This is the library we will be working with.
To install it, open the terminal (or Command Prompt) and run this command:
pip install yt-dlp

Step 1: Prepare your project folder
First, create a new folder for your project. Name it something cool, like YouTube_Downloader
.

Now create a new file inside this folder, using your favorite code editor — be it VS Code, Sublime Text, or Notepad, and name it downloader.py
.

Step 2: Writing Python code
This is where the real game begins.
We will write the code in such a way that everything is divided into modules.
We will start with a main function, which will guide the user on what to do next.
We will add this code in the file downloader.py
.
# Importing libraries to run command-line tools and manage files
import subprocess
import os
# --- Helper Functions ---
def download_video(url, output_path='Videos'):
"""
Function to download a single YouTube video using yt-dlp
"""
try:
print(f"Fetching video from {url}...")
# Ensure the output directory exists
os.makedirs(output_path, exist_ok=True)
# Construct the command to download the best quality video/audio and merge them
command = [
'yt-dlp',
'-o', os.path.join(output_path, '%(title)s.%(ext)s'), # Saves as 'Video Title.mp4' etc.
url
]
subprocess.run(command, check=True) # Run the command and check for errors
print(f"✅ Downloaded successfully!") # Downloading message
except subprocess.CalledProcessError:
print("❌ Error: Failed to download. Check if the URL is correct and yt-dlp is working.")
except Exception as e: # Any other error
print(f"❌ An error occurred during download: {e}")
def download_playlist(url, output_path='Playlists'):
"""
Function to download all videos in a YouTube playlist using yt-dlp
"""
try:
print(f"Starting download for playlist: {url}")
# The output template '%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s'
# tells yt-dlp to create a folder named after the playlist title.
output_template = os.path.join(output_path, '%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s')
command = [
'yt-dlp',
'-o', output_template, # Set the output template
'--yes-playlist', # Confirm downloading a playlist
url
]
subprocess.run(command, check=True)
print("\n✅ Playlist download complete!")
except subprocess.CalledProcessError:
print("❌ Error: Failed to download playlist. Check the URL and your connection.")
except Exception as e:
print(f"❌ An error occurred with the playlist URL: {e}")
# --- Main Program Logic ---
def main():
"""This is the main function which will ask the user what to download and run the correct function
"""
print("--- Welcome to the YouTube Downloader! ---")
while True:
# Ask the user if they want a video, playlist or exit the program
mode = input("\nDo you want to download a (1) single video or a (2) playlist? (Enter 1 or 2, or 'q' to quit): ")
if mode.lower() == 'q': # Exit if user enters 'q'
print("Goodbye! 👋")
break
elif mode == '1': # If downloading a video
video_url = input("Enter the YouTube video URL: ")
download_video(video_url)
elif mode == '2': # If downloading a playlist
playlist_url = input("Enter the YouTube playlist URL: ")
download_playlist(playlist_url)
else: # If wrong option selected
print("That's not a valid option. Please try again.")
# Entry point of the script (this is what runs when you run the file directly)
if __name__ == "__main__":
main()
Step 3: Run the script
Open the terminal
- In Windows → Open Command Prompt or PowerShell
- In Mac and Linux → Open Terminal
Go to your project folder
Use the cd
command to navigate to the folder where your script is located.
In Windows:
cd C:\Users\YourName\Desktop\YouTube_Downloader
In Mac/Linux:
cd /home/YourName/Desktop/YouTube_Downloader
or
cd ~/Desktop/YouTube_Downloader
Run the script
The command is the same for all three – Windows, Mac, Linux:
python downloader.py
If your system runs python3
instead of python
, run this:
python3 downloader.py
The program will now ask you
- Press '1' → to download a video, then paste the URL.
- Press '2' → to download the entire playlist, then paste its URL.

Where to find the downloads
Whatever you download will be saved in your project folder.

If you have downloaded playlists, a separate folder will be created for each playlist.
Frequently Asked Questions (FAQs)
Q1: How do I add a progress bar to a download?
yt-dlp
does this automatically. When you run the script, a detailed progress bar will appear directly in the terminal - including the download speed, file size, and the time left. You don't need to write any extra code for this.
Q2: What if I want to change download options, like download only audio — how do I do that?
You can do this by adding extra flags to the yt-dlp
command in the Python script.
Let’s say you only want the audio and save it as an MP3 file, then change the command list in the download_video
function like this:
Inside the download_video
function
command = [
'yt-dlp',
'-x', # to extract only the audio
'--audio-format', 'mp3', # to convert to mp3
'-o', os.path.join(output_path, '%(title)s.%(ext)s'),
url
]
yt-dlp
has hundreds of options to change the format, quality, subtitles and more.
Q3: Error in script, what to do now?
Usually the problem occurs due to these reasons:
- URL is wrong
- Internet is faulty
-
yt-dlp
is not installed or not working
First check whether the URL you have entered is a direct link to the correct YouTube video or playlist.
If it still does not work, then it is possible that your yt-dlp
library is out of date, because YouTube often changes its system. Update it:
pip install --upgrade yt-dlp
Q4: Why is there no sound in the downloaded video?
This problem is common with other methods, but yt-dlp
fixes it automatically. In fact, when you watch a high-quality video, YouTube provides the video and audio in separate files. yt-dlp
is smart enough to download the best version of both and then combine them into one high-quality file.
This is why it is important to install FFmpeg
, because yt-dlp
uses it to combine the video and audio. Once you have this setup, the no sound problem is gone.
Q5: Why did we choose yt-dlp?
There are other libraries, but we chose yt-dlp
because it is very powerful, reliable and always updated. It is the community's standard tool for downloading videos.
When we call it from Python, we get the benefits of both — Python's simple interface and yt-dlp
's powerful, up-to-date downloader that does all the heavy lifting. And yes, it even handles tricky things like audio-video integration automatically.