#requires -Version 5.1 $ErrorActionPreference = "Stop" # Корень проекта определяется независимо от текущей папки PowerShell. $ProjectRoot = Split-Path -Parent $PSScriptRoot $ToolsDir = Join-Path $ProjectRoot "tools" $OutputDir = Join-Path $ProjectRoot "output" if (-not (Test-Path $OutputDir)) { New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null } function Find-Tool { param( [Parameter(Mandatory = $true)] [string]$Name, [string[]]$LocalNames = @() ) foreach ($localName in $LocalNames) { $localPath = Join-Path $ToolsDir $localName if (Test-Path $localPath -PathType Leaf) { return (Resolve-Path $localPath).Path } } $command = Get-Command $Name -ErrorAction SilentlyContinue if ($command) { return $command.Source } return $null } function Require-Tool { param( [Parameter(Mandatory = $true)] [string]$Name, [string[]]$LocalNames = @(), [string]$InstallHint = "" ) $tool = Find-Tool -Name $Name -LocalNames $LocalNames if (-not $tool) { Write-Host "" Write-Host "ОШИБКА: не найдена зависимость '$Name'." -ForegroundColor Red Write-Host "Проверены:" Write-Host " 1. Папка: $ToolsDir" Write-Host " 2. Системная переменная PATH" if ($InstallHint) { Write-Host "" Write-Host $InstallHint } Write-Host "" Read-Host "Нажмите Enter для выхода" exit 1 } return $tool } $YtDlp = Require-Tool ` -Name "yt-dlp" ` -LocalNames @("yt-dlp.exe", "yt-dlp.cmd", "yt-dlp.ps1") ` -InstallHint "Скачать yt-dlp: https://github.com/yt-dlp/yt-dlp/releases/latest" $Ffmpeg = Require-Tool ` -Name "ffmpeg" ` -LocalNames @("ffmpeg.exe") ` -InstallHint "Скачать FFmpeg: https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-full.7z" $FfmpegDir = Split-Path -Parent $Ffmpeg Write-Host "" Write-Host "============================================================" Write-Host " СКАЧИВАНИЕ ВИДЕО С YOUTUBE" Write-Host "============================================================" Write-Host "Результат: $OutputDir" Write-Host "" $Url = Read-Host "Введите URL видео с YouTube" if ([string]::IsNullOrWhiteSpace($Url)) { Write-Host "" Write-Host "ОШИБКА: ссылка не введена." -ForegroundColor Red Read-Host "Нажмите Enter для выхода" exit 1 } $OutputTemplate = Join-Path $OutputDir "%(title)s.%(ext)s" Write-Host "" Write-Host "Скачивание видео в максимально доступном качестве..." Write-Host "" & $YtDlp ` "-f" "bv*+ba/b" ` "--ffmpeg-location" $FfmpegDir ` "-o" $OutputTemplate ` $Url if ($LASTEXITCODE -ne 0) { Write-Host "" Write-Host "ОШИБКА: yt-dlp завершил работу с кодом $LASTEXITCODE." -ForegroundColor Red Read-Host "Нажмите Enter для выхода" exit $LASTEXITCODE } Write-Host "" Write-Host "Готово." -ForegroundColor Green Write-Host "Файл сохранён в: $OutputDir" Write-Host "" Read-Host "Нажмите Enter для выхода"