PowerShell: Download YouTube Video

From DanIT
Revision as of 08:19, 27 April 2026 by Dan (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Components

These parts are needed to Make Your Own YouTube Downloader:

Interface

The Download-YoutubeVideo.ps1 script.
Useful to have a simple menu that uses all components in one place.

yt-dlp

Required to download Video and Audio from YouTube.
"yt-dlp.exe" is an open-source command line application, and can be downloaded from: https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp.exe

Needs to be regularly updated (as YouTube keeps changing their system).
You can make an Update-button by creating a shortcut to: \yt-dlp\yt-dlp.exe -U

FFmpeg

Required to merge Video and Audio, and to convert formats.
"ffmpeg.exe" is an open-source command line application, and can be downloaded from: https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl.zip

Node.js

Required to simulate a JavaScript environment, so YouTube does not think you are a bot.
"node.exe" is an open-source command line application, and can be downloaded from: https://nodejs.org/en/download

Cookies

Sometimes required, as YouTube requires account identification on restricted videos or restricted client IPs.


Script

Folder Layout
Folder Layout

Download-YoutubeVideo.ps1

param([string]$URL, [string]$Cookies, [string]$Formats, [string]$Location)

function Download-YoutubeVideo
{
    if(!$URL)
    {
        Write-Host "Enter YouTube URL: " -ForegroundColor Cyan -NoNewline; $URL = Read-Host
    }

    if(!$Cookies)
    {
        Write-Host "`n`n[E] Extract from Edge`n[C] Extract from Chrome`n[F] Extract from Firefox`n[R] Use last Browser Extract`n[M] Use manual cookies.txt`n[Enter] to Skip Cookies" -ForegroundColor Yellow
        Write-Host "`nChoose Cookies: " -ForegroundColor Cyan -NoNewline; $Cookies = Read-Host

        $File = $PSScriptRoot+'\Cookies\browser.txt';
        switch -Regex ($Cookies)
        {
            '^E' { Remove-Item $File; $Args += @('--cookies-from-browser', 'edge', '--cookies', $File) }
            '^C' { Remove-Item $File; $Args += @('--cookies-from-browser', 'chrome', '--cookies', $File) }
            '^F' { Remove-Item $File; $Args += @('--cookies-from-browser', 'firefox', '--cookies', $File) }
            '^R' { $Args += @('--cookies', $File) }
            '^M' { $Args += @('--cookies', $File.Replace("browser.txt", "cookies.txt")) }
        }
    }

    $Args += @('--js-runtimes', "node:$PSScriptRoot\node\node.exe")

    if(!$Formats)
    {
        Write-Host "`n`nLoading all available formats..." -ForegroundColor Yellow
        ./yt-dlp/yt-dlp.exe --quiet --no-warnings $Args --list-formats $URL

        Write-Host "`n`n[VideoID+AudioID] For Video and Audio`n[Enter] To automatically select BestVideo+BestAudio" -ForegroundColor Yellow
        Write-Host "`nChoose Format ID(s): " -ForegroundColor Cyan -NoNewline; $Formats = Read-Host

        if(!$Formats) { $Formats = 'bestvideo+bestaudio' }
        $Args += @('--format', "$Formats")
    }

    if(!$Location)
    {
        $Location = $PSScriptRoot + '\Downloads'
        $Args += @('--paths', $Location)
    }

    Write-Host "`nDownloading started..." -ForegroundColor Yellow
    ./yt-dlp/yt-dlp.exe --ffmpeg-location "$PSScriptRoot\ffmpeg\ffmpeg.exe" --merge-output-format mp4 --output '[%(id)s] %(title)s.%(ext)s' $Args $URL

    Write-Host -ForegroundColor Green "`nDownload has finished!`n`n"

    Remove-Variable * -ErrorAction SilentlyContinue
    Download-YoutubeVideo
}

Download-YoutubeVideo

Use

Download-YouTubeVideo.ps1

Run the Download-YoutubeVideo.ps1 script, and answer the following prompts:

-URL

Enter the <URL> link of the YouTube video.

-Cookies

<C> to extract from Chrome
<F> to extract from Firefox
<L> to extract from local file 'cookies.txt'

Leave empty to download without cookies.

-Formats

A list of available Video and Audio Format ID's for this URL will be shown.
Enter the <Video Format ID> + <Audio Format ID>

Leave empty to choose 'bestvideo+bestaudio'.


The script will automatically start over after the download has finished.