Files
Homelab/yt-dlp/Download-RegulationGameplay_cookies.ps1
T

112 lines
4.4 KiB
PowerShell

## Regulation Gameplay
# Set URL and Location
$URL = "https://www.youtube.com/@TheRegulationPodcast"
$folderPath = "\\truenas3.kwyjibo.info\RegulationPodcast$"
Set-Location $folderPath
$rejects = @()
$rejects_string = $rejects -join '|'
# Download flat playlist
Write-Verbose -Message "Download flat playlist"
$flat = D:\yt-dlp\yt-dlp.exe -j --flat-playlist $URL
$flat | Set-Content -Path YT_TheRegulationPodcast.json
# load json into memory, convert to psobject
$json = Get-Content -Path YT_TheRegulationPodcast.json | ConvertFrom-Json
# Load all .mp4 files into memory once at the start
$mp4Files = Get-ChildItem -Path $folderPath -Recurse -Filter "*.mp4"
ForEach ($obj in $json) {
# Initialize $fileFound as null for each iteration
$fileFound = $false
# Extract information from the JSON object
$videoUrl = $obj.webpage_url
$Title = $obj.title
$Id = $obj.id
# Log the start of the process
Write-Verbose -Message "Start $Id ##### $Title"
# Check if the title matches any reject term using wildcards
$reject_matches = $rejects | Where-Object { $Title -like "*$($_)*" }
# If matches are found, reject the title
If ($reject_matches) {
Write-Warning -Message "Skip $Id ##### $Title"
}
Else {
# downloaded already?
# Regular expression to match the ID after "youtube-" and before the closing bracket
$regex = "(?i)youtube-$Id"
# Check if any file already exists that matches the video ID
$fileFound = $mp4Files | Where-Object { $_.Name -match $regex }
# If no file is found, notify the user
if ($fileFound) {
Write-Warning "File found with the YouTube ID: $Id"
}
Else {
# Check if this is a YouTube Short by getting video info (aspect ratio or duration)
Write-Verbose -Message "Checking if video is a Short: $Title"
$videoInfo = D:\yt-dlp\yt-dlp.exe -j $videoUrl
$videoInfoObj = $videoInfo | ConvertFrom-Json
# Determine if this is a short based on duration or aspect ratio
$isShort = $false
if ($videoInfoObj.duration -and $videoInfoObj.duration -eq 60) {
$isShort = $true
}
elseif ($videoInfoObj.width -and $videoInfoObj.height) {
# Calculate aspect ratio (height/width for vertical videos)
$aspectRatio = [double]$videoInfoObj.height / [double]$videoInfoObj.width
if ($aspectRatio -gt 1.5) { # Vertical video (typically > 1.5:1)
$isShort = $true
}
}
# Set output path based on whether it's a short or not
if ($isShort) {
Write-Verbose -Message "Video detected as Short: $Title"
$outputPath = "YouTube Shorts/%(release_date>%Y%m%d,upload_date>%Y%m%d)s - %(title).180B [%(extractor)s-%(id)s].%(ext)s"
}
else {
Write-Verbose -Message "Video detected as regular: $Title"
$outputPath = "Regulation Gameplay/Season %(release_date>%y,upload_date>%y|Unknown)s/%(release_date>%Y%m%d,upload_date>%Y%m%d)s - %(title).180B [%(extractor)s-%(id)s].%(ext)s"
}
# Execute yt-dlp command for non-rejected videos
try {
Write-Warning -Message "Dwnld $Id ##### $Title"
#$attemptedDownloads.Add($obj)
D:\yt-dlp\yt-dlp.exe $videoUrl `
--write-info-json `
--write-thumbnail `
--convert-thumbnails jpg `
--no-progress `
-t sleep `
--rate-limit 5M `
-o $outputPath `
-f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" `
-S vcodec:h264 `
--reject-title $rejects_string `
--playlist-reverse `
--cookies-from-browser firefox
#--cookies "D:\youtube-dlp\20251024_currentsite_cookies.firefox-private.txt" #`
#--extractor-args "youtube:player_client=default,web_safari;player_js_version=actual"
# --reject-title "Dude Soup|Podcast" ` # FH
}
catch {
Write-Error "Failed to download $Id - $_"
}
}
}
# Log the end of the process
Write-Verbose -Message "End $Id ##### $Title"
}