# Install-media-tools.ps1 # Run in elevated PowerShell: # Inside the VM: # Open Start # Type PowerShell # Right-click Windows PowerShell → Run as administrator # chdir to the location of this script # powershell -ExecutionPolicy Bypass -File .\Install-media-tools.ps1 $ErrorActionPreference = "Stop" # Where to install (bin folder on PATH) $BinDir = "C:\Tools\bin" $ToolsRoot = "C:\Tools" $SubtitleEditDir = Join-Path $ToolsRoot "SubtitleEdit" $WorkDir = Join-Path $env:TEMP ("media-tools-" + [guid]::NewGuid().ToString("N")) New-Item -ItemType Directory -Force -Path $BinDir | Out-Null New-Item -ItemType Directory -Force -Path $WorkDir | Out-Null New-Item -ItemType Directory -Force -Path $SubtitleEditDir | Out-Null function Download-File([string]$Url, [string]$OutFile) { Write-Host "Downloading: $Url" Invoke-WebRequest -Uri $Url -OutFile $OutFile -UseBasicParsing } function Add-ToMachinePath([string]$PathToAdd) { $current = [Environment]::GetEnvironmentVariable("Path", "Machine") if (-not $current) { $current = "" } # Compare case-insensitively on Windows $parts = $current.Split(";", [System.StringSplitOptions]::RemoveEmptyEntries) $exists = $parts | Where-Object { $_.TrimEnd("\") -ieq $PathToAdd.TrimEnd("\") } if (-not $exists) { $newPath = ($current.TrimEnd(";") + ";" + $PathToAdd).TrimStart(";") [Environment]::SetEnvironmentVariable("Path", $newPath, "Machine") Write-Host "Added to MACHINE PATH: $PathToAdd" Write-Host "Restart your terminal/session to pick it up." } else { Write-Host "MACHINE PATH already contains: $PathToAdd" } } try { Push-Location $WorkDir # ----------------------------- # Install FFmpeg (full build, Windows x64) from GitHub ZIP # ----------------------------- $ffmpegZip = Join-Path $WorkDir "ffmpeg-full_build.zip" Download-File ` "https://github.com/GyanD/codexffmpeg/releases/download/2025-12-14-git-3332b2db84/ffmpeg-2025-12-14-git-3332b2db84-full_build.zip" ` $ffmpegZip $ffmpegExtract = Join-Path $WorkDir "ffmpeg" New-Item -ItemType Directory -Force -Path $ffmpegExtract | Out-Null Expand-Archive -Path $ffmpegZip -DestinationPath $ffmpegExtract -Force # Find the extracted "bin" folder (contains ffmpeg.exe etc.) $ffmpegBin = Get-ChildItem $ffmpegExtract -Recurse -Directory | Where-Object { $_.Name -ieq "bin" } | Select-Object -First 1 if (-not $ffmpegBin) { throw "FFmpeg bin directory not found after extraction." } Get-ChildItem $ffmpegBin.FullName -File | Where-Object { $_.Name -match '^ff(mpeg|probe|play)\.exe$' } | ForEach-Object { Copy-Item -Force $_.FullName (Join-Path $BinDir $_.Name) } Write-Host "FFmpeg installed to $BinDir" # ----------------------------- # Install Bento4 (mp4decrypt.exe, etc.) # ----------------------------- $bentoZip = Join-Path $WorkDir "Bento4.zip" Download-File ` "https://www.bok.net/Bento4/binaries/Bento4-SDK-1-6-0-641.x86_64-microsoft-win32.zip" ` $bentoZip Expand-Archive -Path $bentoZip -DestinationPath (Join-Path $WorkDir "bento") -Force Get-ChildItem -Path (Join-Path $WorkDir "bento") -Recurse -File | Where-Object { $_.FullName -match "\\bin\\.*\.exe$" } | ForEach-Object { Copy-Item -Force $_.FullName $BinDir } # ----------------------------- # Install MKVToolNix (Windows x64) # ----------------------------- $mkvInstaller = Join-Path $WorkDir "mkvtoolnix-64-bit-96.0-setup.exe" Download-File ` "https://mkvtoolnix.download/windows/releases/96.0/mkvtoolnix-64-bit-96.0-setup.exe" ` $mkvInstaller # Silent install (NSIS): /S = silent # Note: no UI will appear; wait for it to finish. Start-Process -FilePath $mkvInstaller -ArgumentList "/S" -Wait # Optional: add MKVToolNix install dir to PATH if present $mkvDefaultPath = "C:\Program Files\MKVToolNix" if (Test-Path $mkvDefaultPath) { # If you kept Add-ToMachinePath, use that: Add-ToMachinePath $mkvDefaultPath # Or if you switched to Add-ToBestPath, use that instead: # Add-ToBestPath $mkvDefaultPath } else { Write-Host "MKVToolNix installed, but default path not found: $mkvDefaultPath (maybe different install location)" } # ----------------------------- # Install N_m3u8DL-RE (Windows x64) # ----------------------------- $nreZip = Join-Path $WorkDir "N_m3u8DL-RE.zip" Download-File ` "https://github.com/nilaoda/N_m3u8DL-RE/releases/download/v0.3.0-beta/N_m3u8DL-RE_v0.3.0-beta_win-x64_20241203.zip" ` $nreZip Expand-Archive -Path $nreZip -DestinationPath (Join-Path $WorkDir "nre") -Force Get-ChildItem (Join-Path $WorkDir "nre") -Recurse -File | Where-Object { $_.Name -match "^N_m3u8DL-RE(\.exe)?$" } | Select-Object -First 1 | ForEach-Object { Copy-Item -Force $_.FullName (Join-Path $BinDir "N_m3u8DL-RE.exe") } # ----------------------------- # Install Shaka Packager (Windows x64) # ----------------------------- $shakaExe = Join-Path $BinDir "shaka-packager.exe" Download-File ` "https://github.com/shaka-project/shaka-packager/releases/download/v2.6.1/packager-win-x64.exe" ` $shakaExe # ----------------------------- # Install dovi_tool (Windows x64) # ----------------------------- $doviZip = Join-Path $WorkDir "dovi_tool.zip" Download-File ` "https://github.com/quietvoid/dovi_tool/releases/download/2.3.1/dovi_tool-2.3.1-x86_64-pc-windows-msvc.zip" ` $doviZip Expand-Archive -Path $doviZip -DestinationPath (Join-Path $WorkDir "dovi") -Force Get-ChildItem (Join-Path $WorkDir "dovi") -Recurse -File | Where-Object { $_.Name -ieq "dovi_tool.exe" } | Select-Object -First 1 | ForEach-Object { Copy-Item -Force $_.FullName (Join-Path $BinDir "dovi_tool.exe") } # ----------------------------- # Install hdr10plus_tool (Windows x64) # ----------------------------- $hdrZip = Join-Path $WorkDir "hdr10plus_tool.zip" Download-File ` "https://github.com/quietvoid/hdr10plus_tool/releases/download/1.7.1/hdr10plus_tool-1.7.1-x86_64-pc-windows-msvc.zip" ` $hdrZip Expand-Archive -Path $hdrZip -DestinationPath (Join-Path $WorkDir "hdr") -Force Get-ChildItem (Join-Path $WorkDir "hdr") -Recurse -File | Where-Object { $_.Name -ieq "hdr10plus_tool.exe" } | Select-Object -First 1 | ForEach-Object { Copy-Item -Force $_.FullName (Join-Path $BinDir "hdr10plus_tool.exe") } # ----------------------------- # Install SubtitleEdit permanently (Portable zip) # ----------------------------- $seZip = Join-Path $WorkDir "SubtitleEdit.zip" Download-File ` "https://github.com/SubtitleEdit/subtitleedit/releases/download/4.0.14/SE4014.zip" ` $seZip # Replace any previous install cleanly if (Test-Path $SubtitleEditDir) { Remove-Item -Recurse -Force $SubtitleEditDir } New-Item -ItemType Directory -Force -Path $SubtitleEditDir | Out-Null Expand-Archive -Path $seZip -DestinationPath $SubtitleEditDir -Force # Launcher in bin (stable path) $launcher = Join-Path $BinDir "SubtitleEdit.cmd" @( '@echo off' '"C:\Tools\SubtitleEdit\SubtitleEdit.exe" %*' ) | Set-Content -Encoding ASCII $launcher # ----------------------------- # Install uv (Python required) # ----------------------------- python -m pip install --upgrade uv # PATH (Machine) Add-ToMachinePath $BinDir Write-Host "`nDone. Open a NEW terminal and try:" Write-Host " mp4decrypt.exe --help" Write-Host " N_m3u8DL-RE.exe --help" Write-Host " shaka-packager.exe --help" Write-Host " dovi_tool.exe --help" Write-Host " hdr10plus_tool.exe --help" Write-Host " SubtitleEdit.cmd" Write-Host " uv --version" } finally { Pop-Location # Clean up temp work dir if (Test-Path $WorkDir) { Remove-Item -Recurse -Force $WorkDir } }