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 '//p[@data-sentry-component="HeroSubtitle"]' | Get-HtmlNodeText
# $Description = $Document | Select-HtmlNode -XPath '//div[@data-sentry-component="Synopsis"]' | Get-HtmlNodeText -SkipRemoveLineBreaks
# $Availability = ($Document | Select-HtmlNode -CssSelector '._181o3r08' | Get-HtmlNodeText)
# if (-not $Availability.EndsWith('.')) { $Availability = "$Availability." }
# $Meta = $Document | Select-HtmlNode -CssSelector '._1n2dy9g5'
# $MetaLabels = $Document | Select-HtmlNode -CssSelector 'h3._1rqep6p3' -All | ForEach-Object { $_ | Get-HtmlNodeText }
# $Meta = $Meta.Descendants() | Where-Object Name -In 'p', 'ul'

# $RatingsIndex = $MetaLabels.IndexOf('Kijkwijzer')
# $MetaLabels = $MetaLabels[0..($RatingsIndex - 1)] + $MetaLabels[($RatingsIndex + 1)..($MetaLabels.Length - 1)]

# $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) -replace '\. \.$', '.'
# }

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