PowerShell: Download Youtube Video
Contents
Overview
Long story short, YouTube makes it not so easy to download their videos.
So regardless what application you use to download, it is always going to require or include the following base components:
'yt-dlp'
yt-dlp.exe is a command line application to download from YouTube, and needs to be regularly updated (as YouTube keeps changing the system).
This application is open-source (https://github.com/yt-dlp/yt-dlp/).
'ffmpeg'
YouTube stores videos as multiple components, seperating video from audio, and having different quality levels.
ffmpeg.exe is a command line application to merge the video with audio into one file, and to convert the format if needed.
This application is open-source (https://github.com/FFmpeg/FFmpeg).
Cookies
Cookies from your YouTube session from browser are sometimes required to download, as YouTube requires identification for restricted videos or users.
Script
Setting up this PowerShell Menu Script is IMO the best way to do it for Windows, in terms of balancing security and ease of use and edit.
- Make sure to try Update YT-DLP first (with the shortcut) when encountering issues.
- A list of available formats for the given URL will automatically be shown.
- Downloads will automatically be converted to .mp4 (if needed), using ffmpeg.
- After download completion, you will automatically be prompted for a next download.
- Script has parameters, so can also be used by other scripts and automations/jobs.
- Everything is open-source.
Setup
Create a new folder, and put the following in there:
- Download yt-dlp.exe from https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp.exe
- Download ffmpeg.exe from https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl.zip (found in the 'bin' folder).
- Create a new shortcut, with location yt-dlp.exe -U, and name it Update YT-DLP
- Create a new folder called Downloads
- Open Notepad, copy the PowerShell code below, and save it as Download.ps1
param([string]$URL, [string]$Cookies, [string]$Quality, [string]$Location) function Download-YoutubeVideo { if(!$URL) { Write-Host "`nEnter YouTube URL: " -ForegroundColor Yellow -NoNewline; $URL = Read-Host } if(!$Cookies) { Write-Host "`nSelect Cookies" -ForegroundColor Yellow Write-Host "[C] for Chrome, [F] for Firefox, [L] for local cookies.txt, empty to skip: " -ForegroundColor Yellow -NoNewline; $Cookies = Read-Host if($Cookies -eq "C") { $CookiesArgs = @('--cookies-from-browser', 'chrome') } if($Cookies -eq "F") { $CookiesArgs = @('--cookies-from-browser', 'firefox') } if($Cookies -eq "L") { $CookiesArgs = @('--cookies', 'cookies.txt') } } if(!$Quality) { Write-Host "" ./yt-dlp.exe $CookiesArgs -F $URL Write-Host "`nSelect Format ID(s) for Quality" -ForegroundColor Yellow Write-Host "'Video ID + Audio ID', empty for best video and audio: " -ForegroundColor Yellow -NoNewline; $Quality = Read-Host if(!$Quality) { $Quality = 'bestvideo+bestaudio' } } if(!$Location) { $Location = $PSScriptRoot + '\Downloads' } Write-Host "" ./yt-dlp.exe --format $Quality --merge-output-format mp4 $CookiesArgs --paths $Location --output '%(title)s.%(ext)s' $URL Write-Host -ForegroundColor Green "`nDone!" Remove-Variable * -ErrorAction SilentlyContinue Download-YoutubeVideo } Download-YoutubeVideo
Use
Open the Download.ps1 file, and answer the following prompts:
URL
The link of the YouTube video
Cookies
'C' for extract from Chrome
'F' for extract from Firefox
'L' for extract from local file 'cookies.txt'
Leave empty for attempt to download without cookies
Quality
Enter the ID(s) of the format(s) that you want to download from the list.
If you want to download Video and Audio and combine them, enter like: 'Video ID'+'Audio ID'.
Leave empty to automatically choose 'bestvideo+bestaudio'.