DDEX Parser - Python Bindings
High-performance DDEX XML parser for Python with built-in security features and comprehensive metadata extraction. Parse DDEX files 10x faster than traditional XML parsers with full support for all DDEX versions and profiles.
Installation
pip install ddex-parser
# or for specific version
pip install ddex-parser==0.4.4
Version Notes
v0.4.4: Enhanced validation - Parser now properly fails on missing required fields instead of using placeholder values. Ensure your error handling can catch ValidationError exceptions for incomplete DDEX files.
v0.4.1: Enhanced data structure implementation with complete data access. Built on v0.4.0's security fixes (RUSTSEC-2025-0020) with PyO3 0.24 compatibility.
Quick Start
from ddex_parser import DDEXParser
import pandas as pd
# Parse DDEX file
parser = DDEXParser()
result = parser.parse_file("release.xml")
# Access parsed data
print(f"Release: {result.release_title}")
print(f"Artist: {result.main_artist}")
print(f"Tracks: {len(result.tracks)}")
# Convert to DataFrame for analysis
tracks_df = result.to_dataframe()
print(tracks_df.head())
Features
🚀 High Performance
- 10x faster than standard XML parsers
- Streaming support for large files (>100MB)
- Memory-efficient processing
- Native Rust implementation with Python bindings
🔒 Security Built-in
- XXE (XML External Entity) attack protection
- Entity expansion limits
- Memory-bounded parsing
- Deep nesting protection
📊 Data Science Ready
- Direct pandas DataFrame export
- Structured metadata extraction
- JSON serialization support
- Type hints for better IDE experience
🎵 Music Industry Focused
- Support for all DDEX versions (3.2, 3.3, 4.0+)
- Release, track, and artist metadata
- Rights and usage information
- Territory and deal terms
- Image and audio resource handling
API Reference
DDEXParser
from ddex_parser import DDEXParser
parser = DDEXParser(
max_entity_expansions=1000, # Limit entity expansions for security
max_depth=100, # Maximum XML nesting depth
streaming=True # Enable streaming for large files
)
Parsing Methods
parse_file(path: str) -> DDEXResult
Parse a DDEX XML file from disk.
result = parser.parse_file("path/to/release.xml")
parse_string(xml: str) -> DDEXResult
Parse DDEX XML from a string.
with open("release.xml", "r") as f:
xml_content = f.read()
result = parser.parse_string(xml_content)
parse_async(path: str) -> Awaitable[DDEXResult]
Asynchronous parsing for non-blocking operations.
import asyncio
async def parse_ddex():
result = await parser.parse_async("release.xml")
return result
# Usage
result = asyncio.run(parse_ddex())
DataFrame Integration
Perfect for data analysis workflows:
import pandas as pd
from ddex_parser import DDEXParser
parser = DDEXParser()
result = parser.parse_file("catalog.xml")
# Get tracks as DataFrame
tracks_df = result.to_dataframe("tracks")
print(tracks_df.columns)
# ['track_id', 'title', 'artist', 'duration', 'isrc', 'genre', ...]
# Analyze your catalog
genre_counts = tracks_df['genre'].value_counts()
avg_duration = tracks_df['duration'].mean()
# Export for further analysis
tracks_df.to_csv("catalog_analysis.csv")
tracks_df.to_parquet("catalog_analysis.parquet")
Performance Benchmarks
Performance comparison on a MacBook Pro M2:
| File Size | ddex-parser | lxml | xml.etree | Speedup |
|---|---|---|---|---|
| 10KB | 0.8ms | 8ms | 12ms | 10x-15x |
| 100KB | 3ms | 45ms | 78ms | 15x-26x |
| 1MB | 28ms | 380ms | 650ms | 13x-23x |
| 10MB | 180ms | 3.2s | 5.8s | 18x-32x |
Memory usage is consistently 60-80% lower than traditional parsers.
Integration with ddex-builder
Round-trip compatibility with ddex-builder for complete workflows:
from ddex_parser import DDEXParser
from ddex_builder import DDEXBuilder
# Parse existing DDEX file
parser = DDEXParser()
original = parser.parse_file("input.xml")
# Modify data
modified_data = original.to_dict()
modified_data['tracks'][0]['title'] = "New Title"
# Build new DDEX file
builder = DDEXBuilder()
new_xml = builder.build_from_dict(modified_data)
# Verify round-trip integrity
new_result = parser.parse_string(new_xml)
assert new_result.tracks[0].title == "New Title"
Requirements
- Python 3.8+
- pandas (optional, for DataFrame support)
- PyO3 0.24 compatible runtime
License
This project is licensed under the MIT License - see the LICENSE file for details.
Related Projects
- ddex-builder - Build deterministic DDEX XML files
- ddex-parser (npm) - JavaScript/TypeScript bindings
- DDEX Suite - Complete DDEX processing toolkit
Built for the music industry. Powered by Rust for maximum performance and safety.
Metadata
Release files for ddex-parser 0.4.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| ddex_parser-0.4.5-cp38-abi3-macosx_11_0_arm64.whl | CPython 3.8 | abi3 | macOS 11.0+ ARM64 | Details for ddex_parser-0.4.5-cp38-abi3-macosx_11_0_arm64.whl |
Release files / ddex_parser-0.4.5-cp38-abi3-macosx_11_0_arm64.whl
| Download URL | ddex_parser-0.4.5-cp38-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 487.9 kB |
| Tags | CPython 3.8 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
5031944c6b3145322aadec9b8cf0ac7bc8a779bd3e755ba4f2c31bcde28a6d12
|
|
BLAKE2b-256 checksum How to use checksums |
510fe73d23eafaa99b7064e3bedbbc40ef9f0bd43d357b7f6a53c31300251d27
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.9.21
|
Security for ddex-parser 0.4.5
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.