# encoding: ascii
# api: powershell
# title: Get TV Show Airdates
# description: These functions retrieve information about tv show airdates. They are used as a part of my “home automation with powershell”-project.
# version: 0.1
# type: function
# author: DollarUnderscore
# license: CC0
# function: Get-TVShowNextAirDate
# x-poshcode-id: 5351
# x-archived: 2017-04-01T02:48:56
# x-published: 2017-08-04T08:23:00
#
# It’s mostly just for fun but it’s currently used to order snacks (See “Buy groceries with PowerShell”-post) when a TV Show I follow starts/ends soon.
# A short post about these functions are available at:
# http://dollarunderscore.azurewebsites.net/?p=2911
#
function Get-TVShowNextAirDate
{
<#
.Synopsis
Retrieves information about tv shows next air date
.DESCRIPTION
This cmdlet parses pogdesign's tv calendar for tv show air dates
.EXAMPLE
Get-TVShowNextAirDate
.EXAMPLE
Get-TVShowNextAirDate | Format-Table
.EXAMPLE
Get-TVShowNextAirDate | Where-Object { $_.TVShow -eq "Family Guy" }
#>
[CmdletBinding()]
param()
Begin {
# Get the site
$URL = "http://www.pogdesign.co.uk/cat/next-airing"
try {
$CatTV = Invoke-WebRequest -Uri $URL -UseBasicParsing -ErrorAction Stop
}
catch {
Write-Error "Failed to fetch TV Show data."
return
}
$TVShows = $CatTV.Content -split "<div class=`"showlist" | Select-Object -Skip 1
}
Process {
foreach ($TVShow in $TVShows) {
$TVShowName = ((($TVShow -split "<a href")[1] -split "</a>")[0] -split ">")[1] -replace "&","&"
$EpisodeName = ((($TVShow -split "<a href")[2] -split "</a>")[0] -split ">")[1] -replace "&","&"
$Season = (((((($TVShow -split "<a href")[2] -split "</a>")[0] -split ">")[0] -split "season-")[1]) -split "/Episode-")[0]
$Episode = (((((($TVShow -split "<a href")[2] -split "</a>")[0] -split ">")[0] -split "season-")[1]) -split "/Episode-")[1] -replace '"$'
$AirDateString = (($TVShow -split "epdate`">")[1] -split "</span>")[0]
$Year = "20" + (($AirDateString -split " ")[2] -replace "^'")
$MonthString = ($AirDateString -split " ")[1]
$Day = ($AirDateString -split " ")[0] -replace "[^\d]"
$Month = switch ($MonthString)
{
"Jan" { "1" }
"Feb" { "2" }
"Mar" { "3" }
"Apr" { "4" }
"May" { "5" }
"Jun" { "6" }
"Jul" { "7" }
"Aug" { "8" }
"Sep" { "9" }
"Oct" { "10" }
"Nov" { "11" }
"Dec" { "12" }
}
$AirTime = ((($TVShow -split "eptime`">")[1] -split "</span>")[0] -split " ")[0]
$AirTimeAndDate = Get-Date "$Year-$Month-$Day $AirTime"
$returnObject = New-Object System.Object
$returnObject | Add-Member -Type NoteProperty -Name TVShow -Value $TVShowName
$returnObject | Add-Member -Type NoteProperty -Name EpisodeName -Value $EpisodeName
$returnObject | Add-Member -Type NoteProperty -Name Season -Value $Season
$returnObject | Add-Member -Type NoteProperty -Name Episode -Value $Episode
$returnObject | Add-Member -Type NoteProperty -Name AirDate -Value $AirTimeAndDate
Write-Output $returnObject
# Cleanup
Remove-Variable TVShowName, EpisodeName, Season, Episode, AirTimeAndDate, AirDateString, Year, MonthString, Month, Day, AirTime, returnObject
}
}
End { }
}
function Get-TVShowAirDate
{
<#
.Synopsis
Retrieves information about a specific tv show's air dates
.DESCRIPTION
This cmdlet parses pogdesign's tv calendar for a specific tv show's air dates
.EXAMPLE
Get-TVShowAirDate
.EXAMPLE
Get-TVShowAirDate | Format-Table
.EXAMPLE
Get-TVShowNextAirDate | Get-TVShowAirDate | ft
#>
[CmdletBinding()]
param([Parameter(Mandatory=$True, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
[string] $TVShow)
Begin { }
Process {
$URL = "http://www.pogdesign.co.uk/cat/$($TVShow -replace ' ','-' -replace "&","and" -replace '[^a-zA-Z\d-]')-summary"
try {
$TVShowInfo = Invoke-WebRequest -Uri $URL -UseBasicParsing
}
catch {
Write-Error "Failed to fetch TV Show data."
return
}
$TVShowEpisodeSpans = (($TVShowInfo.Content -split "Next Airing Episode Dates")[1] -split "Back to the TV Calendar")[0] -split "<div class=`"" | select -Skip 1
foreach ($TVShowEpisodeSpan in $TVShowEpisodeSpans) {
$EpisodeName = ((($TVShowEpisodeSpan -split "<a href=`"")[1] -split "`">")[1] -split "</A>")[0] -replace "&","&"
$Season = (((((($TVShowEpisodeSpan -split "<a href")[1] -split "</a>")[0] -split ">")[0] -split "season-")[1]) -split "/Episode-")[0]
$Episode = (((((($TVShowEpisodeSpan -split "<a href")[1] -split "</a>")[0] -split ">")[0] -split "season-")[1]) -split "/Episode-")[1] -replace '"$'
$AirDateString = (($TVShowEpisodeSpan -split "epdate`">")[1] -split "</span>")[0]
$Year = "20" + (($AirDateString -split " ")[2] -replace "^'")
$MonthString = ($AirDateString -split " ")[1]
$Day = ($AirDateString -split " ")[0] -replace "[^\d]"
$Month = switch ($MonthString)
{
"Jan" { "1" }
"Feb" { "2" }
"Mar" { "3" }
"Apr" { "4" }
"May" { "5" }
"Jun" { "6" }
"Jul" { "7" }
"Aug" { "8" }
"Sep" { "9" }
"Oct" { "10" }
"Nov" { "11" }
"Dec" { "12" }
}
$AirTime = ((($TVShowEpisodeSpan -split "eptime`">")[1] -split "</span>")[0] -split " ")[0]
$AirTimeAndDate = Get-Date "$Year-$Month-$Day $AirTime"
$returnObject = New-Object System.Object
$returnObject | Add-Member -Type NoteProperty -Name TVShow -Value $TVShow
$returnObject | Add-Member -Type NoteProperty -Name EpisodeName -Value $EpisodeName
$returnObject | Add-Member -Type NoteProperty -Name Season -Value $Season
$returnObject | Add-Member -Type NoteProperty -Name Episode -Value $Episode
$returnObject | Add-Member -Type NoteProperty -Name AirDate -Value $AirTimeAndDate
Write-Output $returnObject
# Cleanup
Remove-Variable EpisodeName, Season, Episode, AirTimeAndDate, AirDateString, Year, MonthString, Month, Day, AirTime, returnObject
}
}
End { }
}