PowerShell · 29.04.2022

PowerShell и YouTube-dl (Часть 1)

Приключения в мире PowerShell и FFMPEG мною уже описывались здесь и здесь. Общедоступные образцы скриптов по этим заметкам я не формировал, потому как случаи работы с видеофайлами носят исключительно частный характер. Здесь же несколько другое дело…

В сети водится уйма программ для скачивания видео с youtube, но все они — как правило — разбухшие от реклам и наворотов графического интерфейса. В конечном счёте, от такой программы требуется только функционал качалки видеофайла(ов) и ни байтом больше. В поисках наиболее простейшей программы — набрёл на лёгкую утилиту YouTube-DL с управлением из командной строки. Ещё где-то здесь у них есть свой репозиторий с полным перечнем параметров.

По сути, от PowerShell требуется лишь оболочка для общения с пользователем, так как базовые вещи YouTube-DL умеет делать сама. К примеру, можно указать в какую папку нужно скачивать видео и утилита сама создаст папку и сложит туда файлы с нужным названием, заданным в шаблоне. Кроме этого, программа чистит за собой весь мусор. Да и внешний обработчик FFMPEG запускает сама. Нужно только всё хранить в одном каталоге.

В Linux использовать YouTube-DL можно прямо из терминала, предварительно установив программу из репозитория. Подробнее можно прочитать в статье на losst.ru.

Функционал моего скрипта достаточно прост: ищем исполняемый файл youtube-dl.exe, если не находим — скачиваем в папку со скриптом; далее предлагаем пользователю выбор действий. Для постобработки потребуется файл ffmpeg.exe — его уже добываем сами с официального сайта FFMPEG (скрипт откроет страницу скачивания).

В итоге у меня получился вот такой скрипт:

## Шапка скрипта ##
$start = "Скачать видео с YouTube"
[System.Console]::Title = $start

## Скачивание YouTube-DL ##
$getytdl = "https://www.youtube-dl.org/downloads/latest/youtube-dl.exe"
Import-Module BitsTransfer
$testutdl = Test-Path youtube-dl.exe
if (!$testutdl){ Write-Host "Файл youtube-dl.exe не найден!" -ForegroundColor Red
                 Write-Host "Запуск процесса скачивания." -ForegroundColor Red
                 Start-BitsTransfer -Source $getytdl -Destination $PSScriptRoot }

## Предупреждение перед запуском ##
Write-Host
Write-Host "Перед запуском операции скачивания поместите в буфер обмена URL нужного ролика" -ForegroundColor Cyan

## Блок переменных ##
$downloadbegin = "Запущен процесс скачивания..."
$downloadend = "Процесс скачивания завершён!"
$updatebegin = "Запущен процесс обновления YouTube-DL..."
$updateend = "Процесс обновления YouTube-DL завершён!"

## Запуск цикла скрипта ##
while($true) { 

         ## Формирование меню скрипта ##
         Write-Host
         Write-Host "------------------------------------------------" -ForegroundColor Yellow
         Write-Host "   1. Скачать видео" -ForegroundColor Green
         Write-Host "   2. Скачать аудиодорожку в формате mp3" -ForegroundColor Green
         Write-Host "   3. Обновить YouTube-Dl" -ForegroundColor Green
         Write-Host "------------------------------------------------" -ForegroundColor Yellow
         Write-Host "   4. Завершить работу скрипта" -ForegroundColor Red
         Write-Host "------------------------------------------------" -ForegroundColor Yellow
         Write-Host

         ## Селектор ##
         $choice = Read-Host "Выберите вариант"
                   Write-Host

         switch($choice){

         ## Скачивание видео ##
         1{ Write-Host $downloadbegin -ForegroundColor Cyan
            $cmd = "-f best $(Get-Clipboard) --no-check-certificate -o /video/%(title)s.%(ext)s --console-title" 
            Start-Process -FilePath youtube-dl.exe -ArgumentList $cmd -Wait -NoNewWindow
            Write-Host $downloadend -ForegroundColor Cyan
            [System.Console]::Title = $downloadend 
           }
         
         ## Скачивание mp3 ##
         2{ Write-Host $downloadbegin -ForegroundColor Cyan
            $testffmpeg = Test-Path ffmpeg.exe
            if (!$testffmpeg) { 
                                 Write-Host "Для этой операции необходима утилита FFMPEG, которая не была найдена!" -ForegroundColor Red
                                 Write-Host "Скачайте утилиту и разместите в папке со скриптом." -ForegroundColor Red
                                 Start-Process -FilePath https://ffmpeg.org/download.html
                                 Break
                              }
            else {
              $cmd = "-f bestaudio -x --embed-thumbnail --audio-format mp3 --audio-quality 0 $(Get-Clipboard) --no-check-certificate -o /audio/%(title)s.%(ext)s --console-title" 
              Start-Process -FilePath youtube-dl.exe -ArgumentList $cmd -Wait -NoNewWindow
              Write-Host $downloadend -ForegroundColor Cyan 
              [System.Console]::Title = $downloadend }
          }
         
         ## Обновление программы ##
         3{ Write-Host $updatebegin -ForegroundColor Cyan
            [System.Console]::Title = $start 
            $cmd = "-U" 
            Start-Process -FilePath youtube-dl.exe -ArgumentList $cmd -Wait -NoNewWindow
            Write-Host $updateend -ForegroundColor Cyan }

         ## Завершить работу скрипта ##
         4{ Exit }

         ## Неверный выбор ##
         default {Write-Host "Неверный выбор. Попробуйте снова." -ForegroundColor Red
         Write-Host}

         }
}

Кстати, не ютьюбом единым жива YouTube-DL. Список всех поддерживаемых сайтов можно глянуть здесь.

UPD: если в буфер обмена поместить ссылку на плейлист — YouTube-DL начнёт выкачивать все видео из этого плейлиста.