PowerShell · 26.02.2023

UPD:PowerShell и Yt-dlp

Наконец-то дошла очередь обновления и до скрипта по работе со связкой yt-dlp и ffmpeg. Обновление объединило в себе два поста — этот и этот. Теперь не требуется таскать за собой пачку ps1 для работы с одним и тем же набором утилит.

Кратко напомню к чему эта карусель: данный скрипт позволяет обращаться к утилитам yt-dlp и ffmpeg для скачивания видео и аудио с видеохостингов. Все посты о моем опыте работы с утилитой yt-dlp можно найти по этому тегу.

Эта версия скрипта умеет скачивать перечисленные выше утилиты, если их нет в папке со скриптом, а yt-dlp можно ещё и обновлять прямо из скрипта.

## Заголовок окна консоли ##
[System.Console]::Title = "Скачать видео с помощью yt-dlp"

## Импорт модулей ##
Import-Module BitsTransfer

## Блок переменных ##
$ytdlp = "yt-dlp.exe"
$ffmpeg = "ffmpeg.exe"
$filename = "linklist.txt"
$linkYTDLP = "https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp.exe"
$linkFFMPEG = "https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.zip" 

## Скачать Yt-dlp и ffmpeg ##
$testytdlp = Test-Path $ytdlp -PathType Leaf
$testffmpeg = Test-Path $ffmpeg -PathType Leaf
if (!$testytdlp) { Start-BitsTransfer -Source $linkYTDLP -Destination $PSScriptRoot }
if (!$testffmpeg) 
{ 
  $zipfile = "$PSScriptRoot\ffmpeg.zip"
  $temp = "$PSScriptRoot\temp"
  Start-BitsTransfer -Source $linkFFMPEG -Destination $zipfile
  Expand-Archive $PSScriptRoot\ffmpeg.zip -DestinationPath $temp
  Get-ChildItem -Include $ffmpeg -Path $temp -Recurse -ErrorAction SilentlyContinue | Move-Item -Destination $PSScriptRoot
  Remove-Item -Path $temp -Recurse -ErrorAction SilentlyContinue
  Remove-Item -Path $zipfile -Recurse -ErrorAction SilentlyContinue
}

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

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

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

    switch($choice){

        ## Скачивание видео ##
        1{ 
           $cmd = "-f bestvideo[height<=1080][ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best --merge-output-format mp4 $(Get-Clipboard) -o video\%(title)s.%(ext)s" 
           Start-Process -FilePath $ytdlp -ArgumentList $cmd -Wait -NoNewWindow
        }
         
        ## Скачивание mp3 ##
        2{ 
            $cmd = "-x --audio-format mp3 --audio-quality 0 --embed-thumbnail $(Get-Clipboard) -o audio\%(title)s.%(ext)s" 
            Start-Process -FilePath $ytdlp -ArgumentList $cmd -Wait -NoNewWindow
        }

        ## Пакетное скачивание аудиодорожек ##
        3{
           # Создание файла для формирования списка #
           try { 
                 # Проверка наличия файла #
                 $testtxt = Test-Path $filename
                 if ($testtxt) { Start-Process notepad.exe -ArgumentList $filename -Wait }
                 else 
                 {
                   Write-Host "Скопируйте ссылки на ролики в файл linklist.txt" -ForegroundColor Cyan
                   New-Item -Path $filename -ItemType File -ErrorAction Ignore | Out-Null 
                   Start-Process notepad.exe -ArgumentList $filename -Wait
                   Write-Host "Файл со списком ссылок готов!" -ForegroundColor Cyan }
                 }
           catch { Write-Host "Ошибка создания файла для списка ссылок!" -ForegroundColor Red }

           # Скачивание аудиофайлов #
           $cmd = "-x --audio-format mp3 --audio-quality 0 --embed-thumbnail --batch-file $filename -o audio\%(title)s.%(ext)s" 
           Start-Process -FilePath $ytdlp -ArgumentList $cmd -Wait -NoNewWindow
           Remove-Item -Path $filename
        }

        ## Пакетное скачивание видео ##
        4{
           # Создание файла для формирования списка #
           try { 
                 # Проверка наличия файла #
                 $testtxt = Test-Path $filename
                 if ($testtxt) { Start-Process notepad.exe -ArgumentList $filename -Wait }
                 else 
                 {
                    Write-Host "Скопируйте ссылки на ролики в файл linklist.txt" -ForegroundColor Cyan
                    New-Item -Path $filename -ItemType File -ErrorAction Ignore | Out-Null 
                    Start-Process notepad.exe -ArgumentList $filename -Wait
                    Write-Host "Файл со списком ссылок готов!" -ForegroundColor Cyan }
                 }
           catch { Write-Host "Ошибка создания файла для списка ссылок!" -ForegroundColor Red }

           # Скачивание видеофайлов  #
           $cmd = "-f bestvideo[height<=1080][ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best --merge-output-format mp4 --batch-file $filename -o video\%(title)s.%(ext)s" 
           Start-Process -FilePath $ytdlp -ArgumentList $cmd -Wait -NoNewWindow
           Remove-Item -Path $filename
        }
        
        ## Обновление программы ##
        5{ 
            $cmd = "-U"
            Start-Process -FilePath $ytdlp -ArgumentList $cmd -Wait -NoNewWindow 			
        }
         
        ## Неверный выбор ##
        default{
		 Write-Host "Неверный выбор. Попробуйте снова." -ForegroundColor Red
                 Write-Host
	}
    }
}

Скрипт использует модуль BitsTransfer для скачивания файлов из этих ваших Интернетов. В случае с ffmpeg — скачивается официальный (эээм…) zip архив и извлекается в папку temp. После извлечения, скрипт отыскивает ffmpeg.exe и перемещает его в папку со скриптом, а всё остальное зачищает.