Public/Get-BcTechDaysSchedule.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function Get-BcTechDaysSchedule
{
    $EnglishCulture = [cultureinfo]'en-US';
    $BrusselsTimeZone = [System.TimeZoneInfo]::FindSystemTimeZoneById('Europe/Brussels')

    $Property = [Ordered]@{
        DateTime    = 'h5.modal-title'
        Title       = 'h2.text-color-secondary'
        Speakers    = 'h2.accordion-header button'
        Tags        = 'span.tag'
        Description = '.pt-3 p'
    }

    ConvertTo-HtmlDocument -Uri https://bctechdays.com/event
    | Select-HtmlNode -CssSelector '.modal[aria-labelledby^="event-detail-"] .modal-content' -All
    | Convert-HtmlNode -Property $Property -TypeName 'UncommonSense.BcTechDays.ScheduledEvent' -Mode CssSelector
    | Where-Object { $_.Tags -notcontains 'Workshop' }
    | Where-Object Title -NotMatch '^\w{3}\s\d+$'
    | ForEach-Object {
        $Date = [DateTime]::ParseExact($_.DateTime.SubString(0, 11), 'ddd dd\, MMM', $EnglishCulture)
        $StartTimeText = $_.DateTime.SubString(12, 5)
        $StartTime = [DateTime]::ParseExact($StartTimeText, 'HH:mm', $EnglishCulture).TimeOfDay
        $EndTimeText = $_.DateTime.SubString(20, 5)
        $EndTime = [DateTime]::ParseExact($EndTimeText, 'HH:mm', $EnglishCulture).TimeOfDay

        [PSCustomObject]@{
            RawDateTime = $_.DateTime
            StartDate   = ([TimeZoneInfo]::ConvertTimeToUtc($Date.Add($StartTime), $BrusselsTimeZone))
            EndDate     = ([TimeZoneInfo]::ConvertTimeToUtc($Date.Add($EndTime), $BrusselsTimeZone))
            Title       = $_.Title
            Location    = $_.Tags | Where-Object { $_ -Match '^Room\s\d+$' }
            Level       = $_.Tags | Where-Object { $_ -match '^LEVEL' } | ForEach-Object { $_ -replace '^LEVEL:\s', '' }
            Speakers    = $_.Speakers
            Description = $_.Description
        }
    }
}