Public/Get-FLTorrent.ps1

function Get-FLTorrent {
    [OutputType('Filelist.Torrent')]
    [CmdletBinding()]
    Param (
        #TODO 'Clean out Parameters'
        [Parameter()]
        [string]
        $Name,
        [Parameter()]
        [ValidateSet('Hibrid','Relevanta','Data','Marime','Downloads','Peers')]
        [string]
        $Sort='Hibrid',
        [Parameter()]
        [int]
        $Pages
    )
    DynamicParam {
        $ParameterName = 'Category'
        $RuntimeParameterDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
        $AttributeCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]
        $ParameterAttribute = New-Object System.Management.Automation.ParameterAttribute
        $AttributeCollection.Add($ParameterAttribute)
        try {
            $HTML = Invoke-WebRequest -Uri ('{0}/browse.php' -f $Script:BaseUri) -WebSession $Script:session
        } catch {
            break
        }
        
        $Document = New-Object -TypeName HtmlAgilityPack.HtmlDocument
        $Document.LoadHtml($HTML)
        $Links = $Document.DocumentNode.SelectNodes('//td[@class="noborder"]//a')
        foreach ($Link in $Links) {
            if ($Link.Attributes.Value -match 'cat') {
                $CategoryId = [int]($Link.Attributes.Value).Replace('browse.php?cat=','')
                $Category = [string]($Link.InnerText).Trim()
            }
            [array]$CategoriesArray += New-Object -TypeName PSCustomObject @{
                Category = $Category
                CategoryID = $CategoryId
            }
        }
        $ValidateSetAttribute = New-Object System.Management.Automation.ValidateSetAttribute($CategoriesArray.Category)
        $AttributeCollection.Add($ValidateSetAttribute)
        $RuntimeParameter = New-Object System.Management.Automation.RuntimeDefinedParameter($ParameterName, [string], $AttributeCollection)
        $RuntimeParameterDictionary.Add($ParameterName, $RuntimeParameter)
        return $RuntimeParameterDictionary
    }

    BEGIN {
        $Category = $PsBoundParameters[$ParameterName]
        if ($Category) {
            foreach ($Item in $CategoriesArray) {
                if ($Item.Category -eq $Category) {
                    $CategoryId = ('cat={0}' -f $Item.CategoryID)
                }
            }
        }
        if ( -Not ($Script:session) ) {
            Write-Output 'You must first login to Filelist using the cmdlet Invoke-FLLogin'
            Break
        }
        switch ($Sort) {
            'Hibrid' {$SortID = '0'}
            'Relevanta' {$SortID = '1'}
            'Data' {$SortID = '2'}
            'Marime' {$SortID = '3'}
            'Downloads' {$SortID = '4'}
            'Peers' {$SortID = '5'}
        }
        if ($Name -or $Category) {
            $Name = $Name -replace ' ', '+'
            $Query = ('{0}/browse.php?search={1}&{2}&searchin=0&sort={3}' -f $Script:BaseUri, $Name, $CategoryId, $SortID)
        } else {
            $Query = ('{0}/browse.php' -f $Script:BaseUri)
        }
        
        #Building the HTML Variable
        try {
            $HTML = (Invoke-WebRequest -Uri $Query -WebSession $Script:session -UseBasicParsing -ErrorAction Stop).RawContent
            if ($Pages) {
                for ($i = 1 ; $i -lt $Pages; $i++) {
                    $HTML += (Invoke-WebRequest -Uri ('{0}?page={1}' -f $Query, [string]$i) -WebSession $Script:session -UseBasicParsing -ErrorAction Stop).RawContent#
                }
            }
        } catch {
            Write-Error $Error[0]
            break
        }
            
        $Document = New-Object -TypeName HtmlAgilityPack.HtmlDocument
        $Document.LoadHtml($HTML)
        $TorrentRows = $Document.DocumentNode.SelectNodes('//div[@class="torrentrow"]')
        
        
    }

    PROCESS {
        foreach ($TorrentRow in $TorrentRows) {
            #Parse Genres
            $Nodes = $TorrentRow.ChildNodes[1].ChildNodes[0].ChildNodes 
            foreach ($Node in $Nodes) {
                If ($Node.Name -eq 'font') {
                    $Genres = ((($Node.InnerText).Trim('[]')).Split(',|')).Trim()
                }
            }
            #Parse Date
            $DateTime = $TorrentRow.ChildNodes[5].ChildNodes.ChildNodes.ChildNodes.InnerHtml
            $DateTime = $DateTime -split '<br>'
            $DateAdded = [datetime]::ParseExact(('{0} {1}' -f $DateTime[1], $DateTime[0]), 'dd/MM/yyyy HH:mm:ss', $null)

            #Tags
            $Tags = $null
            $Nodes = $TorrentRow.ChildNodes[1].ChildNodes.ChildNodes
            foreach ($Node in $Nodes) {
                If ($Node.Name -eq 'img') {
                    foreach ($Attribute in $Node.Attributes) {
                        If ($Attribute.Name -eq 'alt') {
                            [array]$Tags += $Attribute.Value
                        }
                    }
                }
            }

            #File Size
            $Size = $null
            [array]$SizeArray = $TorrentRow.ChildNodes[6].ChildNodes.ChildNodes.InnerHtml -split '<br>'
            Switch ($SizeArray[1]) {
                'kB' { $Size = [int]$SizeArray[0] * 1024 }
                'MB' { $Size = [int]$SizeArray[0] * 1024 * 1024 }
                'GB' { $Size = [int]$SizeArray[0] * 1024 * 1024 * 1024 }
            }

            #Building Object
            $Object = New-Object -TypeName PSCustomObject -Property @{
                Name = [string]$TorrentRow.ChildNodes[1].ChildNodes[0].ChildNodes[0].InnerText
                Id = [int]($TorrentRow.ChildNodes[1].ChildNodes[0].ChildNodes[0].Attributes[0].Value).Replace('details.php?id=','')
                Genre = [string[]]$Genres
                Snatched = [int]($TorrentRow.ChildNodes[7].ChildNodes.InnerText).Replace('times','')
                Category = [string]$TorrentRow.ChildNodes[0].ChildNodes.ChildNodes.ChildNodes.Attributes[2].Value
                CategoryID = [int]($TorrentRow.ChildNodes[0].ChildNodes.ChildNodes.Attributes.Value).Replace('browse.php?cat=','')
                DateAdded = $DateAdded
                Length = [long]$Size
                Seeders = [int]$TorrentRow.ChildNodes[8].InnerText
                Leechers = [int]$TorrentRow.ChildNodes[9].InnerText
                Uploader = [string]$TorrentRow.ChildNodes[10].InnerText
                Tag = $Tags
            }
            $Object.pstypenames.insert(0,'Filelist.Torrent')
            Write-Output -InputObject $Object
            # Write-Output $TorrentRow
        }
    }
}