Skip to main content

Party Models

Party models represent individuals and organizations involved in music rights, including artists, labels, publishers, and other stakeholders.

Core Types​

Party​

Represents any individual or organization:

interface Party {
partyId: string;
partyName: PartyName;
partyType?: PartyType;
roles?: PartyRole[];
contactInformation?: ContactInformation[];
identifiers?: PartyIdentifier[];
}

PartyName​

Structured name information:

interface PartyName {
fullName: string;
fullNameAsciiTranscribed?: string;
namesBeforeKeyName?: string[];
keyName?: string;
namesAfterKeyName?: string[];
}

PartyType​

Classification of party entities:

enum PartyType {
Person = 'Person',
Organisation = 'Organisation',
Character = 'Character'
}

Roles and Relationships​

PartyRole​

Defines the party's function in the context:

interface PartyRole {
role: RoleType;
instrumentType?: string[];
contributorRole?: ContributorRole;
}

Common Role Types​

  • MainArtist - Primary performing artist
  • FeaturedArtist - Guest or featured performer
  • Producer - Record producer
  • Composer - Musical composition author
  • Lyricist - Lyrics author
  • Publisher - Music publisher
  • RecordLabel - Record label/distributor
  • RightsController - Rights administrator

Contact Information​

ContactInformation​

Contact details for parties:

interface ContactInformation {
emailAddress?: string[];
telephoneNumber?: string[];
webPage?: string[];
physicalAddress?: Address[];
}

Address​

Physical address information:

interface Address {
streetAddress?: string[];
city?: string;
postalCode?: string;
territoryCode?: string;
}

Identifiers​

PartyIdentifier​

External identification systems:

interface PartyIdentifier {
value: string;
namespace: string;
isDPID?: boolean; // Interested Party ID
isISNI?: boolean; // International Standard Name Identifier
}

Usage Examples​

Accessing Party Data​

const result = await parser.parse(xmlContent);

// Access all parties
const parties = result.flat.parties;

// Find artists
const artists = parties.filter(party =>
party.roles?.some(role =>
['MainArtist', 'FeaturedArtist'].includes(role.role)
)
);

// Find labels
const labels = parties.filter(party =>
party.roles?.some(role => role.role === 'RecordLabel')
);

// Get artist names
artists.forEach(artist => {
console.log(artist.partyName.fullName);
});

Building Party Data​

const buildRequest = {
parties: [{
partyId: 'P123456789',
partyName: {
fullName: 'Example Artist',
fullNameAsciiTranscribed: 'Example Artist'
},
partyType: 'Person',
roles: [{
role: 'MainArtist'
}],
identifiers: [{
value: '123456789',
namespace: 'ISNI',
isISNI: true
}],
contactInformation: [{
emailAddress: ['[email protected]'],
webPage: ['https://example-artist.com']
}]
}]
};

Working with Contributors​

Contributors are parties with specific roles in resource creation:

// Access sound recording contributors
const recording = result.flat.resources.soundRecordings[0];
const contributors = recording.contributors || [];

// Group by role
const groupedContributors = contributors.reduce((acc, contributor) => {
const role = contributor.role;
if (!acc[role]) acc[role] = [];
acc[role].push(contributor);
return acc;
}, {} as Record<string, Contributor[]>);

console.log('Producers:', groupedContributors.Producer?.map(p => p.partyName.fullName));
console.log('Artists:', groupedContributors.MainArtist?.map(p => p.partyName.fullName));

Rights and Ownership​

Parties can have different rights relationships:

// Rights controllers for a resource
const rightsControllers = recording.rightsController || [];

// Master rights owner
const masterOwner = rightsControllers.find(party =>
party.roles?.some(role => role.role === 'RightsController')
);

// Publishing rights
const publisher = parties.find(party =>
party.roles?.some(role => role.role === 'Publisher')
);

See Also​