#HOW TO RUN THIS THING:
# SAVE THIS FILE AS ytrescue.ps1
#THROW IT INTO WHATEVER FOLDER YOU WANT
#HAVE yt-dlp.exe EITHER:
#- IN PATH
# - OR SITTING NEXT TO THIS SCRIPT
#OPEN powershell.exe
#RUN:
# powershell -ExecutionPolicy Bypass -File .\ytrescue.ps1 "C:\MOVIES"
#
# NOTES FOR THE BRAVE:
# - CHANGE "C:\MOVIES" TO YOUR ACTUAL FOLDER
# - ffmpeg MAY BE NEEDED ??
#- SCRIPT SCANS VIDEO FILE NAMES, STEALS YT ID, REDOWNLOADS CLEAN VERSION
#IF YOUR FILENAMES ARE GARBAGE, IT SKIPS THEM. YOU DESERVED iT
param([string]$Dir = ".")
if (-not (Test-Path -LiteralPath $Dir)) {
Write-Host "DIR NOT REAL: $Dir"
exit 1
}
Set-Location -LiteralPath $Dir
$ytdlp = $null
if (Get-Command yt-dlp.exe -ErrorAction SilentlyContinue) {
$ytdlp = "yt-dlp.exe"
} elseif (Test-Path ".\yt-dlp.exe") {
$ytdlp = ".\yt-dlp.exe"
} else {
Write-Host "YT-DLP NOT FOUND. NOT IN PATH. NOT IN FOLDER. YOU HAVE NOTHING."
exit 1
}
$fmt = "bestvideo[height<=800][vcodec!=av01]+bestaudio[tbr<100]"
$out = '%(title)s [%(resolution)s %(id)s] - %(uploader)s - %(upload_date>%Y-%m-%d)s.%(ext)s'
$ok = 0; $fail = 0; $skip = 0
$files = Get-ChildItem -File | Where-Object { $_.Extension
-match '^\.(mkv|webm|mp4|avi|flv|m4v|mov|ts)$' }
if ($files.Count -eq 0) {
Write-Host "NO VIDEO FILES. FOLDER IS BARREN."
exit 1
}
Write-Host "SCANNING: $Dir ($($files.Count) files)"
foreach ($f in $files) {
$vid = $null
$brackets = [regex]::Matches($f.BaseName, '\[([^\]]+)\]')
foreach ($m in $brackets) {
$tokens = $m.Groups[1].Value -split '\s+'
foreach ($t in $tokens) {
if ($t -match '^[A-Za-z0-9_-]{11}$') { $vid = $t }
}
}
if (-not $vid) {
$all = [regex]::Matches($f.BaseName, '[A-Za-z0-9_-]{11}')
if ($all.Count -gt 0) { $vid = $all[$all.Count - 1].Value }
}
if (-not $vid) {
Write-Host "[SKIP] BAD NAME. NO ID FOUND: $($f.Name)"
$skip++
continue
}
$url = "https://www.youtube.com/watch?v=$vid"
Write-Host "[GET] $vid <- $($f.Name)"
& $ytdlp -ciw -f $fmt --embed-metadata --embed-info-json --add-metadata --embed-thumbnail --convert-thumbnails jpg -o $out $url
Write-Host "[OK] $vid DOWNLOADED. NICE."
$ok++
} else {
Write-Host "[FAIL] $vid ERROR ERRORED. RIP."
$fail++
}
}
Write-Host ""
Write-Host "DONE. OK=$ok FAIL=$fail SKIP=$skip TOTAL=$($files.Count)"
if ($fail -gt 0) { Write-Host "SOME FAILED. SKILL ISSUE OR DELETED VIDEOS." }
if ($skip -gt 0) { Write-Host "SOME SKIPPED. FILENAMES UNREADABLE. RENAME YOUR STUFF." }