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 } } } |