"""DDEX 3.8 Abstract Packager.""" import xml.etree.ElementTree as ET from src.packagers.base import AbstractPackager class DDEX38Packager(AbstractPackager): """DDEX3.8 generic package functions.""" def get_xml_url(self, stereo_upc, spatial_upc): """Format xml fetching url generically for ddex.""" return f'/oa/metadata/generate/dms_id/{self.dms_id}/storename/ddexern/version/3.8.0/returnErr/1/xml_only/0/delivery_type/complete_album/upc/{spatial_upc}' # noqa:E501 def transform_xml( self, input_xml, stereo_metadata, spatial_metadata, spatial_audio_details, spatial_artwork_details): """Format xml generically for ddex.""" namespace = 'http://ddex.net/xml/ern/382' spatial_files = self._format_spatial_file_list(spatial_audio_details) # map stereo ISRCs by volume + track indexes stereo_isrcs = dict() for track in stereo_metadata['tracks']: volume_index = track['volumeNumber'] track_index = track['trackNumber'] if volume_index not in stereo_isrcs: stereo_isrcs[volume_index] = dict() stereo_isrcs[volume_index][track_index] = track['isrc'] # order spatial files by volume + track indexes index = 1 sequenced_files = dict() for volume_index, volumes in sorted(spatial_files.items()): for track_index, track in sorted(volumes.items()): sequenced_files[index] = ( volume_index, track_index, track, stereo_isrcs[volume_index][track_index] ) index += 1 ET.register_namespace('ern', namespace) root = ET.fromstring(input_xml) for resource in root.findall('ResourceList'): # replace product level image details for image_details in resource.findall('Image/ImageDetailsByTerritory/TechnicalImageDetails'): # noqa:E501 image_details.find('File/HashSum/HashSum').text = \ spatial_artwork_details[0] image_details.find('ImageWidth').text = \ str(spatial_artwork_details[1]) image_details.find('ImageHeight').text = \ str(spatial_artwork_details[2]) # replace audio details by sequence number for by_territory in resource.findall('SoundRecording/SoundRecordingDetailsByTerritory'): # noqa:E501 for tech_details in by_territory.findall('TechnicalSoundRecordingDetails'): # noqa:E501 tech_resource_reference = tech_details.find('TechnicalResourceDetailsReference').text # noqa:E501 audio_seq = int(tech_resource_reference.strip('T')) (_, _, track_details, _) = \ sequenced_files[audio_seq] filename = self.output_audio_filename(track_details['path']) # noqa:E501 tech_details.find('AudioCodecType').text = 'Atmos' tech_details.find('File/FileName').text = filename tech_details.find('File/HashSum/HashSum').text = \ track_details['md5'] # add stereo isrc mapping by sequence number for release in root.findall('ReleaseList/Release'): release_seq = int(release.find('ReleaseReference').text[1:]) if release_seq != 0: (_, _, _, stereo_isrc) = \ sequenced_files[release_seq] by_territory = release.find('ReleaseDetailsByTerritory') related_release = ET.SubElement(by_territory, 'RelatedRelease') release_id = ET.SubElement(related_release, 'ReleaseId') ET.SubElement(release_id, 'ISRC').text = stereo_isrc ET.SubElement( related_release, 'ReleaseRelationshipType' ).text = 'IsFromAudio' return self.format_xml(root)