Skip to main content

Release Models

Complete documentation of release data structures representing albums, singles, EPs, and other musical releases.

Overview

Release models represent collections of musical content with associated metadata, commercial terms, and technical specifications. They form the primary organizational unit for music distribution.

Release Types

TypeDescriptionTypical Track CountUse Cases
AlbumFull-length album8-20+ tracksMajor releases, LPs
SingleSingle track release1-3 tracksRadio singles, promotional
EPExtended play3-8 tracksIndependent releases
CompilationCollection of tracksVariableGreatest hits, anthologies
SoundtrackFilm/TV soundtrackVariableMedia tie-ins
LiveLive recordingsVariableConcert recordings
RemixRemix collectionVariableDJ releases, special editions

Graph Model

Release Structure

interface ReleaseDescriptor {
ReleaseId: ReleaseId;
ReleaseReference?: ReleaseReference;
ReleaseType: ReleaseType;
ReleaseDetailsByTerritory: ReleaseDetailsByTerritory[];
ResourceGroup?: ResourceGroup[];
ExternalResourceLink?: ExternalResourceLink[];
Synopsis?: Synopsis;
Genre?: Genre[];
SubGenre?: SubGenre[];
ReleaseDate?: EventDate;
Duration?: Duration;
Extensions?: ExtensionData[];
}

ReleaseDetailsByTerritory

The core metadata structure varying by geographic territory:

interface ReleaseDetailsByTerritory {
TerritoryCode: AllTerritoryCode[];
DisplayArtist: ArtistDescriptor[];
LabelName: LabelName[];
Title: TitleDescriptor[];
ReleaseDate?: EventDate;
OriginalReleaseDate?: EventDate;
Genre?: Genre[];
SubGenre?: SubGenre[];
ParentalWarningType?: ParentalWarningType[];
AvRating?: AvRating[];
MarketingComment?: MarketingComment[];
PLineDescriptor?: PLineDescriptor[];
CLineDescriptor?: CLineDescriptor[];
ResourceGroup?: ResourceGroup[];
DisplayArtistName?: string;
Keywords?: Keyword[];
Moods?: Mood[];
BriefSynopsis?: Synopsis;
CatalogNumber?: CatalogNumber;
ICPN?: ICPN;
}

Example Graph Structure

{
ReleaseId: "REL_INDIE_ALBUM_2024_001",
ReleaseType: "Album",
ReleaseDetailsByTerritory: [
{
TerritoryCode: ["Worldwide"],
DisplayArtist: [
{
PartyName: [
{ FullName: "The Indie Band" }
],
ArtistRole: ["MainArtist"]
}
],
LabelName: [
{ Value: "Independent Records" }
],
Title: [
{
TitleText: "Breakthrough Album",
TitleType: "DisplayTitle"
}
],
ReleaseDate: {
Date: "2024-03-15"
},
Genre: [
{ Value: "Alternative Rock" }
],
ParentalWarningType: ["NotExplicit"],
PLineDescriptor: [
{
Year: "2024",
PLineText: "2024 Independent Records"
}
],
CLineDescriptor: [
{
Year: "2024",
CLineText: "© 2024 The Indie Band"
}
],
CatalogNumber: "INDIE2024001"
}
],
ResourceGroup: [
{
ResourceGroup: [
{
ResourceGroupContentItem: [
{
ReleaseResourceReference: "RES_TRACK_001",
LinkedReleaseResourceReference: ["RES_TRACK_002"]
}
]
}
]
}
]
}

Flattened Model

Simplified Release Structure

interface FlatRelease {
releaseId: string;
releaseType: string;
releaseReference?: string;
title: string;
displayTitle?: string;
sortingTitle?: string;
displayArtist: string;
displayArtistName?: string;
labelName: string;
catalogNumber?: string;
upc?: string;
ean?: string;
icpn?: string;
releaseDate: string;
originalReleaseDate?: string;
territory: string;
genre: string;
subGenre?: string;
parentalWarning: boolean;
explicitContent: boolean;
duration: string;
durationSeconds: number;
trackCount: number;
copyrightLine: string;
producerCopyrightLine: string;
marketingComment?: string;
keywords: string[];
moods: string[];
synopsis?: string;
resourceReferences: string[];
artwork?: ArtworkReference[];
contributors: FlatContributor[];
metadata: Record<string, any>;
}

Example Flattened Structure

{
releaseId: "REL_INDIE_ALBUM_2024_001",
releaseType: "Album",
title: "Breakthrough Album",
displayArtist: "The Indie Band",
labelName: "Independent Records",
catalogNumber: "INDIE2024001",
releaseDate: "2024-03-15",
territory: "Worldwide",
genre: "Alternative Rock",
parentalWarning: false,
explicitContent: false,
duration: "PT45M30S",
durationSeconds: 2730,
trackCount: 12,
copyrightLine: "© 2024 The Indie Band",
producerCopyrightLine: "℗ 2024 Independent Records",
keywords: ["indie", "alternative", "rock", "breakthrough"],
moods: ["energetic", "introspective"],
resourceReferences: ["RES_TRACK_001", "RES_TRACK_002", "..."],
contributors: [
{
name: "The Indie Band",
role: "MainArtist",
isPrimary: true
},
{
name: "Producer Name",
role: "Producer",
isPrimary: false
}
],
metadata: {
recordingLocation: "Abbey Road Studios",
recordingYear: "2023",
masteredBy: "Mastering Engineer"
}
}

Title Structures

Title Types

Title TypePurposeExample
DisplayTitlePrimary display title"Breakthrough Album"
SortTitleSorting/alphabetization"Breakthrough Album, The"
SearchTitleSearch optimization"breakthrough album indie band"
SubTitleAdditional context"Deluxe Edition"
AlternativeTitleAlternative names"Das Durchbruch Album"

Multi-language Titles

interface TitleDescriptor {
TitleText: string;
TitleType?: TitleType;
LanguageAndScriptCode?: string;
SubTitle?: string;
PartNumber?: number;
}

// Example: Multi-language release
{
Title: [
{
TitleText: "Breakthrough Album",
TitleType: "DisplayTitle",
LanguageAndScriptCode: "en"
},
{
TitleText: "Das Durchbruch Album",
TitleType: "DisplayTitle",
LanguageAndScriptCode: "de"
},
{
TitleText: "L'Album Révolutionnaire",
TitleType: "DisplayTitle",
LanguageAndScriptCode: "fr"
}
]
}

Artist Descriptors

Artist Roles

RoleDescriptionExample
MainArtistPrimary performing artist"The Beatles"
FeaturedArtistGuest/featured performer"Ed Sheeran"
ComposerMusic composer"John Lennon"
LyricistLyrics writer"Paul McCartney"
ProducerRecord producer"George Martin"
RemixerRemix artist"David Guetta"
ConductorOrchestra conductor"Herbert von Karajan"

Artist Structure

interface ArtistDescriptor {
SequenceNumber?: number;
PartyId?: PartyId[];
PartyName?: PartyName[];
ArtistRole?: ArtistRole[];
DisplayArtist?: DisplayArtist[];
TitleDisplayInformation?: TitleDisplayInformation[];
}

// Example: Complex artist credits
{
DisplayArtist: [
{
PartyName: [{ FullName: "The Indie Band" }],
ArtistRole: ["MainArtist"],
SequenceNumber: 1
},
{
PartyName: [{ FullName: "Famous Singer" }],
ArtistRole: ["FeaturedArtist"],
SequenceNumber: 2
},
{
PartyName: [{ FullName: "Renowned Producer" }],
ArtistRole: ["Producer"],
SequenceNumber: 3
}
]
}

Resource Grouping

Resource Group Structure

interface ResourceGroup {
ResourceGroup?: ResourceGroup[];
ResourceGroupContentItem?: ResourceGroupContentItem[];
DisplayTitleText?: string;
SequenceNumber?: number;
NoDisplaySequence?: boolean;
CarrierType?: CarrierType;
}

interface ResourceGroupContentItem {
SequenceNumber?: number;
ResourceType?: ResourceType;
ReleaseResourceReference?: ReleaseResourceReference;
LinkedReleaseResourceReference?: ReleaseResourceReference[];
DurationUsedFromResource?: Duration;
StartPoint?: StartPoint;
EndPoint?: EndPoint;
}

Grouping Patterns

Album with Multiple Discs

{
ResourceGroup: [
{
DisplayTitleText: "Disc 1",
CarrierType: "CD",
ResourceGroupContentItem: [
{ ReleaseResourceReference: "TRACK_01", SequenceNumber: 1 },
{ ReleaseResourceReference: "TRACK_02", SequenceNumber: 2 },
{ ReleaseResourceReference: "TRACK_03", SequenceNumber: 3 }
]
},
{
DisplayTitleText: "Disc 2",
CarrierType: "CD",
ResourceGroupContentItem: [
{ ReleaseResourceReference: "TRACK_04", SequenceNumber: 1 },
{ ReleaseResourceReference: "TRACK_05", SequenceNumber: 2 }
]
}
]
}

Single with B-sides

{
ResourceGroup: [
{
DisplayTitleText: "Main Track",
ResourceGroupContentItem: [
{ ReleaseResourceReference: "MAIN_SINGLE", SequenceNumber: 1 }
]
},
{
DisplayTitleText: "B-Sides",
ResourceGroupContentItem: [
{ ReleaseResourceReference: "B_SIDE_1", SequenceNumber: 1 },
{ ReleaseResourceReference: "B_SIDE_2", SequenceNumber: 2 }
]
}
]
}

Identifiers and Codes

Standard Release Identifiers

IdentifierTypeFormatExample
UPCUniversal Product Code12 digits123456789012
EANEuropean Article Number13 digits1234567890123
GRidGlobal Release Identifier18 charsA1-2425G-ABC1234002-M
ICPNInternational Cataloguing of Musical WorksVariableICPN12345678

Catalog Numbers

interface CatalogNumber {
Value: string;
Namespace?: string;
}

// Examples
{
CatalogNumber: [
{ Value: "INDIE2024001" }, // Label catalog number
{ Value: "DIST2024001", Namespace: "DIST" }, // Distributor number
{ Value: "UPC123456789012", Namespace: "UPC" } // UPC reference
]
}

Date Handling

Event Dates

interface EventDate {
Date?: string; // YYYY-MM-DD
ApproximateDate?: string; // YYYY or YYYY-MM
IsKnown?: boolean;
LocationOfEvent?: AllTerritoryCode[];
}

// Examples
{
ReleaseDate: { Date: "2024-03-15" }, // Exact date
OriginalReleaseDate: { ApproximateDate: "1969" }, // Year only
RecordingDate: { Date: "2023-08-10", IsKnown: false } // Estimated
}

Date Validation Rules

  • Release Date: Must not be more than 1 year in future
  • Original Release Date: Must be before or equal to current release date
  • Recording Date: Must be before release date
  • Format: ISO 8601 date format (YYYY-MM-DD)

Artwork and Visual Assets

Artwork References

interface ArtworkReference {
artworkType: 'FrontCoverImage' | 'BackCoverImage' | 'BookletImage';
imageId: string;
imageFormat: 'JPEG' | 'PNG' | 'TIFF';
imageResolution: string;
colorDepth: number;
imageSize: {
width: number;
height: number;
};
fileSize: number;
url?: string;
isMain: boolean;
}

// Example flattened artwork
{
artwork: [
{
artworkType: 'FrontCoverImage',
imageId: 'IMG_FRONT_001',
imageFormat: 'JPEG',
imageResolution: '300dpi',
colorDepth: 24,
imageSize: { width: 3000, height: 3000 },
fileSize: 2048576,
isMain: true
}
]
}
interface CLineDescriptor {
Year: string;
CLineText: string;
CLineType?: CLineType;
CLineCompany?: PartyDescriptor;
}

interface PLineDescriptor {
Year: string;
PLineText: string;
PLineType?: PLineType;
PLineCompany?: PartyDescriptor;
}

// Example usage
{
CLineDescriptor: [
{
Year: "2024",
CLineText: "© 2024 The Indie Band. All rights reserved.",
CLineType: "Copyright"
}
],
PLineDescriptor: [
{
Year: "2024",
PLineText: "℗ 2024 Independent Records",
PLineType: "ProducerCopyright"
}
]
}

Release Assembly Patterns

TypeScript Builder Pattern

import { ReleaseBuilder } from 'ddex-builder';

const release = new ReleaseBuilder()
.setReleaseId('REL_INDIE_2024_001')
.setReleaseType('Album')
.setTitle('Breakthrough Album')
.setDisplayArtist('The Indie Band')
.setLabel('Independent Records')
.setCatalogNumber('INDIE2024001')
.setReleaseDate('2024-03-15')
.setGenre('Alternative Rock')
.setTerritory('Worldwide')
.addCopyright('© 2024 The Indie Band')
.addProducerCopyright('℗ 2024 Independent Records')
.addTrack('RES_TRACK_001')
.addTrack('RES_TRACK_002')
.addArtwork({
type: 'FrontCoverImage',
imageId: 'IMG_FRONT_001',
format: 'JPEG',
width: 3000,
height: 3000
})
.build();

Python Builder Pattern

from ddex_builder import ReleaseBuilder

release = ReleaseBuilder() \
.set_release_id('REL_INDIE_2024_001') \
.set_release_type('Album') \
.set_title('Breakthrough Album') \
.set_display_artist('The Indie Band') \
.set_label('Independent Records') \
.set_catalog_number('INDIE2024001') \
.set_release_date('2024-03-15') \
.set_genre('Alternative Rock') \
.set_territory('Worldwide') \
.add_copyright('© 2024 The Indie Band') \
.add_producer_copyright('℗ 2024 Independent Records') \
.add_track('RES_TRACK_001') \
.add_track('RES_TRACK_002') \
.add_artwork(
artwork_type='FrontCoverImage',
image_id='IMG_FRONT_001',
image_format='JPEG',
width=3000,
height=3000
) \
.build()

Validation Rules

Required Fields

Minimum Requirements (All Versions)

  • ReleaseId
  • ReleaseType
  • Title (at least one)
  • DisplayArtist (at least one)
  • Territory specification

Platform-Specific Requirements

PlatformAdditional Required Fields
SpotifyLabel name, release date, genre
Apple MusicUPC, copyright lines, explicit flag
YouTube MusicISRC for all tracks
Amazon MusicCatalog number, product classification

Business Logic Validation

interface ReleaseValidationRule {
field: string;
rule: 'required' | 'format' | 'reference' | 'business';
message: string;
validator: (release: Release) => boolean;
}

const validationRules: ReleaseValidationRule[] = [
{
field: 'releaseDate',
rule: 'business',
message: 'Release date cannot be more than 1 year in future',
validator: (release) => {
const releaseDate = new Date(release.releaseDate);
const oneYearFromNow = new Date();
oneYearFromNow.setFullYear(oneYearFromNow.getFullYear() + 1);
return releaseDate <= oneYearFromNow;
}
},
{
field: 'trackCount',
rule: 'business',
message: 'Album must have at least 8 tracks',
validator: (release) => {
return release.releaseType !== 'Album' || release.trackCount >= 8;
}
}
];

Performance Considerations

Memory Optimization

// Lazy loading for large releases
class LazyRelease {
private _resourceDetails?: Map<string, Resource>;

async getResourceDetails(resourceId: string): Promise<Resource> {
if (!this._resourceDetails) {
this._resourceDetails = await this.loadResourceDetails();
}
return this._resourceDetails.get(resourceId);
}

private async loadResourceDetails(): Promise<Map<string, Resource>> {
// Load resources on demand
return new Map();
}
}

Batch Processing

# Process releases in batches for large catalogs
def process_release_batch(releases: List[dict], batch_size: int = 100):
for i in range(0, len(releases), batch_size):
batch = releases[i:i + batch_size]

# Process batch
processed_releases = []
for release_data in batch:
release = create_release_from_data(release_data)
processed_releases.append(release)

# Yield batch results
yield processed_releases

Best Practices

Release Organization

  1. Consistent Naming: Use consistent release ID patterns
  2. Territory Strategy: Plan territory coverage carefully
  3. Genre Classification: Use standard genre taxonomies
  4. Date Accuracy: Ensure accurate and consistent dates
  5. Rights Information: Include complete copyright information

Multi-Territory Releases

  1. Territory Planning: Consider regional release strategies
  2. Localization: Provide localized titles and descriptions
  3. Rights Management: Ensure territory-specific rights
  4. Date Coordination: Coordinate release dates across territories
  5. Cultural Sensitivity: Consider cultural preferences and restrictions

Metadata Quality

  1. Title Consistency: Maintain consistent title formatting
  2. Artist Credits: Provide complete and accurate artist credits
  3. Genre Accuracy: Use appropriate and specific genres
  4. Artwork Quality: Ensure high-quality artwork assets
  5. Description Completeness: Include comprehensive descriptions and keywords