Shared Types and Interfaces
Common type definitions used across TypeScript and Python APIs for the DDEX Parser.
Core Configuration Types
DDEXParserOptions / ParseOptions
Parser configuration interface with language-specific variations.
TypeScript
interface DDEXParserOptions {
includeRawExtensions?: boolean;
includeComments?: boolean;
validateReferences?: boolean;
streaming?: boolean;
}
Python
class ParseOptions:
include_raw_extensions: bool = False
include_comments: bool = False
validate_references: bool = True
streaming: bool = False
timeout: float = 30.0
Configuration Properties
Property | Type | Default | Description |
---|---|---|---|
includeRawExtensions / include_raw_extensions | boolean | false | Include raw XML for extension elements |
includeComments / include_comments | boolean | false | Include XML comments in output |
validateReferences / validate_references | boolean | true | Validate resource references |
streaming | boolean | false | Enable streaming mode for large files |
timeout (Python only) | number | 30.0 | Parsing timeout in seconds |
Result Types
ParseResult Structure
The main result object returned by both TypeScript and Python parsers.
TypeScript
interface ParseResult {
graph: MessageGraph;
flat: MessageFlat;
}
Python
class ParseResult:
message_id: str
version: str
release_count: int
releases: List[Dict[str, Any]]
# Internal: _data contains graph/flat structure
Graph vs Flat Representations
Graph Representation
Faithful to the original DDEX XML structure, preserving hierarchy and relationships.
interface MessageGraph {
MessageHeader: {
MessageId: string;
MessageSender: PartyDescriptor;
MessageRecipient: PartyDescriptor;
MessageCreatedDateTime: string;
};
UpdateIndicator: string;
MessageControlType: string;
ReleaseList?: ReleaseDescriptor[];
ResourceList?: ResourceDescriptor[];
DealList?: DealDescriptor[];
}
Flat Representation
Denormalized, analysis-friendly structure with joined data.
interface MessageFlat {
messageInfo: {
messageId: string;
version: string;
sender: string;
recipient: string;
date: string;
};
releases: FlatRelease[];
soundRecordings: FlatSoundRecording[];
dealTerms: FlatDealTerm[];
}
Data Structure Types
Release Types
Graph Release
interface ReleaseDescriptor {
ReleaseId: ReleaseId;
ReleaseType: ReleaseType;
ReleaseReference?: string;
ReleaseDetailsByTerritory: ReleaseDetailsByTerritory[];
ResourceGroup?: ResourceGroup[];
ExternalResourceLink?: ExternalResourceLink[];
}
interface ReleaseDetailsByTerritory {
TerritoryCode: AllTerritoryCode[];
DisplayArtist: ArtistDescriptor[];
LabelName: LabelName[];
Title: TitleDescriptor[];
ReleaseDate?: EventDate;
Genre?: Genre[];
PLineDescriptor?: PLineDescriptor[];
CLineDescriptor?: CLineDescriptor[];
}
Flat Release
interface FlatRelease {
releaseId: string;
releaseType: string;
title: string;
displayArtist: string;
labelName: string;
releaseDate: string;
territory: string;
genre?: string;
catalogNumber?: string;
upc?: string;
pLine?: string;
cLine?: string;
trackCount: number;
totalDuration: number;
}
Sound Recording Types
Graph Sound Recording
interface SoundRecordingDescriptor {
SoundRecordingId: SoundRecordingId;
SoundRecordingType: SoundRecordingType;
SoundRecordingDetailsByTerritory: SoundRecordingDetailsByTerritory[];
MusicalWorkContained?: MusicalWork[];
}
interface SoundRecordingDetailsByTerritory {
TerritoryCode: AllTerritoryCode[];
Title: TitleDescriptor[];
DisplayArtist: ArtistDescriptor[];
LabelName?: LabelName[];
ISRC?: ISRC;
Duration?: Duration;
Genre?: Genre[];
TrackNumber?: number;
VolumeNumber?: number;
}
Flat Sound Recording
interface FlatSoundRecording {
soundRecordingId: string;
isrc: string;
title: string;
displayArtist: string;
duration: string;
durationSeconds: number;
trackNumber?: number;
volumeNumber?: number;
genre?: string;
territory: string;
contributors: FlatContributor[];
}
Deal Types
Graph Deal
interface DealDescriptor {
DealId: DealId;
DealType: DealType;
CommercialModelType: CommercialModelType[];
Usage: Usage[];
DealTerms: DealTerms;
DealReleaseReference: DealReleaseReference[];
}
interface DealTerms {
CommercialModelType: CommercialModelType[];
ValidityPeriod?: Period;
TerritoryCode?: AllTerritoryCode[];
DistributionChannel?: DistributionChannel[];
PriceInformation?: PriceInformation[];
}
Flat Deal Term
interface FlatDealTerm {
dealId: string;
dealType: string;
commercialModelType: string;
territory: string;
distributionChannel: string;
validFrom?: string;
validUntil?: string;
currency?: string;
priceType?: string;
wholeSalePrice?: number;
consumerPrice?: number;
releaseIds: string[];
}
Identifier Types
Standard Identifiers
// DDEX Standard Identifiers
type ISRC = string; // International Standard Recording Code
type ISWC = string; // International Standard Musical Work Code
type UPC = string; // Universal Product Code
type EAN = string; // European Article Number
type GRid = string; // Global Release Identifier
type SICI = string; // Serial Item and Contribution Identifier
// Party Identifiers
type DPID = string; // DDEX Party Identifier
type ISNI = string; // International Standard Name Identifier
type IPI = string; // Interested Parties Information
// Custom Identifiers
interface ProprietaryId {
Namespace: string;
Value: string;
}
ID Types by Context
type ReleaseId = string | ProprietaryId;
type SoundRecordingId = string | ProprietaryId;
type MusicalWorkId = string | ProprietaryId;
type DealId = string | ProprietaryId;
type PartyId = string | ProprietaryId;
Geographic and Territory Types
Territory Codes
// ISO 3166-1 alpha-2 country codes
type TerritoryCode = 'US' | 'GB' | 'DE' | 'FR' | 'JP' | 'CA' | 'AU' | /* ... */;
// Special territory designations
type SpecialTerritory = 'Worldwide' | 'Europe' | 'NorthAmerica' | 'AsiaPacific';
type AllTerritoryCode = TerritoryCode | SpecialTerritory;
Territory Exclusions
interface TerritoryScope {
IncludedTerritoryCode?: AllTerritoryCode[];
ExcludedTerritoryCode?: AllTerritoryCode[];
}
Temporal Types
Dates and Periods
// ISO 8601 date formats
type Date = string; // YYYY-MM-DD
type DateTime = string; // YYYY-MM-DDTHH:mm:ssZ
type PartialDate = string; // YYYY or YYYY-MM
interface EventDate {
Date?: Date;
ApproximateDate?: PartialDate;
}
interface Period {
StartDate?: EventDate;
EndDate?: EventDate;
}
Duration Types
// ISO 8601 duration format: PT[hours]H[minutes]M[seconds]S
type Duration = string; // e.g., "PT3M45S" for 3:45
interface DurationInfo {
duration: Duration;
durationSeconds: number; // Converted to seconds for calculations
}
Commercial Types
Deal and Usage Types
type DealType = 'License' | 'Assignment' | 'UserDefined';
type CommercialModelType =
| 'SubscriptionModel'
| 'DownloadModel'
| 'StreamingModel'
| 'PhysicalModel'
| 'UserDefined';
type Usage =
| 'OnDemandStream'
| 'NonInteractiveStream'
| 'PermanentDownload'
| 'ConditionalDownload'
| 'PhysicalDistribution'
| 'UserDefined';
type DistributionChannel =
| 'Internet'
| 'Mobile'
| 'Satellite'
| 'PhysicalDistribution'
| 'UserDefined';
Price Information
interface PriceInformation {
PriceType: 'WholesalePrice' | 'ConsumerPrice' | 'SuggestedRetailPrice';
CurrencyCode: string; // ISO 4217 currency code
PriceAmount: number;
}
Artist and Contributor Types
Artist Descriptors
interface ArtistDescriptor {
PartyId?: PartyId[];
PartyName?: PartyName[];
ArtistRole?: ArtistRole[];
}
interface PartyName {
FullName: string;
FullNameAsciiTranscribed?: string;
FullNameIndexed?: string;
NamesBeforeKeyName?: string;
KeyName?: string;
NamesAfterKeyName?: string;
}
type ArtistRole =
| 'MainArtist'
| 'FeaturedArtist'
| 'Remixer'
| 'Producer'
| 'Composer'
| 'Lyricist'
| 'UserDefined';
Flat Contributor
interface FlatContributor {
name: string;
role: string;
partyId?: string;
isPrimary: boolean;
}
Technical Types
Resource Types
type ResourceType =
| 'SoundRecording'
| 'MusicalWork'
| 'Video'
| 'Image'
| 'Text'
| 'Software'
| 'UserDefined';
type SoundRecordingType =
| 'MusicalWorkSoundRecording'
| 'NonMusicalWorkSoundRecording'
| 'UserDefined';
type ReleaseType =
| 'Album'
| 'Single'
| 'EP'
| 'Compilation'
| 'Soundtrack'
| 'UserDefined';
File and Technical Data
interface TechnicalDetails {
Duration?: Duration;
BitRate?: number;
SampleRate?: number;
NumberOfChannels?: number;
BitsPerSample?: number;
FileFormat?: string;
FileSize?: number;
FingerPrint?: FingerPrint[];
}
interface FingerPrint {
Algorithm: string;
Parameter?: string;
DataType?: string;
Value: string;
}
Validation and Error Types
Validation Results
interface ValidationResult {
isValid: boolean;
version: string;
errors: ValidationError[];
warnings: ValidationWarning[];
}
interface ValidationError {
code: string;
message: string;
line?: number;
column?: number;
xpath?: string;
}
interface ValidationWarning {
code: string;
message: string;
suggestion?: string;
}
Streaming Types
interface StreamingProgress {
bytesProcessed: number;
elementsProcessed: number;
estimatedTotal?: number;
percentComplete?: number;
elapsedMs: number;
}
interface StreamingOptions {
chunkSize?: number;
maxMemoryMB?: number;
bufferSize?: number;
}
Version-Specific Variations
ERN 3.8.2 Differences
- Limited territory support
- Simplified deal structures
- Different namespace URIs
ERN 4.2 Differences
- Enhanced metadata support
- Additional resource types
- Extended commercial model types
ERN 4.3 Features
- Full streaming deal support
- Enhanced artist roles
- Improved territory handling
- Additional identifier types
Version Detection
type DDEXVersion = '3.8.2' | '4.2' | '4.3' | 'Unknown';
interface VersionInfo {
version: DDEXVersion;
namespace: string;
profile?: string;
detectedFeatures: string[];
}
Utility Types
Optional and Required Variants
// Make all properties optional for partial updates
type PartialRelease = Partial<FlatRelease>;
// Make specific properties required
type RequiredRelease = Required<Pick<FlatRelease, 'releaseId' | 'title' | 'displayArtist'>>;
// Combine with optional properties
type CreateReleaseRequest = RequiredRelease & Partial<FlatRelease>;
Array and Collection Types
type ReleaseCollection = FlatRelease[];
type SoundRecordingCollection = FlatSoundRecording[];
type DealTermCollection = FlatDealTerm[];
// Lookup maps
type ReleaseMap = Record<string, FlatRelease>;
type SoundRecordingMap = Record<string, FlatSoundRecording>;
Filter and Query Types
interface ReleaseFilter {
artist?: string;
genre?: string;
territory?: string;
releaseDateFrom?: string;
releaseDateTo?: string;
labelName?: string;
}
interface SoundRecordingFilter {
isrc?: string;
title?: string;
artist?: string;
durationMin?: number;
durationMax?: number;
genre?: string;
}