"""Generate TikTok ERN DDEX (v38).""" 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 .release import generate_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 TikTok (v38 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/ERN38/dd/ddex_SingleResourceRelease.html root_attribs = { etree.QName( 'http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation' ): ' '.join( [ 'http://ddex.net/xml/ern/382', 'http://ddex.net/xml/ern/382/release-notification.xsd', ] ), 'MessageSchemaVersionId': 'ern/382', 'ReleaseProfileVersionId': 'CommonReleaseTypes/14/SingleResourceRelease', 'LanguageAndScriptCode': 'en', } primary_track_metadata = get_primary_track( sound_recording_metadata, application_name ) base_validation( primary_track_metadata, service, selected_version='3.8' ) sound_recording_release = generate_sound_recording_resource( 'A1', sound_recording_metadata, primary_track_metadata, upload_asset, service.value, takedown=takedown, ) release = generate_release( 'R1', 'A1', sound_recording_metadata, primary_track_metadata, service.value, takedown=takedown, ) root = E( '{http://ddex.net/xml/ern/382}NewReleaseMessage', root_attribs, generate_header(execution_metadata, service), E( 'ResourceList', sound_recording_release, ), E( 'ReleaseList', release, ), ) deal = generate_release_deal('R1', sound_recording_metadata, service.value, 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')