"""Generate Youtube ERN DDEX (v43).""" from typing import Optional from lxml import etree from soundrecording_utils.constants.ddex.constants import RuleService from soundrecording_utils.ddex.utils.primary_track import get_primary_track from soundrecording_utils.metadata.types import Asset, OrchardSoundRecording from ..validate import base_validation from .deal import generate_release_deal from .e import E from .header import generate_header from .party_list import generate_label_party, generate_party_list, generate_the_orchard_party from .release import generate_release, generate_track_release from .sound_recording import generate_sound_recording_resource def generate_ddex( sound_recording_metadata: OrchardSoundRecording, upload_asset: Optional[Asset], execution_metadata: dict, application_name: str, service: RuleService, takedown: bool = False, ) -> str: """Generate DDEX ERN SRR for Youtube (v43 format). Args: sound_recording_metadata: The OrchardSoundRecording to generate DDEX for. upload_asset: Optional asset to include in the DDEX. execution_metadata: Dict with 'message_thread_id', 'message_id', 'timestamp'. application_name: Name of the application generating the DDEX. service: The RuleService (TIKTOK, YOUTUBE, etc.). takedown: Whether this is a takedown delivery. Returns: The generated DDEX XML as a string. """ # See also: https://service.ddex.net/dd/DD-ERN-432/dd/index.html root_attribs = { etree.QName( 'http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation' ): ' '.join( [ 'http://ddex.net/xml/ern/43', 'http://ddex.net/xml/ern/43/release-notification.xsd', ] ), 'ReleaseProfileVersionId': 'SimpleAudioSingle', 'LanguageAndScriptCode': 'en', 'AvsVersionId': '9', } primary_track_metadata = get_primary_track( sound_recording_metadata, application_name ) base_validation( primary_track_metadata, service, selected_version='4.3' ) party_list = generate_party_list(primary_track_metadata) sound_recording_release = generate_sound_recording_resource( 'A1', sound_recording_metadata, primary_track_metadata, upload_asset, takedown=takedown, ) release = generate_release( 'R0', 'A1', sound_recording_metadata, primary_track_metadata, ) track_release = generate_track_release('R1', 'A1', primary_track_metadata) root = E( '{http://ddex.net/xml/ern/43}NewReleaseMessage', root_attribs, generate_header(execution_metadata, service), E( 'PartyList', generate_the_orchard_party(), generate_label_party(primary_track_metadata), *party_list, ), E( 'ResourceList', sound_recording_release, ), E('ReleaseList', release, track_release), ) deal = generate_release_deal( 'R1', sound_recording_metadata, service=service, takedown=takedown ) root.append(E('DealList', deal)) etree.indent(root, space=' ') document_buffer = etree.tostring( root, encoding='utf-8', doctype="", pretty_print=True, ) return document_buffer.decode('utf-8')