"""Generate a SoundRecording resource for Meta.""" from typing import Any from typing import Optional from .e import E from .sound_recording_details_by_territory import \ generate_sound_recording_details_by_territory from ..constants import ddex as constants from .util import deduplicate_territories from .util import get_primary_track from soundrecording_utils.metadata.types import Asset from soundrecording_utils.metadata.types import OrchardSoundRecording from soundrecording_utils.metadata.types import Track def _format_track_duration_iso_8601(track_metadata: Track) -> str: """Format a Track's duration.""" return 'PT{}M{}S'.format( track_metadata.duration_minutes, track_metadata.duration_seconds, ) 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_reference_title(track_metadata: Track): """Generate a ReferenceTitle from Track metadata.""" return E( 'ReferenceTitle', E('TitleText', track_metadata.name), _generate_subtitle(track_metadata), ) def _generate_sound_recording_details_by_territory( sound_recording_metadata: OrchardSoundRecording, upload_asset: Optional[Asset] ): """Generate SoundRecordingDetailByTerritory node for a sound recording.""" # filter out tracks w/o territory claims claimed_tracks = [ x for x in deduplicate_territories(sound_recording_metadata) if x.territories ] # generate territory blocks, adding asset information to first one if claimed_tracks: return [ generate_sound_recording_details_by_territory( track.territories, track, constants.DEFAULT_RIGHTS_SHARE_PERCENTAGE, upload_asset ) for track in claimed_tracks[0:1] ] + [ generate_sound_recording_details_by_territory( track.territories, track, constants.DEFAULT_RIGHTS_SHARE_PERCENTAGE, None ) for track in claimed_tracks[1:] ] # handle "takedown" return [ generate_sound_recording_details_by_territory( [constants.DEFAULT_TERRITORY_CODE], get_primary_track(sound_recording_metadata), constants.TAKEDOWN_RIGHTS_SHARE_PERCENTAGE, None ) ] def generate_sound_recording_resource( resource_reference: str, sound_recording_metadata: OrchardSoundRecording, upload_asset: Optional[Asset], ): """Generate a SoundRecording resource node.""" primary_track_metadata = get_primary_track(sound_recording_metadata) return E( 'SoundRecording', E('SoundRecordingType', constants.DEFAULT_SOUND_RECORDING_TYPE), E( 'SoundRecordingId', E('ISRC', sound_recording_metadata.isrc) ), E('ResourceReference', resource_reference), generate_reference_title(primary_track_metadata), _generate_language_of_performance(primary_track_metadata), E('Duration', _format_track_duration_iso_8601(primary_track_metadata)), *_generate_sound_recording_details_by_territory( sound_recording_metadata, upload_asset ), )