From a84fc8fdc9c94ffa447004b3a345eba229416b20 Mon Sep 17 00:00:00 2001 From: Zack Meier Date: Fri, 1 May 2026 20:12:46 -0500 Subject: [PATCH] new working slimmed down Regulation script --- yt-dlp/Download-RegulationPatreon_Epsilon.ps1 | 170 ++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 yt-dlp/Download-RegulationPatreon_Epsilon.ps1 diff --git a/yt-dlp/Download-RegulationPatreon_Epsilon.ps1 b/yt-dlp/Download-RegulationPatreon_Epsilon.ps1 new file mode 100644 index 0000000..9cd573a --- /dev/null +++ b/yt-dlp/Download-RegulationPatreon_Epsilon.ps1 @@ -0,0 +1,170 @@ +# YT Regulation Patreon +# Set URL and Location +$URL = "https://www.patreon.com/cw/TheRegulationPod" +$folderPath = '\\truenas3.kwyjibo.info\RegulationPodcast$' + +$rejects = @() +$RejectString = $rejects -join '|' + +Set-Location $folderPath + +function Download-YtDlp { + param( + [string]$VideoUrl, + [string]$OutputPath, + [string]$RejectString, + [bool]$WithCookies + ) + + $ytDlpPath = "D:\yt-dlp\yt-dlp.exe" + + $arguments = @( + $VideoUrl, + "--write-info-json", + "--write-thumbnail", + "--embed-metadata", + "--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", $RejectString, + "--playlist-reverse", + "--download-archive", "ytdlp_archive.txt" + ) + + if ($WithCookies) { + $arguments += "--cookies-from-browser", "firefox" + } + + $output = & $ytDlpPath @arguments 2>&1 + $exitCode = $LASTEXITCODE + + # Prefer actual error lines if present + $errorLines = $output | Where-Object { $_ -match '^\[error\]' } + + $message = if ($exitCode -eq 0) { + $null + } + elseif ($errorLines) { + ($errorLines -join "`n").Trim() + } + else { + # fallback if yt-dlp didn't tag it as [error] + ($output -join "`n").Trim() + } + + return [PSCustomObject]@{ + ExitCode = $exitCode + Message = $message + } +} +function Parse-URLToIdentifier { + param( + [Parameter(Mandatory = $true)] + [string]$Url + ) + + $platform = "" + $name = "" + + # 1. Determine the Platform + if ($Url -match "patreon\.com") { + $platform = "patreon" + # For Patreon, take the last segment of the URL path (e.g., TheRegulationPod) + $name = ($Url -split '/')[-1] + } + elseif ($Url -match "youtube.com") { + $platform = "youtube" + # For YouTube, extract everything after the "@" symbol + if ($Url -match '@(.*)') { + $name = $Matches[1] + } + else { + # Handle cases where @ might not be present (though unlikely for channel URLs) + $name = "UnknownChannel" + } + } + else { + Write-Error "Unsupported URL platform." + return $null + } + + # Construct and return the final identifier + return "${platform}_${name}" +} + +$archive_name = Parse-URLToIdentifier -Url $Url + +# Download flat playlist +Write-Verbose -Message "Download flat playlist" -Verbose +$flat = D:\yt-dlp\yt-dlp.exe -j --flat-playlist $URL +$flat | Set-Content -Path "$archive_name.json" + +# load json into memory, convert to psobject +$json = Get-Content -Path "$archive_name.json" | ConvertFrom-Json + +# Load all .mp4 files into memory once at the start +Write-Verbose -Message "Gathering existing downloads" -Verbose +$mp4Files = Get-ChildItem -Path $folderPath -Recurse -Filter "*.mp4" + +ForEach ($obj in $json) { + $TryWithCookies = $false + $videoUrl = $obj.url + $url_basename = $obj.webpage_url_basename + + Write-Verbose -Message ("Start " + $url_basename) -Verbose + $outputPath = "Unsorted/Season %(upload_date>%y|Unknown)s/%(upload_date>%m|Unknown)s/%(release_date>%Y%m%d,upload_date>%Y%m%d)s - %(title).180B [%(extractor)s-%(id)s].%(ext)s" + + $DownloadYTDLPSplat = @{ + videoUrl = $videoUrl + outputPath = "Unsorted/Season %(upload_date>%y|Unknown)s/%(upload_date>%m|Unknown)s/%(release_date>%Y%m%d,upload_date>%Y%m%d)s - %(title).180B [%(extractor)s-%(id)s].%(ext)s" + } + + $DownloadResult = Download-YtDlp @DownloadYTDLPSplat + switch ($DownloadResult.ExitCode) { + 0 { + Write-Verbose -Message "Download successful" + } + { $_ -ne 0 } { + If ($DownloadResult.ExitCode -ne 0) { + switch ($DownloadResult.Message) { + { $_ -match 'No supported media found in this post' } { + Write-Verbose -Message 'No supported media found in this post' -Verbose + } + { $_ -match 'do not have access' } { + Write-Verbose -Message 'do not have access' -Verbose + $TryWithCookies = $true + } + Default { + $errorLine = ($DownloadResult.Message -split "`n") | Where-Object { $_ -match '^ERROR:' } | Select-Object -First 1 + Write-Verbose -Message $errorLine -Verbose + } + } + + If ($TryWithCookies) { + $CookieResult = Download-YtDlp @DownloadYTDLPSplat + + switch ($CookieResult.Message) { + { $_ -match 'No supported media found in this post' } { + Write-Verbose -Message 'No supported media found in this post again.' -Verbose + } + { $_ -match 'do not have access' } { + Write-Verbose -Message 'do not have access again' -Verbose + $TryWithCookies = $true + } + Default { + $errorLine = ($CookieResult.Message -split "`n") | Where-Object { $_ -match '^ERROR:' } | Select-Object -First 1 + Write-Warning -Message "Still failed with cookies." + Write-Verbose -Message $errorLine -Verbose + } + } + } + } + } + } + Write-Verbose -Message ("End " + $url_basename) -Verbose +} +