diff --git a/yt-dlp/Download-Recurring_RedLetterMedia.ps1 b/yt-dlp/Download-Recurring_RedLetterMedia.ps1 new file mode 100644 index 0000000..b7969ed --- /dev/null +++ b/yt-dlp/Download-Recurring_RedLetterMedia.ps1 @@ -0,0 +1,82 @@ +## Red Letter Media +# Set URL and Location +$URL = "https://www.youtube.com/@RedLetterMedia" +$folderPath = "\\truenas3.kwyjibo.info\RedLetterMedia$" + +Set-Location $folderPath + +$rejects = @() +$rejects_string = $rejects -join '|' + +# Download flat playlist +Write-Verbose -Message "Download flat playlist" +$flat = D:\youtube-dlp\yt-dlp.exe -j --flat-playlist $URL +$flat | Set-Content -Path RLM.json + +# load json into memory, convert to psobject +$json = Get-Content -Path RLM.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 { + # Execute yt-dlp command for non-rejected videos + try { + Write-Warning -Message "Dwnld $Id ##### $Title" + #$attemptedDownloads.Add($obj) + D:\youtube-dlp\yt-dlp.exe $videoUrl ` + --write-info-json ` + --write-thumbnail ` + --convert-thumbnails jpg ` + --no-progress ` + -t sleep ` + --rate-limit 5M ` + -o "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" ` + -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" ` + -S vcodec:h264 ` + --reject-title $rejects_string ` + --playlist-reverse + #--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" +} diff --git a/yt-dlp/Download-Recurring_RegulationGameplay.ps1 b/yt-dlp/Download-Recurring_RegulationGameplay.ps1 new file mode 100644 index 0000000..c43343c --- /dev/null +++ b/yt-dlp/Download-Recurring_RegulationGameplay.ps1 @@ -0,0 +1,110 @@ +## 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:\youtube-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:\youtube-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 = "Web-RegulationPodcast/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 = "Web-RegulationPodcast/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:\youtube-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 "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" +} diff --git a/yt-dlp/Download-Recurring_RegulationPatreon.ps1 b/yt-dlp/Download-Recurring_RegulationPatreon.ps1 new file mode 100644 index 0000000..89491f9 --- /dev/null +++ b/yt-dlp/Download-Recurring_RegulationPatreon.ps1 @@ -0,0 +1,82 @@ +## Patreon Regulation +# Set URL and Location +$URL = "https://www.patreon.com/cw/TheRegulationPod" +$folderPath = "\\truenas3.kwyjibo.info\RegulationPodcast$" + +Set-Location $folderPath + +$rejects = @() +$rejects_string = $rejects -join '|' + +# Download flat playlist +Write-Verbose -Message "Download flat playlist" +$flat = D:\youtube-dlp\yt-dlp.exe -j --flat-playlist $URL +$flat | Set-Content -Path Patreon_TheRegulationPod.json + +# load json into memory, convert to psobject +$json = Get-Content -Path Patreon_TheRegulationPod.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 "patreon-" and before the closing bracket + $regex = "(?i)patreon-$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 Patreon ID: $Id" + } + Else { + # Execute yt-dlp command for non-rejected videos + try { + Write-Warning -Message "Dwnld $Id ##### $Title" + #$attemptedDownloads.Add($obj) + D:\youtube-dlp\yt-dlp.exe $URL ` + --write-info-json ` + --write-thumbnail ` + --convert-thumbnails jpg ` + --no-progress ` + -t sleep ` + --rate-limit 5M ` + -o "Unsorted/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" ` + -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" ` + -S vcodec:h264 ` + --reject-title $rejects_string ` + --cookies-from-browser firefox #"D:\youtube-dlp\20251024_currentsite_cookies.firefox-private.txt" + # --playlist-reverse `#` + #--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" +} diff --git a/yt-dlp/Download-Recurring_RegulationPodcast.ps1 b/yt-dlp/Download-Recurring_RegulationPodcast.ps1 new file mode 100644 index 0000000..cb838fd --- /dev/null +++ b/yt-dlp/Download-Recurring_RegulationPodcast.ps1 @@ -0,0 +1,110 @@ +## YT Regulation Podcast +# Set URL and Location +$URL = "https://www.youtube.com/@theregulationpod" +$folderPath = "\\truenas3.kwyjibo.info\RegulationPodcast$" + +Set-Location $folderPath + +$rejects = @() +$rejects_string = $rejects -join '|' + +# Download flat playlist +Write-Verbose -Message "Download flat playlist" +$flat = D:\youtube-dlp\yt-dlp.exe -j --flat-playlist $URL +$flat | Set-Content -Path YT_theregulationpod.json + +# load json into memory, convert to psobject +$json = Get-Content -Path YT_theregulationpod.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:\youtube-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 -lt 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 = "Web-RegulationPodcast/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 = "Web-RegulationPodcast/Regular Videos/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:\youtube-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 "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" +}