#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 if ($LASTEXITCODE -eq 0) { 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." }