Public/Add-PlexLabel.ps1

function Add-PlexLabel
{
    <#
        .SYNOPSIS
            Adds a label to a Plex item (movie, show, or album).
        .DESCRIPTION
            Labels attached on movies, shows or albums are useful when sharing
            library content with others; you can choose to only show items with
            specific labels, or to hide items with specific labels.
        .PARAMETER Id
            Id of the item to add the label to.
        .PARAMETER Label
            The label to add.
        .EXAMPLE
            Add-PlexLabel -Id 12345 -Label 'FLAC'
        .NOTES
            Only movies, shows and albums support labels.
    #>


    [CmdletBinding(SupportsShouldProcess)]
    param(
        [Parameter(Mandatory = $true)]
        [String]
        $Id,

        [Parameter(Mandatory = $true)]
        [String]
        $Label
    )

    #############################################################################
    #Region Import Plex Configuration
    if(!$script:PlexConfigData)
    {
        try
        {
            Import-PlexConfiguration -WhatIf:$False
        }
        catch
        {
            throw $_
        }
    }
    #EndRegion

    #############################################################################
    #Region Get the item
    try
    {
        $Item = Get-PlexItem -Id $Id
    }
    catch
    {
        throw $_
    }
    #EndRegion

    #############################################################################
    #Region Simple checks:
    # If the item already has this label:
    if($Item.Label.Tag -contains $Label)
    {
        Write-Verbose -Message "Item already has label '$Label'"
        return
    }
    #EndRegion

    #############################################################################
    # Get the type id/value for this item:
    $Type = Get-PlexItemTypeId -Type $Item.Type

    #############################################################################
    #Region Construct Uri
    try
    {
        $Params = [Ordered]@{
            id                   = $Item.ratingKey
            type                 = $Type
            includeExternalMedia = 1
        }
        # Combine existing labels (if there are any, force casting to an array)
        # and the user specified label. Append to params.
        # Format: &label[0].tag.tag=MyLabel&label[1].tag.tag=AnotherLabel
        $Index = 0
        foreach($String in ([Array]$Item.Label.Tag + $Label))
        {
            $Params.Add("label[$($Index)].tag.tag", $String)
            $Index++
        }
        $DataUri = Get-PlexAPIUri -RestEndpoint "$($Item.librarySectionKey)/all" -Params $Params
    }
    catch
    {
        throw $_
    }
    #EndRegion

    #############################################################################
    #Region Make request
    if($PSCmdlet.ShouldProcess($Item.title, "Add label '$Label'"))
    {
        Write-Verbose -Message "Adding label '$Label' to item '$($Item.title)'"
        try
        {
            Invoke-RestMethod -Uri $DataUri -Method PUT
        }
        catch
        {
            throw $_
        }
    }
    #EndRegion
}