functions/Find-YifyMovie.ps1

function Find-YifyMovie {
    param (
        # Search on Movie Title/IMDB Code, Actor Name/IMDB Code, Director Name/IMDB Code
        [string]$Query,
        [ValidateSet('480p','720p','1080p','1080p.x265','2160p','3D')]
        [string]$Quality,
        [ValidateRange(0,9)]
        [int]$MinimumRating,
        # filter by IMDB genre (https://imdb.com/interest/all)
        [string]$Genre,
        [ValidateSet('title','year','rating','peers','seeds','download_count','like_count','date_added')]
        [string]$SortBy,
        [ValidateSet('desc','asc')]
        [string]$Order
    )

    begin {
        $Parameters = [ordered]@{
            limit = 50
            page = 1
        }

        switch ($PSBoundParameters) {
            {$_.ContainsKey('Query')} {$Parameters.Add('query_term', $Query)}
            {$_.ContainsKey('Quality')} {$Parameters.Add('quality', $Quality)}
            {$_.ContainsKey('MinimumRating')} {$Parameters.Add('minimum_rating', $MinimumRating)}
            {$_.ContainsKey('Genre')} {$Parameters.Add('genre', $Genre)}
            {$_.ContainsKey('SortBy')} {$Parameters.Add('sort_by', $SortBy)}
            {$_.ContainsKey('Order')} {$Parameters.Add('order_by', $Order)}
            {$_.ContainsKey('RottenTomatoes')} {$Parameters.Add('with_rt_ratings', ([bool]$RottenTomatoes).ToString().ToLower())}
        }
    }

    process {
        do
        {
            try
            {
                $Uri = Format-UriString -Uri $Script:YifyBaseUri -Endpoint 'list_movies.json' -Parameters $Parameters
                $Response = Invoke-RestMethod -Uri $Uri -ErrorAction Stop
                [Yify_Movie[]]($Response.Data.movies | Select-Object -Property * -Unique)
                $Parameters['page'] = $Parameters['page']++

            }
            catch { throw $_ }

        }
        until ($Response.data.movies)
    }
}