"""Generate a SoundRecording resource for Youtube (v43).""" from typing import Any, Optional from soundrecording_utils.constants.ddex import config, constants from soundrecording_utils.ddex.utils.control_chars import remove_control_chars from soundrecording_utils.metadata.types import Asset, OrchardSoundRecording, Track from .e import E from .track import ( generate_display_artist_name, generate_p_line, generate_track_contributor_artists, generate_track_display_artists, ) def _format_track_duration_iso_8601(track_metadata: Track) -> str: """Format a Track's duration.""" return f'PT{track_metadata.duration_minutes}M{track_metadata.duration_seconds}S' def _generate_language_of_performance(track_metadata: Track): """Generate the language of performance node, if required.""" if track_metadata.meta_language_code == 'N/A': return E('IsInstrumental', 'true') if track_metadata.language and track_metadata.language.iso_639_1_code: return E( 'LanguageOfPerformance', track_metadata.language.iso_639_1_code.lower(), ) return None def _generate_subtitle(track_metadata: Track) -> Optional[Any]: """Generate a subtitle field if the Track has a version field.""" if track_metadata.version: return E('SubTitle', track_metadata.version) return None def generate_display_title(track_metadata: Track): """Generate a ReferenceTitle from Track metadata.""" return E( 'DisplayTitle', {'IsDefault': 'true'}, E('TitleText', remove_control_chars(track_metadata.name)), _generate_subtitle(track_metadata), ) def generate_display_title_text(track_metadata: Track): """Generate a DisplayTitleText from Track metadata.""" subtitle = _generate_subtitle(track_metadata) display_title_text = remove_control_chars(track_metadata.name) if subtitle is not None: display_title_text += f' - {subtitle.text}' return E('DisplayTitleText', display_title_text) def generate_sound_recording_resource( resource_reference: str, sound_recording_metadata: OrchardSoundRecording, primary_track_metadata: Track, upload_asset: Optional[Asset], takedown: bool = False, ): """Generate a SoundRecording resource node.""" rights_claim_percentage = constants.TAKEDOWN_RIGHTS_SHARE_PERCENTAGE if not takedown: rights_claim_percentage = constants.DEFAULT_RIGHTS_SHARE_PERCENTAGE return E( 'SoundRecording', E('ResourceReference', resource_reference), E('Type', constants.DEFAULT_SOUND_RECORDING_TYPE), E( 'SoundRecordingEdition', E('ResourceId', E('ISRC', sound_recording_metadata.isrc)), generate_p_line(primary_track_metadata.p_info), E( 'TechnicalDetails', E('TechnicalResourceDetailsReference', 'T1'), E( 'DeliveryFile', E('Type', 'AudioFile'), E( 'File', E( 'URI', f'{config.RESOURCES_DIRNAME}/' f'{upload_asset.filename}.{upload_asset.extension}', ), ), ), ) if upload_asset else None, ), generate_display_title_text(primary_track_metadata), generate_display_title(primary_track_metadata), generate_display_artist_name(primary_track_metadata.participations), *generate_track_display_artists(primary_track_metadata), *generate_track_contributor_artists(primary_track_metadata), E( 'ResourceRightsController', E('RightsControllerPartyReference', constants.ORCHARD_PARTY_REFERENCE), E('RightsControlType', constants.DEFAULT_RIGHTS_CONTROLLER_ROLE), E('RightSharePercentage', rights_claim_percentage), ), E('Duration', _format_track_duration_iso_8601(primary_track_metadata)), E( 'ParentalWarningType', constants.EXPLICIT_STATUS_LOOKUP_TABLE[primary_track_metadata.explicit], ), _generate_language_of_performance(primary_track_metadata), )