Public/Set-JVMovie.ps1

function Set-JVMovie {
    [CmdletBinding(SupportsShouldProcess = $true)]
    param (
        [Parameter(Mandatory = $true, Position = 0)]
        [System.IO.FileInfo]$Path,

        [Parameter(Mandatory = $true, Position = 1)]
        [System.IO.DirectoryInfo]$DestinationPath,

        [Parameter(Mandatory = $true)]
        [PSObject]$Settings,

        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [PSObject]$Data,

        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [PSObject]$SortData,

        [Parameter()]
        [Switch]$Update,

        [Parameter()]
        [Switch]$Force,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias('sort.movetofolder')]
        [Boolean]$MoveToFolder,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias('sort.renamefile')]
        [Boolean]$RenameFile,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias('sort.maxtitlelength')]
        [Int]$MaxTitleLength,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias('sort.create.nfo')]
        [Boolean]$CreateNfo,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias('sort.create.nfoperfile')]
        [Boolean]$CreateNfoPerFile,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias('sort.download.actressimg')]
        [Boolean]$DownloadActressImg,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias('sort.download.thumbimg')]
        [Boolean]$DownloadThumbImg,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias('sort.download.posterimg')]
        [Boolean]$DownloadPosterImg,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias('sort.download.screenshotimg')]
        [Boolean]$DownloadScreenshotImg,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias('sort.download.trailervid')]
        [Boolean]$DownloadTrailerVid,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias('sort.metadata.nfo.firstnameorder')]
        [Boolean]$FirstNameOrder,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias('sort.metadata.nfo.actresslanguageja')]
        [Boolean]$ActressLanguageJa,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias('sort.metadata.nfo.originalpath')]
        [Boolean]$OriginalPath,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias('sort.metadata.nfo.altnamerole')]
        [Boolean]$AltNameRole,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias('sort.format.screenshotimg.padding')]
        [Int]$ScreenshotImgPadding
    )

    begin {
        if (-not $PSBoundParameters.ContainsKey('Confirm')) {
            $ConfirmPreference = $PSCmdlet.SessionState.PSVariable.GetValue('ConfirmPreference')
        }
        if (-not $PSBoundParameters.ContainsKey('WhatIf')) {
            $WhatIfPreference = $PSCmdlet.SessionState.PSVariable.GetValue('WhatIfPreference')
        }

        function New-WebClient {
            param (
                [Switch]$Proxy,
                [String]$ProxyUrl,
                [String]$ProxyUser,
                [String]$ProxyPass
            )

            $webClient = New-Object System.Net.WebClient
            $webclient.Headers.Add("User-Agent: Other")
            if ($Proxy) {
                $newProxy = New-Object System.Net.WebProxy
                $newProxy.Address = $ProxyUrl
                $webClient.Proxy = $newProxy
                if ($ProxyUser -ne '' -or $ProxyPass -ne '') {
                    $cred = New-Object System.Net.NetworkCredential -ArgumentList $ProxyUser, $ProxyPass
                    $webClient.Credentials = $cred
                }
            }

            return $webClient
        }
    }

    process {
        if ($Settings) {
            $MoveToFolder = $Settings.'sort.movetofolder'
            $RenameFile = $Settings.'sort.renamefile'
            $RenameFolder = $Settings.'sort.renamefolderinplace'
            $MaxTitleLength = $Settings.'sort.maxtitlelength'
            $CreateNfo = $Settings.'sort.create.nfo'
            $CreateNfoPerFile = $Settings.'sort.create.nfoperfile'
            $DownloadActressImg = $Settings.'sort.download.actressimg'
            $DownloadThumbImg = $Settings.'sort.download.thumbimg'
            $DownloadPosterImg = $Settings.'sort.download.posterimg'
            $DownloadScreenshotImg = $Settings.'sort.download.screenshotimg'
            $DownloadTrailerVid = $Settings.'sort.download.trailervid'
            $FirstNameOrder = $Settings.'sort.metadata.nfo.firstnameorder'
            $ActressLanguageJa = $Settings.'sort.metadata.nfo.actresslanguageja'
            $OriginalPath = $Settings.'sort.metadata.nfo.originalpath'
            $AltNameRole = $Settings.'sort.metadata.nfo.altnamerole'
            $AddGenericRole = $Settings.'sort.metadata.nfo.addgenericrole'
            $ScreenshotImgPadding = $Settings.'sort.format.screenshotimg.padding'
            $Proxy = $Settings.'proxy.enabled'
            $ProxyUrl = $Settings.'proxy.host'
            $ProxyUser = $Settings.'proxy.username'
            $ProxyPass = $Settings.'proxy.password'
        }

        <# if ($RenameFile -and (!($Update))) {
            $fileName = Convert-JVString -Data $Data -Format $FileFormat -PartNumber $sortData.PartNumber -MaxTitleLength $MaxTitleLength -Delimiter $DelimiterFormat -ActressLanguageJa:$ActressLanguageJa -FirstNameOrder:$FirstNameOrder -GroupActress:$GroupActress -IsFileName:$true
        } else {
            $fileName = (Get-Item -LiteralPath $Path).BaseName
        }
        if ($outputFolderFormat -ne '') {
            $outputFolders = @()
            foreach ($format in $outputFolderFormat) {
                $outputFolders += Convert-JVstring -Data $Data -Format $format -MaxTitleLength $MaxTitleLength -Delimiter $DelimiterFormat -ActressLanguageJa:$ActressLanguageJa -FirstNameOrder:$FirstNameOrder -GroupActress:$GroupActress -IsFileName:$true
            }
            $outputFolderName = $outputFolders -join '/'
        } #>


        <# $sortData.PosterName = @()
        foreach ($format in $PosterFormat) {
            $sortData.PosterName += Convert-JVString -Data $Data -Format $format -MaxTitleLength $MaxTitleLength -Delimiter $DelimiterFormat -ActressLanguageJa:$ActressLanguageJa -FirstNameOrder:$FirstNameOrder -GroupActress:$GroupActress -IsFileName:$true
        } #>


        <# if ($CreateNfo) {
            $nfoName = Convert-JVString -Data $Data -Format $NfoFormat -MaxTitleLength $MaxTitleLength -Delimiter $DelimiterFormat -ActressLanguageJa:$ActressLanguageJa -FirstNameOrder:$FirstNameOrder -GroupActress:$GroupActress -IsFileName:$true
            if ($CreateNfoPerFile) {
                $nfoName = $fileName
            }
        } #>


        if ($OriginalPath) {
            $nfoContents = $Data | Get-JVNfo -NameOrder $FirstNameOrder -ActressLanguageJa:$ActressLanguageJa -OriginalPath:$Path -AltNameRole:$AltNameRole -AddGenericRole:$AddGenericRole
        } else {
            $nfoContents = $Data | Get-JVNfo -NameOrder $FirstNameOrder -ActressLanguageJa:$ActressLanguageJa -AltNameRole:$AltNameRole -AddGenericRole:$AddGenericRole
        }

        <# if ($MoveToFolder) {
            if ($DestinationPath) {
                if ($outputFolderName -ne '' -and $null -ne $outputFolderName) {
                    $sortData.FolderPath = Join-Path -Path $DestinationPath -ChildPath $outputFolderName -AdditionalChildPath $sortData.FolderName
                } else {
                    $sortData.FolderPath = Join-Path -Path $DestinationPath -ChildPath $sortData.FolderName
                }
            } else {
                if ($outputFolderName -ne '' -and $null -ne $outputFolderName) {
                    $sortData.FolderPath = Join-Path -Path $Path -ChildPath $outputFolderName -AdditionalChildPath $sortData.FolderName
                } else {
                    $sortData.FolderPath = Join-Path -Path $Path -ChildPath $sortData.FolderName
                }
            }
        } else {
            if ($DestinationPath) {
                $sortData.FolderPath = $DestinationPath
            } else {
                $sortData.FolderPath = (Get-Item -LiteralPath $Path).Directory
            }
        } #>


        <# if ($Update) {
            $sortData.FolderPath = (Get-Item -LiteralPath $Path).Directory
        } #>



        if ($Force -or $PSCmdlet.ShouldProcess($Path)) {
            # Windows directory paths do not allow trailing dots/periods but do not throw an error on creation
            $sortData.FolderPath = ([String]$sortData.FolderPath).TrimEnd('.')

            # We do not want to recreate the destination folder if it already exists
            try {
                if ($RenameFolder) {
                    # Force multipart movies to wait to avoid race condition when renaming the folder
                    if ($sortData.PartNumber -gt 0) {
                        Start-Sleep -Seconds 5
                    }
                    Rename-Item -LiteralPath $sortData.ParentPath -NewName $sortData.FolderName -ErrorAction SilentlyContinue
                    $Path = Join-Path -Path $sortData.RenameNewPath -ChildPath $sortData.FolderName -AdditionalChildPath $Path.Name
                } else {
                    if (!(Test-Path -LiteralPath $sortData.FolderPath) -and (!($Update))) {
                        New-Item -Path $sortData.FolderPath -ItemType Directory -Force:$Force | Out-Null
                        Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [Directory] created at path [$($sortData.FolderPath)]"
                    }
                }
            } catch {
                Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Error -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] Error occurred when creating destination folder path [$($sortData.FolderPath)]: $PSItem"
            }

            if ($CreateNfo) {
                try {
                    $nfoContents | Out-File -LiteralPath $sortData.NfoPath -Force:$Force
                    Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [Nfo] created at path [$($sortData.NfoPath)]"
                } catch {
                    Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Error -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] Error occurred when creating nfo file [$($sortData.NfoPath)]: $PSItem"
                }
            }

            if ($DownloadThumbImg) {
                if ($null -ne $Data.CoverUrl) {
                    try {
                        $webClient = New-WebClient -Proxy:$Proxy -ProxyUrl $ProxyUrl -ProxyUser $ProxyUser -ProxyPass $ProxyPass
                        if ($sortData.PartNumber -eq 0 -or $sortData.PartNumber -eq 1) {
                            if ($Force) {
                                if (Test-Path -LiteralPath $sortData.ThumbPath) {
                                    Remove-Item -LiteralPath $sortData.ThumbPath -Force
                                }
                                $webClient.DownloadFile(($Data.CoverUrl).ToString(), $sortData.ThumbPath)
                                Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [Thumbnail - $($Data.CoverUrl)] downloaded to path [$($sortData.ThumbPath)]"
                            } elseif (!(Test-Path -LiteralPath $sortData.ThumbPath)) {
                                $webClient.DownloadFile(($Data.CoverUrl).ToString(), $sortData.ThumbPath)
                                Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [Thumbnail - $($Data.CoverUrl)] downloaded to path [$($sortData.ThumbPath)]"
                            }
                        } else {
                            if (!(Test-Path -LiteralPath $sortData.ThumbPath)) {
                                Start-Sleep -Seconds 2
                                if (!(Test-Path -LiteralPath $sortData.ThumbPath)) {
                                    $webClient.DownloadFile(($Data.CoverUrl).ToString(), $sortData.ThumbPath)
                                    Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [Thumbnail - $($Data.CoverUrl)] downloaded to path [$($sortData.ThumbPath)]"
                                }
                            }
                        }
                    } catch {
                        Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Error -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] Error occurred when creating thumbnail image file [$($sortData.ThumbPath)]: $PSItem"
                    }

                    if ($DownloadPosterImg) {
                        try {
                            $cropScriptPath = Join-Path -Path ((Get-Item $PSScriptRoot).Parent) -ChildPath 'crop.py'
                            if (Test-Path -LiteralPath $cropScriptPath) {
                                foreach ($poster in $sortData.PosterPath) {
                                    $pythonThumbPath = $sortData.ThumbPath -replace '\\', '/'
                                    $pythonPosterPath = $poster -replace '\\', '/'
                                    if ($sortData.PartNumber -eq 0 -or $sortData.PartNumber -eq 1) {
                                        if ($Force) {
                                            if (Test-Path -LiteralPath $sortData.PosterPath) {
                                                Remove-Item -LiteralPath $sortData.PosterPath -Force
                                            }
                                            if ([System.Environment]::OSVersion.Platform -eq 'Win32NT') {
                                                python $cropScriptPath $pythonThumbPath $pythonPosterPath
                                                Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [Poster - $($sortData.ThumbPath)] cropped to path [$($poster)]"
                                            } elseif ([System.Environment]::OSVersion.Platform -eq 'Unix') {
                                                python3 $cropScriptPath $pythonThumbPath $pythonPosterPath
                                                Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [Poster - $($sortData.ThumbPath)] cropped to path [$($poster)]"
                                            }
                                        } elseif (!(Test-Path -LiteralPath $poster)) {
                                            if ([System.Environment]::OSVersion.Platform -eq 'Win32NT') {
                                                python $cropScriptPath $pythonThumbPath $pythonPosterPath
                                                Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [Poster - $($sortData.ThumbPath)] cropped to path [$($poster)]"
                                            } elseif ([System.Environment]::OSVersion.Platform -eq 'Unix') {
                                                python3 $cropScriptPath $pythonThumbPath $pythonPosterPath
                                                Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [Poster - $($sortData.ThumbPath)] cropped to path [$($poster)]"
                                            }
                                        }
                                    } else {
                                        if (!(Test-Path -LiteralPath $poster)) {
                                            Start-Sleep -Seconds 2
                                            if (!(Test-Path -LiteralPath $poster)) {
                                                if ([System.Environment]::OSVersion.Platform -eq 'Win32NT') {
                                                    python $cropScriptPath $pythonThumbPath $pythonPosterPath
                                                    Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [Poster - $sortData.ThumbPath] cropped to path [$poster]"
                                                } elseif ([System.Environment]::OSVersion.Platform -eq 'Unix') {
                                                    python3 $cropScriptPath $pythonThumbPath $pythonPosterPath
                                                    Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [Poster - $sortData.ThumbPath] cropped to path [$poster]"
                                                }
                                            }
                                        }
                                    }
                                }

                            } else {
                                Write-JLog -Level Error -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] Crop.py file is missing or cannot be found at path [$cropScriptPath]"
                            }
                        } catch {
                            Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Error -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] Error occurred when creating poster image file [$($poster)]: $PSItem"
                        }
                    }
                }
            }

            if ($DownloadActressImg) {
                if ($null -ne $Data.Actress) {
                    try {
                        if (!(Test-Path -LiteralPath $sortData.ActorFolderPath)) {
                            New-Item -Path $sortData.ActorFolderPath -ItemType Directory -Force:$Force | Out-Null
                        }

                        $nfoXML = [xml]$nfoContents
                        foreach ($actress in $nfoXML.movie.actor) {
                            if ($actress.thumb -ne '') {
                                $webClient = New-WebClient -Proxy:$Proxy -ProxyUrl $ProxyUrl -ProxyUser $ProxyUser -ProxyPass $ProxyPass
                                $newName = ($actress.name -split ' ') -join '_'
                                $actressThumbPath = Join-Path -Path $sortData.ActorFolderPath -ChildPath "$newName.jpg"

                                if ($sortData.PartNumber -eq 0 -or $sortData.PartNumber -eq 1) {
                                    if ($Force) {
                                        if (Test-Path -LiteralPath $actressThumbPath) {
                                            Remove-Item -LiteralPath $actressThumbPath -Force
                                        }
                                        $webClient.DownloadFile($actress.thumb, $actressThumbPath)
                                        Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [ActressImg - $($actress.thumb)] downloaded to path [$actressThumbPath]"
                                    } elseif (!(Test-Path -LiteralPath $actressThumbPath)) {
                                        $webClient.DownloadFile($actress.thumb, $actressThumbPath)
                                        Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [ActressImg - $($actress.thumb)] downloaded to path [$actressThumbPath]"
                                    }
                                } else {
                                    if (!(Test-Path -LiteralPath $actressThumbPath)) {
                                        Start-Sleep -Seconds 2
                                        if (!(Test-Path -LiteralPath $actressThumbPath)) {
                                            $webClient.DownloadFile($actress.thumb, $actressThumbPath)
                                            Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [ActressImg - $($actress.thumb)] downloaded to path [$actressThumbPath]"
                                        }
                                    }
                                }
                            }
                        }
                    } catch {
                        Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Error -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] Error occurred when creating actress image files: $PSItem"
                    }
                }
            }

            if ($DownloadScreenshotImg) {
                if ($null -ne $Data.ScreenshotUrl) {
                    try {
                        $index = 1
                        if (!(Test-Path -LiteralPath $sortData.ScreenshotFolderPath)) {
                            New-Item -Path $sortData.ScreenshotFolderPath -ItemType Directory -Force:$Force -ErrorAction SilentlyContinue | Out-Null
                        }

                        foreach ($screenshot in $Data.ScreenshotUrl) {
                            $webClient = New-WebClient -Proxy:$Proxy -ProxyUrl $ProxyUrl -ProxyUser $ProxyUser -ProxyPass $ProxyPass
                            $paddedIndex = $index.ToString().PadLeft($ScreenshotImgPadding, '0')
                            $screenshotName = "$($sortData.ScreenshotImgName)$paddedIndex.jpg"
                            $screenshotPath = Join-Path -Path $sortData.ScreenshotFolderPath -ChildPath $screenshotName
                            if ($sortData.PartNumber -eq 0 -or $sortData.PartNumber -eq 1) {
                                if ($Force.IsPresent) {
                                    if (Test-Path -LiteralPath $screenshotPath) {
                                        Remove-Item -LiteralPath $screenshotPath -Force
                                    }
                                    $webClient.DownloadFile($screenshot, $screenshotPath)
                                    Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [ScreenshotImg - $screenshot] downloaded to path [$screenshotPath]"
                                } elseif (!(Test-Path -LiteralPath $screenshotPath)) {
                                    $webClient.DownloadFile($screenshot, $screenshotPath)
                                    Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [ScreenshotImg - $screenshot] downloaded to path [$screenshotPath]"
                                }
                                $index++
                            } else {
                                if (!(Test-Path -LiteralPath $screenshotPath)) {
                                    Start-Sleep -Seconds 2
                                    if (!(Test-Path -LiteralPath $screenshotPath)) {
                                        $webClient.DownloadFile($screenshot, $screenshotPath)
                                        Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [ScreenshotImg - $screenshot] downloaded to path [$screenshotPath]"
                                    }
                                }
                            }
                        }
                    } catch {
                        Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Error -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] Error occurred when creating screenshot image file [$screenshot] from to [$screenshotPath]: $PSItem"
                    }
                }
            }

            if ($DownloadTrailerVid) {
                if ($null -ne $Data.TrailerUrl -and $Data.TrailerUrl -ne '') {
                    try {
                        $webClient = New-WebClient -Proxy:$Proxy -ProxyUrl $ProxyUrl -ProxyUser $ProxyUser -ProxyPass $ProxyPass
                        if ($sortData.PartNumber -eq 0 -or $sortData.PartNumber -eq 1) {
                            if ($Force.IsPresent) {
                                if (Test-Path -LiteralPath $sortData.TrailerPath) {
                                    Remove-Item -LiteralPath $sortData.TrailerPath
                                }
                                $webClient.DownloadFile($Data.TrailerUrl, $sortData.TrailerPath)
                                Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [TrailerVid - $($Data.TrailerUrl)] downloaded to path [$($sortData.TrailerPath)]"
                            } elseif (!(Test-Path -LiteralPath $sortData.TrailerPath)) {
                                $webClient.DownloadFile($Data.TrailerUrl, $sortData.TrailerPath)
                                Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [TrailerVid - $($Data.TrailerUrl)] downloaded to path [$($sortData.TrailerPath)]"
                            }
                        } else {
                            if (!(Test-Path -LiteralPath $sortData.TrailerPath)) {
                                Start-Sleep -Seconds 2
                                if (!(Test-Path -LiteralPath $sortData.TrailerPath)) {
                                    $webClient.DownloadFile($Data.TrailerUrl, $sortData.TrailerPath)
                                    Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Debug -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [TrailerVid - $($Data.TrailerUrl)] downloaded to path [$($sortData.TrailerPath)]"
                                }
                            }
                        }
                    } catch {
                        Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Error -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] Error occurred when creating trailer video file [$($Data.TrailerUrl)] to [$($sortData.TrailerName)]: $PSItem"
                    }
                }
            }

            if ($RenameFile -and !$Update) {
                try {
                    if ($RenameFolder) {
                        if ([System.Environment]::OSVersion.Platform -eq 'Win32NT') {
                            Move-Item -LiteralPath $Path -Destination $sortData.FilePath -Force:$Force
                        } elseif ([System.Environment]::OSVersion.Platform -eq 'Unix') {
                            if ($Force) {
                                try {
                                    Move-Item $Path $sortData.FilePath --force
                                } catch {
                                    Move-Item -LiteralPath $Path -Destination $sortData.FilePath -Force
                                }
                            } else {
                                try {
                                    Move-Item $Path $sortData.FilePath --no-clobber
                                } catch {
                                    Move-Item -LiteralPath $Path -Destination $sortData.FilePath
                                }
                            }
                        }
                    } else {
                        if ((Get-Item -LiteralPath $DestinationPath).Directory -ne (Get-Item -LiteralPath $Path).Directory) {
                            if ((Get-Item -LiteralPath $Path).FullName -ne $sortData.FilePath) {
                                if (!(Test-Path -LiteralPath $sortData.FilePath)) {
                                    if ([System.Environment]::OSVersion.Platform -eq 'Win32NT') {
                                        Move-Item -LiteralPath $Path -Destination $sortData.FilePath -Force:$Force
                                    } elseif ([System.Environment]::OSVersion.Platform -eq 'Unix') {
                                        if ($Force) {
                                            try {
                                                Move-Item $Path $sortData.FilePath --force
                                            } catch {
                                                Move-Item -LiteralPath $Path -Destination $sortData.FilePath -Force
                                            }
                                        } else {
                                            try {
                                                Move-Item $Path $sortData.FilePath --no-clobber
                                            } catch {
                                                Move-Item -LiteralPath $Path -Destination $sortData.FilePath
                                            }
                                        }
                                    }
                                    Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Info "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] Completed [$Path] => [$($sortData.FilePath)]"
                                } else {
                                    Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Warning -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] Completed [$Path] but did not move as the destination file already exists"
                                }
                            } else {
                                Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Info "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] Updated [$Path]"
                            }
                        }
                    }
                } catch {
                    Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Error -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] Error occurred when renaming and moving file [$Path] to [$($sortData.FilePath)]: $PSItem"
                }
            } else {
                if (!($Update)) {
                    try {
                        if ((Get-Item -LiteralPath $DestinationPath).Directory -ne (Get-Item -LiteralPath $Path).Directory) {
                            if ((Get-Item -LiteralPath $Path).FullName -ne $sortData.FilePath) {
                                if (!(Test-Path -LiteralPath $sortData.FilePath)) {
                                    if ([System.Environment]::OSVersion.Platform -eq 'Win32NT') {
                                        Move-Item -LiteralPath $Path -Destination $sortData.FilePath -Force:$Force
                                    } elseif ([System.Environment]::OSVersion.Platform -eq 'Unix') {
                                        if ($Force) {
                                            try {
                                                Move-Item $Path $sortData.FilePath --force
                                            } catch {
                                                Move-Item -LiteralPath $Path -Destination $sortData.FilePath -Force
                                            }
                                        } else {
                                            try {
                                                Move-Item $Path $sortData.FilePath --no-clobber
                                            } catch {
                                                Move-Item -LiteralPath $Path -Destination $sortData.FilePath
                                            }
                                        }
                                    }
                                    Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Info "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] Completed [$Path] => [$($sortData.FilePath)]"
                                } else {
                                    Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Warning -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] Completed [$Path] but did not move as the destination file already exists"
                                }
                            } else {
                                Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Info "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] Updated [$Path]"
                            }
                        }
                    } catch {
                        Write-JVLog -Write:$script:JVLogWrite -LogPath $script:JVLogPath -WriteLevel $script:JVLogWriteLevel -Level Error -Message "[$($Data.Id)] [$($MyInvocation.MyCommand.Name)] [$($MyInvocation.MyCommand.Name)] Error occurred when renaming and moving file [$Path] to [$($sortData.FilePath)]: $PSItem"
                    }
                }
            }
        }
    }
}