Platform Presets
Complete reference for industry platform presets in the DDEX Builder.
Overview
The DDEX Builder now uses a simplified, transparent preset system that focuses on public specifications and extensible frameworks. This approach ensures honesty, maintainability, and legal safety while providing valuable preset functionality.
Available Presets
YouTube Presets (Public Specification)
Preset | Type | Profile | DDEX Version | Specification |
---|---|---|---|---|
youtube_album | Album | Content ID | ERN 4.3 | YouTube Public DDEX Spec |
youtube_single | Single | Content ID | ERN 4.3 | YouTube Public DDEX Spec |
youtube_video | Video | Content ID | ERN 4.3 | YouTube Public DDEX Spec |
Generic DDEX-Compliant Presets
Preset | Type | Profile | DDEX Version | Specification |
---|---|---|---|---|
generic_audio_album | Audio Album | Universal | ERN 4.3 | DDEX Standard |
generic_audio_single | Audio Single | Universal | ERN 4.3 | DDEX Standard |
generic_video_single | Video Single | Universal | ERN 4.3 | DDEX Standard |
generic_compilation | Compilation | Universal | ERN 4.3 | DDEX Standard |
Spotify Preset
Configuration
// TypeScript
builder.applyPreset('spotify');
// Python
builder.apply_preset('spotify')
Requirements
Required Fields
Field | Level | Notes |
---|---|---|
Release ID | Release | Must be unique within message |
Title | Release | Max 100 characters |
Artist | Release | Primary artist only |
Label | Release | Record label name required |
UPC | Release | Valid UPC-A format |
Release Date | Release | ISO 8601 format (YYYY-MM-DD) |
Genre | Release | From Spotify genre list |
ISRC | Resource | Valid ISRC format |
Duration | Resource | ISO 8601 duration (PT3M45S) |
Track Number | Resource | Sequential numbering |
Validation Rules
{
"release_title": {
"type": "length",
"max": 100,
"message": "Release title cannot exceed 100 characters"
},
"upc": {
"type": "format",
"pattern": "^\\d{12}$",
"message": "UPC must be 12 digits"
},
"isrc": {
"type": "format",
"pattern": "^[A-Z]{2}[A-Z0-9]{3}\\d{7}$",
"message": "Invalid ISRC format"
},
"genre": {
"type": "enum",
"values": ["Pop", "Rock", "Hip-Hop", "Electronic", "Country", "..."],
"message": "Genre must be from Spotify approved list"
}
}
Commercial Model
- Primary Model: Subscription Streaming
- Secondary Models: Ad-supported streaming
- Territories: Worldwide (excluding embargoed territories)
- Distribution Channel: Internet streaming
Example Usage
import { DdexBuilder } from 'ddex-builder';
const builder = new DdexBuilder();
builder.applyPreset('spotify');
const release = {
releaseId: 'SPT_REL_001',
releaseType: 'Album',
title: 'My Streaming Album',
artist: 'Artist Name',
label: 'Independent Records',
upc: '123456789012',
releaseDate: '2024-03-15',
genre: 'Pop',
trackIds: ['SPT_TRK_001', 'SPT_TRK_002']
};
builder.addRelease(release);
const xml = await builder.build();
from ddex_builder import DdexBuilder
builder = DdexBuilder()
builder.apply_preset('spotify')
release = {
'release_id': 'SPT_REL_001',
'release_type': 'Album',
'title': 'My Streaming Album',
'artist': 'Artist Name',
'label': 'Independent Records',
'upc': '123456789012',
'release_date': '2024-03-15',
'genre': 'Pop',
'track_ids': ['SPT_TRK_001', 'SPT_TRK_002']
}
builder.add_release(release)
xml = await builder.build()
Apple Music Preset
Configuration
// TypeScript
builder.applyPreset('apple_music');
// Python
builder.apply_preset('apple_music')
Requirements
Required Fields
Field | Level | Notes |
---|---|---|
Release ID | Release | iTunes-compatible format |
Title | Release | Support for international characters |
Artist | Release | Support for featured artists |
Label | Release | Record label required |
UPC | Release | EAN-13 or UPC-A |
Release Date | Release | Must not be future date |
Genre | Release | iTunes genre taxonomy |
Copyright | Release | Copyright line required |
Producer Copyright | Release | P-line required |
ISRC | Resource | Mandatory for all tracks |
Duration | Resource | Accurate to milliseconds |
Special Requirements
- Artwork: High-resolution artwork specifications
- Preview: Preview start time and duration
- Explicit Content: Explicit content flagging required
- Featured Artists: Proper featured artist handling
- Multi-language: Support for multiple language metadata
Commercial Models
- Primary: Permanent Download
- Secondary: Subscription Streaming
- Territories: Worldwide iTunes Store presence
- Price Tiers: Standard iTunes pricing structure
Example Usage
const builder = new DdexBuilder();
builder.applyPreset('apple_music');
const release = {
releaseId: 'ITMS_REL_001',
releaseType: 'Album',
title: 'iTunes Album',
artist: 'Artist Name',
label: 'Major Label Records',
upc: '1234567890123',
releaseDate: '2024-03-15',
genre: 'Alternative',
parentalWarning: false,
copyrightLine: '© 2024 Major Label Records',
producerCopyrightLine: '℗ 2024 Major Label Records',
trackIds: ['ITMS_TRK_001', 'ITMS_TRK_002']
};
builder.addRelease(release);
YouTube Music Preset
Configuration
// TypeScript
builder.applyPreset('youtube_music');
// Python
builder.apply_preset('youtube_music')
Requirements
Required Fields
Field | Level | Notes |
---|---|---|
Release ID | Release | YouTube Content ID compatible |
Title | Release | Must match video content |
Artist | Release | Channel/artist verification |
ISRC | Resource | Required for Content ID |
Duration | Resource | Must match audio duration |
Territory Rights | Deal | Detailed territory mapping |
Content Type | Resource | Audio/Video classification |
Content ID Requirements
- Audio Fingerprinting: Support for Content ID fingerprinting
- Reference Files: High-quality reference audio required
- Territory Mapping: Detailed geographic rights specification
- Ownership Claims: Clear ownership and rights information
- Monetization: Monetization policy specification
Commercial Models
- Primary: Ad-supported streaming
- Secondary: YouTube Premium subscription
- Territories: Based on Content ID availability
- Rights: Performance and synchronization rights
Example Usage
const builder = new DdexBuilder();
builder.applyPreset('youtube_music');
const release = {
releaseId: 'YTM_REL_001',
releaseType: 'Single',
title: 'YouTube Hit Single',
artist: 'Content Creator',
label: 'Creator Network',
releaseDate: '2024-03-15',
genre: 'Electronic',
contentType: 'Audio',
trackIds: ['YTM_TRK_001']
};
const deal = {
dealId: 'YTM_DEAL_001',
dealType: 'License',
commercialModelType: 'AdSupportedModel',
territory: 'Worldwide',
distributionChannel: 'Internet',
monetizationPolicy: 'Monetize',
releaseReferences: ['YTM_REL_001']
};
builder.addRelease(release);
builder.addDeal(deal);
Amazon Music Preset
Configuration
// TypeScript
builder.applyPreset('amazon_music');
// Python
builder.apply_preset('amazon_music')
Requirements
Required Fields
Field | Level | Notes |
---|---|---|
Release ID | Release | Amazon ASIN compatible |
Title | Release | Amazon catalog standards |
Artist | Release | Artist name verification |
Label | Release | Label registration required |
UPC | Release | Amazon barcode standards |
Release Date | Release | Amazon release calendar |
Genre | Release | Amazon music categories |
ISRC | Resource | Global ISRC database |
Product Type | Release | Physical/Digital classification |
Amazon-Specific Requirements
- Product Classification: Proper Amazon product categorization
- Search Keywords: SEO-optimized metadata
- Brand Registry: Trademark and brand compliance
- Regional Availability: Territory-specific availability
- Pricing Strategy: Amazon pricing tier compatibility
Commercial Models
- Primary: Unlimited Streaming (Amazon Music Unlimited)
- Secondary: Prime Music inclusion
- Tertiary: Purchase downloads
- Territories: Amazon Music service areas
Example Usage
const builder = new DdexBuilder();
builder.applyPreset('amazon_music');
const release = {
releaseId: 'AMZ_REL_001',
releaseType: 'Album',
title: 'Amazon Music Album',
artist: 'Professional Artist',
label: 'Established Records',
upc: '123456789012',
releaseDate: '2024-03-15',
genre: 'Country',
productType: 'DigitalAlbum',
searchKeywords: ['country', 'acoustic', 'folk'],
trackIds: ['AMZ_TRK_001', 'AMZ_TRK_002']
};
builder.addRelease(release);
Universal Preset
Configuration
// TypeScript
builder.applyPreset('universal');
// Python
builder.apply_preset('universal')
Purpose
The universal preset provides a generic configuration suitable for most streaming platforms and digital distributors. It includes common requirements and best practices without platform-specific restrictions.
Requirements
Core Fields
Field | Level | Required | Notes |
---|---|---|---|
Release ID | Release | ✓ | Unique identifier |
Title | Release | ✓ | No length restrictions |
Artist | Release | ✓ | Primary artist |
Release Date | Release | ○ | Recommended |
Genre | Release | ○ | Standard genres |
ISRC | Resource | ○ | Recommended |
Duration | Resource | ○ | For audio content |
Flexible Requirements
- Minimal Validation: Basic structure validation only
- Format Flexibility: Accepts various identifier formats
- Genre Freedom: No restricted genre lists
- Territory Neutral: No territory restrictions
- Commercial Agnostic: Works with any commercial model
Example Usage
const builder = new DdexBuilder();
builder.applyPreset('universal');
const release = {
releaseId: 'UNI_REL_001',
releaseType: 'Album',
title: 'Universal Release',
artist: 'Any Artist',
label: 'Any Label',
releaseDate: '2024-03-15',
genre: 'World Music',
trackIds: ['UNI_TRK_001']
};
builder.addRelease(release);
Preset Comparison
Field Requirements Matrix
Field | Spotify | Apple Music | YouTube Music | Amazon Music | Universal |
---|---|---|---|---|---|
Release ID | ✓ | ✓ | ✓ | ✓ | ✓ |
Title | ✓ | ✓ | ✓ | ✓ | ✓ |
Artist | ✓ | ✓ | ✓ | ✓ | ✓ |
Label | ✓ | ✓ | ○ | ✓ | ○ |
UPC | ✓ | ✓ | ○ | ✓ | ○ |
Release Date | ✓ | ✓ | ✓ | ✓ | ○ |
Genre | ✓ | ✓ | ✓ | ✓ | ○ |
ISRC | ✓ | ✓ | ✓ | ✓ | ○ |
Duration | ✓ | ✓ | ✓ | ○ | ○ |
Copyright | ○ | ✓ | ○ | ○ | ○ |
Explicit Flag | ○ | ✓ | ○ | ○ | ○ |
Validation Strictness
Preset | Structure | Format | Business Rules | Custom Rules |
---|---|---|---|---|
Spotify | Strict | Strict | Strict | Platform-specific |
Apple Music | Strict | Strict | Strict | iTunes-specific |
YouTube Music | Medium | Medium | Medium | Content ID-specific |
Amazon Music | Strict | Strict | Medium | Amazon-specific |
Universal | Basic | Flexible | Minimal | None |
Custom Preset Creation
Defining Custom Rules
// TypeScript
import { DdexBuilder, ValidationRule } from 'ddex-builder';
const customRules: ValidationRule[] = [
{
fieldName: 'title',
ruleType: 'length',
message: 'Title must be between 1 and 50 characters',
parameters: { min: '1', max: '50' }
},
{
fieldName: 'genre',
ruleType: 'enum',
message: 'Genre must be from approved list',
parameters: { values: 'Pop,Rock,Electronic' }
}
];
const builder = new DdexBuilder();
builder.applyCustomRules(customRules);
# Python
from ddex_builder import DdexBuilder, ValidationRule
custom_rules = [
ValidationRule(
field_name='title',
rule_type='length',
message='Title must be between 1 and 50 characters',
parameters={'min': '1', 'max': '50'}
),
ValidationRule(
field_name='genre',
rule_type='enum',
message='Genre must be from approved list',
parameters={'values': 'Pop,Rock,Electronic'}
)
]
builder = DdexBuilder()
builder.apply_custom_rules(custom_rules)
Preset Inheritance
// Start with universal preset and add custom rules
const builder = new DdexBuilder();
builder.applyPreset('universal');
// Add platform-specific requirements
builder.addValidationRule({
fieldName: 'label',
ruleType: 'required',
message: 'Label is required for our platform'
});
// Override existing rules
builder.overrideValidationRule('title', {
fieldName: 'title',
ruleType: 'length',
message: 'Title must be under 80 characters',
parameters: { max: '80' }
});
Preset Best Practices
Choosing the Right Preset
- Single Platform: Use specific preset (spotify, apple_music, etc.)
- Multiple Platforms: Start with universal, add platform-specific validation
- Development/Testing: Use universal for flexibility
- Production: Use specific presets for compliance
Preset Workflow
// Development phase
builder.applyPreset('universal');
// ... build and test
// Platform-specific validation
const spotifyBuilder = new DdexBuilder();
spotifyBuilder.applyPreset('spotify');
const validation = await spotifyBuilder.validate();
// Production build
if (validation.isValid) {
const xml = await spotifyBuilder.build();
}
Error Handling
try {
builder.applyPreset('spotify');
const xml = await builder.build();
} catch (error) {
if (error.message.includes('Validation failed')) {
// Check specific preset requirements
const presetInfo = builder.getPresetInfo('spotify');
console.log('Required fields:', presetInfo.requiredFields);
// Get detailed validation results
const validation = await builder.validate();
validation.errors.forEach(err => console.error(err));
}
}
Platform-Specific Notes
Spotify Considerations
- Genre Mapping: Use Spotify's official genre taxonomy
- Featured Artists: Include featured artists in title
- Release Types: Distinguish between Album, Single, EP
- Territory Rights: Specify streaming territories clearly
Apple Music Considerations
- Artwork Standards: 3000x3000px minimum resolution
- Preview Points: Specify preview start times
- Language Support: Provide localized metadata
- Price Tiers: Align with iTunes pricing structure
YouTube Music Considerations
- Content ID: Ensure Content ID compatibility
- Rights Management: Detailed ownership information
- Territory Mapping: Granular geographic rights
- Reference Quality: High-quality reference files
Amazon Music Considerations
- Product Types: Classify as Single, Album, etc.
- Search Optimization: Include relevant keywords
- Brand Compliance: Follow Amazon brand guidelines
- Regional Variations: Account for regional Amazon stores
This preset system ensures platform-specific compliance while maintaining flexibility for custom requirements and multi-platform distribution strategies.