Public/Add-SonarrSeries.ps1

function Add-SonarrSeries
{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'IMDB')]
        [ValidatePattern('^(tt)?\d{5,9}$')]
        [String]$IMDBID,

        [Parameter(Mandatory = $true, ParameterSetName = 'TMDB')]
        [ValidatePattern('^\d{1,9}$')]
        [String]$TMDBID,

        [Parameter(Mandatory = $true, ParameterSetName = 'TVDB')]
        [String]$TVDBID,

        [Parameter(Mandatory = $true)]
        [int]
        $QualityProfileId,

        [Parameter(Mandatory = $false)]
        [ValidateSet('all', 'future', 'missing', 'existing', 'recent', 'pilot', 'firstSeason', 'lastSeason', 'monitorSpecials', 'unmonitorSpecials', 'none')]
        $MonitorOption = 'all',

        [Parameter(Mandatory = $false)]
        [Switch]$Search
    )

    ####################################################################################################
    #Region Import configuration
    try
    {
        Import-Configuration -ErrorAction Stop
    }
    catch
    {
        throw $_
    }
    #EndRegion


    ####################################################################################################
    # If using IMDB, ensure the ID is in the correct format
    if($ParameterSetName -eq 'IMDBID' -and $IMDBID -notmatch '^tt')
    {
        $IMDBID = 'tt' + $IMDBID
    }


    ####################################################################################################
    #Region Check if already in Sonarr before attempting an addition
    Write-Verbose -Message "Checking if the series already exists"
    try
    {
        if($IMDBID)
        {
            $Series = Get-SonarrSeries -IMDBID $IMDBID -ErrorAction Stop
        }
        elseif($TMDBID)
        {
            $Series = Get-SonarrSeries -TMDBID $TMDBID -ErrorAction Stop
        }
        elseif($TVDBID)
        {
            $Series = Get-SonarrSeries -TVDBID $TVDBID -ErrorAction Stop
        }

        if($Series)
        {
            Write-Warning "Series already exists in Sonarr!"
            return
        }
    }
    catch
    {
        throw $_
    }
    #EndRegion


    ####################################################################################################
    #Region Define the path, parameters, headers and URI
    try
    {
        $Path = '/series/lookup'

        if($TVDBID)
        {
            $Params = @{
                term = "tvdb%3A$($TVDBID)"
            }
        }
        elseif($IMDBID)
        {
            $Params = @{
                term = "imdb%3A$($IMDBID)"
            }
        }

        # Generate the headers and URI
        $Headers = Get-Headers
        $Uri = Get-APIUri -RestEndpoint $Path -Params $Params
    }
    catch
    {
        throw $_
    }
    #EndRegion


    ####################################################################################################
    #Region Search for the series (we need to get the data before adding it)
    Write-Verbose -Message "Using Sonarr lookup service to find the series"
    try
    {
        if($IMDBID)
        {
            $Series = Search-SonarrSeries -IMDBID $IMDBID -ErrorAction Stop
        }
        elseif($TMDBID)
        {
            $Series = Search-SonarrSeries -TMDBID $TMDBID -ErrorAction Stop
        }
        elseif($TVDBID)
        {
            $Series = Search-SonarrSeries -TVDBID $TVDBID -ErrorAction Stop
        }

        if(!$Series)
        {
            throw "Could not find the series to add"
        }
    }
    catch
    {
        throw $_
    }
    #EndRegion


    #############################################################################
    #Region Append data
    try
    {
        $Series | Add-Member -MemberType NoteProperty -Name 'qualityProfileId' -Value $QualityProfileId -Force
        $Series | Add-Member -MemberType NoteProperty -Name 'languageProfileId' -Value 1 -Force
        $Series | Add-Member -MemberType NoteProperty -Name 'seasonFolder' -Value $True -Force
        $Series | Add-Member -MemberType NoteProperty -Name 'monitored' -Value $True -Force
        $Series | Add-Member -MemberType NoteProperty -Name 'rootFolderPath' -Value $Config.RootFolderPath -Force

        if($Search)
        {
            $Series | Add-Member -MemberType NoteProperty -Name 'addOptions' -Value $(
                [PSCustomObject]@{
                    monitor                    = $MonitorOption
                    searchForMissingEpisodes   = $true
                    ignoreEpisodesWithFiles    = $false
                    ignoreEpisodesWithoutFiles = $false
                }
            ) -Force
        }
        else
        {
            $Series | Add-Member -MemberType NoteProperty -Name 'addOptions' -Value $(
                [PSCustomObject]@{
                    monitor                      = $MonitorOption
                    searchForMissingEpisodes     = $false
                    searchForCutoffUnmetEpisodes = $false
                    ignoreEpisodesWithFiles      = $false
                    ignoreEpisodesWithoutFiles   = $false
                }
            ) -Force
        }
    }
    catch
    {
        throw $_
    }
    #EndRegion


    ####################################################################################################
    #Region Define the path, parameters, headers and URI
    try
    {
        $Data = $Series | ConvertTo-Json -Depth 5
        $DataEncoded = ([System.Text.Encoding]::UTF8.GetBytes($Data))

        $Headers = Get-Headers
        $Path = '/series'
        $Uri = Get-APIUri -RestEndpoint $Path
    }
    catch
    {
        throw $_
    }
    #EndRegion


    ####################################################################################################
    #Region make the main request
    Write-Verbose "Adding: $Uri"
    try
    {
        Invoke-RestMethod -Uri $Uri -Headers $Headers -Method Post -ContentType "application/json" -Body $DataEncoded -ErrorAction Stop
    }
    catch
    {
        throw $_
    }
    #EndRegion
}