private/Find-ParameterFromPropertyName.ps1

function Find-ParameterFromPropertyName {
    <#
    .DESCRIPTION
        Returns the AtomicParsley parameter name based on the iTunes metadata property name.

    .OUTPUTS
        String. The AtomicParsley parameter name.

    .PARAMETER PropertyName
        REQUIRED. String. Alias: -n. A valid iTunes metadata property name.

    .EXAMPLE
        Find-ParameterFromPropertyName -PropertyName 'title'

    .NOTES
        If the property name is not found in the list of known iTunes metadata property names
        the function will return the property name as is, and it will be added to the media
        file as a custom property. In this case, the property name should be in the reverseDNS
        format (for example, 'com.myApp;myProperty').
    #>

    [OutputType([String])]
    [CmdletBinding()]
    param (
        [Parameter(Mandatory,ValueFromPipeline)] [Alias('n')] [String] $PropertyName,
        [Parameter()]                            [Alias('d')] [Switch] $IncludeDataType
    )

    process {

        Write-Msg -FunctionCall -IncludeParameters

        $atom = $Script:AP_ATOMS | Where-Object { $_.PropertyName -eq $PropertyName }
        
        if ( [String]::IsNullOrEmpty($atom) ) {
            Write-Msg -d -il 1 -m $( 'Custom Atom Found: {0}' -f $PropertyName )
            $type = 'string'
            $nameParts = $PropertyName -Split ';'
            if ( $nameParts.count -eq 2 ) {
                $name = 'name={0} domain={1}' -f $nameParts[1], $nameParts[0]
            }
            else {
                $name = 'name={0} domain={1}' -f $nameParts[0], $env:PS_ATOMICPARSLEY_DEFAULTDOMAIN
            }
        }
        else {
            Write-Msg -d -il 1 -m $( 'Known Atom Found: {0}' -f $PropertyName )
            if ( $atom.WriteSupported ) {
                $type = $atom.DataType
                if ( [String]::IsNullOrEmpty($atom.ParameterName) ) {
                    $name = 'name={0} domain={1}' -f $atom.AtomID, $atom.AtomDomain
                }
                else {
                    $name = $atom.ParameterName
                }
            }
            else {
                Write-Msg -d -il 2 -m $( 'Writing of this atom not supported: {0}' -f $PropertyName )
                $name = $atom.PropertyName
                $type = 'WriteNotSupported'
            }

        }

        Write-Msg -d -il 1 -m $( 'Property: {0} => Parameter: {1}' -f $PropertyName, $($name ?? '<Not Found>') )
        Write-Msg -d -il 1 -m $( 'DataType: {0}' -f $type )

        if ( $IncludeDataType ) { 
            Write-Msg -FunctionResult -m $( 'Property Data: ' ) -o @{ name = $name; type = $type }
            return $name,$type 
        } else { 
            Write-Msg -FunctionResult -m $( 'Property Name: {0}' -f $name  )
            return $name 
        }

    }

}