Public/Add-SonarrSeries.ps1

function Add-SonarrSeries
{
    <#
        .SYNOPSIS
            Add a series to Sonarr by IMDB, TMDB, or TVDB ID.

        .SYNTAX
            Add-SonarrSeries -IMDBID <String> -QualityProfileId <Int32> [-MonitorOption <String>] [-Search] [<CommonParameters>]

            Add-SonarrSeries -TMDBID <String> -QualityProfileId <Int32> [-MonitorOption <String>] [-Search] [<CommonParameters>]

            Add-SonarrSeries -TVDBID <String> -QualityProfileId <Int32> [-MonitorOption <String>] [-Search] [<CommonParameters>]

        .DESCRIPTION
            Adds a series to Sonarr using external database IDs. The function will search for the series using the provided ID,
            then add it to Sonarr with the specified quality profile and monitoring options.

            Note: This function only targets settings for the show as a whole (e.g. quality profile and monitoring new seasons) but
            not individual seasons; for this use Set-SonarrSeasonStatus after adding the series.

        .PARAMETER IMDBID
            The IMDB ID of the series to add. Can include or exclude the 'tt' prefix.

        .PARAMETER TMDBID
            The TMDB (The Movie Database) ID of the series to add.

        .PARAMETER TVDBID
            The TVDB (TheTVDB) ID of the series to add.

        .PARAMETER QualityProfileId
            The ID of the quality profile to assign to the series.

        .PARAMETER MonitorOption
            The monitoring option for the series. Valid values are: 'all', 'firstSeason', 'lastSeason', 'future', 'missing', 'existing', 'recent', 'pilot', 'monitorSpecials', 'unmonitorSpecials', 'none'. Defaults to 'all'.

        .PARAMETER Search
            If specified, initiates a search for missing episodes after adding the series.

        .EXAMPLE
            Add-SonarrSeries -IMDBID 'tt0944947' -QualityProfileId 1 -MonitorOption 'all' -Search

        .EXAMPLE
            Add-SonarrSeries -TVDBID '121361' -QualityProfileId 2 -MonitorOption 'future'

        .NOTES
            The series must exist in the external database (IMDB, TMDB, or TVDB) and be findable through Sonarr's lookup service.
    #>


    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'IMDBID')]
        [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', 'firstSeason', 'lastSeason', 'future', 'missing', 'existing', 'recent', 'pilot', '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($PSCmdlet.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-Verbose -Message "Series already exists in Sonarr with ID $($Series.id)."

            if($Series.qualityProfileId -ne $QualityProfileId)
            {
                Write-Warning -Message "Series already exists but has a different quality profile (Current: $($Series.qualityProfileId), Desired: $QualityProfileId). Use 'Set-SonarrSeriesQualityProfile' to update the quality profile."

            }

            if($Series.monitored -eq $false -and $MonitorOption -ne 'none')
            {
                Write-Warning -Message "Series already exists but is unmonitored. Use 'Set-SonarrSeriesStatus' to change series monitoring status, and 'Set-SonarrSeasonStatus' to change season monitoring status."
            }

            if($Series.monitored -eq $true -and $MonitorOption -eq 'none')
            {
                Write-Warning -Message "Series already exists and is monitored. Use 'Set-SonarrSeriesStatus' to change series monitoring status, and 'Set-SonarrSeasonStatus' to change season monitoring status."
            }

            return $Series
        }
    }
    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($TVDBID)
        {
            $Params = @{
                'TVDBID' = $TVDBID
            }
        }
        elseif($IMDBID)
        {
            $Params = @{
                'IMDBID' = $IMDBID
            }
        }
        elseif($TMDBID)
        {
            $Params = @{
                'TMDBID' = $TMDBID
            }
        }

        $Series = Find-SonarrSeries @Params -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
        Write-Debug -Message "Series data to be posted: $Data"
    }
    catch
    {
        throw $_
    }
    #EndRegion


    ####################################################################################################
    #Region make the main request
    Write-Verbose "Adding series to Sonarr"
    try
    {
        $Result = Invoke-SonarrRequest -Path '/series' -Method POST -Body $Data -ErrorAction Stop
        return $Result
    }
    catch
    {
        throw $_
    }
    #EndRegion
}