[{"data":1,"prerenderedAt":8126},["ShallowReactive",2],{"navigation":3,"/blog/music-data/building-a-claude-skill-for-ddex-validation-music-metadata-post":734,"/blog/music-data/building-a-claude-skill-for-ddex-validation-music-metadata-surround":2180,"/blog/music-data/building-a-claude-skill-for-ddex-validation-music-metadata-related":2185},[4,70,207,312,721],{"title":5,"path":6,"stem":7,"children":8,"page":69},"Case Study","/blog/case-study","blog/case-study",[9,13,17,21,25,29,33,37,41,45,49,53,57,61,65],{"title":10,"path":11,"stem":12},"Ambistream – Multi-Layer Streaming Platform","/blog/case-study/ambistream-building-a-multi-layer-streaming-platform-from-a-spark-of-an-idea","blog/case-study/ambistream-building-a-multi-layer-streaming-platform-from-a-spark-of-an-idea",{"title":14,"path":15,"stem":16},"Custom Chromecast & AirPlay Casting App","/blog/case-study/chromecast-airplay-casting-app-case-study","blog/case-study/chromecast-airplay-casting-app-case-study",{"title":18,"path":19,"stem":20},"Direct Music Licensing Platform Case Study","/blog/case-study/dlm-music-catalog-case-study","blog/case-study/dlm-music-catalog-case-study",{"title":22,"path":23,"stem":24},"Assembly Instructions App - Galeco Mobile App","/blog/case-study/galeco-mobile-app-case-study","blog/case-study/galeco-mobile-app-case-study",{"title":26,"path":27,"stem":28},"MemoSonic: Building an Audio Memory Game","/blog/case-study/how-we-built-memosonic-accessible-audio-memory-game-flutter","blog/case-study/how-we-built-memosonic-accessible-audio-memory-game-flutter",{"title":30,"path":31,"stem":32},"Loyalty Program App for Shopping Mall","/blog/case-study/loyalty-program-application-case-study","blog/case-study/loyalty-program-application-case-study",{"title":34,"path":35,"stem":36},"Mobile Application for Music Catalogs","/blog/case-study/mobile-app-for-music-catalog","blog/case-study/mobile-app-for-music-catalog",{"title":38,"path":39,"stem":40},"Universal Music Data Parser for 20+ Platforms","/blog/case-study/musicdata-lab-universal-music-data-parser-case-study","blog/case-study/musicdata-lab-universal-music-data-parser-case-study",{"title":42,"path":43,"stem":44},"Panther ML/AI Pricing Recommendation Tool","/blog/case-study/panther-pricing-recommendation-tool-case-study","blog/case-study/panther-pricing-recommendation-tool-case-study",{"title":46,"path":47,"stem":48},"4D Grupa Roofing Wholesalers Platform","/blog/case-study/roofing-wholesalers-website-case-study","blog/case-study/roofing-wholesalers-website-case-study",{"title":50,"path":51,"stem":52},"Talent Alpha HR Frontend Platform","/blog/case-study/talent-alpha-hr-platform-case-study","blog/case-study/talent-alpha-hr-platform-case-study",{"title":54,"path":55,"stem":56},"Ticketing & Events Platform Development","/blog/case-study/ticketing-events-platform-case-study","blog/case-study/ticketing-events-platform-case-study",{"title":58,"path":59,"stem":60},"Turn Fans into Superfans — Roadie.co","/blog/case-study/turn-fans-into-superfans-roadie-co","blog/case-study/turn-fans-into-superfans-roadie-co",{"title":62,"path":63,"stem":64},"Walkative 2.0 Global Booking Engine","/blog/case-study/walkative-2-booking-platform-case-study","blog/case-study/walkative-2-booking-platform-case-study",{"title":66,"path":67,"stem":68},"Why Merch Is the New Royalty Check, and How Tech Is Closing the Gap","/blog/case-study/why-merch-is-the-new-royalty-check","blog/case-study/why-merch-is-the-new-royalty-check",false,{"title":71,"path":72,"stem":73,"children":74,"page":69},"Music Data","/blog/music-data","blog/music-data",[75,79,83,87,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203],{"title":76,"path":77,"stem":78},"13 Distributors, 5 File Formats, Zero Standards -The Reality of Music Royalty Data","/blog/music-data/13-distributors-5-file-formats-zero-standards-the-reality-of-music-royalty-data","blog/music-data/13-distributors-5-file-formats-zero-standards-the-reality-of-music-royalty-data",{"title":80,"path":81,"stem":82},"830 Ways to Say Spotify - Normalizing Music Streaming Data","/blog/music-data/830-ways-to-say-spotify-normalizing-music-streaming-data","blog/music-data/830-ways-to-say-spotify-normalizing-music-streaming-data",{"title":84,"path":85,"stem":86},"Why Music Companies Need AI-Powered Analytics (And How We Built One)","/blog/music-data/ai-powered-analytics-dashboard-django-clickhouse-ollama","blog/music-data/ai-powered-analytics-dashboard-django-clickhouse-ollama",{"title":88,"path":89,"stem":90},"AI Rehearsal: Spaced Repetition for Your Musical Ideas","/blog/music-data/ai-rehearsal-spaced-repetition-for-musical-ideas","blog/music-data/ai-rehearsal-spaced-repetition-for-musical-ideas",{"title":92,"path":93,"stem":94},"Audio Project Organization Is a Mess — Here's Why","/blog/music-data/audio-project-organization-mess","blog/music-data/audio-project-organization-mess",{"title":96,"path":97,"stem":98},"Why Audio Search Is Still Broken and How to Fix It with Embeddings","/blog/music-data/audio-search-broken-fix-with-embeddings","blog/music-data/audio-search-broken-fix-with-embeddings",{"title":100,"path":101,"stem":102},"AI Song Structure Analysis: Intro, Verse, Chorus","/blog/music-data/automatic-song-structure-analysis-how-ai-detects-intro-verse-chorus","blog/music-data/automatic-song-structure-analysis-how-ai-detects-intro-verse-chorus",{"title":104,"path":105,"stem":106},"The Broken Feedback Loop in Music Collaboration","/blog/music-data/broken-feedback-loop-music-collaboration","blog/music-data/broken-feedback-loop-music-collaboration",{"title":108,"path":109,"stem":110},"Building a Claude Skill for DDEX Validation: Automate Music Metadata Checks with AI","/blog/music-data/building-a-claude-skill-for-ddex-validation-music-metadata","blog/music-data/building-a-claude-skill-for-ddex-validation-music-metadata",{"title":112,"path":113,"stem":114},"Building a Custom Music Delivery Platform on the Revelator API","/blog/music-data/building-a-custom-music-delivery-platform-on-the-revelator-api","blog/music-data/building-a-custom-music-delivery-platform-on-the-revelator-api",{"title":116,"path":117,"stem":118},"Building a Suno AI Remix App with Nuxt & Firebase","/blog/music-data/building-a-suno-remix-app-with-nuxt-and-firebase","blog/music-data/building-a-suno-remix-app-with-nuxt-and-firebase",{"title":120,"path":121,"stem":122},"C2PA & DDEX: Authenticity Meets Rights in the Age of AI Music","/blog/music-data/c2pa-and-ddex-authenticity-meets-rights-in-the-age-of-ai-music","blog/music-data/c2pa-and-ddex-authenticity-meets-rights-in-the-age-of-ai-music",{"title":124,"path":125,"stem":126},"C2PA in Music: A Claude MCP for Reading Content Provenance","/blog/music-data/c2pa-in-music-mcp","blog/music-data/c2pa-in-music-mcp",{"title":128,"path":129,"stem":130},"Data Modeling in MongoDB Using Design Patterns","/blog/music-data/data-modeling-in-mongodb-with-the-usage-of-design-patterns","blog/music-data/data-modeling-in-mongodb-with-the-usage-of-design-patterns",{"title":132,"path":133,"stem":134},"Office Hours with MusicTech Lab's DDEX Expert","/blog/music-data/ddex-office-hours-musictech","blog/music-data/ddex-office-hours-musictech",{"title":136,"path":137,"stem":138},"DDEX Open Source Projects Review","/blog/music-data/ddex-open-source-projects-review","blog/music-data/ddex-open-source-projects-review",{"title":140,"path":141,"stem":142},"Extracting Data from Ableton .als and .asd Files","/blog/music-data/extracting-data-from-ableton-als-asd-files","blog/music-data/extracting-data-from-ableton-als-asd-files",{"title":144,"path":145,"stem":146},"Maciej Dulski on Sound Connections Podcast","/blog/music-data/from-startups-to-musictech-maciej-dulski-on-sound-connections-podcast","blog/music-data/from-startups-to-musictech-maciej-dulski-on-sound-connections-podcast",{"title":148,"path":149,"stem":150},"How to Transcribe Video to Text Using OpenAI Whisper","/blog/music-data/how-to-transcribe-video-to-text-using-whisper","blog/music-data/how-to-transcribe-video-to-text-using-whisper",{"title":152,"path":153,"stem":154},"Epidemic Sound MCP with Claude for Devs","/blog/music-data/how-to-use-epidemic-sound-mcp-with-claude","blog/music-data/how-to-use-epidemic-sound-mcp-with-claude",{"title":156,"path":157,"stem":158},"Hybrid Database Model in Django for Speed","/blog/music-data/hybrid-database-model-in-django-as-a-performance-booster","blog/music-data/hybrid-database-model-in-django-as-a-performance-booster",{"title":160,"path":161,"stem":162},"Introduction to generating DDEX file using Python","/blog/music-data/introduction-to-generating-ddex-file-using-python","blog/music-data/introduction-to-generating-ddex-file-using-python",{"title":164,"path":165,"stem":166},"Maintaining Music Tech Tools: The SLA Dilemma for Small Teams","/blog/music-data/maintaining-music-tech-tools-the-sla-dilemma-for-small-teams","blog/music-data/maintaining-music-tech-tools-the-sla-dilemma-for-small-teams",{"title":168,"path":169,"stem":170},"Querying Bandcamp Revenue Reports with Natural Language — Meet mtl-bandcamp-mcp","/blog/music-data/mtl-bandcamp-mcp-open-source-revenue-dashboard","blog/music-data/mtl-bandcamp-mcp-open-source-revenue-dashboard",{"title":172,"path":173,"stem":174},"mtl-metadata-mcp: Open Source Audio Metadata Embedding for Claude Code","/blog/music-data/mtl-metadata-mcp-open-source-audio-metadata-embedding","blog/music-data/mtl-metadata-mcp-open-source-audio-metadata-embedding",{"title":176,"path":177,"stem":178},"MusicTech Resources for Builders","/blog/music-data/musictech-resources-curated-insights-for-the-musictech-builders","blog/music-data/musictech-resources-curated-insights-for-the-musictech-builders",{"title":180,"path":181,"stem":182},"Poland's Creative Tech and MusicTech Rise","/blog/music-data/polands-creative-tech-sector-is-on-the-rise-and-musictech-is-part-of-it","blog/music-data/polands-creative-tech-sector-is-on-the-rise-and-musictech-is-part-of-it",{"title":184,"path":185,"stem":186},"Batch ISRC Enrichment That Turns Messy Catalogs Into Clean Data","/blog/music-data/scout-isrc-metadata-enrichment-spotify-musicbrainz","blog/music-data/scout-isrc-metadata-enrichment-spotify-musicbrainz",{"title":188,"path":189,"stem":190},"Music Self-Publishing: The Emuze.me Story","/blog/music-data/self-publishing-in-the-music-industry-a-tale-of-emuze-me","blog/music-data/self-publishing-in-the-music-industry-a-tale-of-emuze-me",{"title":192,"path":193,"stem":194},"Understanding the API First Approach","/blog/music-data/understanding-the-api-first-approach","blog/music-data/understanding-the-api-first-approach",{"title":196,"path":197,"stem":198},"The Voice Memo Graveyard Problem","/blog/music-data/voice-memo-graveyard-problem","blog/music-data/voice-memo-graveyard-problem",{"title":200,"path":201,"stem":202},"Which Database for Music Data? Redshift vs BigQuery vs ClickHouse and When to Use Each","/blog/music-data/which-database-for-music-data-redshift-vs-bigquery-vs-clickhouse","blog/music-data/which-database-for-music-data-redshift-vs-bigquery-vs-clickhouse",{"title":204,"path":205,"stem":206},"Why we decided to use wavesurfer.js","/blog/music-data/why-we-decided-to-use-wavesurfer","blog/music-data/why-we-decided-to-use-wavesurfer",{"title":208,"path":209,"stem":210,"children":211,"page":69},"Newsletter","/blog/newsletter","blog/newsletter",[212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308],{"title":213,"path":214,"stem":215},"Music Industry Tech Openings (April 2024 Update)","/blog/newsletter/music-industry-tech-openings-april-2024-update","blog/newsletter/music-industry-tech-openings-april-2024-update",{"title":217,"path":218,"stem":219},"Music Industry Tech Openings (April 2025 Update)","/blog/newsletter/music-industry-tech-openings-april-2025-update","blog/newsletter/music-industry-tech-openings-april-2025-update",{"title":221,"path":222,"stem":223},"Music Industry Tech Openings (August 2024 Update)","/blog/newsletter/music-industry-tech-openings-august-2024-update","blog/newsletter/music-industry-tech-openings-august-2024-update",{"title":225,"path":226,"stem":227},"Music Industry Tech Openings (December 2024 Update)","/blog/newsletter/music-industry-tech-openings-december-2024-update","blog/newsletter/music-industry-tech-openings-december-2024-update",{"title":229,"path":230,"stem":231},"Music Industry Tech Openings (February 2025 Update)","/blog/newsletter/music-industry-tech-openings-february-2025-update","blog/newsletter/music-industry-tech-openings-february-2025-update",{"title":233,"path":234,"stem":235},"Music Industry Tech Openings (January 2025 Update)","/blog/newsletter/music-industry-tech-openings-january-2025-update","blog/newsletter/music-industry-tech-openings-january-2025-update",{"title":237,"path":238,"stem":239},"Music Industry Tech Openings (July 2024 Update)","/blog/newsletter/music-industry-tech-openings-july-2024-update","blog/newsletter/music-industry-tech-openings-july-2024-update",{"title":241,"path":242,"stem":243},"Music Industry Tech Openings (June 2024 Update)","/blog/newsletter/music-industry-tech-openings-june-2024-update","blog/newsletter/music-industry-tech-openings-june-2024-update",{"title":245,"path":246,"stem":247},"Music Industry Tech Openings (March 2025 Update)","/blog/newsletter/music-industry-tech-openings-march-2025-update","blog/newsletter/music-industry-tech-openings-march-2025-update",{"title":249,"path":250,"stem":251},"Music Industry Tech Openings (May 2024 Update)","/blog/newsletter/music-industry-tech-openings-may-2024-update","blog/newsletter/music-industry-tech-openings-may-2024-update",{"title":253,"path":254,"stem":255},"Music Industry Tech Openings (May 2025 Update)","/blog/newsletter/music-industry-tech-openings-may-2025","blog/newsletter/music-industry-tech-openings-may-2025",{"title":257,"path":258,"stem":259},"Music Industry Tech Openings (November 2024 Update)","/blog/newsletter/music-industry-tech-openings-november-2024-update","blog/newsletter/music-industry-tech-openings-november-2024-update",{"title":261,"path":262,"stem":263},"Music Industry Tech Openings (October 2024 Update)","/blog/newsletter/music-industry-tech-openings-october-2024-update","blog/newsletter/music-industry-tech-openings-october-2024-update",{"title":265,"path":266,"stem":267},"Music Industry Tech Openings (September 2024 Update)","/blog/newsletter/music-industry-tech-openings-september-2024-update","blog/newsletter/music-industry-tech-openings-september-2024-update",{"title":269,"path":270,"stem":271},"MusicTech Insights #1 by Maciej Dulski","/blog/newsletter/musictech-insights-1-curated-by-maciej-dulski","blog/newsletter/musictech-insights-1-curated-by-maciej-dulski",{"title":273,"path":274,"stem":275},"Provenance, Not Detection, Is the Durable Answer","/blog/newsletter/musictech-insights-10-curated-by-jim-anderson","blog/newsletter/musictech-insights-10-curated-by-jim-anderson",{"title":277,"path":278,"stem":279},"What CMOs can teach us about innovation in uncertain times","/blog/newsletter/musictech-insights-10-curated-by-joanna-kurkowska","blog/newsletter/musictech-insights-10-curated-by-joanna-kurkowska",{"title":281,"path":282,"stem":283},"Feeling the MusicTech Momentum","/blog/newsletter/musictech-insights-2-curated-by-maciej-dulski","blog/newsletter/musictech-insights-2-curated-by-maciej-dulski",{"title":285,"path":286,"stem":287},"AI in Music: Hype, Hope, and a Human Touch","/blog/newsletter/musictech-insights-3-curated-by-drew-thurlow","blog/newsletter/musictech-insights-3-curated-by-drew-thurlow",{"title":289,"path":290,"stem":291},"The Music Metadata Conundrum","/blog/newsletter/musictech-insights-4-curated-by-amanda-schupf","blog/newsletter/musictech-insights-4-curated-by-amanda-schupf",{"title":293,"path":294,"stem":295},"7 Rounds in the First 10 Days of November 2025","/blog/newsletter/musictech-insights-5-curated-by-maciej-dulski","blog/newsletter/musictech-insights-5-curated-by-maciej-dulski",{"title":297,"path":298,"stem":299},"The End of an Era: It's All About to Crash","/blog/newsletter/musictech-insights-6-curated-by-sigurdur-arnason","blog/newsletter/musictech-insights-6-curated-by-sigurdur-arnason",{"title":301,"path":302,"stem":303},"Low-Code Magic Won't Solve MusicTech Reality","/blog/newsletter/musictech-insights-7-curated-by-mariusz-smenzyk","blog/newsletter/musictech-insights-7-curated-by-mariusz-smenzyk",{"title":305,"path":306,"stem":307},"The New Economics of Game Music","/blog/newsletter/musictech-insights-8-curated-by-kenny-vaughan","blog/newsletter/musictech-insights-8-curated-by-kenny-vaughan",{"title":309,"path":310,"stem":311},"Music Business Meets Direct-to-Fan","/blog/newsletter/musictech-insights-9-curated-by-yaw-asamani","blog/newsletter/musictech-insights-9-curated-by-yaw-asamani",{"title":313,"path":314,"stem":315,"children":316,"page":69},"Software Development","/blog/software-development","blog/software-development",[317,321,325,329,333,337,341,345,349,353,357,361,365,369,373,377,381,385,389,393,397,401,405,409,413,417,421,425,429,433,437,441,445,449,453,457,461,465,469,473,477,481,485,489,493,497,501,505,509,513,517,521,525,529,533,537,541,545,549,553,557,561,565,569,573,577,581,585,589,593,597,601,605,609,613,617,621,625,629,633,637,641,645,649,653,657,661,665,669,673,677,681,685,689,693,697,701,705,709,713,717],{"title":318,"path":319,"stem":320},"Benefits of Outsourcing Software Development","/blog/software-development/10-benefits-of-outsourcing-software-development-services","blog/software-development/10-benefits-of-outsourcing-software-development-services",{"title":322,"path":323,"stem":324},"10 Steps to Find the Best MVP Developers","/blog/software-development/10-steps-to-find-the-best-mvp-developers-for-your-startup-idea","blog/software-development/10-steps-to-find-the-best-mvp-developers-for-your-startup-idea",{"title":326,"path":327,"stem":328},"1,200 Looms Later: How Async Video Became My Development Superpower","/blog/software-development/1200-looms-how-async-video-became-our-development-superpower","blog/software-development/1200-looms-how-async-video-became-our-development-superpower",{"title":330,"path":331,"stem":332},"Communication Strategy in Outsourcing Projects","/blog/software-development/5-steps-to-implement-an-effective-communication-strategy-in-outsourcing-software-development-project","blog/software-development/5-steps-to-implement-an-effective-communication-strategy-in-outsourcing-software-development-project",{"title":334,"path":335,"stem":336},"7 Best Practices for Outsourcing Software Development","/blog/software-development/7-best-practices-for-outsourcing-software-development","blog/software-development/7-best-practices-for-outsourcing-software-development",{"title":338,"path":339,"stem":340},"9 Reasons Why Saleor.io Is Best for eCommerce","/blog/software-development/9-reasons-why-the-saleor-io-platform-is-the-best-choice-for-your-ecommerce-website","blog/software-development/9-reasons-why-the-saleor-io-platform-is-the-best-choice-for-your-ecommerce-website",{"title":342,"path":343,"stem":344},"A Look at Bravelab.io’s Clutch 2021 Year In Review","/blog/software-development/a-look-at-bravelab-ios-clutch-2021-year-in-review","blog/software-development/a-look-at-bravelab-ios-clutch-2021-year-in-review",{"title":346,"path":347,"stem":348},"A quick introduction to profit sharing implementation","/blog/software-development/a-quick-introduction-to-profit-sharing-implementation","blog/software-development/a-quick-introduction-to-profit-sharing-implementation",{"title":350,"path":351,"stem":352},"AI Audio Similarity Search: The Future of Sound Library Discovery","/blog/software-development/ai-audio-similarity-search-for-sound-libraries","blog/software-development/ai-audio-similarity-search-for-sound-libraries",{"title":354,"path":355,"stem":356},"Automate Repetitive Tasks for Better Results","/blog/software-development/automate-repetitive-tasks-to-improve-your-business-performance","blog/software-development/automate-repetitive-tasks-to-improve-your-business-performance",{"title":358,"path":359,"stem":360},"Automating Success: The Art of Unified Documentation","/blog/software-development/automating-success-the-art-of-unified-documentation","blog/software-development/automating-success-the-art-of-unified-documentation",{"title":362,"path":363,"stem":364},"Brave 3.0 Website Redesign, Part 2: Solution","/blog/software-development/brave-3-0-how-we-conducted-website-redesign-part-2-solution","blog/software-development/brave-3-0-how-we-conducted-website-redesign-part-2-solution",{"title":366,"path":367,"stem":368},"Brave 3.0, Part 4: Tech Stack and Recap","/blog/software-development/brave-3-0-part-4-technologies-behind-and-final-series-recap","blog/software-development/brave-3-0-part-4-technologies-behind-and-final-series-recap",{"title":370,"path":371,"stem":372},"Brave 3.0 – redesign process part 1. The Challenge","/blog/software-development/brave-3-0-redesign-process-part-1-challenge","blog/software-development/brave-3-0-redesign-process-part-1-challenge",{"title":374,"path":375,"stem":376},"Brave 3.0 – redesign process, part 3. Lesson learned","/blog/software-development/brave-3-0-redesign-process-part-3-lesson-learned","blog/software-development/brave-3-0-redesign-process-part-3-lesson-learned",{"title":378,"path":379,"stem":380},"Bravelab.io: Top Software Developer by Clutch","/blog/software-development/bravelab-io-is-recognized-as-a-top-custom-software-developer-by-clutch","blog/software-development/bravelab-io-is-recognized-as-a-top-custom-software-developer-by-clutch",{"title":382,"path":383,"stem":384},"Bravelab.io: Top Developer in Poland by Clutch","/blog/software-development/bravelab-io-named-top-software-developer-in-poland-by-clutch","blog/software-development/bravelab-io-named-top-software-developer-in-poland-by-clutch",{"title":386,"path":387,"stem":388},"MusicTech Lab Partners with LALAL.AI","/blog/software-development/bravelab-partners-with-the-audio-lalal-ai","blog/software-development/bravelab-partners-with-the-audio-lalal-ai",{"title":390,"path":391,"stem":392},"MusicTech Lab Partners with The Audio Programmer","/blog/software-development/bravelab-partners-with-the-audio-programmer","blog/software-development/bravelab-partners-with-the-audio-programmer",{"title":394,"path":395,"stem":396},"Bravelab's team about productivity","/blog/software-development/bravelabs-team-about-productivity","blog/software-development/bravelabs-team-about-productivity",{"title":398,"path":399,"stem":400},"Braveloper","/blog/software-development/braveloper","blog/software-development/braveloper",{"title":402,"path":403,"stem":404},"Bravely App: Boost Productivity with Django","/blog/software-development/bravely-app-how-to-be-more-productive-with-django-quick","blog/software-development/bravely-app-how-to-be-more-productive-with-django-quick",{"title":406,"path":407,"stem":408},"DIY MIDI Controller for Ableton with Arduino","/blog/software-development/building-a-diy-midi-controller-for-ableton-live-with-arduino","blog/software-development/building-a-diy-midi-controller-for-ableton-live-with-arduino",{"title":410,"path":411,"stem":412},"C2PA in Ableton: Making AI Music Provenance Visible Inside Your DAW","/blog/software-development/c2pa-in-ableton-max-for-live","blog/software-development/c2pa-in-ableton-max-for-live",{"title":414,"path":415,"stem":416},"Change Detection mechanism in Angular","/blog/software-development/change-detection-mechanism-in-angular","blog/software-development/change-detection-mechanism-in-angular",{"title":418,"path":419,"stem":420},"Communication Channels in Remote Work","/blog/software-development/comparison-of-the-communication-channels-in-remote-work","blog/software-development/comparison-of-the-communication-channels-in-remote-work",{"title":422,"path":423,"stem":424},"Connecting Your Max for Live Device to a Cloud API","/blog/software-development/connecting-your-max-for-live-device-to-a-cloud-api","blog/software-development/connecting-your-max-for-live-device-to-a-cloud-api",{"title":426,"path":427,"stem":428},"From Voice Memo to Studio: The Cross-Platform Problem for Creators","/blog/software-development/cross-platform-problem-for-creators","blog/software-development/cross-platform-problem-for-creators",{"title":430,"path":431,"stem":432},"Cultural transformation through the pandemic era","/blog/software-development/cultural-transformation-through-the-pandemic-era","blog/software-development/cultural-transformation-through-the-pandemic-era",{"title":434,"path":435,"stem":436},"D-Commerce Decoded: Cutting Through the Hype","/blog/software-development/d-commerce-decoded-cutting-through-the-hype","blog/software-development/d-commerce-decoded-cutting-through-the-hype",{"title":438,"path":439,"stem":440},"Dev Meeting 002: Intro to DDD","/blog/software-development/dev-meeting-002-introduction-to-domain-driven-design-ddd","blog/software-development/dev-meeting-002-introduction-to-domain-driven-design-ddd",{"title":442,"path":443,"stem":444},"Dev Meeting 003: Web3 Primer","/blog/software-development/dev-meeting-003-web3-primer","blog/software-development/dev-meeting-003-web3-primer",{"title":446,"path":447,"stem":448},"Dev Meeting 004: Introduction to Event Storming","/blog/software-development/dev-meeting-004-introduction-to-event-storming","blog/software-development/dev-meeting-004-introduction-to-event-storming",{"title":450,"path":451,"stem":452},"Dev Meeting 001: Kubernetes is a Framework","/blog/software-development/dev-meeting-kubernetes-is-a-framework","blog/software-development/dev-meeting-kubernetes-is-a-framework",{"title":454,"path":455,"stem":456},"Did You Know? 10 Developer Tips from Real Codebases","/blog/software-development/did-you-know-dev-tips-part-1","blog/software-development/did-you-know-dev-tips-part-1",{"title":458,"path":459,"stem":460},"10 Surprising MusicTech Facts (Part 2)","/blog/software-development/did-you-know-musictech-facts-part-2","blog/software-development/did-you-know-musictech-facts-part-2",{"title":462,"path":463,"stem":464},"Django-cms and GraphQL","/blog/software-development/django-cms-and-graphql","blog/software-development/django-cms-and-graphql",{"title":466,"path":467,"stem":468},"Does Zappa make it super easy?","/blog/software-development/does-zappa-make-it-super-easy","blog/software-development/does-zappa-make-it-super-easy",{"title":470,"path":471,"stem":472},"Establishing cooperation between Netlify and Bravelab","/blog/software-development/establishing-cooperation-between-netlify-and-bravelab","blog/software-development/establishing-cooperation-between-netlify-and-bravelab",{"title":474,"path":475,"stem":476},"Export Ableton Locators to JSON via Max for Live","/blog/software-development/exporting-ableton-live-locators-to-json-with-max-for-live","blog/software-development/exporting-ableton-live-locators-to-json-with-max-for-live",{"title":478,"path":479,"stem":480},"IT Outsourcing: Success and Failure Factors","/blog/software-development/factors-that-contribute-to-the-success-or-failure-of-an-it-outsourcing-project","blog/software-development/factors-that-contribute-to-the-success-or-failure-of-an-it-outsourcing-project",{"title":482,"path":483,"stem":484},"Flutter 2022 Strategy: Analyzing the Roadmap","/blog/software-development/flutter-strategy-for-2022-analyzing-the-new-flutter-roadmap","blog/software-development/flutter-strategy-for-2022-analyzing-the-new-flutter-roadmap",{"title":486,"path":487,"stem":488},"Git Better #1 — Commit Message Convention","/blog/software-development/git-better-1-see-more-with-a-commit-message-convention","blog/software-development/git-better-1-see-more-with-a-commit-message-convention",{"title":490,"path":491,"stem":492},"Hasura in action. How to use it with Django","/blog/software-development/hasura-in-action","blog/software-development/hasura-in-action",{"title":494,"path":495,"stem":496},"Holacracy why and where we are","/blog/software-development/holacracy-why-and-where-we-are","blog/software-development/holacracy-why-and-where-we-are",{"title":498,"path":499,"stem":500},"How does JavaScript work","/blog/software-development/how-does-javascript-work","blog/software-development/how-does-javascript-work",{"title":502,"path":503,"stem":504},"How important is good UX/UI design?","/blog/software-development/how-important-is-good-ux-ui-design","blog/software-development/how-important-is-good-ux-ui-design",{"title":506,"path":507,"stem":508},"How repetitive tasks impact your business","/blog/software-development/how-repetitive-tasks-impact-your-business","blog/software-development/how-repetitive-tasks-impact-your-business",{"title":510,"path":511,"stem":512},"Becoming a Vue.js Dev: Do Paid Trials Work?","/blog/software-development/how-to-become-a-vue-js-developer-and-whether-paid-trials-in-it-work-out","blog/software-development/how-to-become-a-vue-js-developer-and-whether-paid-trials-in-it-work-out",{"title":514,"path":515,"stem":516},"How to Build an MVP in 6 Steps","/blog/software-development/how-to-build-a-minimum-viable-product-mvp-in-6-steps","blog/software-development/how-to-build-a-minimum-viable-product-mvp-in-6-steps",{"title":518,"path":519,"stem":520},"How to conduct workshops for creative industry?","/blog/software-development/how-to-conduct-workshops-for-creative-industry","blog/software-development/how-to-conduct-workshops-for-creative-industry",{"title":522,"path":523,"stem":524},"How to easily create form in Angular","/blog/software-development/how-to-easily-create-form-in-angular","blog/software-development/how-to-easily-create-form-in-angular",{"title":526,"path":527,"stem":528},"How to export orders in Saleor.io to XLSX file","/blog/software-development/how-to-export-orders-in-saleor-io-to-xlsx-file","blog/software-development/how-to-export-orders-in-saleor-io-to-xlsx-file",{"title":530,"path":531,"stem":532},"Handling High Loads on E-Commerce Platforms","/blog/software-development/how-to-handle-high-loads-on-e-commerce-platform-with-ease","blog/software-development/how-to-handle-high-loads-on-e-commerce-platform-with-ease",{"title":534,"path":535,"stem":536},"How to launch Saleor.io shop instance within 40h","/blog/software-development/how-to-launch-saleor-io-shop-instance-within-40h","blog/software-development/how-to-launch-saleor-io-shop-instance-within-40h",{"title":538,"path":539,"stem":540},"First Steps to Build a Business Relationship","/blog/software-development/how-to-make-the-first-step-to-establish-a-business-relationship","blog/software-development/how-to-make-the-first-step-to-establish-a-business-relationship",{"title":542,"path":543,"stem":544},"Multi-Tenant Apps with Django and Saleor.io","/blog/software-development/how-to-manage-tenants-in-the-multitenant-app-based-on-django-tenants-and-saleor-io-platform","blog/software-development/how-to-manage-tenants-in-the-multitenant-app-based-on-django-tenants-and-saleor-io-platform",{"title":546,"path":547,"stem":548},"Notion Backup Tool Built in 3 Days with Python","/blog/software-development/how-we-built-a-notion-backup-tool-in-3-days-with-pythonvue-and-why","blog/software-development/how-we-built-a-notion-backup-tool-in-3-days-with-pythonvue-and-why",{"title":550,"path":551,"stem":552},"Important new features in Python 3.8","/blog/software-development/important-new-features-in-python-3-8","blog/software-development/important-new-features-in-python-3-8",{"title":554,"path":555,"stem":556},"Installing Proxmox on dedicated server from OVH","/blog/software-development/installing-proxmox-on-dedicated-server-from-ovh","blog/software-development/installing-proxmox-on-dedicated-server-from-ovh",{"title":558,"path":559,"stem":560},"Integrating SignNow E-Signatures into Your Django Application","/blog/software-development/integrating-signnow-e-signatures-into-your-django-application","blog/software-development/integrating-signnow-e-signatures-into-your-django-application",{"title":562,"path":563,"stem":564},"Tempus Metronome and GetSongBPM API","/blog/software-development/integrating-tempus-metronome-with-the-getsongbpm-api-what-bpm-really-means-and-how-to-use-it","blog/software-development/integrating-tempus-metronome-with-the-getsongbpm-api-what-bpm-really-means-and-how-to-use-it",{"title":566,"path":567,"stem":568},"Introducing MusicTech Poland","/blog/software-development/introducing-musictech-poland","blog/software-development/introducing-musictech-poland",{"title":570,"path":571,"stem":572},"Vue.js as a Frontend for Saleor.io","/blog/software-development/is-it-possible-to-use-vue-js-as-a-frontend-for-saleor-io-platform","blog/software-development/is-it-possible-to-use-vue-js-as-a-frontend-for-saleor-io-platform",{"title":574,"path":575,"stem":576},"Is your business ready for the cashless era?","/blog/software-development/is-your-business-ready-for-the-cashless-era","blog/software-development/is-your-business-ready-for-the-cashless-era",{"title":578,"path":579,"stem":580},"Is your face ready to buy?","/blog/software-development/is-your-face-ready-to-buy","blog/software-development/is-your-face-ready-to-buy",{"title":582,"path":583,"stem":584},"JS Frameworks: Trends and Opportunities","/blog/software-development/javascript-trending-frameworks-and-market-opportunities","blog/software-development/javascript-trending-frameworks-and-market-opportunities",{"title":586,"path":587,"stem":588},"Kanban Board: Boost Your Team Productivity","/blog/software-development/kanban-board-methodology-hack-your-companys-productivity","blog/software-development/kanban-board-methodology-hack-your-companys-productivity",{"title":590,"path":591,"stem":592},"Verified Human Cert MCP Server: Prove Your Music Is Human-Made, Right from the Terminal","/blog/software-development/mcp-verified-human-cert-open-source","blog/software-development/mcp-verified-human-cert-open-source",{"title":594,"path":595,"stem":596},"Migrating from TravisCI to Github Actions","/blog/software-development/migrating-from-travisci-to-github-actions","blog/software-development/migrating-from-travisci-to-github-actions",{"title":598,"path":599,"stem":600},"MusicTech Lab: Top Software Developer by Clutch","/blog/software-development/musictechlab-is-recognized-as-a-top-custom-software-developer-by-clutch","blog/software-development/musictechlab-is-recognized-as-a-top-custom-software-developer-by-clutch",{"title":602,"path":603,"stem":604},"MusicTech Lab x Verified Human: Building a Trust Layer for Human-Made Music","/blog/software-development/musictechlab_blog_verified_human_partnership","blog/software-development/musictechlab_blog_verified_human_partnership",{"title":606,"path":607,"stem":608},"MusicXML: Standard for Music Notation","/blog/software-development/musicxml-standard-for-music-notation-and-education","blog/software-development/musicxml-standard-for-music-notation-and-education",{"title":610,"path":611,"stem":612},"Only a few books but dozens of ideas","/blog/software-development/only-a-few-books-but-dozens-of-ideas","blog/software-development/only-a-few-books-but-dozens-of-ideas",{"title":614,"path":615,"stem":616},"Overdue Invoices and Issue Tracker Integration","/blog/software-development/overdue-invoices-integration-with-the-issue-tracking-system","blog/software-development/overdue-invoices-integration-with-the-issue-tracking-system",{"title":618,"path":619,"stem":620},"Performing SAML SSO using JWT in Django","/blog/software-development/performing-saml-sso-using-jwt-in-django","blog/software-development/performing-saml-sso-using-jwt-in-django",{"title":622,"path":623,"stem":624},"Progressive Web Apps for Mobile Development","/blog/software-development/progressive-web-apps-a-new-way-of-creating-mobile-application","blog/software-development/progressive-web-apps-a-new-way-of-creating-mobile-application",{"title":626,"path":627,"stem":628},"Recruitment System: Gmail, Jira, and CRM","/blog/software-development/recruitment-system-integrating-gmail-bravely-jira-slack-and-copper-crm","blog/software-development/recruitment-system-integrating-gmail-bravely-jira-slack-and-copper-crm",{"title":630,"path":631,"stem":632},"Scratch Me: Chrome Extension for Leads","/blog/software-development/scratch-me-a-simple-chrome-extension-which-will-increase-your-productivity","blog/software-development/scratch-me-a-simple-chrome-extension-which-will-increase-your-productivity",{"title":634,"path":635,"stem":636},"Scratch Me – integration with the Copper CRM","/blog/software-development/scratch-me-integration-with-the-copper-crm","blog/software-development/scratch-me-integration-with-the-copper-crm",{"title":638,"path":639,"stem":640},"SignNow MCP Server: E-Signatures Straight from Claude Code","/blog/software-development/signnow-mcp-server-e-signatures-from-claude-code","blog/software-development/signnow-mcp-server-e-signatures-from-claude-code",{"title":642,"path":643,"stem":644},"Music Industry Tech Openings (March 2024 Update)","/blog/software-development/technical-job-opportunities-in-the-music-industry","blog/software-development/technical-job-opportunities-in-the-music-industry",{"title":646,"path":647,"stem":648},"Thanks app – a Management 3.0 solution","/blog/software-development/thanks-app-a-management-3-0-solution","blog/software-development/thanks-app-a-management-3-0-solution",{"title":650,"path":651,"stem":652},"Colonial Pipeline Case: 7 Security Reminders","/blog/software-development/the-case-of-colonial-pipeline-and-7-security-reminders","blog/software-development/the-case-of-colonial-pipeline-and-7-security-reminders",{"title":654,"path":655,"stem":656},"The Evolution and Future of E-commerce Platforms","/blog/software-development/the-evolution-and-future-of-e-commerce-platforms","blog/software-development/the-evolution-and-future-of-e-commerce-platforms",{"title":658,"path":659,"stem":660},"The Gender Gap in the Tech Industry","/blog/software-development/the-gender-gap-in-the-tech-industry","blog/software-development/the-gender-gap-in-the-tech-industry",{"title":662,"path":663,"stem":664},"First Attempt to Implement 4DX at Bravelab.io","/blog/software-development/the-very-first-attempt-to-implement-4dx-in-bravelab-io","blog/software-development/the-very-first-attempt-to-implement-4dx-in-bravelab-io",{"title":666,"path":667,"stem":668},"The WTF Scale: IT Project Complexity","/blog/software-development/the-wtf-programming-scale-measuring-it-project-complexity","blog/software-development/the-wtf-programming-scale-measuring-it-project-complexity",{"title":670,"path":671,"stem":672},"Top 10 articles through the eyes of our developers","/blog/software-development/top-10-articles-through-the-eyes-of-our-developers","blog/software-development/top-10-articles-through-the-eyes-of-our-developers",{"title":674,"path":675,"stem":676},"Top 6 apps made with Flutter","/blog/software-development/top-6-apps-made-with-flutter","blog/software-development/top-6-apps-made-with-flutter",{"title":678,"path":679,"stem":680},"Uber 101: How Uber Made It to the Top","/blog/software-development/uber-101-how-this-ride-sharing-behemoth-made-it-to-the-top","blog/software-development/uber-101-how-this-ride-sharing-behemoth-made-it-to-the-top",{"title":682,"path":683,"stem":684},"MusicTech Lab Partners with Music Glue","/blog/software-development/unifying-artists-and-audiences-exploring-music-glue","blog/software-development/unifying-artists-and-audiences-exploring-music-glue",{"title":686,"path":687,"stem":688},"Why AI Will Defeat Traditional HR","/blog/software-development/warning-why-artificial-intelligence-will-defeat-traditional-hr","blog/software-development/warning-why-artificial-intelligence-will-defeat-traditional-hr",{"title":690,"path":691,"stem":692},"What is a Discovery Document?","/blog/software-development/what-is-discovery-document","blog/software-development/what-is-discovery-document",{"title":694,"path":695,"stem":696},"What is Flutter, and Why is it Worth Considering?","/blog/software-development/what-is-flutter-and-why-is-it-worth-considering","blog/software-development/what-is-flutter-and-why-is-it-worth-considering",{"title":698,"path":699,"stem":700},"What is a Watermarked Song?","/blog/software-development/what-is-watermarked-song","blog/software-development/what-is-watermarked-song",{"title":702,"path":703,"stem":704},"Choosing a Frontend Framework for the Web","/blog/software-development/which-framework-should-you-choose-for-the-frontend-web-platform-development","blog/software-development/which-framework-should-you-choose-for-the-frontend-web-platform-development",{"title":706,"path":707,"stem":708},"Why DAWs Are the Wrong Tool for Starting a Song","/blog/software-development/why-daws-wrong-tool-for-starting-song","blog/software-development/why-daws-wrong-tool-for-starting-song",{"title":710,"path":711,"stem":712},"Why the Programming World Loves Python","/blog/software-development/why-the-programming-world-loves-python","blog/software-development/why-the-programming-world-loves-python",{"title":714,"path":715,"stem":716},"Why We Don't Build Chat From Scratch (And Neither Should You)","/blog/software-development/why-we-dont-build-chat-from-scratch","blog/software-development/why-we-dont-build-chat-from-scratch",{"title":718,"path":719,"stem":720},"Why we use Sanity.io","/blog/software-development/why-we-use-sanity-io","blog/software-development/why-we-use-sanity-io",{"title":722,"path":723,"stem":724,"children":725,"page":69},"Sportstech","/blog/sportstech","blog/sportstech",[726,730],{"title":727,"path":728,"stem":729},"BeatBuddy Replay: Video Analysis App Challenges","/blog/sportstech/beatbuddy-replay-video-analysis-app-for-swimmers-flutter","blog/sportstech/beatbuddy-replay-video-analysis-app-for-swimmers-flutter",{"title":731,"path":732,"stem":733},"How to Create a Watch Face App for Garmin Watch","/blog/sportstech/how-to-create-watch-face-app-for-garmin-watch","blog/sportstech/how-to-create-watch-face-app-for-garmin-watch",{"id":735,"title":108,"authors":736,"badge":742,"body":745,"category":2145,"client":2146,"date":2147,"description":2148,"extension":2149,"faq":2150,"featured":69,"featuredOrder":2146,"hidden":69,"image":2159,"keyTakeaways":2161,"meta":2172,"navigation":1100,"path":109,"seo":2173,"status":2146,"stem":110,"tags":2176,"teaser":2146,"__hash__":2179},"posts/blog/music-data/building-a-claude-skill-for-ddex-validation-music-metadata.md",[737],{"name":738,"to":739,"avatar":740},"Mariusz Smenżyk","https://www.linkedin.com/in/mariusz-smenzyk/",{"src":741},"/images/people/mariusz-smenzyk2.webp",{"label":743,"color":744},"Tutorial","#7c3aed",{"type":746,"value":747,"toc":2128},"minimark",[748,752,755,768,786,791,798,808,815,819,837,841,844,866,870,873,906,910,920,927,932,935,1036,1059,1063,1066,1581,1585,1588,1710,1724,1728,1731,1738,1741,1748,1762,1766,1769,1777,1785,1813,1817,1820,1826,1832,1838,1961,1967,1971,1974,2026,2029,2044,2048,2055,2086,2097,2101,2107,2110,2124],[749,750,751],"p",{},"If you distribute music digitally, you've dealt with DDEX. The Electronic Release Notification (ERN) standard is how labels and distributors exchange release metadata - track titles, ISRC codes, territory rights, audio file references, and more. Get it wrong, and your release gets rejected. Get it right, and it flows seamlessly to Spotify, Apple Music, and hundreds of other platforms.",[749,753,754],{},"The problem? DDEX XML files are complex, deeply nested, and easy to break. Validation usually means uploading files to web tools, running CLI scripts, or waiting for your distributor to reject your submission.",[749,756,757,758,762,763,767],{},"In this tutorial, we'll build a ",[759,760,761],"strong",{},"Claude skill"," that validates DDEX ERN files on demand - right inside Claude Code or Claude.ai. Type ",[764,765,766],"code",{},"/ddex-validate",", paste your XML, and get instant feedback with actionable error messages.",[769,770,771],"note",{},[749,772,773,774,777,778,785],{},"This is a ",[759,775,776],{},"proof of concept"," - an experiment in using AI to streamline daily routines when working with music industry data. The full skill is open source on ",[779,780,784],"a",{"href":781,"rel":782},"https://github.com/musictechlab/ddex-validate",[783],"nofollow","GitHub",".",[787,788,790],"h2",{"id":789},"what-is-a-claude-skill","What is a Claude skill?",[749,792,793,794,797],{},"A skill is a folder with a ",[764,795,796],{},"SKILL.md"," file that teaches Claude how to handle a specific workflow. Think of it as a reusable prompt template with structure:",[799,800,806],"pre",{"className":801,"code":803,"language":804,"meta":805},[802],"language-text","ddex-validate/\n├── SKILL.md                    # Instructions + YAML frontmatter\n├── references/\n│   └── ern-structure.md        # DDEX domain knowledge\n└── assets/\n    └── ern382-sample.xml       # Example file for testing\n","text","",[764,807,803],{"__ignoreMap":805},[749,809,810,811,814],{},"Skills use ",[759,812,813],{},"progressive disclosure"," - Claude loads the frontmatter first (to decide if the skill is relevant), then the full instructions only when triggered. This keeps token usage low while maintaining deep domain expertise.",[787,816,818],{"id":817},"prerequisites","Prerequisites",[820,821,822,831,834],"ul",{},[823,824,825,830],"li",{},[779,826,829],{"href":827,"rel":828},"https://docs.anthropic.com/en/docs/claude-code/overview",[783],"Claude Code"," installed (or Claude.ai with skills support)",[823,832,833],{},"Basic familiarity with XML and DDEX concepts",[823,835,836],{},"About 15–30 minutes",[787,838,840],{"id":839},"step-1-plan-the-use-cases","Step 1: Plan the use cases",[749,842,843],{},"Before writing any code, define what the skill should handle:",[845,846,853,858,862],"div",{"className":847},[848,849,850,851,852],"grid","grid-cols-1","md:grid-cols-3","gap-4","my-8",[854,855],"spotlight-card",{"description":856,"title":857},"Parse XML, detect ERN version, fetch XSD schema, validate, and report errors with line numbers.","Full XML Validation",[854,859],{"description":860,"title":861},"Verify required elements exist and check ISRC/UPC format without full schema validation.","Quick Structure Check",[854,863],{"description":864,"title":865},"Analyze each error, suggest a specific fix, and show corrected XML snippets the user can copy-paste.","Fix Suggestions",[787,867,869],{"id":868},"step-2-create-the-skill-folder","Step 2: Create the skill folder",[749,871,872],{},"Create the skill directory in your Claude Code skills location:",[799,874,878],{"className":875,"code":876,"language":877,"meta":805,"style":805},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","mkdir -p ~/.claude/skills/ddex-validate/references\nmkdir -p ~/.claude/skills/ddex-validate/assets\n","bash",[764,879,880,896],{"__ignoreMap":805},[881,882,885,889,893],"span",{"class":883,"line":884},"line",1,[881,886,888],{"class":887},"sBMFI","mkdir",[881,890,892],{"class":891},"sfazB"," -p",[881,894,895],{"class":891}," ~/.claude/skills/ddex-validate/references\n",[881,897,899,901,903],{"class":883,"line":898},2,[881,900,888],{"class":887},[881,902,892],{"class":891},[881,904,905],{"class":891}," ~/.claude/skills/ddex-validate/assets\n",[787,907,909],{"id":908},"step-3-write-the-skillmd","Step 3: Write the SKILL.md",[749,911,912,913,916,917,785],{},"This is the core of the skill. The YAML frontmatter tells Claude ",[759,914,915],{},"when"," to load it, and the Markdown body tells Claude ",[759,918,919],{},"what to do",[749,921,922,923,926],{},"Create ",[764,924,925],{},"~/.claude/skills/ddex-validate/SKILL.md",":",[928,929,931],"h3",{"id":930},"the-frontmatter","The frontmatter",[749,933,934],{},"The frontmatter is the most important part - it's how Claude decides whether to load your skill:",[799,936,940],{"className":937,"code":938,"language":939,"meta":805,"style":805},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: ddex-validate\ndescription: Validates DDEX ERN XML files against official schemas.\n  Checks structure, required fields (ISRC, UPC, MessageHeader), and\n  schema conformance. Use when user uploads .xml files, mentions\n  \"DDEX\", \"ERN\", \"validate release\", \"check metadata\", or\n  \"release notification\".\n","yaml",[764,941,942,954,964,970,976,1022],{"__ignoreMap":805},[881,943,944,948,951],{"class":883,"line":884},[881,945,947],{"class":946},"swJcz","name",[881,949,926],{"class":950},"sMK4o",[881,952,953],{"class":891}," ddex-validate\n",[881,955,956,959,961],{"class":883,"line":898},[881,957,958],{"class":946},"description",[881,960,926],{"class":950},[881,962,963],{"class":891}," Validates DDEX ERN XML files against official schemas.\n",[881,965,967],{"class":883,"line":966},3,[881,968,969],{"class":891},"  Checks structure, required fields (ISRC, UPC, MessageHeader), and\n",[881,971,973],{"class":883,"line":972},4,[881,974,975],{"class":891},"  schema conformance. Use when user uploads .xml files, mentions\n",[881,977,979,982,985,988,992,994,997,999,1001,1003,1006,1008,1010,1012,1015,1017,1019],{"class":883,"line":978},5,[881,980,981],{"class":950},"  \"",[881,983,984],{"class":891},"DDEX",[881,986,987],{"class":950},"\"",[881,989,991],{"class":990},"sTEyZ",", ",[881,993,987],{"class":950},[881,995,996],{"class":891},"ERN",[881,998,987],{"class":950},[881,1000,991],{"class":990},[881,1002,987],{"class":950},[881,1004,1005],{"class":891},"validate release",[881,1007,987],{"class":950},[881,1009,991],{"class":990},[881,1011,987],{"class":950},[881,1013,1014],{"class":891},"check metadata",[881,1016,987],{"class":950},[881,1018,991],{"class":990},[881,1020,1021],{"class":891},"or\n",[881,1023,1025,1027,1030,1032],{"class":883,"line":1024},6,[881,1026,981],{"class":950},[881,1028,1029],{"class":891},"release notification",[881,1031,987],{"class":950},[881,1033,1035],{"class":1034},"sbssI",".\n",[1037,1038,1039],"tip",{},[749,1040,1041,1042,1047,1048,1047,1053,1058],{},"A good description follows the pattern: ",[759,1043,1044],{},[881,1045,1046],{},"What it does"," + ",[759,1049,1050],{},[881,1051,1052],{},"When to use it",[759,1054,1055],{},[881,1056,1057],{},"Key capabilities",". Include specific trigger phrases users might say - Claude uses these to decide if the skill is relevant.",[928,1060,1062],{"id":1061},"the-validation-workflow","The validation workflow",[749,1064,1065],{},"The body of SKILL.md contains step-by-step instructions. Here's the core - the Python validation function that fetches the official DDEX XSD and validates against it:",[799,1067,1072],{"className":1068,"code":1069,"filename":1070,"language":1071,"meta":805,"style":805},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from lxml import etree\nimport requests\n\ndef validate_ddex(xml_content: str, version: str) -> dict:\n    \"\"\"Validate DDEX XML against official ERN schema.\"\"\"\n    xsd_url = (\n        f\"https://service.ddex.net/xml/ern/\"\n        f\"{version}/release-notification.xsd\"\n    )\n\n    # Fetch and compile schema\n    response = requests.get(xsd_url, timeout=10)\n    response.raise_for_status()\n    schema_root = etree.fromstring(response.content)\n    schema = etree.XMLSchema(schema_root)\n\n    # Parse and validate\n    xml_tree = etree.fromstring(xml_content.encode())\n    is_valid = schema.validate(xml_tree)\n\n    errors = []\n    if not is_valid:\n        for error in schema.error_log:\n            errors.append({\n                \"line\": error.line,\n                \"column\": error.column,\n                \"message\": error.message,\n                \"level\": error.level_name,\n            })\n\n    return {\"valid\": is_valid, \"errors\": errors, \"version\": version}\n","validate_ddex.py","python",[764,1073,1074,1089,1096,1102,1146,1158,1169,1178,1197,1203,1208,1214,1248,1262,1290,1312,1317,1323,1349,1372,1377,1388,1402,1423,1437,1459,1479,1499,1520,1526,1531],{"__ignoreMap":805},[881,1075,1076,1080,1083,1086],{"class":883,"line":884},[881,1077,1079],{"class":1078},"s7zQu","from",[881,1081,1082],{"class":990}," lxml ",[881,1084,1085],{"class":1078},"import",[881,1087,1088],{"class":990}," etree\n",[881,1090,1091,1093],{"class":883,"line":898},[881,1092,1085],{"class":1078},[881,1094,1095],{"class":990}," requests\n",[881,1097,1098],{"class":883,"line":966},[881,1099,1101],{"emptyLinePlaceholder":1100},true,"\n",[881,1103,1104,1108,1112,1115,1119,1121,1124,1127,1130,1132,1134,1137,1140,1143],{"class":883,"line":972},[881,1105,1107],{"class":1106},"spNyl","def",[881,1109,1111],{"class":1110},"s2Zo4"," validate_ddex",[881,1113,1114],{"class":950},"(",[881,1116,1118],{"class":1117},"sHdIc","xml_content",[881,1120,926],{"class":950},[881,1122,1123],{"class":887}," str",[881,1125,1126],{"class":950},",",[881,1128,1129],{"class":1117}," version",[881,1131,926],{"class":950},[881,1133,1123],{"class":887},[881,1135,1136],{"class":950},")",[881,1138,1139],{"class":950}," ->",[881,1141,1142],{"class":887}," dict",[881,1144,1145],{"class":950},":\n",[881,1147,1148,1151,1155],{"class":883,"line":978},[881,1149,1150],{"class":1078},"    \"\"\"",[881,1152,1154],{"class":1153},"sHwdD","Validate DDEX XML against official ERN schema.",[881,1156,1157],{"class":1078},"\"\"\"\n",[881,1159,1160,1163,1166],{"class":883,"line":1024},[881,1161,1162],{"class":990},"    xsd_url ",[881,1164,1165],{"class":950},"=",[881,1167,1168],{"class":950}," (\n",[881,1170,1172,1175],{"class":883,"line":1171},7,[881,1173,1174],{"class":1106},"        f",[881,1176,1177],{"class":891},"\"https://service.ddex.net/xml/ern/\"\n",[881,1179,1181,1183,1185,1188,1191,1194],{"class":883,"line":1180},8,[881,1182,1174],{"class":1106},[881,1184,987],{"class":891},[881,1186,1187],{"class":1034},"{",[881,1189,1190],{"class":990},"version",[881,1192,1193],{"class":1034},"}",[881,1195,1196],{"class":891},"/release-notification.xsd\"\n",[881,1198,1200],{"class":883,"line":1199},9,[881,1201,1202],{"class":950},"    )\n",[881,1204,1206],{"class":883,"line":1205},10,[881,1207,1101],{"emptyLinePlaceholder":1100},[881,1209,1211],{"class":883,"line":1210},11,[881,1212,1213],{"class":1153},"    # Fetch and compile schema\n",[881,1215,1217,1220,1222,1225,1227,1230,1232,1235,1237,1240,1242,1245],{"class":883,"line":1216},12,[881,1218,1219],{"class":990},"    response ",[881,1221,1165],{"class":950},[881,1223,1224],{"class":990}," requests",[881,1226,785],{"class":950},[881,1228,1229],{"class":1110},"get",[881,1231,1114],{"class":950},[881,1233,1234],{"class":1110},"xsd_url",[881,1236,1126],{"class":950},[881,1238,1239],{"class":1117}," timeout",[881,1241,1165],{"class":950},[881,1243,1244],{"class":1034},"10",[881,1246,1247],{"class":950},")\n",[881,1249,1251,1254,1256,1259],{"class":883,"line":1250},13,[881,1252,1253],{"class":990},"    response",[881,1255,785],{"class":950},[881,1257,1258],{"class":1110},"raise_for_status",[881,1260,1261],{"class":950},"()\n",[881,1263,1265,1268,1270,1273,1275,1278,1280,1283,1285,1288],{"class":883,"line":1264},14,[881,1266,1267],{"class":990},"    schema_root ",[881,1269,1165],{"class":950},[881,1271,1272],{"class":990}," etree",[881,1274,785],{"class":950},[881,1276,1277],{"class":1110},"fromstring",[881,1279,1114],{"class":950},[881,1281,1282],{"class":1110},"response",[881,1284,785],{"class":950},[881,1286,1287],{"class":946},"content",[881,1289,1247],{"class":950},[881,1291,1293,1296,1298,1300,1302,1305,1307,1310],{"class":883,"line":1292},15,[881,1294,1295],{"class":990},"    schema ",[881,1297,1165],{"class":950},[881,1299,1272],{"class":990},[881,1301,785],{"class":950},[881,1303,1304],{"class":1110},"XMLSchema",[881,1306,1114],{"class":950},[881,1308,1309],{"class":1110},"schema_root",[881,1311,1247],{"class":950},[881,1313,1315],{"class":883,"line":1314},16,[881,1316,1101],{"emptyLinePlaceholder":1100},[881,1318,1320],{"class":883,"line":1319},17,[881,1321,1322],{"class":1153},"    # Parse and validate\n",[881,1324,1326,1329,1331,1333,1335,1337,1339,1341,1343,1346],{"class":883,"line":1325},18,[881,1327,1328],{"class":990},"    xml_tree ",[881,1330,1165],{"class":950},[881,1332,1272],{"class":990},[881,1334,785],{"class":950},[881,1336,1277],{"class":1110},[881,1338,1114],{"class":950},[881,1340,1118],{"class":1110},[881,1342,785],{"class":950},[881,1344,1345],{"class":1110},"encode",[881,1347,1348],{"class":950},"())\n",[881,1350,1352,1355,1357,1360,1362,1365,1367,1370],{"class":883,"line":1351},19,[881,1353,1354],{"class":990},"    is_valid ",[881,1356,1165],{"class":950},[881,1358,1359],{"class":990}," schema",[881,1361,785],{"class":950},[881,1363,1364],{"class":1110},"validate",[881,1366,1114],{"class":950},[881,1368,1369],{"class":1110},"xml_tree",[881,1371,1247],{"class":950},[881,1373,1375],{"class":883,"line":1374},20,[881,1376,1101],{"emptyLinePlaceholder":1100},[881,1378,1380,1383,1385],{"class":883,"line":1379},21,[881,1381,1382],{"class":990},"    errors ",[881,1384,1165],{"class":950},[881,1386,1387],{"class":950}," []\n",[881,1389,1391,1394,1397,1400],{"class":883,"line":1390},22,[881,1392,1393],{"class":1078},"    if",[881,1395,1396],{"class":950}," not",[881,1398,1399],{"class":990}," is_valid",[881,1401,1145],{"class":950},[881,1403,1405,1408,1411,1414,1416,1418,1421],{"class":883,"line":1404},23,[881,1406,1407],{"class":1078},"        for",[881,1409,1410],{"class":990}," error ",[881,1412,1413],{"class":1078},"in",[881,1415,1359],{"class":990},[881,1417,785],{"class":950},[881,1419,1420],{"class":946},"error_log",[881,1422,1145],{"class":950},[881,1424,1426,1429,1431,1434],{"class":883,"line":1425},24,[881,1427,1428],{"class":990},"            errors",[881,1430,785],{"class":950},[881,1432,1433],{"class":1110},"append",[881,1435,1436],{"class":950},"({\n",[881,1438,1440,1443,1445,1447,1449,1452,1454,1456],{"class":883,"line":1439},25,[881,1441,1442],{"class":950},"                \"",[881,1444,883],{"class":891},[881,1446,987],{"class":950},[881,1448,926],{"class":950},[881,1450,1451],{"class":1110}," error",[881,1453,785],{"class":950},[881,1455,883],{"class":946},[881,1457,1458],{"class":950},",\n",[881,1460,1462,1464,1467,1469,1471,1473,1475,1477],{"class":883,"line":1461},26,[881,1463,1442],{"class":950},[881,1465,1466],{"class":891},"column",[881,1468,987],{"class":950},[881,1470,926],{"class":950},[881,1472,1451],{"class":1110},[881,1474,785],{"class":950},[881,1476,1466],{"class":946},[881,1478,1458],{"class":950},[881,1480,1482,1484,1487,1489,1491,1493,1495,1497],{"class":883,"line":1481},27,[881,1483,1442],{"class":950},[881,1485,1486],{"class":891},"message",[881,1488,987],{"class":950},[881,1490,926],{"class":950},[881,1492,1451],{"class":1110},[881,1494,785],{"class":950},[881,1496,1486],{"class":946},[881,1498,1458],{"class":950},[881,1500,1502,1504,1507,1509,1511,1513,1515,1518],{"class":883,"line":1501},28,[881,1503,1442],{"class":950},[881,1505,1506],{"class":891},"level",[881,1508,987],{"class":950},[881,1510,926],{"class":950},[881,1512,1451],{"class":1110},[881,1514,785],{"class":950},[881,1516,1517],{"class":946},"level_name",[881,1519,1458],{"class":950},[881,1521,1523],{"class":883,"line":1522},29,[881,1524,1525],{"class":950},"            })\n",[881,1527,1529],{"class":883,"line":1528},30,[881,1530,1101],{"emptyLinePlaceholder":1100},[881,1532,1534,1537,1540,1542,1545,1547,1549,1551,1553,1556,1559,1561,1563,1566,1568,1570,1572,1574,1576,1578],{"class":883,"line":1533},31,[881,1535,1536],{"class":1078},"    return",[881,1538,1539],{"class":950}," {",[881,1541,987],{"class":950},[881,1543,1544],{"class":891},"valid",[881,1546,987],{"class":950},[881,1548,926],{"class":950},[881,1550,1399],{"class":990},[881,1552,1126],{"class":950},[881,1554,1555],{"class":950}," \"",[881,1557,1558],{"class":891},"errors",[881,1560,987],{"class":950},[881,1562,926],{"class":950},[881,1564,1565],{"class":990}," errors",[881,1567,1126],{"class":950},[881,1569,1555],{"class":950},[881,1571,1190],{"class":891},[881,1573,987],{"class":950},[881,1575,926],{"class":950},[881,1577,1129],{"class":990},[881,1579,1580],{"class":950},"}\n",[928,1582,1584],{"id":1583},"music-industry-checks","Music industry checks",[749,1586,1587],{},"Beyond schema validation, the skill checks for issues that cause real distributor rejections:",[1589,1590,1591,1607],"table",{},[1592,1593,1594],"thead",{},[1595,1596,1597,1601,1604],"tr",{},[1598,1599,1600],"th",{},"Check",[1598,1602,1603],{},"Rule",[1598,1605,1606],{},"Example",[1608,1609,1610,1624,1637,1658,1671,1694],"tbody",{},[1595,1611,1612,1616,1619],{},[1613,1614,1615],"td",{},"ISRC",[1613,1617,1618],{},"Exactly 12 alphanumeric chars, no hyphens",[1613,1620,1621],{},[764,1622,1623],{},"USSM12345678",[1595,1625,1626,1629,1632],{},[1613,1627,1628],{},"UPC/EAN",[1613,1630,1631],{},"12 or 13 digits",[1613,1633,1634],{},[764,1635,1636],{},"123456789012",[1595,1638,1639,1642,1648],{},[1613,1640,1641],{},"Territory",[1613,1643,1644,1645],{},"ISO 3166-1 alpha-2 or ",[764,1646,1647],{},"Worldwide",[1613,1649,1650,991,1653,991,1656],{},[764,1651,1652],{},"US",[764,1654,1655],{},"GB",[764,1657,1647],{},[1595,1659,1660,1663,1666],{},[1613,1661,1662],{},"Duration",[1613,1664,1665],{},"ISO 8601 format",[1613,1667,1668],{},[764,1669,1670],{},"PT3M30S",[1595,1672,1673,1676,1686],{},[1613,1674,1675],{},"Resource refs",[1613,1677,1678,1679,1682,1683],{},"Every ",[764,1680,1681],{},"ReleaseResourceReference"," must match a ",[764,1684,1685],{},"ResourceReference",[1613,1687,1688,1691,1692],{},[764,1689,1690],{},"A1"," links to ",[764,1693,1690],{},[1595,1695,1696,1699,1702],{},[1613,1697,1698],{},"ParentalWarning",[1613,1700,1701],{},"Must be present",[1613,1703,1704,991,1707],{},[764,1705,1706],{},"NotExplicit",[764,1708,1709],{},"Explicit",[1711,1712,1713],"warning",{},[749,1714,1715,1716,1719,1720,1723],{},"ISRC codes use hyphens for display (",[764,1717,1718],{},"US-SM1-23-45678",") but ",[759,1721,1722],{},"never in XML",". This is one of the most common validation errors we see.",[928,1725,1727],{"id":1726},"output-format","Output format",[749,1729,1730],{},"The skill defines exactly how Claude should present results:",[799,1732,1736],{"className":1733,"code":1734,"filename":1735,"language":804,"meta":805},[802],"DDEX ERN 382 - Valid\n\nSummary:\n- Releases: 1\n- Sound Recordings: 3\n- Images: 1\n- Territory: Worldwide\n- Message Type: LiveMessage\n","valid output",[764,1737,1734],{"__ignoreMap":805},[749,1739,1740],{},"And when errors are found:",[799,1742,1746],{"className":1743,"code":1744,"filename":1745,"language":804,"meta":805},[802],"DDEX ERN 382 - 2 error(s) found\n\n| # | Line | Error                           | Suggested Fix                    |\n|---|------|---------------------------------|----------------------------------|\n| 1 | 36   | Element 'ISRC': '' is not valid | Add 12-char ISRC: CCXXXYYNNNNN   |\n| 2 | 45   | Missing element 'TerritoryCode' | Add \u003CTerritoryCode>Worldwide\u003C/…> |\n","error output",[764,1747,1744],{"__ignoreMap":805},[769,1749,1750],{},[749,1751,1752,1753,1756,1757,785],{},"The full SKILL.md also includes a ",[759,1754,1755],{},"Common Issues"," section with pre-documented fixes for namespace errors, resource reference mismatches, and territory code problems. See the complete file in the ",[779,1758,1761],{"href":1759,"rel":1760},"https://github.com/musictechlab/ddex-validate/blob/main/SKILL.md",[783],"GitHub repo",[787,1763,1765],{"id":1764},"step-4-add-supporting-files","Step 4: Add supporting files",[749,1767,1768],{},"The skill needs two more pieces:",[749,1770,1771,1776],{},[759,1772,1773],{},[764,1774,1775],{},"references/ern-structure.md"," - the complete ERN element hierarchy (MessageHeader, ResourceList, ReleaseList, DealList), field format rules, and version differences between ERN 3.8.2 and 4.1.1+. Claude loads this on demand when it needs deeper context during validation.",[749,1778,1779,1784],{},[759,1780,1781],{},[764,1782,1783],{},"assets/ern382-sample.xml"," - a minimal but valid ERN 3.8.2 file with a MessageHeader, one SoundRecording (ISRC, artist, genre, technical details), one Image, and one Release.",[1037,1786,1787,1794],{},[749,1788,1789,1790,1793],{},"You don't need to write these from scratch. Clone the ",[779,1791,1761],{"href":781,"rel":1792},[783]," and the full skill is ready to use:",[799,1795,1797],{"className":875,"code":1796,"language":877,"meta":805,"style":805},"git clone https://github.com/musictechlab/ddex-validate.git ~/.claude/skills/ddex-validate\n",[764,1798,1799],{"__ignoreMap":805},[881,1800,1801,1804,1807,1810],{"class":883,"line":884},[881,1802,1803],{"class":887},"git",[881,1805,1806],{"class":891}," clone",[881,1808,1809],{"class":891}," https://github.com/musictechlab/ddex-validate.git",[881,1811,1812],{"class":891}," ~/.claude/skills/ddex-validate\n",[787,1814,1816],{"id":1815},"step-5-test-the-skill","Step 5: Test the skill",[749,1818,1819],{},"Once installed, test it from three angles:",[749,1821,1822,1825],{},[759,1823,1824],{},"Should trigger"," - try prompts like these:",[799,1827,1830],{"className":1828,"code":1829,"language":804,"meta":805},[802],"\"Validate this DDEX file\"\n\"Check my ERN XML for errors\"\n\"Is this release metadata valid?\"\n",[764,1831,1829],{"__ignoreMap":805},[749,1833,1834,1837],{},[759,1835,1836],{},"Error detection"," - introduce common mistakes and verify the skill catches them:",[799,1839,1844],{"className":1840,"code":1841,"filename":1842,"language":1843,"meta":805,"style":805},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!-- Missing ISRC -->\n\u003CSoundRecordingId>\n  \u003CCatalogNumber Namespace=\"PADPIDA2023001\">CAT001\u003C/CatalogNumber>\n\u003C/SoundRecordingId>\n\n\u003C!-- Invalid territory code -->\n\u003CTerritoryCode>United States\u003C/TerritoryCode>\n\n\u003C!-- Mismatched resource reference -->\n\u003CReleaseResourceReference>A99\u003C/ReleaseResourceReference>\n\u003C!-- when ResourceReference is \"A1\" -->\n","common-errors.xml","xml",[764,1845,1846,1851,1862,1895,1903,1907,1912,1930,1934,1939,1956],{"__ignoreMap":805},[881,1847,1848],{"class":883,"line":884},[881,1849,1850],{"class":1153},"\u003C!-- Missing ISRC -->\n",[881,1852,1853,1856,1859],{"class":883,"line":898},[881,1854,1855],{"class":950},"\u003C",[881,1857,1858],{"class":946},"SoundRecordingId",[881,1860,1861],{"class":950},">\n",[881,1863,1864,1867,1870,1873,1875,1877,1880,1882,1885,1888,1891,1893],{"class":883,"line":966},[881,1865,1866],{"class":950},"  \u003C",[881,1868,1869],{"class":946},"CatalogNumber",[881,1871,1872],{"class":1106}," Namespace",[881,1874,1165],{"class":950},[881,1876,987],{"class":950},[881,1878,1879],{"class":891},"PADPIDA2023001",[881,1881,987],{"class":950},[881,1883,1884],{"class":950},">",[881,1886,1887],{"class":990},"CAT001",[881,1889,1890],{"class":950},"\u003C/",[881,1892,1869],{"class":946},[881,1894,1861],{"class":950},[881,1896,1897,1899,1901],{"class":883,"line":972},[881,1898,1890],{"class":950},[881,1900,1858],{"class":946},[881,1902,1861],{"class":950},[881,1904,1905],{"class":883,"line":978},[881,1906,1101],{"emptyLinePlaceholder":1100},[881,1908,1909],{"class":883,"line":1024},[881,1910,1911],{"class":1153},"\u003C!-- Invalid territory code -->\n",[881,1913,1914,1916,1919,1921,1924,1926,1928],{"class":883,"line":1171},[881,1915,1855],{"class":950},[881,1917,1918],{"class":946},"TerritoryCode",[881,1920,1884],{"class":950},[881,1922,1923],{"class":990},"United States",[881,1925,1890],{"class":950},[881,1927,1918],{"class":946},[881,1929,1861],{"class":950},[881,1931,1932],{"class":883,"line":1180},[881,1933,1101],{"emptyLinePlaceholder":1100},[881,1935,1936],{"class":883,"line":1199},[881,1937,1938],{"class":1153},"\u003C!-- Mismatched resource reference -->\n",[881,1940,1941,1943,1945,1947,1950,1952,1954],{"class":883,"line":1205},[881,1942,1855],{"class":950},[881,1944,1681],{"class":946},[881,1946,1884],{"class":950},[881,1948,1949],{"class":990},"A99",[881,1951,1890],{"class":950},[881,1953,1681],{"class":946},[881,1955,1861],{"class":950},[881,1957,1958],{"class":883,"line":1210},[881,1959,1960],{"class":1153},"\u003C!-- when ResourceReference is \"A1\" -->\n",[749,1962,1963,1966],{},[759,1964,1965],{},"Should NOT trigger"," - prompts like \"Write a Python function\" or \"Help me with CSS\" should not activate the skill.",[787,1968,1970],{"id":1969},"how-it-works-under-the-hood","How it works under the hood",[749,1972,1973],{},"When you type a prompt that matches the skill's description triggers, Claude's progressive disclosure system kicks in:",[799,1975,1979],{"className":1976,"code":1977,"language":1978,"meta":805,"style":805},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","graph LR\n    A[User prompt] --> B{Match?}\n    B -->|Yes| C[Level 1: Frontmatter]\n    B -->|No| D[Skip skill]\n    C --> E[Level 2: SKILL.md body]\n    E --> F{Need more context?}\n    F -->|Yes| G[Level 3: references/]\n    F -->|No| H[Execute validation]\n    G --> H\n","mermaid",[764,1980,1981,1986,1991,1996,2001,2006,2011,2016,2021],{"__ignoreMap":805},[881,1982,1983],{"class":883,"line":884},[881,1984,1985],{"class":990},"graph LR\n",[881,1987,1988],{"class":883,"line":898},[881,1989,1990],{"class":990},"    A[User prompt] --> B{Match?}\n",[881,1992,1993],{"class":883,"line":966},[881,1994,1995],{"class":990},"    B -->|Yes| C[Level 1: Frontmatter]\n",[881,1997,1998],{"class":883,"line":972},[881,1999,2000],{"class":990},"    B -->|No| D[Skip skill]\n",[881,2002,2003],{"class":883,"line":978},[881,2004,2005],{"class":990},"    C --> E[Level 2: SKILL.md body]\n",[881,2007,2008],{"class":883,"line":1024},[881,2009,2010],{"class":990},"    E --> F{Need more context?}\n",[881,2012,2013],{"class":883,"line":1171},[881,2014,2015],{"class":990},"    F -->|Yes| G[Level 3: references/]\n",[881,2017,2018],{"class":883,"line":1180},[881,2019,2020],{"class":990},"    F -->|No| H[Execute validation]\n",[881,2022,2023],{"class":883,"line":1199},[881,2024,2025],{"class":990},"    G --> H\n",[749,2027,2028],{},"This three-level system keeps token usage minimal for non-DDEX conversations while providing deep expertise when needed:",[845,2030,2032,2036,2040],{"className":2031},[848,849,850,851,852],[854,2033],{"description":2034,"title":2035},"Claude reads `name` and `description`. Just enough to decide: \"is this a DDEX request?\"","Level 1 - Frontmatter",[854,2037],{"description":2038,"title":2039},"The full 5-step workflow: parse, validate, check industry rules, report results.","Level 2 - Instructions",[854,2041],{"description":2042,"title":2043},"Deep ERN structure docs, field formats, version differences. Loaded only when needed.","Level 3 - References",[787,2045,2047],{"id":2046},"whats-next","What's next",[749,2049,2050,2051,2054],{},"This skill covers ",[759,2052,2053],{},"standalone validation"," - no external services required. But there are natural extensions:",[820,2056,2057,2068,2074,2080],{},[823,2058,2059,2062,2063,2067],{},[759,2060,2061],{},"MCP integration"," - connect to your distributor's API to validate ",[2064,2065,2066],"em",{},"and"," submit in one workflow",[823,2069,2070,2073],{},[759,2071,2072],{},"Batch validation"," - process an entire directory of ERN files before a bulk delivery",[823,2075,2076,2079],{},[759,2077,2078],{},"DSRF support"," - extend to Digital Sales Report Format flat files (tab-separated, not XML)",[823,2081,2082,2085],{},[759,2083,2084],{},"Auto-fix mode"," - instead of just reporting errors, have Claude rewrite the XML with fixes applied",[749,2087,2088,2089,2092,2093,2096],{},"You could also combine this with an AudioSalad or Revelator delivery skill - validate the DDEX, then push it to your distributor, all from one conversation. We've already built similar Claude integrations: a ",[779,2090,2091],{"href":639},"SignNow MCP server"," for e-signatures and a ",[779,2094,2095],{"href":169},"Bandcamp MCP server"," for revenue analytics.",[787,2098,2100],{"id":2099},"wrapping-up","Wrapping up",[749,2102,2103,2104,2106],{},"DDEX validation is a perfect fit for a Claude skill: it's a well-defined workflow, requires domain knowledge that doesn't change often, and benefits from consistent execution. Instead of context-switching to a web tool or remembering CLI flags, you type ",[764,2105,766],{}," and get expert-level feedback in seconds.",[749,2108,2109],{},"The full skill is open source - clone it and start validating:",[799,2111,2112],{"className":875,"code":1796,"language":877,"meta":805,"style":805},[764,2113,2114],{"__ignoreMap":805},[881,2115,2116,2118,2120,2122],{"class":883,"line":884},[881,2117,1803],{"class":887},[881,2119,1806],{"class":891},[881,2121,1809],{"class":891},[881,2123,1812],{"class":891},[2125,2126,2127],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":805,"searchDepth":898,"depth":898,"links":2129},[2130,2131,2132,2133,2134,2140,2141,2142,2143,2144],{"id":789,"depth":898,"text":790},{"id":817,"depth":898,"text":818},{"id":839,"depth":898,"text":840},{"id":868,"depth":898,"text":869},{"id":908,"depth":898,"text":909,"children":2135},[2136,2137,2138,2139],{"id":930,"depth":966,"text":931},{"id":1061,"depth":966,"text":1062},{"id":1583,"depth":966,"text":1584},{"id":1726,"depth":966,"text":1727},{"id":1764,"depth":898,"text":1765},{"id":1815,"depth":898,"text":1816},{"id":1969,"depth":898,"text":1970},{"id":2046,"depth":898,"text":2047},{"id":2099,"depth":898,"text":2100},"music-data",null,"2026-02-20T00:00:00.000Z","A step-by-step guide to creating a Claude Code skill that validates DDEX ERN XML files against official schemas - catching metadata errors before they reach distributors.","md",[2151,2153,2156],{"question":790,"answer":2152},"A Claude skill is a folder containing instructions (SKILL.md) that teaches Claude how to handle specific tasks or workflows. Skills are reusable across Claude.ai, Claude Code, and the API.",{"question":2154,"answer":2155},"What is DDEX ERN?","DDEX ERN (Electronic Release Notification) is the music industry standard XML format for communicating metadata about music releases between labels, distributors, and digital service providers like Spotify and Apple Music.",{"question":2157,"answer":2158},"Do I need an MCP server for this skill?","No. This is a standalone skill that uses Claude's built-in code execution capabilities. No MCP server or external integrations are required.",{"src":2160},"/images/blog/musictechlab_blog_building-a-claude-skill-for-ddex-validation-music-metadata.webp",{"enabled":1100,"items":2162},[2163,2166,2169],{"text":2164,"icon":2165},"A Claude skill validates DDEX ERN XML files on demand with no external services required.","i-lucide-sparkles",{"text":2167,"icon":2168},"Progressive disclosure loads domain knowledge only when needed, keeping token usage low.","i-lucide-zap",{"text":2170,"icon":2171},"The skill catches common rejection causes like hyphenated ISRCs and missing territory codes.","i-lucide-alert-triangle",{},{"title":2174,"description":2175},"Building a Claude Skill for DDEX Validation | MusicTech Lab","Learn how to build a Claude Code skill that validates DDEX ERN XML files against official schemas. Step-by-step tutorial for music tech developers.",[984,2177,2178],"AI","metadata","trud8uwiY6UslRodHfCJ1YY0qyq94qzUFd1IQcwab9M",[2181,2183],{"title":104,"path":105,"stem":106,"description":2182,"children":-1},"Sharing a rough idea with a collaborator requires exporting, uploading, sending a link, then getting feedback via text. There's no Google Docs-style commenting for audio.",{"title":112,"path":113,"stem":114,"description":2184,"children":-1},"A practical guide for music distributors evaluating a hybrid approach: custom frontend with Revelator's API as the delivery backbone. Covers architecture, DDEX integration, territory handling, and when to go fully independent.",[2186,4095,4286,5209],{"id":2187,"title":120,"authors":2188,"badge":2191,"body":2194,"category":2145,"client":2146,"date":4057,"description":4058,"extension":2149,"faq":4059,"featured":69,"featuredOrder":2146,"hidden":69,"image":4069,"keyTakeaways":4071,"meta":4085,"navigation":1100,"path":121,"seo":4086,"status":2146,"stem":122,"tags":4089,"teaser":2146,"__hash__":4094,"score":972},"posts/blog/music-data/c2pa-and-ddex-authenticity-meets-rights-in-the-age-of-ai-music.md",[2189],{"name":738,"to":739,"avatar":2190},{"src":741},{"label":2192,"color":2193},"Distribution","#0ea5e9",{"type":746,"value":2195,"toc":4030},[2196,2199,2215,2219,2222,2226,2229,2247,2254,2265,2269,2272,2300,2304,2307,2311,2314,2382,2387,2391,2394,2426,2433,2437,2605,2609,2612,2659,2663,2670,2673,2684,2688,2691,2695,2698,2709,2713,2716,2727,2743,2747,2750,2865,2876,2880,2883,3027,3031,3034,3043,3048,3065,3082,3086,3090,3097,3600,3604,3619,3895,3906,3910,3977,3981,3991,3994,3997,4024,4027],[749,2197,2198],{},"A track lands on a streaming platform. It sounds like a well-known artist, but was it actually recorded by them -or generated by an AI model trained on their catalog? And regardless of origin, who should receive the royalties?",[749,2200,2201,2202,2205,2206,2209,2210,2205,2213,785],{},"These two questions -",[759,2203,2204],{},"\"is this real?\""," and ",[759,2207,2208],{},"\"who gets paid?\""," -sit at the heart of the music industry's biggest challenges today. Two very different standards are stepping up to answer them: ",[759,2211,2212],{},"C2PA",[759,2214,984],{},[787,2216,2218],{"id":2217},"what-is-c2pa","What is C2PA?",[749,2220,2221],{},"C2PA (Coalition for Content Provenance and Authenticity) is an open standard for proving the origin and history of digital content. Think of it as a tamper-proof seal for media files: images, video, audio, and documents.",[928,2223,2225],{"id":2224},"how-it-works","How it works",[749,2227,2228],{},"The standard operates through three core mechanisms:",[845,2230,2232,2237,2242],{"className":2231},[848,849,850,851,852],[854,2233],{"description":2234,"icon":2235,"title":2236},"Cryptographically signed metadata embedded in files. They record who created or edited the content, what tools were used, and when the changes happened.","i-lucide-fingerprint","Content Credentials",[854,2238],{"description":2239,"icon":2240,"title":2241},"Structured metadata containers attached to content. Each manifest holds assertions (claims about the content) and a digital signature that can be verified against a certificate chain.","i-lucide-file-check","Manifests",[854,2243],{"description":2244,"icon":2245,"title":2246},"Cryptographic ties between the manifest and the actual content bytes. If someone tampers with the file, the binding breaks and verification fails.","i-lucide-link","Hard Bindings",[749,2248,2249,2250,2253],{},"Every time content is created or edited, a new manifest entry is added, forming a ",[759,2251,2252],{},"provenance chain",". A camera captures an image and signs it. An editor crops it and adds a new signed manifest. An AI model generates a track and labels it as AI-created. Each step is recorded and verifiable.",[769,2255,2256],{},[749,2257,2258,2259,2264],{},"C2PA was ",[779,2260,2263],{"href":2261,"rel":2262},"https://c2pa.org/about/",[783],"founded by Adobe, Arm, Intel, Microsoft, and Truepic"," as a Joint Development Foundation project. It unifies two earlier initiatives: the Adobe-led Content Authenticity Initiative (CAI) and Project Origin, a Microsoft- and BBC-led effort tackling disinformation in digital news. The coalition has since grown to include Sony, Nikon, Google, OpenAI, and many others.",[928,2266,2268],{"id":2267},"c2pa-for-audio","C2PA for audio",[749,2270,2271],{},"While C2PA gained traction in the image and video space first, audio support is growing. The spec already supports audio file formats, and the implications for music are significant:",[820,2273,2274,2288,2294],{},[823,2275,2276,2279,2280,2283,2284,2287],{},[759,2277,2278],{},"AI transparency"," -a generative model like Suno or Udio could embed a C2PA manifest with a ",[764,2281,2282],{},"digitalSourceType"," (defined by IPTC) of ",[764,2285,2286],{},"trainedAlgorithmicMedia",", the standard way to declare content as AI-generated. Additional assertions can capture model details and prompts",[823,2289,2290,2293],{},[759,2291,2292],{},"Recording provenance"," -a DAW or recording device could sign audio at the point of capture, creating a verifiable chain from microphone to master. We are just starting to see reference implementations where stems -with or without provenance -can be mixed into a final and saved with provenance that includes ingredients, but these are demos and PoCs. No DAW has committed to shipping C2PA support yet",[823,2295,2296,2299],{},[759,2297,2298],{},"Remix and sample tracking"," -each derivative work adds a manifest, linking back to source material",[787,2301,2303],{"id":2302},"what-is-ddex","What is DDEX?",[749,2305,2306],{},"DDEX (Digital Data Exchange) is a group of music industry players that builds standards for sharing data about music. While C2PA asks \"is this content real?\", DDEX asks \"who owns this, and how should they be paid?\"",[928,2308,2310],{"id":2309},"the-ddex-standard-family","The DDEX standard family",[749,2312,2313],{},"DDEX isn't a single standard -it's a family of XML and JSON-based messaging formats:",[1589,2315,2316,2326],{},[1592,2317,2318],{},[1595,2319,2320,2323],{},[1598,2321,2322],{},"Standard",[1598,2324,2325],{},"Purpose",[1608,2327,2328,2338,2349,2360,2371],{},[1595,2329,2330,2335],{},[1613,2331,2332,2334],{},[759,2333,996],{}," (Electronic Release Notification)",[1613,2336,2337],{},"Delivering releases from labels to DSPs",[1595,2339,2340,2346],{},[1613,2341,2342,2345],{},[759,2343,2344],{},"MWN"," (Musical Works Notification)",[1613,2347,2348],{},"Communicating musical works data between publishers and societies",[1595,2350,2351,2357],{},[1613,2352,2353,2356],{},[759,2354,2355],{},"MEAD"," (Media Enrichment and Description)",[1613,2358,2359],{},"Enriching metadata for discovery and curation",[1595,2361,2362,2368],{},[1613,2363,2364,2367],{},[759,2365,2366],{},"DSR"," (Digital Sales Reporting)",[1613,2369,2370],{},"Reporting sales and streams back to rights holders",[1595,2372,2373,2379],{},[1613,2374,2375,2378],{},[759,2376,2377],{},"RDR"," (Recording Data and Rights)",[1613,2380,2381],{},"Linking sound recordings to musical works and their rights holders",[1037,2383,2384],{},[749,2385,2386],{},"If you distribute music to Spotify, Apple Music, Amazon, or any major DSP, your distributor is almost certainly using DDEX ERN messages under the hood.",[928,2388,2390],{"id":2389},"what-ddex-carries","What DDEX carries",[749,2392,2393],{},"A DDEX message typically contains:",[820,2395,2396,2402,2408,2414,2420],{},[823,2397,2398,2401],{},[759,2399,2400],{},"Release metadata"," -title, artist, label, UPC/EAN, genre, release date",[823,2403,2404,2407],{},[759,2405,2406],{},"Track-level data"," -ISRC codes, duration, contributors, territories",[823,2409,2410,2413],{},[759,2411,2412],{},"Rights and licensing"," -who owns what, in which territories, under which terms",[823,2415,2416,2419],{},[759,2417,2418],{},"Commercial terms"," -pricing, availability windows, pre-order dates",[823,2421,2422,2425],{},[759,2423,2424],{},"Royalty reporting"," -stream counts, revenue splits, payment details",[749,2427,2428,2429,2432],{},"In practice, this metadata arrives from every distributor in different formats and naming conventions. Even something as simple as a retailer name can appear ",[779,2430,2431],{"href":81},"830 different ways across sources",", which is why normalisation is a critical step before any of this data becomes useful.",[787,2434,2436],{"id":2435},"who-are-these-standards-designed-for","Who are these standards designed for?",[845,2438,2441,2524],{"className":2439},[848,849,2440,851,852],"md:grid-cols-2",[854,2442,2446],{"description":2443,"icon":2444,"title":2445},"Anyone who creates, distributes, or consumes digital content.","i-lucide-building-2","C2PA -Who benefits",[1589,2447,2448,2458],{},[1592,2449,2450],{},[1595,2451,2452,2455],{},[1598,2453,2454],{},"Stakeholder",[1598,2456,2457],{},"How they use C2PA",[1608,2459,2460,2471,2482,2493,2503,2513],{},[1595,2461,2462,2468],{},[1613,2463,2464,2467],{},[759,2465,2466],{},"DAW vendors"," (Ableton, Logic, Pro Tools)",[1613,2469,2470],{},"Sign audio at export to prove origin",[1595,2472,2473,2479],{},[1613,2474,2475,2478],{},[759,2476,2477],{},"AI music platforms"," (Suno, Udio)",[1613,2480,2481],{},"Label outputs as AI-generated with model details",[1595,2483,2484,2490],{},[1613,2485,2486,2489],{},[759,2487,2488],{},"Streaming platforms"," (Spotify, Apple Music)",[1613,2491,2492],{},"Verify content authenticity at ingest",[1595,2494,2495,2500],{},[1613,2496,2497],{},[759,2498,2499],{},"News organizations",[1613,2501,2502],{},"Confirm audio/video hasn't been manipulated",[1595,2504,2505,2510],{},[1613,2506,2507],{},[759,2508,2509],{},"Creators and artists",[1613,2511,2512],{},"Prove their work is original and human-made",[1595,2514,2515,2521],{},[1613,2516,2517,2520],{},[759,2518,2519],{},"Hardware manufacturers"," (Nikon, Sony)",[1613,2522,2523],{},"Embed provenance at point of capture",[854,2525,2529],{"description":2526,"icon":2527,"title":2528},"Music industry players who need to exchange rights and commercial data.","i-lucide-music","DDEX -Who benefits",[1589,2530,2531,2540],{},[1592,2532,2533],{},[1595,2534,2535,2537],{},[1598,2536,2454],{},[1598,2538,2539],{},"How they use DDEX",[1608,2541,2542,2552,2563,2574,2584,2595],{},[1595,2543,2544,2549],{},[1613,2545,2546],{},[759,2547,2548],{},"Record labels",[1613,2550,2551],{},"Deliver releases and metadata to DSPs",[1595,2553,2554,2560],{},[1613,2555,2556,2559],{},[759,2557,2558],{},"Distributors"," (DistroKid, TuneCore)",[1613,2561,2562],{},"Automate release delivery via ERN messages",[1595,2564,2565,2571],{},[1613,2566,2567,2570],{},[759,2568,2569],{},"DSPs"," (Spotify, Apple Music, Amazon)",[1613,2572,2573],{},"Ingest releases with structured rights data",[1595,2575,2576,2581],{},[1613,2577,2578],{},[759,2579,2580],{},"Publishers",[1613,2582,2583],{},"Communicate musical works ownership via MWN",[1595,2585,2586,2592],{},[1613,2587,2588,2591],{},[759,2589,2590],{},"Collecting societies"," (ASCAP, PRS, ZAIKS)",[1613,2593,2594],{},"Process royalty claims and distributions",[1595,2596,2597,2602],{},[1613,2598,2599],{},[759,2600,2601],{},"Independent artists",[1613,2603,2604],{},"Get paid correctly through standardized reporting",[787,2606,2608],{"id":2607},"the-fundamental-difference","The fundamental difference",[749,2610,2611],{},"Here's the core distinction:",[845,2613,2615,2637],{"className":2614},[848,849,2440,851,852],[854,2616,2620],{"description":2617,"icon":2618,"title":2619},"Was this content tampered with? Who created it? Was AI involved?","i-lucide-shield-check","C2PA -Trust Layer",[820,2621,2622,2625,2628,2631,2634],{},[823,2623,2624],{},"Cryptographic proof of origin",[823,2626,2627],{},"Tamper-evident edit history",[823,2629,2630],{},"AI disclosure and labeling",[823,2632,2633],{},"Works on any digital media",[823,2635,2636],{},"PKI-based trust model (see below)",[854,2638,2642],{"description":2639,"icon":2640,"title":2641},"Who owns the rights? How should royalties be split? Where can this be distributed?","i-lucide-receipt","DDEX -Commerce Layer",[820,2643,2644,2647,2650,2653,2656],{},[823,2645,2646],{},"Rights ownership and splits",[823,2648,2649],{},"Commercial metadata exchange",[823,2651,2652],{},"Royalty reporting and payment",[823,2654,2655],{},"Music industry specific",[823,2657,2658],{},"B2B contractual trust model",[928,2660,2662],{"id":2661},"how-c2pa-trust-works-pki-in-plain-terms","How C2PA trust works: PKI in plain terms",[749,2664,2665,2666,2669],{},"C2PA relies on ",[759,2667,2668],{},"Public Key Infrastructure (PKI)",", the same trust system that secures HTTPS websites. Every app or device that creates content holds a private key and a certificate from a trusted authority. When a C2PA manifest is signed, anyone can check that signature against the certificate chain, up to a root Certificate Authority (CA). If it checks out, you know the manifest is untouched and you know who produced it. Change even a single byte of the file, and the signature breaks.",[749,2671,2672],{},"In practice, this means a DAW vendor like Ableton could obtain a C2PA certificate, sign every exported master, and any platform receiving that file can verify it came from Ableton's software, untouched.",[749,2674,2675,2676,2679,2680,2683],{},"They operate at different layers of the content lifecycle. C2PA is about the ",[759,2677,2678],{},"integrity of the content itself"," -its provenance and authenticity. DDEX is about the ",[759,2681,2682],{},"business logic surrounding the content"," -ownership, distribution, and compensation.",[787,2685,2687],{"id":2686},"why-ai-music-needs-both","Why AI music needs both",[749,2689,2690],{},"The rise of AI-generated music is exactly why both standards matter now.",[928,2692,2694],{"id":2693},"the-authenticity-problem","The authenticity problem",[749,2696,2697],{},"When an AI model can generate a track that sounds identical to a human recording, platforms, listeners, and rights holders all need to know the origin. Without C2PA-style provenance:",[820,2699,2700,2703,2706],{},[823,2701,2702],{},"A generated track could be uploaded as an \"original recording\" and claim royalties under false pretenses",[823,2704,2705],{},"Training data attribution becomes impossible to verify",[823,2707,2708],{},"Deepfake audio of real artists erodes trust across the entire ecosystem",[928,2710,2712],{"id":2711},"the-rights-problem","The rights problem",[749,2714,2715],{},"Even when AI origin is disclosed, the rights questions are hard:",[820,2717,2718,2721,2724],{},[823,2719,2720],{},"Who owns an AI-generated track -the prompter, the model operator, or the training data contributors?",[823,2722,2723],{},"If a model was trained on copyrighted recordings, how should those rights holders be compensated?",[823,2725,2726],{},"How do existing DDEX workflows handle a \"performer\" that is a language model?",[1711,2728,2729],{},[749,2730,2731,2732,991,2735,2738,2739,2742],{},"Current DDEX schemas weren't built for AI-generated content. Fields like ",[764,2733,2734],{},"Artist",[764,2736,2737],{},"Performer",", and ",[764,2740,2741],{},"Contributor"," assume human creators. The industry will need to extend these standards, or build new ones, to handle AI provenance and attribution.",[928,2744,2746],{"id":2745},"the-combined-solution","The combined solution",[749,2748,2749],{},"Imagine a future where a single music file carries both layers:",[845,2751,2753,2812],{"className":2752},[848,849,2440,851,852],[854,2754,2757],{"description":2755,"icon":2618,"title":2756},"Authenticity and provenance layer embedded in the file.","C2PA Manifest",[1589,2758,2759,2769],{},[1592,2760,2761],{},[1595,2762,2763,2766],{},[1598,2764,2765],{},"Field",[1598,2767,2768],{},"Value",[1608,2770,2771,2779,2788,2796,2804],{},[1595,2772,2773,2776],{},[1613,2774,2775],{},"Created by",[1613,2777,2778],{},"SunoAI v4.0",[1595,2780,2781,2783],{},[1613,2782,2282],{},[1613,2784,2785,2787],{},[764,2786,2286],{}," (IPTC)",[1595,2789,2790,2793],{},[1613,2791,2792],{},"Prompt",[1613,2794,2795],{},"\"upbeat jazz fusion, 120 BPM\"",[1595,2797,2798,2801],{},[1613,2799,2800],{},"Training data",[1613,2802,2803],{},"Licensed Dataset X",[1595,2805,2806,2809],{},[1613,2807,2808],{},"Signature",[1613,2810,2811],{},"Valid (SunoAI cert)",[854,2813,2816],{"description":2814,"icon":2640,"title":2815},"Commercial and rights layer for distribution and payment.","DDEX Metadata",[1589,2817,2818,2826],{},[1592,2819,2820],{},[1595,2821,2822,2824],{},[1598,2823,2765],{},[1598,2825,2768],{},[1608,2827,2828,2835,2843,2851,2857],{},[1595,2829,2830,2832],{},[1613,2831,1615],{},[1613,2833,2834],{},"USXX42312345",[1595,2836,2837,2840],{},[1613,2838,2839],{},"Rights holder",[1613,2841,2842],{},"Acme Music LLC",[1595,2844,2845,2848],{},[1613,2846,2847],{},"Royalty split",[1613,2849,2850],{},"70% publisher / 30% AI",[1595,2852,2853,2855],{},[1613,2854,1641],{},[1613,2856,1647],{},[1595,2858,2859,2862],{},[1613,2860,2861],{},"Distributor",[1613,2863,2864],{},"DistroKid",[749,2866,2867,2868,2871,2872,2875],{},"The C2PA layer provides ",[759,2869,2870],{},"verifiable proof"," of how the content was created. The DDEX layer provides ",[759,2873,2874],{},"the commercial framework"," for distributing it and paying the right parties.",[787,2877,2879],{"id":2878},"technical-integration-points","Technical integration points",[749,2881,2882],{},"For developers and music tech teams thinking about implementation, here are the key integration points:",[845,2884,2886,2929,2986],{"className":2885},[848,849,850,851,852],[854,2887,2891],{"description":2888,"icon":2889,"title":2890},"When a track arrives at a DSP or distributor, run these checks in sequence.","i-lucide-scan-search","Ingest Pipeline",[1589,2892,2893,2903],{},[1592,2894,2895],{},[1595,2896,2897,2900],{},[1598,2898,2899],{},"Step",[1598,2901,2902],{},"Action",[1608,2904,2905,2913,2921],{},[1595,2906,2907,2910],{},[1613,2908,2909],{},"Validate C2PA",[1613,2911,2912],{},"Check signature chain, verify content integrity, extract provenance",[1595,2914,2915,2918],{},[1613,2916,2917],{},"Parse DDEX",[1613,2919,2920],{},"Extract rights, contributors, and commercial terms",[1595,2922,2923,2926],{},[1613,2924,2925],{},"Cross-reference",[1613,2927,2928],{},"Flag mismatches (e.g. C2PA says \"AI-generated\" but DDEX lists a human performer)",[854,2930,2934],{"description":2931,"icon":2932,"title":2933},"C2PA provenance data can automatically populate DDEX fields.","i-lucide-merge","Metadata Enrichment",[1589,2935,2936,2946],{},[1592,2937,2938],{},[1595,2939,2940,2943],{},[1598,2941,2942],{},"C2PA Source",[1598,2944,2945],{},"DDEX Target",[1608,2947,2948,2963,2972],{},[1595,2949,2950,2955],{},[1613,2951,2952],{},[764,2953,2954],{},"creator",[1613,2956,2957,2960,2961],{},[764,2958,2959],{},"DisplayArtist"," / ",[764,2962,2741],{},[1595,2964,2965,2969],{},[1613,2966,2967],{},[764,2968,2282],{},[1613,2970,2971],{},"Extension field for AI disclosure",[1595,2973,2974,2980],{},[1613,2975,2976,2979],{},[764,2977,2978],{},"source material"," refs",[1613,2981,2982,2985],{},[764,2983,2984],{},"RelatedRelease"," links",[854,2987,2991],{"description":2988,"icon":2989,"title":2990},"Before distributing a track, a platform should verify both layers.","i-lucide-check-circle","Rights Verification",[1589,2992,2993,3001],{},[1592,2994,2995],{},[1595,2996,2997,2999],{},[1598,2998,1600],{},[1598,3000,2325],{},[1608,3002,3003,3011,3019],{},[1595,3004,3005,3008],{},[1613,3006,3007],{},"C2PA chain",[1613,3009,3010],{},"Confirm submitter has legitimate access to the content",[1595,3012,3013,3016],{},[1613,3014,3015],{},"DDEX rights",[1613,3017,3018],{},"Confirm distribution is authorized for the target territory",[1595,3020,3021,3024],{},[1613,3022,3023],{},"Training data refs",[1613,3025,3026],{},"Verify licensing compliance for AI-generated content",[787,3028,3030],{"id":3029},"whats-happening-now","What's happening now",[749,3032,3033],{},"Both standards are actively evolving:",[749,3035,3036,3038,3039,3042],{},[759,3037,2212],{}," released version 2.3 of the specification and the ecosystem is growing rapidly. The ",[764,3040,3041],{},"c2patool"," CLI and libraries in Rust, JavaScript, and Python make it possible to read and write C2PA manifests programmatically, though writing manifests correctly is non-trivial in practice.",[749,3044,3045,3047],{},[759,3046,984],{}," continues to refine its standards. ERN 4.3 is the latest release notification format, and there are ongoing discussions within the consortium about how to handle AI-generated content within existing schemas.",[769,3049,3050],{},[749,3051,3052,3053,3055,3056,3061,3062,3064],{},"The C2PA spec requires every asset to include a ",[764,3054,2282],{}," as defined by ",[779,3057,3060],{"href":3058,"rel":3059},"https://iptc.org/",[783],"IPTC",". For AI-generated content, the value is ",[764,3063,2286],{},". There are additional assertions available for AI content, but in practice consumption and verification tooling is still catching up -much of this remains theoretical for now.",[1037,3066,3067],{},[749,3068,3069,3070,3075,3076,3081],{},"If you're building music tech infrastructure, start experimenting with C2PA now. The ",[779,3071,3074],{"href":3072,"rel":3073},"https://github.com/contentauth/c2pa-rs",[783],"c2pa-rs"," Rust crate and ",[779,3077,3080],{"href":3078,"rel":3079},"https://github.com/contentauth/c2pa-node",[783],"c2pa-node"," JavaScript library are production-ready and well-documented. You can get quite far using the development certificate for testing.",[787,3083,3085],{"id":3084},"code-examples","Code examples",[928,3087,3089],{"id":3088},"reading-a-c2pa-manifest-with-python","Reading a C2PA manifest with Python",[749,3091,3092,3093,3096],{},"The ",[764,3094,3095],{},"c2pa-python"," library lets you read and validate Content Credentials from any supported file:",[799,3098,3101],{"className":1068,"code":3099,"filename":3100,"language":1071,"meta":805,"style":805},"import c2pa\n\n# Read the C2PA manifest from an audio file\nreader = c2pa.Reader.from_file(\"track.wav\")\n\n# Get the active manifest (most recent signer)\nmanifest = reader.get_active_manifest()\n\nprint(f\"Title: {manifest['title']}\")\nprint(f\"Format: {manifest['format']}\")\n\n# Check assertions -was this AI-generated?\nfor assertion in manifest.get(\"assertions\", []):\n    if assertion[\"label\"] == \"c2pa.actions\":\n        for action in assertion[\"data\"][\"actions\"]:\n            print(f\"Action: {action['action']}\")\n            if \"softwareAgent\" in action:\n                print(f\"Software: {action['softwareAgent']}\")\n            # digitalSourceType is required by the spec (IPTC vocabulary)\n            # trainedAlgorithmicMedia = AI-generated content\n            if \"digitalSourceType\" in action:\n                print(f\"Source type: {action['digitalSourceType']}\")\n\n# Validate the signature chain\nvalidation = reader.validation_status\nif not validation:\n    print(\"Signature: VALID\")\nelse:\n    for status in validation:\n        print(f\"Issue: {status['code']}\")\n","read_c2pa.py",[764,3102,3103,3110,3114,3119,3150,3154,3159,3176,3180,3218,3250,3254,3259,3290,3320,3353,3386,3406,3438,3443,3448,3464,3495,3499,3504,3518,3530,3546,3553,3567],{"__ignoreMap":805},[881,3104,3105,3107],{"class":883,"line":884},[881,3106,1085],{"class":1078},[881,3108,3109],{"class":990}," c2pa\n",[881,3111,3112],{"class":883,"line":898},[881,3113,1101],{"emptyLinePlaceholder":1100},[881,3115,3116],{"class":883,"line":966},[881,3117,3118],{"class":1153},"# Read the C2PA manifest from an audio file\n",[881,3120,3121,3124,3126,3129,3131,3134,3136,3139,3141,3143,3146,3148],{"class":883,"line":972},[881,3122,3123],{"class":990},"reader ",[881,3125,1165],{"class":950},[881,3127,3128],{"class":990}," c2pa",[881,3130,785],{"class":950},[881,3132,3133],{"class":946},"Reader",[881,3135,785],{"class":950},[881,3137,3138],{"class":1110},"from_file",[881,3140,1114],{"class":950},[881,3142,987],{"class":950},[881,3144,3145],{"class":891},"track.wav",[881,3147,987],{"class":950},[881,3149,1247],{"class":950},[881,3151,3152],{"class":883,"line":978},[881,3153,1101],{"emptyLinePlaceholder":1100},[881,3155,3156],{"class":883,"line":1024},[881,3157,3158],{"class":1153},"# Get the active manifest (most recent signer)\n",[881,3160,3161,3164,3166,3169,3171,3174],{"class":883,"line":1171},[881,3162,3163],{"class":990},"manifest ",[881,3165,1165],{"class":950},[881,3167,3168],{"class":990}," reader",[881,3170,785],{"class":950},[881,3172,3173],{"class":1110},"get_active_manifest",[881,3175,1261],{"class":950},[881,3177,3178],{"class":883,"line":1180},[881,3179,1101],{"emptyLinePlaceholder":1100},[881,3181,3182,3185,3187,3190,3193,3195,3198,3201,3204,3207,3209,3212,3214,3216],{"class":883,"line":1199},[881,3183,3184],{"class":1110},"print",[881,3186,1114],{"class":950},[881,3188,3189],{"class":1106},"f",[881,3191,3192],{"class":891},"\"Title: ",[881,3194,1187],{"class":1034},[881,3196,3197],{"class":1110},"manifest",[881,3199,3200],{"class":950},"[",[881,3202,3203],{"class":950},"'",[881,3205,3206],{"class":891},"title",[881,3208,3203],{"class":950},[881,3210,3211],{"class":950},"]",[881,3213,1193],{"class":1034},[881,3215,987],{"class":891},[881,3217,1247],{"class":950},[881,3219,3220,3222,3224,3226,3229,3231,3233,3235,3237,3240,3242,3244,3246,3248],{"class":883,"line":1205},[881,3221,3184],{"class":1110},[881,3223,1114],{"class":950},[881,3225,3189],{"class":1106},[881,3227,3228],{"class":891},"\"Format: ",[881,3230,1187],{"class":1034},[881,3232,3197],{"class":1110},[881,3234,3200],{"class":950},[881,3236,3203],{"class":950},[881,3238,3239],{"class":891},"format",[881,3241,3203],{"class":950},[881,3243,3211],{"class":950},[881,3245,1193],{"class":1034},[881,3247,987],{"class":891},[881,3249,1247],{"class":950},[881,3251,3252],{"class":883,"line":1210},[881,3253,1101],{"emptyLinePlaceholder":1100},[881,3255,3256],{"class":883,"line":1216},[881,3257,3258],{"class":1153},"# Check assertions -was this AI-generated?\n",[881,3260,3261,3264,3267,3269,3272,3274,3276,3278,3280,3283,3285,3287],{"class":883,"line":1250},[881,3262,3263],{"class":1078},"for",[881,3265,3266],{"class":990}," assertion ",[881,3268,1413],{"class":1078},[881,3270,3271],{"class":990}," manifest",[881,3273,785],{"class":950},[881,3275,1229],{"class":1110},[881,3277,1114],{"class":950},[881,3279,987],{"class":950},[881,3281,3282],{"class":891},"assertions",[881,3284,987],{"class":950},[881,3286,1126],{"class":950},[881,3288,3289],{"class":950}," []):\n",[881,3291,3292,3294,3297,3299,3301,3304,3306,3308,3311,3313,3316,3318],{"class":883,"line":1264},[881,3293,1393],{"class":1078},[881,3295,3296],{"class":990}," assertion",[881,3298,3200],{"class":950},[881,3300,987],{"class":950},[881,3302,3303],{"class":891},"label",[881,3305,987],{"class":950},[881,3307,3211],{"class":950},[881,3309,3310],{"class":950}," ==",[881,3312,1555],{"class":950},[881,3314,3315],{"class":891},"c2pa.actions",[881,3317,987],{"class":950},[881,3319,1145],{"class":950},[881,3321,3322,3324,3327,3329,3331,3333,3335,3338,3340,3343,3345,3348,3350],{"class":883,"line":1292},[881,3323,1407],{"class":1078},[881,3325,3326],{"class":990}," action ",[881,3328,1413],{"class":1078},[881,3330,3296],{"class":990},[881,3332,3200],{"class":950},[881,3334,987],{"class":950},[881,3336,3337],{"class":891},"data",[881,3339,987],{"class":950},[881,3341,3342],{"class":950},"][",[881,3344,987],{"class":950},[881,3346,3347],{"class":891},"actions",[881,3349,987],{"class":950},[881,3351,3352],{"class":950},"]:\n",[881,3354,3355,3358,3360,3362,3365,3367,3370,3372,3374,3376,3378,3380,3382,3384],{"class":883,"line":1314},[881,3356,3357],{"class":1110},"            print",[881,3359,1114],{"class":950},[881,3361,3189],{"class":1106},[881,3363,3364],{"class":891},"\"Action: ",[881,3366,1187],{"class":1034},[881,3368,3369],{"class":1110},"action",[881,3371,3200],{"class":950},[881,3373,3203],{"class":950},[881,3375,3369],{"class":891},[881,3377,3203],{"class":950},[881,3379,3211],{"class":950},[881,3381,1193],{"class":1034},[881,3383,987],{"class":891},[881,3385,1247],{"class":950},[881,3387,3388,3391,3393,3396,3398,3401,3404],{"class":883,"line":1319},[881,3389,3390],{"class":1078},"            if",[881,3392,1555],{"class":950},[881,3394,3395],{"class":891},"softwareAgent",[881,3397,987],{"class":950},[881,3399,3400],{"class":950}," in",[881,3402,3403],{"class":990}," action",[881,3405,1145],{"class":950},[881,3407,3408,3411,3413,3415,3418,3420,3422,3424,3426,3428,3430,3432,3434,3436],{"class":883,"line":1325},[881,3409,3410],{"class":1110},"                print",[881,3412,1114],{"class":950},[881,3414,3189],{"class":1106},[881,3416,3417],{"class":891},"\"Software: ",[881,3419,1187],{"class":1034},[881,3421,3369],{"class":1110},[881,3423,3200],{"class":950},[881,3425,3203],{"class":950},[881,3427,3395],{"class":891},[881,3429,3203],{"class":950},[881,3431,3211],{"class":950},[881,3433,1193],{"class":1034},[881,3435,987],{"class":891},[881,3437,1247],{"class":950},[881,3439,3440],{"class":883,"line":1351},[881,3441,3442],{"class":1153},"            # digitalSourceType is required by the spec (IPTC vocabulary)\n",[881,3444,3445],{"class":883,"line":1374},[881,3446,3447],{"class":1153},"            # trainedAlgorithmicMedia = AI-generated content\n",[881,3449,3450,3452,3454,3456,3458,3460,3462],{"class":883,"line":1379},[881,3451,3390],{"class":1078},[881,3453,1555],{"class":950},[881,3455,2282],{"class":891},[881,3457,987],{"class":950},[881,3459,3400],{"class":950},[881,3461,3403],{"class":990},[881,3463,1145],{"class":950},[881,3465,3466,3468,3470,3472,3475,3477,3479,3481,3483,3485,3487,3489,3491,3493],{"class":883,"line":1390},[881,3467,3410],{"class":1110},[881,3469,1114],{"class":950},[881,3471,3189],{"class":1106},[881,3473,3474],{"class":891},"\"Source type: ",[881,3476,1187],{"class":1034},[881,3478,3369],{"class":1110},[881,3480,3200],{"class":950},[881,3482,3203],{"class":950},[881,3484,2282],{"class":891},[881,3486,3203],{"class":950},[881,3488,3211],{"class":950},[881,3490,1193],{"class":1034},[881,3492,987],{"class":891},[881,3494,1247],{"class":950},[881,3496,3497],{"class":883,"line":1404},[881,3498,1101],{"emptyLinePlaceholder":1100},[881,3500,3501],{"class":883,"line":1425},[881,3502,3503],{"class":1153},"# Validate the signature chain\n",[881,3505,3506,3509,3511,3513,3515],{"class":883,"line":1439},[881,3507,3508],{"class":990},"validation ",[881,3510,1165],{"class":950},[881,3512,3168],{"class":990},[881,3514,785],{"class":950},[881,3516,3517],{"class":946},"validation_status\n",[881,3519,3520,3523,3525,3528],{"class":883,"line":1461},[881,3521,3522],{"class":1078},"if",[881,3524,1396],{"class":950},[881,3526,3527],{"class":990}," validation",[881,3529,1145],{"class":950},[881,3531,3532,3535,3537,3539,3542,3544],{"class":883,"line":1481},[881,3533,3534],{"class":1110},"    print",[881,3536,1114],{"class":950},[881,3538,987],{"class":950},[881,3540,3541],{"class":891},"Signature: VALID",[881,3543,987],{"class":950},[881,3545,1247],{"class":950},[881,3547,3548,3551],{"class":883,"line":1501},[881,3549,3550],{"class":1078},"else",[881,3552,1145],{"class":950},[881,3554,3555,3558,3561,3563,3565],{"class":883,"line":1522},[881,3556,3557],{"class":1078},"    for",[881,3559,3560],{"class":990}," status ",[881,3562,1413],{"class":1078},[881,3564,3527],{"class":990},[881,3566,1145],{"class":950},[881,3568,3569,3572,3574,3576,3579,3581,3584,3586,3588,3590,3592,3594,3596,3598],{"class":883,"line":1528},[881,3570,3571],{"class":1110},"        print",[881,3573,1114],{"class":950},[881,3575,3189],{"class":1106},[881,3577,3578],{"class":891},"\"Issue: ",[881,3580,1187],{"class":1034},[881,3582,3583],{"class":1110},"status",[881,3585,3200],{"class":950},[881,3587,3203],{"class":950},[881,3589,764],{"class":891},[881,3591,3203],{"class":950},[881,3593,3211],{"class":950},[881,3595,1193],{"class":1034},[881,3597,987],{"class":891},[881,3599,1247],{"class":950},[928,3601,3603],{"id":3602},"ddex-ern-message-simplified","DDEX ERN message (simplified)",[749,3605,3606,3607,3610,3611,3614,3615,3618],{},"The core of a DDEX Electronic Release Notification boils down to three blocks: ",[759,3608,3609],{},"what"," is being released, ",[759,3612,3613],{},"who"," performs it, and ",[759,3616,3617],{},"where/how"," it can be streamed:",[799,3620,3623],{"className":1840,"code":3621,"filename":3622,"language":1843,"meta":805,"style":805},"\u003CNewReleaseMessage>\n  \u003C!-- WHAT: the release -->\n  \u003CRelease>\n    \u003CICPN>0123456789012\u003C/ICPN>\n    \u003CTitle>Upbeat Jazz Fusion\u003C/Title>\n    \u003CArtist>Acme Music AI\u003C/Artist>\n    \u003CTerritory>Worldwide\u003C/Territory>\n  \u003C/Release>\n\n  \u003C!-- WHO: the sound recording -->\n  \u003CSoundRecording>\n    \u003CISRC>USXX42312345\u003C/ISRC>\n    \u003CDuration>PT3M24S\u003C/Duration>\n    \u003CArtistRole>MainArtist\u003C/ArtistRole>  \u003C!-- No \"AI\" option here -->\n  \u003C/SoundRecording>\n\n  \u003C!-- HOW: the deal terms -->\n  \u003CDeal>\n    \u003CModel>SubscriptionModel\u003C/Model>\n    \u003CUseType>OnDemandStream\u003C/UseType>\n    \u003CStartDate>2026-03-13\u003C/StartDate>\n  \u003C/Deal>\n\u003C/NewReleaseMessage>\n","ern_release.xml",[764,3624,3625,3634,3639,3648,3667,3685,3702,3718,3727,3731,3736,3745,3761,3778,3799,3807,3811,3816,3825,3843,3861,3879,3887],{"__ignoreMap":805},[881,3626,3627,3629,3632],{"class":883,"line":884},[881,3628,1855],{"class":950},[881,3630,3631],{"class":946},"NewReleaseMessage",[881,3633,1861],{"class":950},[881,3635,3636],{"class":883,"line":898},[881,3637,3638],{"class":1153},"  \u003C!-- WHAT: the release -->\n",[881,3640,3641,3643,3646],{"class":883,"line":966},[881,3642,1866],{"class":950},[881,3644,3645],{"class":946},"Release",[881,3647,1861],{"class":950},[881,3649,3650,3653,3656,3658,3661,3663,3665],{"class":883,"line":972},[881,3651,3652],{"class":950},"    \u003C",[881,3654,3655],{"class":946},"ICPN",[881,3657,1884],{"class":950},[881,3659,3660],{"class":990},"0123456789012",[881,3662,1890],{"class":950},[881,3664,3655],{"class":946},[881,3666,1861],{"class":950},[881,3668,3669,3671,3674,3676,3679,3681,3683],{"class":883,"line":978},[881,3670,3652],{"class":950},[881,3672,3673],{"class":946},"Title",[881,3675,1884],{"class":950},[881,3677,3678],{"class":990},"Upbeat Jazz Fusion",[881,3680,1890],{"class":950},[881,3682,3673],{"class":946},[881,3684,1861],{"class":950},[881,3686,3687,3689,3691,3693,3696,3698,3700],{"class":883,"line":1024},[881,3688,3652],{"class":950},[881,3690,2734],{"class":946},[881,3692,1884],{"class":950},[881,3694,3695],{"class":990},"Acme Music AI",[881,3697,1890],{"class":950},[881,3699,2734],{"class":946},[881,3701,1861],{"class":950},[881,3703,3704,3706,3708,3710,3712,3714,3716],{"class":883,"line":1171},[881,3705,3652],{"class":950},[881,3707,1641],{"class":946},[881,3709,1884],{"class":950},[881,3711,1647],{"class":990},[881,3713,1890],{"class":950},[881,3715,1641],{"class":946},[881,3717,1861],{"class":950},[881,3719,3720,3723,3725],{"class":883,"line":1180},[881,3721,3722],{"class":950},"  \u003C/",[881,3724,3645],{"class":946},[881,3726,1861],{"class":950},[881,3728,3729],{"class":883,"line":1199},[881,3730,1101],{"emptyLinePlaceholder":1100},[881,3732,3733],{"class":883,"line":1205},[881,3734,3735],{"class":1153},"  \u003C!-- WHO: the sound recording -->\n",[881,3737,3738,3740,3743],{"class":883,"line":1210},[881,3739,1866],{"class":950},[881,3741,3742],{"class":946},"SoundRecording",[881,3744,1861],{"class":950},[881,3746,3747,3749,3751,3753,3755,3757,3759],{"class":883,"line":1216},[881,3748,3652],{"class":950},[881,3750,1615],{"class":946},[881,3752,1884],{"class":950},[881,3754,2834],{"class":990},[881,3756,1890],{"class":950},[881,3758,1615],{"class":946},[881,3760,1861],{"class":950},[881,3762,3763,3765,3767,3769,3772,3774,3776],{"class":883,"line":1250},[881,3764,3652],{"class":950},[881,3766,1662],{"class":946},[881,3768,1884],{"class":950},[881,3770,3771],{"class":990},"PT3M24S",[881,3773,1890],{"class":950},[881,3775,1662],{"class":946},[881,3777,1861],{"class":950},[881,3779,3780,3782,3785,3787,3790,3792,3794,3796],{"class":883,"line":1264},[881,3781,3652],{"class":950},[881,3783,3784],{"class":946},"ArtistRole",[881,3786,1884],{"class":950},[881,3788,3789],{"class":990},"MainArtist",[881,3791,1890],{"class":950},[881,3793,3784],{"class":946},[881,3795,1884],{"class":950},[881,3797,3798],{"class":1153},"  \u003C!-- No \"AI\" option here -->\n",[881,3800,3801,3803,3805],{"class":883,"line":1292},[881,3802,3722],{"class":950},[881,3804,3742],{"class":946},[881,3806,1861],{"class":950},[881,3808,3809],{"class":883,"line":1314},[881,3810,1101],{"emptyLinePlaceholder":1100},[881,3812,3813],{"class":883,"line":1319},[881,3814,3815],{"class":1153},"  \u003C!-- HOW: the deal terms -->\n",[881,3817,3818,3820,3823],{"class":883,"line":1325},[881,3819,1866],{"class":950},[881,3821,3822],{"class":946},"Deal",[881,3824,1861],{"class":950},[881,3826,3827,3829,3832,3834,3837,3839,3841],{"class":883,"line":1351},[881,3828,3652],{"class":950},[881,3830,3831],{"class":946},"Model",[881,3833,1884],{"class":950},[881,3835,3836],{"class":990},"SubscriptionModel",[881,3838,1890],{"class":950},[881,3840,3831],{"class":946},[881,3842,1861],{"class":950},[881,3844,3845,3847,3850,3852,3855,3857,3859],{"class":883,"line":1374},[881,3846,3652],{"class":950},[881,3848,3849],{"class":946},"UseType",[881,3851,1884],{"class":950},[881,3853,3854],{"class":990},"OnDemandStream",[881,3856,1890],{"class":950},[881,3858,3849],{"class":946},[881,3860,1861],{"class":950},[881,3862,3863,3865,3868,3870,3873,3875,3877],{"class":883,"line":1379},[881,3864,3652],{"class":950},[881,3866,3867],{"class":946},"StartDate",[881,3869,1884],{"class":950},[881,3871,3872],{"class":990},"2026-03-13",[881,3874,1890],{"class":950},[881,3876,3867],{"class":946},[881,3878,1861],{"class":950},[881,3880,3881,3883,3885],{"class":883,"line":1390},[881,3882,3722],{"class":950},[881,3884,3822],{"class":946},[881,3886,1861],{"class":950},[881,3888,3889,3891,3893],{"class":883,"line":1404},[881,3890,1890],{"class":950},[881,3892,3631],{"class":946},[881,3894,1861],{"class":950},[769,3896,3897],{},[749,3898,3899,3900,3902,3903,3905],{},"Notice how the DDEX schema has no concept of \"AI-generated.\" The ",[764,3901,3784],{}," is ",[764,3904,3789],{},", which traditionally means a human performer. This is exactly the gap that combining C2PA provenance with DDEX metadata would fill.",[928,3907,3909],{"id":3908},"real-world-use-cases","Real-world use cases",[845,3911,3913,3929,3945,3961],{"className":3912},[848,849,2440,851,852],[854,3914,3918],{"description":3915,"icon":3916,"title":3917},"A service like ElevenLabs or Kits.AI generates a vocal track using a licensed artist voice model.","i-lucide-mic","AI vocal cloning",[820,3919,3920,3923,3926],{},[823,3921,3922],{},"C2PA manifest declares the output as AI-generated, referencing the voice model license",[823,3924,3925],{},"DDEX metadata routes royalties to both the platform and the original voice owner",[823,3927,3928],{},"DSPs can surface an \"AI-generated vocal\" label to listeners",[854,3930,3934],{"description":3931,"icon":3932,"title":3933},"A music supervisor finds a track on a sync platform and needs to clear rights quickly.","i-lucide-radio","Sync licensing for film/TV",[820,3935,3936,3939,3942],{},[823,3937,3938],{},"C2PA chain confirms the track is an unaltered original from a known studio",[823,3940,3941],{},"DDEX rights data shows territory clearance, splits, and one-stop licensing",[823,3943,3944],{},"The supervisor can verify authenticity and clear rights in a single workflow",[854,3946,3950],{"description":3947,"icon":3948,"title":3949},"A producer builds a track using stems from Splice or Tracklib.","i-lucide-disc-3","Sample-based production",[820,3951,3952,3955,3958],{},[823,3953,3954],{},"Each stem carries a C2PA manifest linking to its original recording session",[823,3956,3957],{},"The DAW adds a new manifest referencing all source stems on export",[823,3959,3960],{},"DDEX metadata captures royalty splits between the producer and sample owners",[854,3962,3966],{"description":3963,"icon":3964,"title":3965},"A streaming platform receives a submission that sounds like a major artist from an unknown account.","i-lucide-shield-alert","Deepfake detection at DSPs",[820,3967,3968,3971,3974],{},[823,3969,3970],{},"No C2PA manifest present, or the manifest shows AI generation with no artist license",[823,3972,3973],{},"DDEX metadata claims the submitter as the performer, contradicting the audio fingerprint",[823,3975,3976],{},"Automated pipeline flags the submission for human review before it goes live",[787,3978,3980],{"id":3979},"looking-ahead","Looking ahead",[749,3982,3983,3984,2205,3987,3990],{},"The music industry is approaching a tipping point. As AI-generated content floods platforms, the demand for both ",[759,3985,3986],{},"authenticity verification",[759,3988,3989],{},"rights management"," will only grow.",[749,3992,3993],{},"The platforms that win will be the ones that treat provenance and rights as two sides of the same coin. C2PA and DDEX aren't competitors. Together, they could form the trust layer the music industry needs.",[749,3995,3996],{},"For music tech builders, the action items are clear:",[3998,3999,4000,4006,4012,4018],"ol",{},[823,4001,4002,4005],{},[759,4003,4004],{},"Embed C2PA manifests"," at the point of content creation -whether that's a DAW, an AI model, or a recording device",[823,4007,4008,4011],{},[759,4009,4010],{},"Extend DDEX workflows"," to consume and reference C2PA provenance data",[823,4013,4014,4017],{},[759,4015,4016],{},"Build cross-validation"," into ingest pipelines to catch mismatches between authenticity claims and rights declarations",[823,4019,4020,4023],{},[759,4021,4022],{},"Engage with both consortiums"," -the standards are still evolving, and the music industry's voice matters in shaping them",[749,4025,4026],{},"The question isn't whether these standards will converge -it's how quickly the industry can make it happen.",[2125,4028,4029],{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":805,"searchDepth":898,"depth":898,"links":4031},[4032,4036,4040,4041,4044,4049,4050,4051,4056],{"id":2217,"depth":898,"text":2218,"children":4033},[4034,4035],{"id":2224,"depth":966,"text":2225},{"id":2267,"depth":966,"text":2268},{"id":2302,"depth":898,"text":2303,"children":4037},[4038,4039],{"id":2309,"depth":966,"text":2310},{"id":2389,"depth":966,"text":2390},{"id":2435,"depth":898,"text":2436},{"id":2607,"depth":898,"text":2608,"children":4042},[4043],{"id":2661,"depth":966,"text":2662},{"id":2686,"depth":898,"text":2687,"children":4045},[4046,4047,4048],{"id":2693,"depth":966,"text":2694},{"id":2711,"depth":966,"text":2712},{"id":2745,"depth":966,"text":2746},{"id":2878,"depth":898,"text":2879},{"id":3029,"depth":898,"text":3030},{"id":3084,"depth":898,"text":3085,"children":4052},[4053,4054,4055],{"id":3088,"depth":966,"text":3089},{"id":3602,"depth":966,"text":3603},{"id":3908,"depth":966,"text":3909},{"id":3979,"depth":898,"text":3980},"2026-03-13T00:00:00.000Z","C2PA proves content is real. DDEX ensures the right people get paid. Together, could they reshape how the music industry handles trust and rights in the AI era?",[4060,4063,4066],{"question":4061,"answer":4062},"What is the difference between C2PA and DDEX?","C2PA is a content authenticity standard that cryptographically proves who created digital content and whether it was modified. DDEX is a music industry standard for exchanging commercial metadata like rights ownership, royalty splits, and release information. C2PA answers 'is this real?' while DDEX answers 'who gets paid?'",{"question":4064,"answer":4065},"Can C2PA and DDEX work together?","Yes. A music file could carry both a C2PA manifest proving its origin and creation history, and DDEX metadata ensuring correct royalty distribution. Together they provide end-to-end trust -from authenticity to payment.",{"question":4067,"answer":4068},"Why do these standards matter for AI-generated music?","AI-generated tracks blur the line between human and machine creation. C2PA can transparently label AI-generated content, while DDEX can handle the complex rights questions around who owns and profits from AI-created music.",{"src":4070},"/images/blog/musictechlab_blog_c2pa-vs-ddex.webp",{"enabled":1100,"items":4072},[4073,4076,4079,4082],{"text":4074,"icon":4075},"C2PA proves content origin with cryptographic signatures; DDEX handles rights and royalty splits.","i-lucide-shield",{"text":4077,"icon":4078},"Current DDEX schemas have no concept of AI-generated content or non-human performers.","i-lucide-brain",{"text":4080,"icon":4081},"Combining both standards creates end-to-end trust from authenticity verification to payment.","i-lucide-handshake",{"text":4083,"icon":4084},"C2PA tools in Rust, JavaScript, and Python are production-ready for experimentation today.","i-lucide-code",{},{"title":4087,"description":4088},"C2PA & DDEX: Authenticity & Rights in AI Music","Compare C2PA and DDEX standards -how content provenance and rights metadata work together to solve trust and payment in the AI music era.",[2212,984,4090,4091,4092,2178,4093],"AI music","content authenticity","music rights","music distribution","gAC7wVP0DrbqIReV_k8NunYO6AEVCudMp3VZZ9-1zfY",{"id":4096,"title":132,"authors":4097,"badge":4103,"body":4106,"category":2145,"client":2146,"date":4266,"description":4267,"extension":2149,"faq":2146,"featured":69,"featuredOrder":2146,"hidden":69,"image":4268,"keyTakeaways":4270,"meta":4281,"navigation":1100,"path":133,"seo":4282,"status":2146,"stem":134,"tags":4283,"teaser":2146,"__hash__":4285,"score":972},"posts/blog/music-data/ddex-office-hours-musictech.md",[4098],{"name":4099,"to":4100,"avatar":4101},"Maciej Dulski","https://www.linkedin.com/in/maciej-dulski/",{"src":4102},"/images/cdn-migrated/maciej-dulski-400x400.webp",{"label":4104,"color":4105},"Featured","#E91E63",{"type":746,"value":4107,"toc":4260},[4108,4114,4125,4132,4136,4155,4158,4162,4165,4182,4187,4191,4198,4212,4215,4218,4233,4241],[749,4109,4110,4111,785],{},"If you're building a MusicTech platform that needs to integrate with labels, distributors, or DSPs, DDEX compliance becomes unavoidable at some point. The challenge is knowing ",[759,4112,4113],{},"what to implement, when, and how much is actually required",[749,4115,4116,4117,4124],{},"MusicTech Lab is a ",[759,4118,4119],{},[779,4120,4123],{"href":4121,"rel":4122},"https://ddex.net/membership/current-members/",[783],"DDEX member",", and these office hours are run by our DDEX expert — based on hands-on experience with production systems used across the music industry.",[749,4126,4127,4128,4131],{},"We offer ",[759,4129,4130],{},"2 free DDEX office hour slots per month",", focused on practical guidance.",[787,4133,4135],{"id":4134},"what-we-can-help-with","What We Can Help With",[845,4137,4139,4143,4147,4151],{"className":4138},[848,849,2440,851,852],[854,4140],{"description":4141,"title":4142},"Choosing the right DDEX standard for your use case — ERN, DSR, RIN, or MLC — and understanding the real-world differences between ERN versions.","Standards Selection",[854,4144],{"description":4145,"title":4146},"Reviewing your internal data model for DDEX readiness. Mapping Releases, Resources, Deals, and Parties to your existing structures.","Data Model Preparation",[854,4148],{"description":4149,"title":4150},"Designing ERN export APIs, including OpenAPI-based approaches. Handling identifiers for artists, contributors, and rights holders correctly.","API Design",[854,4152],{"description":4153,"title":4154},"Common compliance pitfalls, validation strategies, and how to test your DDEX output before sending it to DSPs.","Validation & Compliance",[749,4156,4157],{},"You can bring a specific technical problem or ask us to review your overall approach.",[787,4159,4161],{"id":4160},"common-questions-weve-answered","Common Questions We've Answered",[749,4163,4164],{},"Here are real examples of what teams bring to office hours:",[820,4166,4167,4170,4173,4176,4179],{},[823,4168,4169],{},"\"We have track metadata in our database — how do we map it to ERN 3.8?\"",[823,4171,4172],{},"\"Our distributor is asking for DDEX-compliant delivery. Where do we start?\"",[823,4174,4175],{},"\"We're building an export pipeline. Should we generate XML directly or use an intermediary format?\"",[823,4177,4178],{},"\"How do we handle multi-territory deals and release windows?\"",[823,4180,4181],{},"\"What's the minimum viable ERN file that YouTube/Spotify will accept?\"",[769,4183,4184],{},[749,4185,4186],{},"These aren't theoretical discussions. Every session is focused on your specific implementation — your data model, your tech stack, your timeline.",[787,4188,4190],{"id":4189},"real-implementation-experience","Real Implementation Experience",[749,4192,4193,4194,4197],{},"We recently supported a music creation platform in preparing their internal data model for ",[759,4195,4196],{},"DDEX ERN-based metadata delivery",". The engagement included:",[820,4199,4200,4203,4206,4209],{},[823,4201,4202],{},"Data model review and gap analysis for DDEX compliance",[823,4204,4205],{},"Mapping internal fields to ERN structures",[823,4207,4208],{},"Defining export specifications for ERN 3.8 with future upgrade paths",[823,4210,4211],{},"Documentation, examples, and validation recommendations",[749,4213,4214],{},"This gave the client a clear, compliant foundation to move toward distributor and DSP integrations.",[787,4216,4217],{"id":2224},"How It Works",[845,4219,4221,4225,4229],{"className":4220},[848,849,850,851,852],[854,4222],{"description":4223,"title":4224},"First come, first served. Each session is 30–45 minutes.","2 free slots per month",[854,4226],{"description":4227,"title":4228},"Bring your code, data models, or architecture diagrams. We'll review and advise.","Technical consultation",[854,4230],{"description":4231,"title":4232},"No sales pitch. Just practical help with real implementation choices.","Focused on decisions",[1711,4234,4235],{},[749,4236,4237,4238,785],{},"These office hours are provided by MusicTech Lab. MusicTech Lab is a DDEX member, but this service is ",[759,4239,4240],{},"not endorsed, operated, or provided by DDEX",[845,4242,4247,4255],{"className":4243},[4244,4245,4246,852],"flex","flex-wrap","gap-3",[4248,4249],"u-button",{"color":4250,"label":4251,"target":4252,"to":4253,"variant":4254},"primary","Book a Session","_blank","https://musictechlab.io/contact","subtle",[4248,4256],{"color":4257,"label":4258,"target":4252,"to":4259,"variant":4254},"neutral","DDEX Integration Services","https://musictechlab.io/lp/ddex-integration",{"title":805,"searchDepth":898,"depth":898,"links":4261},[4262,4263,4264,4265],{"id":4134,"depth":898,"text":4135},{"id":4160,"depth":898,"text":4161},{"id":4189,"depth":898,"text":4190},{"id":2224,"depth":898,"text":4217},"2025-12-22T00:00:00.000Z","Free DDEX office hours for MusicTech teams. Get help with DDEX compliance, ERN implementation, data models, and integrations with DSPs.",{"src":4269},"/images/blog/musictechlab_blog_musictech-lab-ddex-office-hours.webp",{"enabled":1100,"items":4271},[4272,4275,4278],{"text":4273,"icon":4274},"MusicTech Lab offers 2 free DDEX office hour slots per month for hands-on technical guidance.","i-lucide-users",{"text":4276,"icon":4277},"Sessions cover standards selection, data model mapping, API design, and validation strategies.","i-lucide-file-code",{"text":4279,"icon":4280},"Every session is focused on your specific implementation, not theoretical discussions.","i-lucide-lightbulb",{},{"title":132,"description":4267},[984,4284,2178],"musictech","Ixad9_iid0eEMjDHYM-lp2qGTEmyHS6lFV2v0lZz3_c",{"id":4287,"title":136,"authors":4288,"badge":4291,"body":4292,"category":2145,"client":2146,"date":5190,"description":5191,"extension":2149,"faq":2146,"featured":69,"featuredOrder":2146,"hidden":69,"image":5192,"keyTakeaways":5194,"meta":5205,"navigation":1100,"path":137,"seo":5206,"status":2146,"stem":138,"tags":5207,"teaser":2146,"__hash__":5208,"score":972},"posts/blog/music-data/ddex-open-source-projects-review.md",[4289],{"name":738,"to":739,"avatar":4290},{"src":741},{"label":4104,"color":4105},{"type":746,"value":4293,"toc":5176},[4294,4297,4304,4309,4311,4314,4318,4326,4330,4333,4342,4367,4376,4398,4407,4429,4438,4459,4468,4488,4497,4517,4526,4547,4556,4576,4584,4603,4612,4633,4641,4661,4670,4690,4699,4720,4729,4749,4758,4777,4786,4807,4816,4837,4846,4867,4876,4896,4905,4925,4929,4947,4951,4966,4970,4988,4992,5015,5019,5034,5038,5076,5079,5083,5089,5108,5118,5145,5149,5159,5163],[749,4295,4296],{},"In the rapidly evolving digital music industry, managing the exchange of data across different platforms and services can be a daunting task. The complexity of licensing, distribution, and rights management makes seamless data exchange essential for all players involved - artists, record labels, distributors, and digital service providers (DSPs). To address this challenge, the Digital Data Exchange (DDEX) consortium was established to standardize data formats and processes across the industry. DDEX plays a critical role in ensuring that music rights, royalties, and metadata flow smoothly across the digital ecosystem. Among its most significant contributions are its open-source projects, which provide tools and resources that allow stakeholders to easily implement DDEX standards.",[749,4298,4299],{},[4300,4301],"img",{"alt":4302,"src":4303},"DDEX website screenshot","/images/cdn-migrated/ddex-website-screenshot.webp",[749,4305,4306],{},[2064,4307,4308],{},"CREDIT: DDEX website",[787,4310,2303],{"id":2302},[749,4312,4313],{},"DDEX, founded in 2006, is a consortium of leading media companies, digital music services, and music rights organizations. It creates and maintains standards for the communication of metadata between businesses in the digital music supply chain. These standards ensure that information such as licensing details, royalties, and usage data is accurately transferred between parties involved in the production, distribution, and consumption of digital media. The core of DDEX's mission is to enable a more efficient exchange of metadata, which is crucial for tracking music rights and ensuring that artists and rights holders receive fair compensation for their work.",[787,4315,4317],{"id":4316},"open-source-in-ddex","Open Source in DDEX",[749,4319,4320,4321,4325],{},"DDEX's open-source projects allow developers and businesses to implement its standards without having to start from scratch. By making these projects available under open-source licenses, DDEX encourages collaboration, innovation, and faster adoption of standardized protocols. This approach lowers the barrier for small and large players alike, enabling the entire music industry to benefit from greater consistency and transparency in metadata management. Here is a list of Open Source tools provided by DDEX: ",[779,4322,4323],{"href":4323,"rel":4324},"https://kb.ddex.net/reference-material/open-source-software/",[783]," Let's delve inside them.",[787,4327,4329],{"id":4328},"open-source-software-from-ddex-website","Open Source Software (from DDEX website)",[749,4331,4332],{},"The DDEX website lists several open-source tools available on GitHub, developed by various companies and individuals. These tools can assist with parsing, validating, and converting DDEX-compliant metadata files in various programming languages, such as Python, Ruby, JavaScript, and PHP. Many of the tools focus on validating, parsing, and converting DDEX XML files related to music metadata, ensuring conformance to DDEX standards for digital sales reporting (DSR), Electronic Release Notification (ERN), and Metadata Choreography (MEAD).",[749,4334,4335],{},[779,4336,4339],{"href":4337,"rel":4338},"https://github.com/ddexnet/dsrf",[783],[759,4340,4341],{},"dsrf",[820,4343,4344,4349,4355,4361],{},[823,4345,4346,4348],{},[759,4347,2322],{},": DSR (Digital Sales Report)",[823,4350,4351,4354],{},[759,4352,4353],{},"Description",": The DSRF Flat File Parser and Conformance Tool is an open-source library that allows parsing and testing of DDEX DSR Flat files, ensuring they comply with DDEX DSR Flat File Standard v3.0.",[823,4356,4357,4360],{},[759,4358,4359],{},"Language",": Python",[823,4362,4363,4366],{},[759,4364,4365],{},"Creator",": Google",[749,4368,4369],{},[779,4370,4373],{"href":4371,"rel":4372},"https://github.com/sshaw/ddex",[783],[759,4374,4375],{},"ddex ruby",[820,4377,4378,4383,4388,4393],{},[823,4379,4380,4382],{},[759,4381,2322],{},": ERN (Electronic Release Notification)",[823,4384,4385,4387],{},[759,4386,4353],{},": This library facilitates DDEX metadata serialization for Ruby. Comprehensive documentation is available for easy integration.",[823,4389,4390,4392],{},[759,4391,4359],{},": Ruby",[823,4394,4395,4397],{},[759,4396,4365],{},": Skye Shaw",[749,4399,4400],{},[779,4401,4404],{"href":4402,"rel":4403},"https://github.com/7digital/DDEX-Deserialiser",[783],[759,4405,4406],{},"DDEX Deserialiser",[820,4408,4409,4414,4419,4424],{},[823,4410,4411,4413],{},[759,4412,2322],{},": ERN",[823,4415,4416,4418],{},[759,4417,4353],{},": A tool developed by 7digital for batch deserialization of DDEX XML files, allowing seamless conversion of XML data to usable formats.",[823,4420,4421,4423],{},[759,4422,4359],{},": C#",[823,4425,4426,4428],{},[759,4427,4365],{},": 7digital",[749,4430,4431],{},[779,4432,4435],{"href":4433,"rel":4434},"https://github.com/eddleston/DDEX-Validator",[783],[759,4436,4437],{},"DDEX Validator",[820,4439,4440,4444,4449,4454],{},[823,4441,4442,4413],{},[759,4443,2322],{},[823,4445,4446,4448],{},[759,4447,4353],{},": A validation service designed to verify DDEX XML documents for compliance with the DDEX ERN standard.",[823,4450,4451,4453],{},[759,4452,4359],{},": NuGet/Microsoft Visual Studio",[823,4455,4456,4458],{},[759,4457,4365],{},": Paul Eddleston",[749,4460,4461],{},[779,4462,4465],{"href":4463,"rel":4464},"https://github.com/thornlaw/ddex-ern-lib",[783],[759,4466,4467],{},"ddex-ern-lib",[820,4469,4470,4474,4479,4483],{},[823,4471,4472,4413],{},[759,4473,2322],{},[823,4475,4476,4478],{},[759,4477,4353],{},": A DDEX ERN 3.7 XML Messaging Class Library, leveraging Linq to XSD and T4 Templates, for easy handling of ERN messages.",[823,4480,4481,4423],{},[759,4482,4359],{},[823,4484,4485,4487],{},[759,4486,4365],{},": Thornlaw Consultants",[749,4489,4490],{},[779,4491,4494],{"href":4492,"rel":4493},"https://github.com/willm/DDEXUI",[783],[759,4495,4496],{},"DDEXUI (1)",[820,4498,4499,4503,4508,4512],{},[823,4500,4501,4413],{},[759,4502,2322],{},[823,4504,4505,4507],{},[759,4506,4353],{},": A user interface designed to help create simplified DDEX metadata, making the metadata creation process easier for users.",[823,4509,4510,4360],{},[759,4511,4359],{},[823,4513,4514,4516],{},[759,4515,4365],{},": Will Munn",[749,4518,4519],{},[779,4520,4523],{"href":4521,"rel":4522},"https://github.com/agreen757/SoundCloudDDEX",[783],[759,4524,4525],{},"SoundCloud DDEX",[820,4527,4528,4532,4537,4542],{},[823,4529,4530,4413],{},[759,4531,2322],{},[823,4533,4534,4536],{},[759,4535,4353],{},": A tool for generating DDEX feeds for SoundCloud by converting data from CSV files into DDEX-compliant metadata.",[823,4538,4539,4541],{},[759,4540,4359],{},": JavaScript",[823,4543,4544,4546],{},[759,4545,4365],{},": Adrian Green",[749,4548,4549],{},[779,4550,4553],{"href":4551,"rel":4552},"https://github.com/Trax-air/ddexreader",[783],[759,4554,4555],{},"DDEXreader",[820,4557,4558,4562,4567,4571],{},[823,4559,4560,4413],{},[759,4561,2322],{},[823,4563,4564,4566],{},[759,4565,4353],{},": A Python project that allows reading of DDEX XML files and decoding them into Python data types using the PyXB library.",[823,4568,4569,4360],{},[759,4570,4359],{},[823,4572,4573,4575],{},[759,4574,4365],{},": Trax Air",[749,4577,4578],{},[779,4579,4581],{"href":4492,"rel":4580},[783],[759,4582,4583],{},"DDEXUI (2)",[820,4585,4586,4590,4595,4599],{},[823,4587,4588,4413],{},[759,4589,2322],{},[823,4591,4592,4594],{},[759,4593,4353],{},": Another version of DDEXUI, focusing on making DDEX metadata creation more accessible for small labels and independent artists by simplifying the process.",[823,4596,4597,4360],{},[759,4598,4359],{},[823,4600,4601,4516],{},[759,4602,4365],{},[749,4604,4605],{},[779,4606,4609],{"href":4607,"rel":4608},"https://github.com/moodleexpert/DDEXPHPParser",[783],[759,4610,4611],{},"DDEX PHP Parser",[820,4613,4614,4618,4623,4628],{},[823,4615,4616,4413],{},[759,4617,2322],{},[823,4619,4620,4622],{},[759,4621,4353],{},": A PHP parser specifically designed for handling DDEX XML files, enabling parsing and output in JSON format.",[823,4624,4625,4627],{},[759,4626,4359],{},": PHP",[823,4629,4630,4632],{},[759,4631,4365],{},": Nikhil Patil",[749,4634,4635],{},[779,4636,4639],{"href":4637,"rel":4638},"https://github.com/Alveum/DDEX",[783],[759,4640,984],{},[820,4642,4643,4647,4652,4656],{},[823,4644,4645,4413],{},[759,4646,2322],{},[823,4648,4649,4651],{},[759,4650,4353],{},": A library for retrieving DDEX party details, which helps in managing metadata related to parties in the music supply chain.",[823,4653,4654,4627],{},[759,4655,4359],{},[823,4657,4658,4660],{},[759,4659,4365],{},": Alveum",[749,4662,4663],{},[779,4664,4667],{"href":4665,"rel":4666},"https://github.com/bnathyuw/RubyDdexParserSpike",[783],[759,4668,4669],{},"RubyDDEXParserSpike",[820,4671,4672,4676,4681,4685],{},[823,4673,4674,4413],{},[759,4675,2322],{},[823,4677,4678,4680],{},[759,4679,4353],{},": A Ruby-based tool for reading DDEX deal information using XPath to extract data from the DDEX XML.",[823,4682,4683,4392],{},[759,4684,4359],{},[823,4686,4687,4689],{},[759,4688,4365],{},": Matthew Butt",[749,4691,4692],{},[779,4693,4696],{"href":4694,"rel":4695},"https://github.com/AidanTwomey/DdexToJson",[783],[759,4697,4698],{},"DDEX to JSON",[820,4700,4701,4705,4710,4715],{},[823,4702,4703,4413],{},[759,4704,2322],{},[823,4706,4707,4709],{},[759,4708,4353],{},": A Lambda function for converting DDEX XML files into JSON format for easier integration into web services and modern data workflows.",[823,4711,4712,4714],{},[759,4713,4359],{},": Lambda",[823,4716,4717,4719],{},[759,4718,4365],{},": Aidan Twomey",[749,4721,4722],{},[779,4723,4726],{"href":4724,"rel":4725},"https://github.com/ddexnet/ern-validator-client",[783],[759,4727,4728],{},"DDEX Validator (Client)",[820,4730,4731,4735,4740,4744],{},[823,4732,4733,4413],{},[759,4734,2322],{},[823,4736,4737,4739],{},[759,4738,4353],{},": A JavaScript client-side validator designed for verifying ERN messages for compliance with DDEX standards.",[823,4741,4742,4541],{},[759,4743,4359],{},[823,4745,4746,4748],{},[759,4747,4365],{},": Rob deWilder",[749,4750,4751],{},[779,4752,4755],{"href":4753,"rel":4754},"https://github.com/ddexnet/ern-validator-api",[783],[759,4756,4757],{},"Client Validator (API)",[820,4759,4760,4764,4769,4773],{},[823,4761,4762,4413],{},[759,4763,2322],{},[823,4765,4766,4768],{},[759,4767,4353],{},": A validator API for ensuring ERN XML files adhere to DDEX standards.",[823,4770,4771,4541],{},[759,4772,4359],{},[823,4774,4775,4748],{},[759,4776,4365],{},[749,4778,4779],{},[779,4780,4783],{"href":4781,"rel":4782},"https://github.com/elibeta22/ddex-mesage-validator-api",[783],[759,4784,4785],{},"DDEX XML Validator",[820,4787,4788,4792,4797,4802],{},[823,4789,4790,4413],{},[759,4791,2322],{},[823,4793,4794,4796],{},[759,4795,4353],{},": An API tool to validate XML documents against XSD and Schematron schemas for DDEX ERN messages.",[823,4798,4799,4801],{},[759,4800,4359],{},": XSLT",[823,4803,4804,4806],{},[759,4805,4365],{},": elibeta22",[749,4808,4809],{},[779,4810,4813],{"href":4811,"rel":4812},"https://github.com/googleinterns/ddex-mead-parser",[783],[759,4814,4815],{},"DDEX XML/XSD to Protocol Buffer",[820,4817,4818,4823,4828,4833],{},[823,4819,4820,4822],{},[759,4821,2322],{},": MEAD (Metadata Exchange)",[823,4824,4825,4827],{},[759,4826,4353],{},": Converts DDEX XML/XSD messages into Protocol Buffer format for easier usage in applications that rely on binary data protocols.",[823,4829,4830,4832],{},[759,4831,4359],{},": Java",[823,4834,4835,4366],{},[759,4836,4365],{},[749,4838,4839],{},[779,4840,4843],{"href":4841,"rel":4842},"https://github.com/monstercat/transport-ddex",[783],[759,4844,4845],{},"Transport DDEX",[820,4847,4848,4853,4858,4862],{},[823,4849,4850,4852],{},[759,4851,2322],{},": ERN Choreography",[823,4854,4855,4857],{},[759,4856,4353],{},": A Python tool for assisting in the secure transfer of DDEX files over SFTP, enabling reliable file exchanges.",[823,4859,4860,4360],{},[759,4861,4359],{},[823,4863,4864,4866],{},[759,4865,4365],{},": Monster Cat",[749,4868,4869],{},[779,4870,4873],{"href":4871,"rel":4872},"https://github.com/moodleexpert/DDEXPythonParser",[783],[759,4874,4875],{},"DDEX Python Parser",[820,4877,4878,4882,4887,4891],{},[823,4879,4880,4413],{},[759,4881,2322],{},[823,4883,4884,4886],{},[759,4885,4353],{},": Parses DDEX XML files and converts them to JSON format for easier handling in web services and other applications.",[823,4888,4889,4360],{},[759,4890,4359],{},[823,4892,4893,4895],{},[759,4894,4365],{},": Arjun Nikhil",[749,4897,4898],{},[779,4899,4902],{"href":4900,"rel":4901},"https://github.com/miqwit/dedex",[783],[759,4903,4904],{},"DeDEX",[820,4906,4907,4911,4916,4920],{},[823,4908,4909,4413],{},[759,4910,2322],{},[823,4912,4913,4915],{},[759,4914,4353],{},": A parser for DDEX XML files specifically supporting versions 3.8.2 and 4.1 of the ERN standard.",[823,4917,4918,4627],{},[759,4919,4359],{},[823,4921,4922,4924],{},[759,4923,4365],{},": miqwit",[787,4926,4928],{"id":4927},"code-quality","Code Quality",[749,4930,4931,4932,2205,4935,4938,4939,2205,4943,4946],{},"Most of the repositories, such as ",[779,4933,4341],{"href":4337,"rel":4934},[783],[779,4936,4437],{"href":4433,"rel":4937},[783],", show clean and modular code structures that follow standard practices in their respective languages. This ensures better readability and easier debugging or extension by other developers. Several projects, especially those from large contributors like ",[779,4940,4942],{"href":4811,"rel":4941},[783],"Google's DDEX XML/XSD to Protocol Buffer",[779,4944,4525],{"href":4521,"rel":4945},[783],", adopt coding best practices such as proper documentation within the code, and meaningful commit messages. These repositories are structured in a way that supports easy adoption and scalability.",[787,4948,4950],{"id":4949},"documentation","Documentation",[749,4952,4953,4954,4957,4958,4961,4962,4965],{},"The repositories generally provide adequate README files explaining usage, installation, and setup. For example, the ",[779,4955,4375],{"href":4371,"rel":4956},[783]," repository includes clear links to additional documentation and explains the Ruby serialization process. Similarly, ",[779,4959,4437],{"href":4433,"rel":4960},[783]," includes detailed instructions for integration with Microsoft Visual Studio. While most repositories have decent documentation, some could benefit from more extensive guides. For instance, repositories like ",[779,4963,4904],{"href":4900,"rel":4964},[783]," lack comprehensive usage examples or extended documentation, which might make it harder for newcomers to implement the tool.",[787,4967,4969],{"id":4968},"community-engagement","Community Engagement",[749,4971,4972,4973,4976,4977,4980,4981,2205,4984,4987],{},"Several of the repositories are personal or small-team projects, such as ",[779,4974,4611],{"href":4607,"rel":4975},[783],", which shows limited engagement from the wider community. However, repositories like ",[779,4978,4341],{"href":4337,"rel":4979},[783]," have contributions from large organizations (Google) and are more likely to see community engagement due to their relevance and backing. Repositories like ",[779,4982,4406],{"href":4402,"rel":4983},[783],[779,4985,4467],{"href":4463,"rel":4986},[783]," have open issues, showing active participation in maintaining and improving the code. Repositories without active issue management might face difficulties in sustaining quality as the technology evolves.",[787,4989,4991],{"id":4990},"activity-maintenance","Activity & Maintenance",[749,4993,4994,4995,4998,4999,5002,5003,5006,5007,2205,5010,5014],{},"Some repositories, such as ",[779,4996,4698],{"href":4694,"rel":4997},[783],", have not seen recent updates, which raises concerns about their long-term maintainability. In contrast, repositories like ",[779,5000,4341],{"href":4337,"rel":5001},[783]," or ",[779,5004,4437],{"href":4433,"rel":5005},[783]," show regular commits and improvements, signaling that they are actively maintained. Projects like ",[779,5008,4942],{"href":4811,"rel":5009},[783],[779,5011,5013],{"href":4492,"rel":5012},[783],"DDEXUI"," use proper versioning and commit practices, ensuring clear tracking of changes and fixes over time.",[787,5016,5018],{"id":5017},"testing-cicd","Testing & CI/CD",[749,5020,5021,5022,5025,5026,5029,5030,5033],{},"Repositories with automated tests and CI/CD integration are generally more reliable in production environments. Tools like ",[779,5023,4437],{"href":4433,"rel":5024},[783]," integrate well into Microsoft Visual Studio, implying a strong emphasis on testing and validation. However, repositories such as ",[779,5027,4611],{"href":4607,"rel":5028},[783]," might lack the same level of CI/CD infrastructure. Repositories like ",[779,5031,4467],{"href":4463,"rel":5032},[783]," show robust error handling mechanisms, which improve the reliability of these tools in production.",[787,5035,5037],{"id":5036},"overall-quality-assessment","Overall Quality Assessment",[820,5039,5040,5053,5066],{},[823,5041,5042,5045,5046,2205,5049,5052],{},[759,5043,5044],{},"High Quality",": Projects like ",[779,5047,4341],{"href":4337,"rel":5048},[783],[779,5050,4437],{"href":4433,"rel":5051},[783]," show high quality in terms of code structure, documentation, and community support.",[823,5054,5055,5058,5059,2205,5062,5065],{},[759,5056,5057],{},"Moderate Quality",": Projects such as ",[779,5060,4611],{"href":4607,"rel":5061},[783],[779,5063,4904],{"href":4900,"rel":5064},[783]," offer good functionality but may require additional documentation and updates to maintain relevance.",[823,5067,5068,5071,5072,5075],{},[759,5069,5070],{},"Low Activity or Maintenance Concerns",": Some repositories, like ",[779,5073,4698],{"href":4694,"rel":5074},[783],", show signs of being outdated or have low maintenance activity, which could make them less reliable in the long term.",[749,5077,5078],{},"By analyzing these repositories across various metrics, we can conclude that while most tools are functional and well-built, their long-term value largely depends on regular updates and community engagement.",[787,5080,5082],{"id":5081},"contributing-to-the-musictech-opensource","Contributing to the MusicTech OpenSource",[749,5084,5085],{},[4300,5086],{"alt":5087,"src":5088},"DDEX Validator screenshot","/images/cdn-migrated/ddex-screenshot.webp",[749,5090,5091,5092,5099,5100,5103,5104,5107],{},"In addition to the tools offered by DDEX, the ",[779,5093,5096],{"href":5094,"rel":5095},"https://ddexvalidator.musictechlab.io/",[783],[759,5097,5098],{},"MTL DDEX Validator"," is a new open-source project developed to validate DDEX messages. Hosted by ",[759,5101,5102],{},"MusicTech Lab",", this tool is designed to help users ensure compliance with DDEX standards, specifically for validating ",[759,5105,5106],{},"Electronic Release Notification (ERN)"," messages.",[749,5109,5110,5111,5114,5115,926],{},"The project can be accessed both as a ",[759,5112,5113],{},"web-based tool"," and through its ",[759,5116,5117],{},"GitHub repository",[820,5119,5120,5130,5141],{},[823,5121,5122,5125,5126,5129],{},[759,5123,5124],{},"Web Tool",": The ",[779,5127,5098],{"href":5094,"rel":5128},[783]," allows users to upload DDEX XML files and check their conformance with the official standards. This provides a quick and user-friendly way for developers and rights holders to verify their metadata.",[823,5131,5132,5134,5135,5140],{},[759,5133,784],{},": ",[779,5136,5139],{"href":5137,"rel":5138},"https://github.com/musictechlab/ddex-validator",[783],"MTL DDEX Validator on GitHub"," offers the full codebase, allowing developers to contribute, clone, or modify the validator to suit their needs. This Python-based project focuses on ensuring accurate and up-to-date validations of XML files used for music metadata exchange, making it an invaluable tool for digital service providers and record labels.",[823,5142,5143,4360],{},[759,5144,4359],{},[787,5146,5148],{"id":5147},"additional-resource-musictech-open-source-catalog","Additional Resource: MusicTech Open-Source Catalog",[749,5150,3092,5151,5158],{},[779,5152,5155],{"href":5153,"rel":5154},"https://musictechlab.io/resources",[783],[759,5156,5157],{},"MusicTech Open-Source Catalog"," by MusicTech Lab is a dedicated resource for music technology tools, including DDEX-specific projects. It offers a variety of open-source tools designed to help developers in the music industry.",[787,5160,5162],{"id":5161},"in-need-of-ddex-standard-implementation","In need of DDEX standard implementation?",[749,5164,5165,5166,5168,5169,5175],{},"If you need expert support for integrating DDEX standards into your digital music platform, ",[759,5167,5102],{}," offers professional services to streamline implementation. Learn more and get started with DDEX integration by visiting the ",[779,5170,5172],{"href":4259,"rel":5171},[783],[759,5173,5174],{},"MusicTech Lab DDEX Integration Services"," for personalized solutions tailored to your business needs.",{"title":805,"searchDepth":898,"depth":898,"links":5177},[5178,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189],{"id":2302,"depth":898,"text":2303},{"id":4316,"depth":898,"text":4317},{"id":4328,"depth":898,"text":4329},{"id":4927,"depth":898,"text":4928},{"id":4949,"depth":898,"text":4950},{"id":4968,"depth":898,"text":4969},{"id":4990,"depth":898,"text":4991},{"id":5017,"depth":898,"text":5018},{"id":5036,"depth":898,"text":5037},{"id":5081,"depth":898,"text":5082},{"id":5147,"depth":898,"text":5148},{"id":5161,"depth":898,"text":5162},"2024-09-12T00:00:00.000Z","Explore DDEX open-source projects that simplify music metadata management, enhance rights tracking, and streamline royalty distribution.",{"src":5193},"/images/blog/musictechlab_blog_ddex-open-source-projects-review.webp",{"enabled":1100,"items":5195},[5196,5198,5201,5203],{"text":5197,"icon":4084},"20+ open source DDEX tools exist across Python, Ruby, C#, PHP, JavaScript, and Java.",{"text":5199,"icon":5200},"Google's dsrf parser and the DDEX Validator are the highest-quality maintained projects.","i-lucide-star",{"text":5202,"icon":2171},"Many repositories lack recent updates, raising long-term maintainability concerns.",{"text":5204,"icon":4277},"MTL DDEX Validator is an open source web tool for validating ERN messages.",{},{"title":136,"description":5191},[984,4284,2178],"1iGHR1ZyKl8mlFxEovkzHfYNK3VJPZ4Q8fDBbFxCZs8",{"id":5210,"title":160,"authors":5211,"badge":2146,"body":5216,"category":2145,"client":2146,"date":8106,"description":8107,"extension":2149,"faq":2146,"featured":69,"featuredOrder":2146,"hidden":69,"image":8108,"keyTakeaways":8110,"meta":8121,"navigation":1100,"path":161,"seo":8122,"status":2146,"stem":162,"tags":8123,"teaser":2146,"__hash__":8125,"score":972},"posts/blog/music-data/introduction-to-generating-ddex-file-using-python.md",[5212],{"name":5213,"avatar":5214},"Andrzej Dąbski",{"src":5215},"/images/people/andrzej-dabski.png",{"type":746,"value":5217,"toc":8097},[5218,5222,5225,5244,5247,5251,5260,5263,5283,5287,5294,6063,6067,6070,8033,8038,8042,8065,8069,8072,8094],[787,5219,5221],{"id":5220},"what-is-a-ddex-file","What is a DDEX file?",[749,5223,5224],{},"DDEX (Digital Data Exchange) is a set of international standards for exchanging digital media data in the music industry. These XML-based standards ensure that information about releases, licensing, recordings, and sales flows accurately between creators, distributors, and retailers.",[845,5226,5228,5232,5236,5240],{"className":5227},[848,849,2440,851,852],[854,5229],{"description":5230,"title":5231},"Communicates release information — albums, singles, tracklists, and contributors.","ERN (Electronic Release Notification)",[854,5233],{"description":5234,"title":5235},"Reports sales and usage data for digital music releases across platforms.","DSR (Digital Sales Reporting)",[854,5237],{"description":5238,"title":5239},"Exchanges details about the recording process, contributors, and technical specs.","RIN (Recording Information Notification)",[854,5241],{"description":5242,"title":5243},"Supports licensing data exchange between publishers and licensing agencies.","MLC (Musical Works Licensing Creator)",[749,5245,5246],{},"The most common use case today is proving rights to a piece of music (clearance) or sending takedown messages when content is used without permission. Different content providers support different DDEX versions — YouTube supports 3.4 to 3.8, Facebook supports 3.8.3, and the newest version is 4.2.",[787,5248,5250],{"id":5249},"how-to-generate-a-ddex-file-using-python","How to Generate a DDEX File Using Python",[749,5252,5253,5254,5259],{},"The simplest approach is to start from an existing DDEX file and create a template. ",[779,5255,5258],{"href":5256,"rel":5257},"https://www.octolivery.com/",[783],"Octolivery"," is one of the few DDEX file generators available.",[749,5261,5262],{},"To fill the template, you'll need:",[820,5264,5265,5268,5277,5280],{},[823,5266,5267],{},"A link to the already-published music or video",[823,5269,5270,5271,5276],{},"Your ",[779,5272,5275],{"href":5273,"rel":5274},"https://dpid.ddex.net/",[783],"DPID"," (free to obtain — no DDEX membership required)",[823,5278,5279],{},"The DDEX ID of the recipient company",[823,5281,5282],{},"Track data: name, duration, artists, compositor, etc. (per scene for music videos)",[928,5284,5286],{"id":5285},"basic-example-ern-xml-with-python","Basic Example: ERN XML with Python",[749,5288,5289,5290,5293],{},"Here's a minimal example using Python's built-in ",[764,5291,5292],{},"xml.etree.ElementTree"," to create a DDEX ERN file:",[799,5295,5297],{"className":1068,"code":5296,"language":1071,"meta":805,"style":805},"import xml.etree.ElementTree as ET\n\n# Create root element\nroot = ET.Element(\"ern:NewReleaseMessage\", {\n    \"xmlns:ern\": \"http://ddex.net/xml/ern/43\",\n    \"MessageSchemaVersionId\": \"ern/43\",\n})\n\n# Message header\nheader = ET.SubElement(root, \"MessageHeader\")\nET.SubElement(header, \"MessageId\").text = \"MSG-2023-001\"\nET.SubElement(header, \"MessageCreatedDateTime\").text = \"2023-12-07T10:00:00Z\"\n\nsender = ET.SubElement(header, \"MessageSender\")\nET.SubElement(sender, \"PartyId\").text = \"PADPIDA2023010101A\"\nET.SubElement(sender, \"PartyName\").text = \"My Label\"\n\nrecipient = ET.SubElement(header, \"MessageRecipient\")\nET.SubElement(recipient, \"PartyId\").text = \"PADPIDA2020121501Y\"\nET.SubElement(recipient, \"PartyName\").text = \"YouTube\"\n\n# Resource list\nresource_list = ET.SubElement(root, \"ResourceList\")\nsound_recording = ET.SubElement(resource_list, \"SoundRecording\")\nET.SubElement(sound_recording, \"ResourceReference\").text = \"A1\"\n\ndetails = ET.SubElement(sound_recording, \"SoundRecordingDetailsByTerritory\")\ntitle = ET.SubElement(details, \"Title\")\nET.SubElement(title, \"TitleText\").text = \"My Song Title\"\nET.SubElement(details, \"Duration\").text = \"PT3M45S\"\n\n# Write to file\ntree = ET.ElementTree(root)\nET.indent(tree, space=\"  \")\ntree.write(\"release.xml\", xml_declaration=True, encoding=\"UTF-8\")\n\nprint(\"DDEX ERN file generated: release.xml\")\n",[764,5298,5299,5322,5326,5331,5360,5381,5401,5406,5410,5415,5445,5484,5518,5522,5550,5585,5619,5623,5651,5685,5718,5722,5727,5755,5783,5816,5820,5848,5876,5910,5943,5947,5953,5973,6001,6042,6047],{"__ignoreMap":805},[881,5300,5301,5303,5306,5308,5311,5313,5316,5319],{"class":883,"line":884},[881,5302,1085],{"class":1078},[881,5304,5305],{"class":990}," xml",[881,5307,785],{"class":950},[881,5309,5310],{"class":946},"etree",[881,5312,785],{"class":950},[881,5314,5315],{"class":946},"ElementTree",[881,5317,5318],{"class":1078}," as",[881,5320,5321],{"class":990}," ET\n",[881,5323,5324],{"class":883,"line":898},[881,5325,1101],{"emptyLinePlaceholder":1100},[881,5327,5328],{"class":883,"line":966},[881,5329,5330],{"class":1153},"# Create root element\n",[881,5332,5333,5336,5338,5341,5343,5346,5348,5350,5353,5355,5357],{"class":883,"line":972},[881,5334,5335],{"class":990},"root ",[881,5337,1165],{"class":950},[881,5339,5340],{"class":990}," ET",[881,5342,785],{"class":950},[881,5344,5345],{"class":1110},"Element",[881,5347,1114],{"class":950},[881,5349,987],{"class":950},[881,5351,5352],{"class":891},"ern:NewReleaseMessage",[881,5354,987],{"class":950},[881,5356,1126],{"class":950},[881,5358,5359],{"class":950}," {\n",[881,5361,5362,5365,5368,5370,5372,5374,5377,5379],{"class":883,"line":978},[881,5363,5364],{"class":950},"    \"",[881,5366,5367],{"class":891},"xmlns:ern",[881,5369,987],{"class":950},[881,5371,926],{"class":950},[881,5373,1555],{"class":950},[881,5375,5376],{"class":891},"http://ddex.net/xml/ern/43",[881,5378,987],{"class":950},[881,5380,1458],{"class":950},[881,5382,5383,5385,5388,5390,5392,5394,5397,5399],{"class":883,"line":1024},[881,5384,5364],{"class":950},[881,5386,5387],{"class":891},"MessageSchemaVersionId",[881,5389,987],{"class":950},[881,5391,926],{"class":950},[881,5393,1555],{"class":950},[881,5395,5396],{"class":891},"ern/43",[881,5398,987],{"class":950},[881,5400,1458],{"class":950},[881,5402,5403],{"class":883,"line":1171},[881,5404,5405],{"class":950},"})\n",[881,5407,5408],{"class":883,"line":1180},[881,5409,1101],{"emptyLinePlaceholder":1100},[881,5411,5412],{"class":883,"line":1199},[881,5413,5414],{"class":1153},"# Message header\n",[881,5416,5417,5420,5422,5424,5426,5429,5431,5434,5436,5438,5441,5443],{"class":883,"line":1205},[881,5418,5419],{"class":990},"header ",[881,5421,1165],{"class":950},[881,5423,5340],{"class":990},[881,5425,785],{"class":950},[881,5427,5428],{"class":1110},"SubElement",[881,5430,1114],{"class":950},[881,5432,5433],{"class":1110},"root",[881,5435,1126],{"class":950},[881,5437,1555],{"class":950},[881,5439,5440],{"class":891},"MessageHeader",[881,5442,987],{"class":950},[881,5444,1247],{"class":950},[881,5446,5447,5450,5452,5454,5456,5459,5461,5463,5466,5468,5471,5473,5476,5478,5481],{"class":883,"line":1210},[881,5448,5449],{"class":990},"ET",[881,5451,785],{"class":950},[881,5453,5428],{"class":1110},[881,5455,1114],{"class":950},[881,5457,5458],{"class":1110},"header",[881,5460,1126],{"class":950},[881,5462,1555],{"class":950},[881,5464,5465],{"class":891},"MessageId",[881,5467,987],{"class":950},[881,5469,5470],{"class":950},").",[881,5472,804],{"class":946},[881,5474,5475],{"class":950}," =",[881,5477,1555],{"class":950},[881,5479,5480],{"class":891},"MSG-2023-001",[881,5482,5483],{"class":950},"\"\n",[881,5485,5486,5488,5490,5492,5494,5496,5498,5500,5503,5505,5507,5509,5511,5513,5516],{"class":883,"line":1216},[881,5487,5449],{"class":990},[881,5489,785],{"class":950},[881,5491,5428],{"class":1110},[881,5493,1114],{"class":950},[881,5495,5458],{"class":1110},[881,5497,1126],{"class":950},[881,5499,1555],{"class":950},[881,5501,5502],{"class":891},"MessageCreatedDateTime",[881,5504,987],{"class":950},[881,5506,5470],{"class":950},[881,5508,804],{"class":946},[881,5510,5475],{"class":950},[881,5512,1555],{"class":950},[881,5514,5515],{"class":891},"2023-12-07T10:00:00Z",[881,5517,5483],{"class":950},[881,5519,5520],{"class":883,"line":1250},[881,5521,1101],{"emptyLinePlaceholder":1100},[881,5523,5524,5527,5529,5531,5533,5535,5537,5539,5541,5543,5546,5548],{"class":883,"line":1264},[881,5525,5526],{"class":990},"sender ",[881,5528,1165],{"class":950},[881,5530,5340],{"class":990},[881,5532,785],{"class":950},[881,5534,5428],{"class":1110},[881,5536,1114],{"class":950},[881,5538,5458],{"class":1110},[881,5540,1126],{"class":950},[881,5542,1555],{"class":950},[881,5544,5545],{"class":891},"MessageSender",[881,5547,987],{"class":950},[881,5549,1247],{"class":950},[881,5551,5552,5554,5556,5558,5560,5563,5565,5567,5570,5572,5574,5576,5578,5580,5583],{"class":883,"line":1292},[881,5553,5449],{"class":990},[881,5555,785],{"class":950},[881,5557,5428],{"class":1110},[881,5559,1114],{"class":950},[881,5561,5562],{"class":1110},"sender",[881,5564,1126],{"class":950},[881,5566,1555],{"class":950},[881,5568,5569],{"class":891},"PartyId",[881,5571,987],{"class":950},[881,5573,5470],{"class":950},[881,5575,804],{"class":946},[881,5577,5475],{"class":950},[881,5579,1555],{"class":950},[881,5581,5582],{"class":891},"PADPIDA2023010101A",[881,5584,5483],{"class":950},[881,5586,5587,5589,5591,5593,5595,5597,5599,5601,5604,5606,5608,5610,5612,5614,5617],{"class":883,"line":1314},[881,5588,5449],{"class":990},[881,5590,785],{"class":950},[881,5592,5428],{"class":1110},[881,5594,1114],{"class":950},[881,5596,5562],{"class":1110},[881,5598,1126],{"class":950},[881,5600,1555],{"class":950},[881,5602,5603],{"class":891},"PartyName",[881,5605,987],{"class":950},[881,5607,5470],{"class":950},[881,5609,804],{"class":946},[881,5611,5475],{"class":950},[881,5613,1555],{"class":950},[881,5615,5616],{"class":891},"My Label",[881,5618,5483],{"class":950},[881,5620,5621],{"class":883,"line":1319},[881,5622,1101],{"emptyLinePlaceholder":1100},[881,5624,5625,5628,5630,5632,5634,5636,5638,5640,5642,5644,5647,5649],{"class":883,"line":1325},[881,5626,5627],{"class":990},"recipient ",[881,5629,1165],{"class":950},[881,5631,5340],{"class":990},[881,5633,785],{"class":950},[881,5635,5428],{"class":1110},[881,5637,1114],{"class":950},[881,5639,5458],{"class":1110},[881,5641,1126],{"class":950},[881,5643,1555],{"class":950},[881,5645,5646],{"class":891},"MessageRecipient",[881,5648,987],{"class":950},[881,5650,1247],{"class":950},[881,5652,5653,5655,5657,5659,5661,5664,5666,5668,5670,5672,5674,5676,5678,5680,5683],{"class":883,"line":1351},[881,5654,5449],{"class":990},[881,5656,785],{"class":950},[881,5658,5428],{"class":1110},[881,5660,1114],{"class":950},[881,5662,5663],{"class":1110},"recipient",[881,5665,1126],{"class":950},[881,5667,1555],{"class":950},[881,5669,5569],{"class":891},[881,5671,987],{"class":950},[881,5673,5470],{"class":950},[881,5675,804],{"class":946},[881,5677,5475],{"class":950},[881,5679,1555],{"class":950},[881,5681,5682],{"class":891},"PADPIDA2020121501Y",[881,5684,5483],{"class":950},[881,5686,5687,5689,5691,5693,5695,5697,5699,5701,5703,5705,5707,5709,5711,5713,5716],{"class":883,"line":1374},[881,5688,5449],{"class":990},[881,5690,785],{"class":950},[881,5692,5428],{"class":1110},[881,5694,1114],{"class":950},[881,5696,5663],{"class":1110},[881,5698,1126],{"class":950},[881,5700,1555],{"class":950},[881,5702,5603],{"class":891},[881,5704,987],{"class":950},[881,5706,5470],{"class":950},[881,5708,804],{"class":946},[881,5710,5475],{"class":950},[881,5712,1555],{"class":950},[881,5714,5715],{"class":891},"YouTube",[881,5717,5483],{"class":950},[881,5719,5720],{"class":883,"line":1379},[881,5721,1101],{"emptyLinePlaceholder":1100},[881,5723,5724],{"class":883,"line":1390},[881,5725,5726],{"class":1153},"# Resource list\n",[881,5728,5729,5732,5734,5736,5738,5740,5742,5744,5746,5748,5751,5753],{"class":883,"line":1404},[881,5730,5731],{"class":990},"resource_list ",[881,5733,1165],{"class":950},[881,5735,5340],{"class":990},[881,5737,785],{"class":950},[881,5739,5428],{"class":1110},[881,5741,1114],{"class":950},[881,5743,5433],{"class":1110},[881,5745,1126],{"class":950},[881,5747,1555],{"class":950},[881,5749,5750],{"class":891},"ResourceList",[881,5752,987],{"class":950},[881,5754,1247],{"class":950},[881,5756,5757,5760,5762,5764,5766,5768,5770,5773,5775,5777,5779,5781],{"class":883,"line":1425},[881,5758,5759],{"class":990},"sound_recording ",[881,5761,1165],{"class":950},[881,5763,5340],{"class":990},[881,5765,785],{"class":950},[881,5767,5428],{"class":1110},[881,5769,1114],{"class":950},[881,5771,5772],{"class":1110},"resource_list",[881,5774,1126],{"class":950},[881,5776,1555],{"class":950},[881,5778,3742],{"class":891},[881,5780,987],{"class":950},[881,5782,1247],{"class":950},[881,5784,5785,5787,5789,5791,5793,5796,5798,5800,5802,5804,5806,5808,5810,5812,5814],{"class":883,"line":1439},[881,5786,5449],{"class":990},[881,5788,785],{"class":950},[881,5790,5428],{"class":1110},[881,5792,1114],{"class":950},[881,5794,5795],{"class":1110},"sound_recording",[881,5797,1126],{"class":950},[881,5799,1555],{"class":950},[881,5801,1685],{"class":891},[881,5803,987],{"class":950},[881,5805,5470],{"class":950},[881,5807,804],{"class":946},[881,5809,5475],{"class":950},[881,5811,1555],{"class":950},[881,5813,1690],{"class":891},[881,5815,5483],{"class":950},[881,5817,5818],{"class":883,"line":1461},[881,5819,1101],{"emptyLinePlaceholder":1100},[881,5821,5822,5825,5827,5829,5831,5833,5835,5837,5839,5841,5844,5846],{"class":883,"line":1481},[881,5823,5824],{"class":990},"details ",[881,5826,1165],{"class":950},[881,5828,5340],{"class":990},[881,5830,785],{"class":950},[881,5832,5428],{"class":1110},[881,5834,1114],{"class":950},[881,5836,5795],{"class":1110},[881,5838,1126],{"class":950},[881,5840,1555],{"class":950},[881,5842,5843],{"class":891},"SoundRecordingDetailsByTerritory",[881,5845,987],{"class":950},[881,5847,1247],{"class":950},[881,5849,5850,5853,5855,5857,5859,5861,5863,5866,5868,5870,5872,5874],{"class":883,"line":1501},[881,5851,5852],{"class":990},"title ",[881,5854,1165],{"class":950},[881,5856,5340],{"class":990},[881,5858,785],{"class":950},[881,5860,5428],{"class":1110},[881,5862,1114],{"class":950},[881,5864,5865],{"class":1110},"details",[881,5867,1126],{"class":950},[881,5869,1555],{"class":950},[881,5871,3673],{"class":891},[881,5873,987],{"class":950},[881,5875,1247],{"class":950},[881,5877,5878,5880,5882,5884,5886,5888,5890,5892,5895,5897,5899,5901,5903,5905,5908],{"class":883,"line":1522},[881,5879,5449],{"class":990},[881,5881,785],{"class":950},[881,5883,5428],{"class":1110},[881,5885,1114],{"class":950},[881,5887,3206],{"class":1110},[881,5889,1126],{"class":950},[881,5891,1555],{"class":950},[881,5893,5894],{"class":891},"TitleText",[881,5896,987],{"class":950},[881,5898,5470],{"class":950},[881,5900,804],{"class":946},[881,5902,5475],{"class":950},[881,5904,1555],{"class":950},[881,5906,5907],{"class":891},"My Song Title",[881,5909,5483],{"class":950},[881,5911,5912,5914,5916,5918,5920,5922,5924,5926,5928,5930,5932,5934,5936,5938,5941],{"class":883,"line":1528},[881,5913,5449],{"class":990},[881,5915,785],{"class":950},[881,5917,5428],{"class":1110},[881,5919,1114],{"class":950},[881,5921,5865],{"class":1110},[881,5923,1126],{"class":950},[881,5925,1555],{"class":950},[881,5927,1662],{"class":891},[881,5929,987],{"class":950},[881,5931,5470],{"class":950},[881,5933,804],{"class":946},[881,5935,5475],{"class":950},[881,5937,1555],{"class":950},[881,5939,5940],{"class":891},"PT3M45S",[881,5942,5483],{"class":950},[881,5944,5945],{"class":883,"line":1533},[881,5946,1101],{"emptyLinePlaceholder":1100},[881,5948,5950],{"class":883,"line":5949},32,[881,5951,5952],{"class":1153},"# Write to file\n",[881,5954,5956,5959,5961,5963,5965,5967,5969,5971],{"class":883,"line":5955},33,[881,5957,5958],{"class":990},"tree ",[881,5960,1165],{"class":950},[881,5962,5340],{"class":990},[881,5964,785],{"class":950},[881,5966,5315],{"class":1110},[881,5968,1114],{"class":950},[881,5970,5433],{"class":1110},[881,5972,1247],{"class":950},[881,5974,5976,5978,5980,5983,5985,5988,5990,5993,5995,5997,5999],{"class":883,"line":5975},34,[881,5977,5449],{"class":990},[881,5979,785],{"class":950},[881,5981,5982],{"class":1110},"indent",[881,5984,1114],{"class":950},[881,5986,5987],{"class":1110},"tree",[881,5989,1126],{"class":950},[881,5991,5992],{"class":1117}," space",[881,5994,1165],{"class":950},[881,5996,987],{"class":950},[881,5998,981],{"class":950},[881,6000,1247],{"class":950},[881,6002,6004,6006,6008,6011,6013,6015,6018,6020,6022,6025,6028,6031,6033,6035,6038,6040],{"class":883,"line":6003},35,[881,6005,5987],{"class":990},[881,6007,785],{"class":950},[881,6009,6010],{"class":1110},"write",[881,6012,1114],{"class":950},[881,6014,987],{"class":950},[881,6016,6017],{"class":891},"release.xml",[881,6019,987],{"class":950},[881,6021,1126],{"class":950},[881,6023,6024],{"class":1117}," xml_declaration",[881,6026,6027],{"class":950},"=True,",[881,6029,6030],{"class":1117}," encoding",[881,6032,1165],{"class":950},[881,6034,987],{"class":950},[881,6036,6037],{"class":891},"UTF-8",[881,6039,987],{"class":950},[881,6041,1247],{"class":950},[881,6043,6045],{"class":883,"line":6044},36,[881,6046,1101],{"emptyLinePlaceholder":1100},[881,6048,6050,6052,6054,6056,6059,6061],{"class":883,"line":6049},37,[881,6051,3184],{"class":1110},[881,6053,1114],{"class":950},[881,6055,987],{"class":950},[881,6057,6058],{"class":891},"DDEX ERN file generated: release.xml",[881,6060,987],{"class":950},[881,6062,1247],{"class":950},[928,6064,6066],{"id":6065},"more-complete-example-with-artists-and-deal-terms","More Complete Example: With Artists and Deal Terms",[749,6068,6069],{},"A real-world DDEX file includes artist details, ISRC codes, and deal terms. Here's a more complete version:",[799,6071,6073],{"className":1068,"code":6072,"language":1071,"meta":805,"style":805},"import xml.etree.ElementTree as ET\nfrom datetime import datetime\n\n\ndef create_ern_release(track_data: dict, sender: dict, recipient: dict) -> ET.Element:\n    \"\"\"Generate a DDEX ERN 4.3 NewReleaseMessage.\"\"\"\n    root = ET.Element(\"ern:NewReleaseMessage\", {\n        \"xmlns:ern\": \"http://ddex.net/xml/ern/43\",\n        \"MessageSchemaVersionId\": \"ern/43\",\n    })\n\n    # Header\n    header = ET.SubElement(root, \"MessageHeader\")\n    ET.SubElement(header, \"MessageId\").text = f\"MSG-{datetime.now():%Y%m%d%H%M%S}\"\n    ET.SubElement(header, \"MessageCreatedDateTime\").text = datetime.now().isoformat()\n\n    msg_sender = ET.SubElement(header, \"MessageSender\")\n    ET.SubElement(msg_sender, \"PartyId\").text = sender[\"dpid\"]\n    ET.SubElement(msg_sender, \"PartyName\").text = sender[\"name\"]\n\n    msg_recipient = ET.SubElement(header, \"MessageRecipient\")\n    ET.SubElement(msg_recipient, \"PartyId\").text = recipient[\"dpid\"]\n    ET.SubElement(msg_recipient, \"PartyName\").text = recipient[\"name\"]\n\n    # Resource list\n    resource_list = ET.SubElement(root, \"ResourceList\")\n    recording = ET.SubElement(resource_list, \"SoundRecording\")\n    ET.SubElement(recording, \"ResourceReference\").text = \"A1\"\n\n    sr_id = ET.SubElement(recording, \"SoundRecordingId\")\n    ET.SubElement(sr_id, \"ISRC\").text = track_data[\"isrc\"]\n\n    details = ET.SubElement(recording, \"SoundRecordingDetailsByTerritory\")\n    title_el = ET.SubElement(details, \"Title\")\n    ET.SubElement(title_el, \"TitleText\").text = track_data[\"title\"]\n    ET.SubElement(details, \"Duration\").text = track_data[\"duration\"]\n\n    # Artists\n    for artist in track_data.get(\"artists\", []):\n        contributor = ET.SubElement(details, \"DisplayArtist\")\n        name_el = ET.SubElement(contributor, \"PartyName\")\n        ET.SubElement(name_el, \"FullName\").text = artist[\"name\"]\n        ET.SubElement(contributor, \"ArtistRole\").text = artist.get(\"role\", \"MainArtist\")\n\n    # Release list\n    release_list = ET.SubElement(root, \"ReleaseList\")\n    release = ET.SubElement(release_list, \"Release\")\n    release_id = ET.SubElement(release, \"ReleaseId\")\n    ET.SubElement(release_id, \"ICPN\").text = track_data.get(\"upc\", \"\")\n\n    release_detail = ET.SubElement(release, \"ReleaseDetailsByTerritory\")\n    ET.SubElement(release_detail, \"TerritoryCode\").text = \"Worldwide\"\n\n    # Deal list\n    deal_list = ET.SubElement(root, \"DealList\")\n    deal = ET.SubElement(deal_list, \"ReleaseDeal\")\n    deal_terms = ET.SubElement(deal, \"Deal\")\n    ET.SubElement(deal_terms, \"CommercialModelType\").text = \"SubscriptionModel\"\n    ET.SubElement(deal_terms, \"Usage\").text = \"OnDemandStream\"\n\n    validity = ET.SubElement(deal_terms, \"ValidityPeriod\")\n    ET.SubElement(validity, \"StartDate\").text = track_data.get(\"release_date\", \"\")\n\n    return root\n\n\n# Usage\ntrack = {\n    \"title\": \"Ocean Waves\",\n    \"isrc\": \"USRC12345678\",\n    \"duration\": \"PT4M12S\",\n    \"upc\": \"0123456789012\",\n    \"release_date\": \"2024-01-15\",\n    \"artists\": [\n        {\"name\": \"Jane Doe\", \"role\": \"MainArtist\"},\n        {\"name\": \"John Smith\", \"role\": \"FeaturedArtist\"},\n    ],\n}\n\nern = create_ern_release(\n    track_data=track,\n    sender={\"dpid\": \"PADPIDA2023010101A\", \"name\": \"My Label\"},\n    recipient={\"dpid\": \"PADPIDA2020121501Y\", \"name\": \"YouTube\"},\n)\n\ntree = ET.ElementTree(ern)\nET.indent(tree, space=\"  \")\ntree.write(\"release_complete.xml\", xml_declaration=True, encoding=\"UTF-8\")\nprint(\"Complete DDEX ERN file generated.\")\n",[764,6074,6075,6093,6105,6109,6113,6159,6168,6193,6212,6230,6235,6239,6244,6271,6350,6391,6395,6422,6463,6501,6505,6532,6571,6609,6613,6618,6645,6672,6705,6709,6736,6777,6781,6808,6835,6874,6913,6917,6923,6952,6980,7009,7052,7104,7109,7115,7144,7173,7203,7253,7258,7287,7321,7326,7332,7361,7391,7420,7455,7489,7494,7523,7572,7577,7585,7590,7595,7601,7611,7631,7651,7671,7690,7710,7724,7764,7803,7809,7814,7819,7832,7845,7886,7926,7931,7936,7956,7981,8017],{"__ignoreMap":805},[881,6076,6077,6079,6081,6083,6085,6087,6089,6091],{"class":883,"line":884},[881,6078,1085],{"class":1078},[881,6080,5305],{"class":990},[881,6082,785],{"class":950},[881,6084,5310],{"class":946},[881,6086,785],{"class":950},[881,6088,5315],{"class":946},[881,6090,5318],{"class":1078},[881,6092,5321],{"class":990},[881,6094,6095,6097,6100,6102],{"class":883,"line":898},[881,6096,1079],{"class":1078},[881,6098,6099],{"class":990}," datetime ",[881,6101,1085],{"class":1078},[881,6103,6104],{"class":990}," datetime\n",[881,6106,6107],{"class":883,"line":966},[881,6108,1101],{"emptyLinePlaceholder":1100},[881,6110,6111],{"class":883,"line":972},[881,6112,1101],{"emptyLinePlaceholder":1100},[881,6114,6115,6117,6120,6122,6125,6127,6129,6131,6134,6136,6138,6140,6143,6145,6147,6149,6151,6153,6155,6157],{"class":883,"line":978},[881,6116,1107],{"class":1106},[881,6118,6119],{"class":1110}," create_ern_release",[881,6121,1114],{"class":950},[881,6123,6124],{"class":1117},"track_data",[881,6126,926],{"class":950},[881,6128,1142],{"class":887},[881,6130,1126],{"class":950},[881,6132,6133],{"class":1117}," sender",[881,6135,926],{"class":950},[881,6137,1142],{"class":887},[881,6139,1126],{"class":950},[881,6141,6142],{"class":1117}," recipient",[881,6144,926],{"class":950},[881,6146,1142],{"class":887},[881,6148,1136],{"class":950},[881,6150,1139],{"class":950},[881,6152,5340],{"class":990},[881,6154,785],{"class":950},[881,6156,5345],{"class":946},[881,6158,1145],{"class":950},[881,6160,6161,6163,6166],{"class":883,"line":1024},[881,6162,1150],{"class":1078},[881,6164,6165],{"class":1153},"Generate a DDEX ERN 4.3 NewReleaseMessage.",[881,6167,1157],{"class":1078},[881,6169,6170,6173,6175,6177,6179,6181,6183,6185,6187,6189,6191],{"class":883,"line":1171},[881,6171,6172],{"class":990},"    root ",[881,6174,1165],{"class":950},[881,6176,5340],{"class":990},[881,6178,785],{"class":950},[881,6180,5345],{"class":1110},[881,6182,1114],{"class":950},[881,6184,987],{"class":950},[881,6186,5352],{"class":891},[881,6188,987],{"class":950},[881,6190,1126],{"class":950},[881,6192,5359],{"class":950},[881,6194,6195,6198,6200,6202,6204,6206,6208,6210],{"class":883,"line":1180},[881,6196,6197],{"class":950},"        \"",[881,6199,5367],{"class":891},[881,6201,987],{"class":950},[881,6203,926],{"class":950},[881,6205,1555],{"class":950},[881,6207,5376],{"class":891},[881,6209,987],{"class":950},[881,6211,1458],{"class":950},[881,6213,6214,6216,6218,6220,6222,6224,6226,6228],{"class":883,"line":1199},[881,6215,6197],{"class":950},[881,6217,5387],{"class":891},[881,6219,987],{"class":950},[881,6221,926],{"class":950},[881,6223,1555],{"class":950},[881,6225,5396],{"class":891},[881,6227,987],{"class":950},[881,6229,1458],{"class":950},[881,6231,6232],{"class":883,"line":1205},[881,6233,6234],{"class":950},"    })\n",[881,6236,6237],{"class":883,"line":1210},[881,6238,1101],{"emptyLinePlaceholder":1100},[881,6240,6241],{"class":883,"line":1216},[881,6242,6243],{"class":1153},"    # Header\n",[881,6245,6246,6249,6251,6253,6255,6257,6259,6261,6263,6265,6267,6269],{"class":883,"line":1250},[881,6247,6248],{"class":990},"    header ",[881,6250,1165],{"class":950},[881,6252,5340],{"class":990},[881,6254,785],{"class":950},[881,6256,5428],{"class":1110},[881,6258,1114],{"class":950},[881,6260,5433],{"class":1110},[881,6262,1126],{"class":950},[881,6264,1555],{"class":950},[881,6266,5440],{"class":891},[881,6268,987],{"class":950},[881,6270,1247],{"class":950},[881,6272,6273,6276,6278,6280,6282,6284,6286,6288,6290,6292,6294,6296,6298,6301,6304,6306,6309,6311,6314,6317,6320,6323,6326,6328,6331,6333,6336,6338,6341,6343,6346,6348],{"class":883,"line":1264},[881,6274,6275],{"class":990},"    ET",[881,6277,785],{"class":950},[881,6279,5428],{"class":1110},[881,6281,1114],{"class":950},[881,6283,5458],{"class":1110},[881,6285,1126],{"class":950},[881,6287,1555],{"class":950},[881,6289,5465],{"class":891},[881,6291,987],{"class":950},[881,6293,5470],{"class":950},[881,6295,804],{"class":946},[881,6297,5475],{"class":950},[881,6299,6300],{"class":1106}," f",[881,6302,6303],{"class":891},"\"MSG-",[881,6305,1187],{"class":1034},[881,6307,6308],{"class":990},"datetime",[881,6310,785],{"class":950},[881,6312,6313],{"class":1110},"now",[881,6315,6316],{"class":950},"():%",[881,6318,6319],{"class":990},"Y",[881,6321,6322],{"class":950},"%",[881,6324,6325],{"class":990},"m",[881,6327,6322],{"class":950},[881,6329,6330],{"class":990},"d",[881,6332,6322],{"class":950},[881,6334,6335],{"class":990},"H",[881,6337,6322],{"class":950},[881,6339,6340],{"class":990},"M",[881,6342,6322],{"class":950},[881,6344,6345],{"class":990},"S",[881,6347,1193],{"class":1034},[881,6349,5483],{"class":891},[881,6351,6352,6354,6356,6358,6360,6362,6364,6366,6368,6370,6372,6374,6376,6379,6381,6383,6386,6389],{"class":883,"line":1292},[881,6353,6275],{"class":990},[881,6355,785],{"class":950},[881,6357,5428],{"class":1110},[881,6359,1114],{"class":950},[881,6361,5458],{"class":1110},[881,6363,1126],{"class":950},[881,6365,1555],{"class":950},[881,6367,5502],{"class":891},[881,6369,987],{"class":950},[881,6371,5470],{"class":950},[881,6373,804],{"class":946},[881,6375,5475],{"class":950},[881,6377,6378],{"class":990}," datetime",[881,6380,785],{"class":950},[881,6382,6313],{"class":1110},[881,6384,6385],{"class":950},"().",[881,6387,6388],{"class":1110},"isoformat",[881,6390,1261],{"class":950},[881,6392,6393],{"class":883,"line":1314},[881,6394,1101],{"emptyLinePlaceholder":1100},[881,6396,6397,6400,6402,6404,6406,6408,6410,6412,6414,6416,6418,6420],{"class":883,"line":1319},[881,6398,6399],{"class":990},"    msg_sender ",[881,6401,1165],{"class":950},[881,6403,5340],{"class":990},[881,6405,785],{"class":950},[881,6407,5428],{"class":1110},[881,6409,1114],{"class":950},[881,6411,5458],{"class":1110},[881,6413,1126],{"class":950},[881,6415,1555],{"class":950},[881,6417,5545],{"class":891},[881,6419,987],{"class":950},[881,6421,1247],{"class":950},[881,6423,6424,6426,6428,6430,6432,6435,6437,6439,6441,6443,6445,6447,6449,6451,6453,6455,6458,6460],{"class":883,"line":1325},[881,6425,6275],{"class":990},[881,6427,785],{"class":950},[881,6429,5428],{"class":1110},[881,6431,1114],{"class":950},[881,6433,6434],{"class":1110},"msg_sender",[881,6436,1126],{"class":950},[881,6438,1555],{"class":950},[881,6440,5569],{"class":891},[881,6442,987],{"class":950},[881,6444,5470],{"class":950},[881,6446,804],{"class":946},[881,6448,5475],{"class":950},[881,6450,6133],{"class":990},[881,6452,3200],{"class":950},[881,6454,987],{"class":950},[881,6456,6457],{"class":891},"dpid",[881,6459,987],{"class":950},[881,6461,6462],{"class":950},"]\n",[881,6464,6465,6467,6469,6471,6473,6475,6477,6479,6481,6483,6485,6487,6489,6491,6493,6495,6497,6499],{"class":883,"line":1351},[881,6466,6275],{"class":990},[881,6468,785],{"class":950},[881,6470,5428],{"class":1110},[881,6472,1114],{"class":950},[881,6474,6434],{"class":1110},[881,6476,1126],{"class":950},[881,6478,1555],{"class":950},[881,6480,5603],{"class":891},[881,6482,987],{"class":950},[881,6484,5470],{"class":950},[881,6486,804],{"class":946},[881,6488,5475],{"class":950},[881,6490,6133],{"class":990},[881,6492,3200],{"class":950},[881,6494,987],{"class":950},[881,6496,947],{"class":891},[881,6498,987],{"class":950},[881,6500,6462],{"class":950},[881,6502,6503],{"class":883,"line":1374},[881,6504,1101],{"emptyLinePlaceholder":1100},[881,6506,6507,6510,6512,6514,6516,6518,6520,6522,6524,6526,6528,6530],{"class":883,"line":1379},[881,6508,6509],{"class":990},"    msg_recipient ",[881,6511,1165],{"class":950},[881,6513,5340],{"class":990},[881,6515,785],{"class":950},[881,6517,5428],{"class":1110},[881,6519,1114],{"class":950},[881,6521,5458],{"class":1110},[881,6523,1126],{"class":950},[881,6525,1555],{"class":950},[881,6527,5646],{"class":891},[881,6529,987],{"class":950},[881,6531,1247],{"class":950},[881,6533,6534,6536,6538,6540,6542,6545,6547,6549,6551,6553,6555,6557,6559,6561,6563,6565,6567,6569],{"class":883,"line":1390},[881,6535,6275],{"class":990},[881,6537,785],{"class":950},[881,6539,5428],{"class":1110},[881,6541,1114],{"class":950},[881,6543,6544],{"class":1110},"msg_recipient",[881,6546,1126],{"class":950},[881,6548,1555],{"class":950},[881,6550,5569],{"class":891},[881,6552,987],{"class":950},[881,6554,5470],{"class":950},[881,6556,804],{"class":946},[881,6558,5475],{"class":950},[881,6560,6142],{"class":990},[881,6562,3200],{"class":950},[881,6564,987],{"class":950},[881,6566,6457],{"class":891},[881,6568,987],{"class":950},[881,6570,6462],{"class":950},[881,6572,6573,6575,6577,6579,6581,6583,6585,6587,6589,6591,6593,6595,6597,6599,6601,6603,6605,6607],{"class":883,"line":1404},[881,6574,6275],{"class":990},[881,6576,785],{"class":950},[881,6578,5428],{"class":1110},[881,6580,1114],{"class":950},[881,6582,6544],{"class":1110},[881,6584,1126],{"class":950},[881,6586,1555],{"class":950},[881,6588,5603],{"class":891},[881,6590,987],{"class":950},[881,6592,5470],{"class":950},[881,6594,804],{"class":946},[881,6596,5475],{"class":950},[881,6598,6142],{"class":990},[881,6600,3200],{"class":950},[881,6602,987],{"class":950},[881,6604,947],{"class":891},[881,6606,987],{"class":950},[881,6608,6462],{"class":950},[881,6610,6611],{"class":883,"line":1425},[881,6612,1101],{"emptyLinePlaceholder":1100},[881,6614,6615],{"class":883,"line":1439},[881,6616,6617],{"class":1153},"    # Resource list\n",[881,6619,6620,6623,6625,6627,6629,6631,6633,6635,6637,6639,6641,6643],{"class":883,"line":1461},[881,6621,6622],{"class":990},"    resource_list ",[881,6624,1165],{"class":950},[881,6626,5340],{"class":990},[881,6628,785],{"class":950},[881,6630,5428],{"class":1110},[881,6632,1114],{"class":950},[881,6634,5433],{"class":1110},[881,6636,1126],{"class":950},[881,6638,1555],{"class":950},[881,6640,5750],{"class":891},[881,6642,987],{"class":950},[881,6644,1247],{"class":950},[881,6646,6647,6650,6652,6654,6656,6658,6660,6662,6664,6666,6668,6670],{"class":883,"line":1481},[881,6648,6649],{"class":990},"    recording ",[881,6651,1165],{"class":950},[881,6653,5340],{"class":990},[881,6655,785],{"class":950},[881,6657,5428],{"class":1110},[881,6659,1114],{"class":950},[881,6661,5772],{"class":1110},[881,6663,1126],{"class":950},[881,6665,1555],{"class":950},[881,6667,3742],{"class":891},[881,6669,987],{"class":950},[881,6671,1247],{"class":950},[881,6673,6674,6676,6678,6680,6682,6685,6687,6689,6691,6693,6695,6697,6699,6701,6703],{"class":883,"line":1501},[881,6675,6275],{"class":990},[881,6677,785],{"class":950},[881,6679,5428],{"class":1110},[881,6681,1114],{"class":950},[881,6683,6684],{"class":1110},"recording",[881,6686,1126],{"class":950},[881,6688,1555],{"class":950},[881,6690,1685],{"class":891},[881,6692,987],{"class":950},[881,6694,5470],{"class":950},[881,6696,804],{"class":946},[881,6698,5475],{"class":950},[881,6700,1555],{"class":950},[881,6702,1690],{"class":891},[881,6704,5483],{"class":950},[881,6706,6707],{"class":883,"line":1522},[881,6708,1101],{"emptyLinePlaceholder":1100},[881,6710,6711,6714,6716,6718,6720,6722,6724,6726,6728,6730,6732,6734],{"class":883,"line":1528},[881,6712,6713],{"class":990},"    sr_id ",[881,6715,1165],{"class":950},[881,6717,5340],{"class":990},[881,6719,785],{"class":950},[881,6721,5428],{"class":1110},[881,6723,1114],{"class":950},[881,6725,6684],{"class":1110},[881,6727,1126],{"class":950},[881,6729,1555],{"class":950},[881,6731,1858],{"class":891},[881,6733,987],{"class":950},[881,6735,1247],{"class":950},[881,6737,6738,6740,6742,6744,6746,6749,6751,6753,6755,6757,6759,6761,6763,6766,6768,6770,6773,6775],{"class":883,"line":1533},[881,6739,6275],{"class":990},[881,6741,785],{"class":950},[881,6743,5428],{"class":1110},[881,6745,1114],{"class":950},[881,6747,6748],{"class":1110},"sr_id",[881,6750,1126],{"class":950},[881,6752,1555],{"class":950},[881,6754,1615],{"class":891},[881,6756,987],{"class":950},[881,6758,5470],{"class":950},[881,6760,804],{"class":946},[881,6762,5475],{"class":950},[881,6764,6765],{"class":990}," track_data",[881,6767,3200],{"class":950},[881,6769,987],{"class":950},[881,6771,6772],{"class":891},"isrc",[881,6774,987],{"class":950},[881,6776,6462],{"class":950},[881,6778,6779],{"class":883,"line":5949},[881,6780,1101],{"emptyLinePlaceholder":1100},[881,6782,6783,6786,6788,6790,6792,6794,6796,6798,6800,6802,6804,6806],{"class":883,"line":5955},[881,6784,6785],{"class":990},"    details ",[881,6787,1165],{"class":950},[881,6789,5340],{"class":990},[881,6791,785],{"class":950},[881,6793,5428],{"class":1110},[881,6795,1114],{"class":950},[881,6797,6684],{"class":1110},[881,6799,1126],{"class":950},[881,6801,1555],{"class":950},[881,6803,5843],{"class":891},[881,6805,987],{"class":950},[881,6807,1247],{"class":950},[881,6809,6810,6813,6815,6817,6819,6821,6823,6825,6827,6829,6831,6833],{"class":883,"line":5975},[881,6811,6812],{"class":990},"    title_el ",[881,6814,1165],{"class":950},[881,6816,5340],{"class":990},[881,6818,785],{"class":950},[881,6820,5428],{"class":1110},[881,6822,1114],{"class":950},[881,6824,5865],{"class":1110},[881,6826,1126],{"class":950},[881,6828,1555],{"class":950},[881,6830,3673],{"class":891},[881,6832,987],{"class":950},[881,6834,1247],{"class":950},[881,6836,6837,6839,6841,6843,6845,6848,6850,6852,6854,6856,6858,6860,6862,6864,6866,6868,6870,6872],{"class":883,"line":6003},[881,6838,6275],{"class":990},[881,6840,785],{"class":950},[881,6842,5428],{"class":1110},[881,6844,1114],{"class":950},[881,6846,6847],{"class":1110},"title_el",[881,6849,1126],{"class":950},[881,6851,1555],{"class":950},[881,6853,5894],{"class":891},[881,6855,987],{"class":950},[881,6857,5470],{"class":950},[881,6859,804],{"class":946},[881,6861,5475],{"class":950},[881,6863,6765],{"class":990},[881,6865,3200],{"class":950},[881,6867,987],{"class":950},[881,6869,3206],{"class":891},[881,6871,987],{"class":950},[881,6873,6462],{"class":950},[881,6875,6876,6878,6880,6882,6884,6886,6888,6890,6892,6894,6896,6898,6900,6902,6904,6906,6909,6911],{"class":883,"line":6044},[881,6877,6275],{"class":990},[881,6879,785],{"class":950},[881,6881,5428],{"class":1110},[881,6883,1114],{"class":950},[881,6885,5865],{"class":1110},[881,6887,1126],{"class":950},[881,6889,1555],{"class":950},[881,6891,1662],{"class":891},[881,6893,987],{"class":950},[881,6895,5470],{"class":950},[881,6897,804],{"class":946},[881,6899,5475],{"class":950},[881,6901,6765],{"class":990},[881,6903,3200],{"class":950},[881,6905,987],{"class":950},[881,6907,6908],{"class":891},"duration",[881,6910,987],{"class":950},[881,6912,6462],{"class":950},[881,6914,6915],{"class":883,"line":6049},[881,6916,1101],{"emptyLinePlaceholder":1100},[881,6918,6920],{"class":883,"line":6919},38,[881,6921,6922],{"class":1153},"    # Artists\n",[881,6924,6926,6928,6931,6933,6935,6937,6939,6941,6943,6946,6948,6950],{"class":883,"line":6925},39,[881,6927,3557],{"class":1078},[881,6929,6930],{"class":990}," artist ",[881,6932,1413],{"class":1078},[881,6934,6765],{"class":990},[881,6936,785],{"class":950},[881,6938,1229],{"class":1110},[881,6940,1114],{"class":950},[881,6942,987],{"class":950},[881,6944,6945],{"class":891},"artists",[881,6947,987],{"class":950},[881,6949,1126],{"class":950},[881,6951,3289],{"class":950},[881,6953,6955,6958,6960,6962,6964,6966,6968,6970,6972,6974,6976,6978],{"class":883,"line":6954},40,[881,6956,6957],{"class":990},"        contributor ",[881,6959,1165],{"class":950},[881,6961,5340],{"class":990},[881,6963,785],{"class":950},[881,6965,5428],{"class":1110},[881,6967,1114],{"class":950},[881,6969,5865],{"class":1110},[881,6971,1126],{"class":950},[881,6973,1555],{"class":950},[881,6975,2959],{"class":891},[881,6977,987],{"class":950},[881,6979,1247],{"class":950},[881,6981,6983,6986,6988,6990,6992,6994,6996,6999,7001,7003,7005,7007],{"class":883,"line":6982},41,[881,6984,6985],{"class":990},"        name_el ",[881,6987,1165],{"class":950},[881,6989,5340],{"class":990},[881,6991,785],{"class":950},[881,6993,5428],{"class":1110},[881,6995,1114],{"class":950},[881,6997,6998],{"class":1110},"contributor",[881,7000,1126],{"class":950},[881,7002,1555],{"class":950},[881,7004,5603],{"class":891},[881,7006,987],{"class":950},[881,7008,1247],{"class":950},[881,7010,7012,7015,7017,7019,7021,7024,7026,7028,7031,7033,7035,7037,7039,7042,7044,7046,7048,7050],{"class":883,"line":7011},42,[881,7013,7014],{"class":990},"        ET",[881,7016,785],{"class":950},[881,7018,5428],{"class":1110},[881,7020,1114],{"class":950},[881,7022,7023],{"class":1110},"name_el",[881,7025,1126],{"class":950},[881,7027,1555],{"class":950},[881,7029,7030],{"class":891},"FullName",[881,7032,987],{"class":950},[881,7034,5470],{"class":950},[881,7036,804],{"class":946},[881,7038,5475],{"class":950},[881,7040,7041],{"class":990}," artist",[881,7043,3200],{"class":950},[881,7045,987],{"class":950},[881,7047,947],{"class":891},[881,7049,987],{"class":950},[881,7051,6462],{"class":950},[881,7053,7055,7057,7059,7061,7063,7065,7067,7069,7071,7073,7075,7077,7079,7081,7083,7085,7087,7089,7092,7094,7096,7098,7100,7102],{"class":883,"line":7054},43,[881,7056,7014],{"class":990},[881,7058,785],{"class":950},[881,7060,5428],{"class":1110},[881,7062,1114],{"class":950},[881,7064,6998],{"class":1110},[881,7066,1126],{"class":950},[881,7068,1555],{"class":950},[881,7070,3784],{"class":891},[881,7072,987],{"class":950},[881,7074,5470],{"class":950},[881,7076,804],{"class":946},[881,7078,5475],{"class":950},[881,7080,7041],{"class":990},[881,7082,785],{"class":950},[881,7084,1229],{"class":1110},[881,7086,1114],{"class":950},[881,7088,987],{"class":950},[881,7090,7091],{"class":891},"role",[881,7093,987],{"class":950},[881,7095,1126],{"class":950},[881,7097,1555],{"class":950},[881,7099,3789],{"class":891},[881,7101,987],{"class":950},[881,7103,1247],{"class":950},[881,7105,7107],{"class":883,"line":7106},44,[881,7108,1101],{"emptyLinePlaceholder":1100},[881,7110,7112],{"class":883,"line":7111},45,[881,7113,7114],{"class":1153},"    # Release list\n",[881,7116,7118,7121,7123,7125,7127,7129,7131,7133,7135,7137,7140,7142],{"class":883,"line":7117},46,[881,7119,7120],{"class":990},"    release_list ",[881,7122,1165],{"class":950},[881,7124,5340],{"class":990},[881,7126,785],{"class":950},[881,7128,5428],{"class":1110},[881,7130,1114],{"class":950},[881,7132,5433],{"class":1110},[881,7134,1126],{"class":950},[881,7136,1555],{"class":950},[881,7138,7139],{"class":891},"ReleaseList",[881,7141,987],{"class":950},[881,7143,1247],{"class":950},[881,7145,7147,7150,7152,7154,7156,7158,7160,7163,7165,7167,7169,7171],{"class":883,"line":7146},47,[881,7148,7149],{"class":990},"    release ",[881,7151,1165],{"class":950},[881,7153,5340],{"class":990},[881,7155,785],{"class":950},[881,7157,5428],{"class":1110},[881,7159,1114],{"class":950},[881,7161,7162],{"class":1110},"release_list",[881,7164,1126],{"class":950},[881,7166,1555],{"class":950},[881,7168,3645],{"class":891},[881,7170,987],{"class":950},[881,7172,1247],{"class":950},[881,7174,7176,7179,7181,7183,7185,7187,7189,7192,7194,7196,7199,7201],{"class":883,"line":7175},48,[881,7177,7178],{"class":990},"    release_id ",[881,7180,1165],{"class":950},[881,7182,5340],{"class":990},[881,7184,785],{"class":950},[881,7186,5428],{"class":1110},[881,7188,1114],{"class":950},[881,7190,7191],{"class":1110},"release",[881,7193,1126],{"class":950},[881,7195,1555],{"class":950},[881,7197,7198],{"class":891},"ReleaseId",[881,7200,987],{"class":950},[881,7202,1247],{"class":950},[881,7204,7206,7208,7210,7212,7214,7217,7219,7221,7223,7225,7227,7229,7231,7233,7235,7237,7239,7241,7244,7246,7248,7251],{"class":883,"line":7205},49,[881,7207,6275],{"class":990},[881,7209,785],{"class":950},[881,7211,5428],{"class":1110},[881,7213,1114],{"class":950},[881,7215,7216],{"class":1110},"release_id",[881,7218,1126],{"class":950},[881,7220,1555],{"class":950},[881,7222,3655],{"class":891},[881,7224,987],{"class":950},[881,7226,5470],{"class":950},[881,7228,804],{"class":946},[881,7230,5475],{"class":950},[881,7232,6765],{"class":990},[881,7234,785],{"class":950},[881,7236,1229],{"class":1110},[881,7238,1114],{"class":950},[881,7240,987],{"class":950},[881,7242,7243],{"class":891},"upc",[881,7245,987],{"class":950},[881,7247,1126],{"class":950},[881,7249,7250],{"class":950}," \"\"",[881,7252,1247],{"class":950},[881,7254,7256],{"class":883,"line":7255},50,[881,7257,1101],{"emptyLinePlaceholder":1100},[881,7259,7261,7264,7266,7268,7270,7272,7274,7276,7278,7280,7283,7285],{"class":883,"line":7260},51,[881,7262,7263],{"class":990},"    release_detail ",[881,7265,1165],{"class":950},[881,7267,5340],{"class":990},[881,7269,785],{"class":950},[881,7271,5428],{"class":1110},[881,7273,1114],{"class":950},[881,7275,7191],{"class":1110},[881,7277,1126],{"class":950},[881,7279,1555],{"class":950},[881,7281,7282],{"class":891},"ReleaseDetailsByTerritory",[881,7284,987],{"class":950},[881,7286,1247],{"class":950},[881,7288,7290,7292,7294,7296,7298,7301,7303,7305,7307,7309,7311,7313,7315,7317,7319],{"class":883,"line":7289},52,[881,7291,6275],{"class":990},[881,7293,785],{"class":950},[881,7295,5428],{"class":1110},[881,7297,1114],{"class":950},[881,7299,7300],{"class":1110},"release_detail",[881,7302,1126],{"class":950},[881,7304,1555],{"class":950},[881,7306,1918],{"class":891},[881,7308,987],{"class":950},[881,7310,5470],{"class":950},[881,7312,804],{"class":946},[881,7314,5475],{"class":950},[881,7316,1555],{"class":950},[881,7318,1647],{"class":891},[881,7320,5483],{"class":950},[881,7322,7324],{"class":883,"line":7323},53,[881,7325,1101],{"emptyLinePlaceholder":1100},[881,7327,7329],{"class":883,"line":7328},54,[881,7330,7331],{"class":1153},"    # Deal list\n",[881,7333,7335,7338,7340,7342,7344,7346,7348,7350,7352,7354,7357,7359],{"class":883,"line":7334},55,[881,7336,7337],{"class":990},"    deal_list ",[881,7339,1165],{"class":950},[881,7341,5340],{"class":990},[881,7343,785],{"class":950},[881,7345,5428],{"class":1110},[881,7347,1114],{"class":950},[881,7349,5433],{"class":1110},[881,7351,1126],{"class":950},[881,7353,1555],{"class":950},[881,7355,7356],{"class":891},"DealList",[881,7358,987],{"class":950},[881,7360,1247],{"class":950},[881,7362,7364,7367,7369,7371,7373,7375,7377,7380,7382,7384,7387,7389],{"class":883,"line":7363},56,[881,7365,7366],{"class":990},"    deal ",[881,7368,1165],{"class":950},[881,7370,5340],{"class":990},[881,7372,785],{"class":950},[881,7374,5428],{"class":1110},[881,7376,1114],{"class":950},[881,7378,7379],{"class":1110},"deal_list",[881,7381,1126],{"class":950},[881,7383,1555],{"class":950},[881,7385,7386],{"class":891},"ReleaseDeal",[881,7388,987],{"class":950},[881,7390,1247],{"class":950},[881,7392,7394,7397,7399,7401,7403,7405,7407,7410,7412,7414,7416,7418],{"class":883,"line":7393},57,[881,7395,7396],{"class":990},"    deal_terms ",[881,7398,1165],{"class":950},[881,7400,5340],{"class":990},[881,7402,785],{"class":950},[881,7404,5428],{"class":1110},[881,7406,1114],{"class":950},[881,7408,7409],{"class":1110},"deal",[881,7411,1126],{"class":950},[881,7413,1555],{"class":950},[881,7415,3822],{"class":891},[881,7417,987],{"class":950},[881,7419,1247],{"class":950},[881,7421,7423,7425,7427,7429,7431,7434,7436,7438,7441,7443,7445,7447,7449,7451,7453],{"class":883,"line":7422},58,[881,7424,6275],{"class":990},[881,7426,785],{"class":950},[881,7428,5428],{"class":1110},[881,7430,1114],{"class":950},[881,7432,7433],{"class":1110},"deal_terms",[881,7435,1126],{"class":950},[881,7437,1555],{"class":950},[881,7439,7440],{"class":891},"CommercialModelType",[881,7442,987],{"class":950},[881,7444,5470],{"class":950},[881,7446,804],{"class":946},[881,7448,5475],{"class":950},[881,7450,1555],{"class":950},[881,7452,3836],{"class":891},[881,7454,5483],{"class":950},[881,7456,7458,7460,7462,7464,7466,7468,7470,7472,7475,7477,7479,7481,7483,7485,7487],{"class":883,"line":7457},59,[881,7459,6275],{"class":990},[881,7461,785],{"class":950},[881,7463,5428],{"class":1110},[881,7465,1114],{"class":950},[881,7467,7433],{"class":1110},[881,7469,1126],{"class":950},[881,7471,1555],{"class":950},[881,7473,7474],{"class":891},"Usage",[881,7476,987],{"class":950},[881,7478,5470],{"class":950},[881,7480,804],{"class":946},[881,7482,5475],{"class":950},[881,7484,1555],{"class":950},[881,7486,3854],{"class":891},[881,7488,5483],{"class":950},[881,7490,7492],{"class":883,"line":7491},60,[881,7493,1101],{"emptyLinePlaceholder":1100},[881,7495,7497,7500,7502,7504,7506,7508,7510,7512,7514,7516,7519,7521],{"class":883,"line":7496},61,[881,7498,7499],{"class":990},"    validity ",[881,7501,1165],{"class":950},[881,7503,5340],{"class":990},[881,7505,785],{"class":950},[881,7507,5428],{"class":1110},[881,7509,1114],{"class":950},[881,7511,7433],{"class":1110},[881,7513,1126],{"class":950},[881,7515,1555],{"class":950},[881,7517,7518],{"class":891},"ValidityPeriod",[881,7520,987],{"class":950},[881,7522,1247],{"class":950},[881,7524,7526,7528,7530,7532,7534,7537,7539,7541,7543,7545,7547,7549,7551,7553,7555,7557,7559,7561,7564,7566,7568,7570],{"class":883,"line":7525},62,[881,7527,6275],{"class":990},[881,7529,785],{"class":950},[881,7531,5428],{"class":1110},[881,7533,1114],{"class":950},[881,7535,7536],{"class":1110},"validity",[881,7538,1126],{"class":950},[881,7540,1555],{"class":950},[881,7542,3867],{"class":891},[881,7544,987],{"class":950},[881,7546,5470],{"class":950},[881,7548,804],{"class":946},[881,7550,5475],{"class":950},[881,7552,6765],{"class":990},[881,7554,785],{"class":950},[881,7556,1229],{"class":1110},[881,7558,1114],{"class":950},[881,7560,987],{"class":950},[881,7562,7563],{"class":891},"release_date",[881,7565,987],{"class":950},[881,7567,1126],{"class":950},[881,7569,7250],{"class":950},[881,7571,1247],{"class":950},[881,7573,7575],{"class":883,"line":7574},63,[881,7576,1101],{"emptyLinePlaceholder":1100},[881,7578,7580,7582],{"class":883,"line":7579},64,[881,7581,1536],{"class":1078},[881,7583,7584],{"class":990}," root\n",[881,7586,7588],{"class":883,"line":7587},65,[881,7589,1101],{"emptyLinePlaceholder":1100},[881,7591,7593],{"class":883,"line":7592},66,[881,7594,1101],{"emptyLinePlaceholder":1100},[881,7596,7598],{"class":883,"line":7597},67,[881,7599,7600],{"class":1153},"# Usage\n",[881,7602,7604,7607,7609],{"class":883,"line":7603},68,[881,7605,7606],{"class":990},"track ",[881,7608,1165],{"class":950},[881,7610,5359],{"class":950},[881,7612,7614,7616,7618,7620,7622,7624,7627,7629],{"class":883,"line":7613},69,[881,7615,5364],{"class":950},[881,7617,3206],{"class":891},[881,7619,987],{"class":950},[881,7621,926],{"class":950},[881,7623,1555],{"class":950},[881,7625,7626],{"class":891},"Ocean Waves",[881,7628,987],{"class":950},[881,7630,1458],{"class":950},[881,7632,7634,7636,7638,7640,7642,7644,7647,7649],{"class":883,"line":7633},70,[881,7635,5364],{"class":950},[881,7637,6772],{"class":891},[881,7639,987],{"class":950},[881,7641,926],{"class":950},[881,7643,1555],{"class":950},[881,7645,7646],{"class":891},"USRC12345678",[881,7648,987],{"class":950},[881,7650,1458],{"class":950},[881,7652,7654,7656,7658,7660,7662,7664,7667,7669],{"class":883,"line":7653},71,[881,7655,5364],{"class":950},[881,7657,6908],{"class":891},[881,7659,987],{"class":950},[881,7661,926],{"class":950},[881,7663,1555],{"class":950},[881,7665,7666],{"class":891},"PT4M12S",[881,7668,987],{"class":950},[881,7670,1458],{"class":950},[881,7672,7674,7676,7678,7680,7682,7684,7686,7688],{"class":883,"line":7673},72,[881,7675,5364],{"class":950},[881,7677,7243],{"class":891},[881,7679,987],{"class":950},[881,7681,926],{"class":950},[881,7683,1555],{"class":950},[881,7685,3660],{"class":891},[881,7687,987],{"class":950},[881,7689,1458],{"class":950},[881,7691,7693,7695,7697,7699,7701,7703,7706,7708],{"class":883,"line":7692},73,[881,7694,5364],{"class":950},[881,7696,7563],{"class":891},[881,7698,987],{"class":950},[881,7700,926],{"class":950},[881,7702,1555],{"class":950},[881,7704,7705],{"class":891},"2024-01-15",[881,7707,987],{"class":950},[881,7709,1458],{"class":950},[881,7711,7713,7715,7717,7719,7721],{"class":883,"line":7712},74,[881,7714,5364],{"class":950},[881,7716,6945],{"class":891},[881,7718,987],{"class":950},[881,7720,926],{"class":950},[881,7722,7723],{"class":950}," [\n",[881,7725,7727,7730,7732,7734,7736,7738,7740,7743,7745,7747,7749,7751,7753,7755,7757,7759,7761],{"class":883,"line":7726},75,[881,7728,7729],{"class":950},"        {",[881,7731,987],{"class":950},[881,7733,947],{"class":891},[881,7735,987],{"class":950},[881,7737,926],{"class":950},[881,7739,1555],{"class":950},[881,7741,7742],{"class":891},"Jane Doe",[881,7744,987],{"class":950},[881,7746,1126],{"class":950},[881,7748,1555],{"class":950},[881,7750,7091],{"class":891},[881,7752,987],{"class":950},[881,7754,926],{"class":950},[881,7756,1555],{"class":950},[881,7758,3789],{"class":891},[881,7760,987],{"class":950},[881,7762,7763],{"class":950},"},\n",[881,7765,7767,7769,7771,7773,7775,7777,7779,7782,7784,7786,7788,7790,7792,7794,7796,7799,7801],{"class":883,"line":7766},76,[881,7768,7729],{"class":950},[881,7770,987],{"class":950},[881,7772,947],{"class":891},[881,7774,987],{"class":950},[881,7776,926],{"class":950},[881,7778,1555],{"class":950},[881,7780,7781],{"class":891},"John Smith",[881,7783,987],{"class":950},[881,7785,1126],{"class":950},[881,7787,1555],{"class":950},[881,7789,7091],{"class":891},[881,7791,987],{"class":950},[881,7793,926],{"class":950},[881,7795,1555],{"class":950},[881,7797,7798],{"class":891},"FeaturedArtist",[881,7800,987],{"class":950},[881,7802,7763],{"class":950},[881,7804,7806],{"class":883,"line":7805},77,[881,7807,7808],{"class":950},"    ],\n",[881,7810,7812],{"class":883,"line":7811},78,[881,7813,1580],{"class":950},[881,7815,7817],{"class":883,"line":7816},79,[881,7818,1101],{"emptyLinePlaceholder":1100},[881,7820,7822,7825,7827,7829],{"class":883,"line":7821},80,[881,7823,7824],{"class":990},"ern ",[881,7826,1165],{"class":950},[881,7828,6119],{"class":1110},[881,7830,7831],{"class":950},"(\n",[881,7833,7835,7838,7840,7843],{"class":883,"line":7834},81,[881,7836,7837],{"class":1117},"    track_data",[881,7839,1165],{"class":950},[881,7841,7842],{"class":1110},"track",[881,7844,1458],{"class":950},[881,7846,7848,7851,7854,7856,7858,7860,7862,7864,7866,7868,7870,7872,7874,7876,7878,7880,7882,7884],{"class":883,"line":7847},82,[881,7849,7850],{"class":1117},"    sender",[881,7852,7853],{"class":950},"={",[881,7855,987],{"class":950},[881,7857,6457],{"class":891},[881,7859,987],{"class":950},[881,7861,926],{"class":950},[881,7863,1555],{"class":950},[881,7865,5582],{"class":891},[881,7867,987],{"class":950},[881,7869,1126],{"class":950},[881,7871,1555],{"class":950},[881,7873,947],{"class":891},[881,7875,987],{"class":950},[881,7877,926],{"class":950},[881,7879,1555],{"class":950},[881,7881,5616],{"class":891},[881,7883,987],{"class":950},[881,7885,7763],{"class":950},[881,7887,7889,7892,7894,7896,7898,7900,7902,7904,7906,7908,7910,7912,7914,7916,7918,7920,7922,7924],{"class":883,"line":7888},83,[881,7890,7891],{"class":1117},"    recipient",[881,7893,7853],{"class":950},[881,7895,987],{"class":950},[881,7897,6457],{"class":891},[881,7899,987],{"class":950},[881,7901,926],{"class":950},[881,7903,1555],{"class":950},[881,7905,5682],{"class":891},[881,7907,987],{"class":950},[881,7909,1126],{"class":950},[881,7911,1555],{"class":950},[881,7913,947],{"class":891},[881,7915,987],{"class":950},[881,7917,926],{"class":950},[881,7919,1555],{"class":950},[881,7921,5715],{"class":891},[881,7923,987],{"class":950},[881,7925,7763],{"class":950},[881,7927,7929],{"class":883,"line":7928},84,[881,7930,1247],{"class":950},[881,7932,7934],{"class":883,"line":7933},85,[881,7935,1101],{"emptyLinePlaceholder":1100},[881,7937,7939,7941,7943,7945,7947,7949,7951,7954],{"class":883,"line":7938},86,[881,7940,5958],{"class":990},[881,7942,1165],{"class":950},[881,7944,5340],{"class":990},[881,7946,785],{"class":950},[881,7948,5315],{"class":1110},[881,7950,1114],{"class":950},[881,7952,7953],{"class":1110},"ern",[881,7955,1247],{"class":950},[881,7957,7959,7961,7963,7965,7967,7969,7971,7973,7975,7977,7979],{"class":883,"line":7958},87,[881,7960,5449],{"class":990},[881,7962,785],{"class":950},[881,7964,5982],{"class":1110},[881,7966,1114],{"class":950},[881,7968,5987],{"class":1110},[881,7970,1126],{"class":950},[881,7972,5992],{"class":1117},[881,7974,1165],{"class":950},[881,7976,987],{"class":950},[881,7978,981],{"class":950},[881,7980,1247],{"class":950},[881,7982,7984,7986,7988,7990,7992,7994,7997,7999,8001,8003,8005,8007,8009,8011,8013,8015],{"class":883,"line":7983},88,[881,7985,5987],{"class":990},[881,7987,785],{"class":950},[881,7989,6010],{"class":1110},[881,7991,1114],{"class":950},[881,7993,987],{"class":950},[881,7995,7996],{"class":891},"release_complete.xml",[881,7998,987],{"class":950},[881,8000,1126],{"class":950},[881,8002,6024],{"class":1117},[881,8004,6027],{"class":950},[881,8006,6030],{"class":1117},[881,8008,1165],{"class":950},[881,8010,987],{"class":950},[881,8012,6037],{"class":891},[881,8014,987],{"class":950},[881,8016,1247],{"class":950},[881,8018,8020,8022,8024,8026,8029,8031],{"class":883,"line":8019},89,[881,8021,3184],{"class":1110},[881,8023,1114],{"class":950},[881,8025,987],{"class":950},[881,8027,8028],{"class":891},"Complete DDEX ERN file generated.",[881,8030,987],{"class":950},[881,8032,1247],{"class":950},[1711,8034,8035],{},[749,8036,8037],{},"Handle tracks with multiple artists carefully — ensure each artist element is properly structured with the correct role. This is a common source of validation errors.",[787,8039,8041],{"id":8040},"what-to-pay-attention-to","What to Pay Attention To",[820,8043,8044,8050,8056,8062],{},[823,8045,8046,8049],{},[759,8047,8048],{},"DDEX for takedowns"," uses a different message structure with serious legal consequences — handle separately",[823,8051,8052,8055],{},[759,8053,8054],{},"Version compatibility"," varies by platform (YouTube: 3.4–3.8, Facebook: 3.8.3, newest: 4.2)",[823,8057,8058,8061],{},[759,8059,8060],{},"Validation is essential"," — always validate generated XML against the official XSD schemas before submission",[823,8063,8064],{},"This guide covers single music files only. Videos and other media types require different approaches and more detailed metadata",[787,8066,8068],{"id":8067},"why-use-ddex","Why Use DDEX?",[749,8070,8071],{},"DDEX standards are widely adopted because they solve real problems: interoperability between systems, automated workflows that reduce manual errors, and consistent data formats that ensure artists and rights holders get paid accurately. Most major digital music platforms require DDEX compliance for content delivery.",[769,8073,8074],{},[749,8075,8076,8077,8082,8083,8088,8089,785],{},"For more on DDEX, see the ",[779,8078,8081],{"href":8079,"rel":8080},"https://kb.ddex.net/",[783],"DDEX Knowledge Base",", the ",[779,8084,8087],{"href":8085,"rel":8086},"https://kb.ddex.net/about-ddex-standards/ddex-development-and-maintenance/",[783],"backward compatibility guide",", and the ",[779,8090,8093],{"href":8091,"rel":8092},"https://kb.ddex.net/reference-material/past-versions-of-standards/",[783],"list of breaking updates",[2125,8095,8096],{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":805,"searchDepth":898,"depth":898,"links":8098},[8099,8100,8104,8105],{"id":5220,"depth":898,"text":5221},{"id":5249,"depth":898,"text":5250,"children":8101},[8102,8103],{"id":5285,"depth":966,"text":5286},{"id":6065,"depth":966,"text":6066},{"id":8040,"depth":898,"text":8041},{"id":8067,"depth":898,"text":8068},"2023-12-07T00:00:00.000Z","Learn what DDEX files are and how to generate them using Python. Covers ERN, DSR, and RIN standards for digital music data exchange in the industry.",{"src":8109},"/images/blog/musictechlab_blog_introduction-to-generating-ddex-file-using-python.webp",{"enabled":1100,"items":8111},[8112,8114,8117,8119],{"text":8113,"icon":4084},"DDEX ERN files can be generated with Python's built-in xml.etree.ElementTree module.",{"text":8115,"icon":8116},"A free DPID is required to identify the sender; no DDEX membership needed to obtain one.","i-lucide-file-text",{"text":8118,"icon":2171},"Version compatibility varies by platform: YouTube supports 3.4-3.8, Facebook requires 3.8.3.",{"text":8120,"icon":4075},"Always validate generated XML against official XSD schemas before submitting to any DSP.",{},{"title":160,"description":8107},[984,8124,2178],"development","IfkYZXP75b51909IVUbhsodw2qm0IdstdMvTAks2cYg",1780305239295]