Public/Get-Picl.ps1

<#
.SYNOPSIS
Retrieves films available on picl.nl
#>

function Get-Picl
{
    [CmdletBinding()]
    param()

    $DutchCulture = Get-Culture 'nl-NL'

    Invoke-WebRequest -Uri 'https://picl.nl/films/'
    | Select-Object -ExpandProperty Links
    | Select-Object -ExpandProperty Href
    | Where-Object { $_ -match '^/films/[^/]+$' }
    | ForEach-Object {
        $Url = 'https://picl.nl{0}' -f $_
        $Document = ConvertTo-HtmlDocument -Uri $Url
        $Title = $Document | Select-HtmlNode -CssSelector 'h1' | Get-HtmlNodeText
        $Image = $Document | Select-HtmlNode -CssSelector '._181o3r00 img'
        $ImageUrl = 'https://picl.nl' + $Image.Attributes['src'].Value -replace '^https://picl\.nl/_next/image\?url=', ''
        $ImageUrl = [System.Uri]::UnescapeDataString($ImageUrl) -replace '&.*$', ''
        $Synopsis = $Document | Select-HtmlNode -XPath '//div[@data-sentry-component="Synopsis"]//strong' | Get-HtmlNodeText
        $Description = $Document | Select-HtmlNode -CssSelector '._1n4o8zx1 > p' -All | Select-Object -Skip 1 | Get-HtmlNodeText -SkipRemoveLineBreaks
        $Availability = ($Document | Select-HtmlNode -CssSelector '._181o3r08' | Get-HtmlNodeText)
        if (-not $Availability.EndsWith('.')) { $Availability = "$Availability." }
        $Meta = $Document | Select-HtmlNode -CssSelector '._1n2dy9g3'
        $MetaLabels = $Document | Select-HtmlNode -CssSelector 'h3._1rqep6p2' -All | ForEach-Object { $_ | Get-HtmlNodeText } | Select-Object -Skip 1

        $Meta = $Meta.Descendants() | Where Name -in 'p', 'ul'

        $AvailableUntilIndex = $MetaLabels.IndexOf('Te zien tot en met')
        $GenreIndex = $MetaLabels.IndexOf('Genre')
        $CountryIndex = $MetaLabels.IndexOf('Land')
        $LanguageIndex = $MetaLabels.IndexOf('Taal')
        $SubtitlesIndex = $MetaLabels.IndexOf('Ondertitels')

        $AvailableUntilText = ''
        $AvailableUntil = $null

        if ($AvailableUntilIndex -ne -1)
        {
            $AvailableUntilText = $Meta[$AvailableUntilIndex] | Get-HtmlNodeText
            $AvailableUntil = [DateTime]::ParseExact($AvailableUntilText, 'd MMMM yyyy', $DutchCulture)
            $Availability = "Te zien tot $AvailableUntilText. " + $Availability
        }

        filter ElementsContainingText
        {
            $CurrentElement = $_

            switch($CurrentElement.Name)
            {
                'p' { return $CurrentElement }
                'ul' { return $CurrentElement.Elements('li') }
            }
        }

        $Genre = $Meta[$GenreIndex] | ElementsContainingText | ForEach-Object { $_ | Get-HtmlNodeText } | Join-String -Separator ', '
        $Country = $Meta[$CountryIndex] | ElementsContainingText | ForEach-Object { $_ | Get-HtmlNodeText } | Join-String -Separator ', '
        $Language = $Meta[$LanguageIndex] | ElementsContainingText | ForEach-Object { $_ | Get-HtmlNodeText } | Join-String -Separator ', '
        $SubTitles= $Meta[$SubtitlesIndex] | ElementsContainingText | ForEach-Object { $_ | Get-HtmlNodeText } | Join-String -Separator ', '

        [PSCustomObject]@{
            PSTypeName     = 'UncommonSense.Cinema.PiclFilm'
            Url            = $Url
            Title          = $Title
            ImageUrl       = $ImageUrl
            Synopsis       = $Synopsis
            Description    = $Description
            Genre          = $Genre
            Country        = $Country
            Language       = $Language
            Subtitles = $Subtitles
            Availability   = $Availability
            AvailableUntil = $AvailableUntil
        }
    }
}