"""Utility functions.""" from typing import List from typing import Set from soundrecording_utils.metadata.types import ExplicitStatus from soundrecording_utils.metadata.types import Genre from soundrecording_utils.metadata.types import Label from soundrecording_utils.metadata.types import LabelID from soundrecording_utils.metadata.types import LabelType from soundrecording_utils.metadata.types import ProductStatus from soundrecording_utils.metadata.types import OrchardSoundRecording from soundrecording_utils.metadata.types import Product from soundrecording_utils.metadata.types import Subgenre from soundrecording_utils.metadata.types import Track def get_primary_track( sound_recording_metadata: OrchardSoundRecording ) -> Track: """Select primary parent track in a sound recording.""" if not sound_recording_metadata.track_connection.tracks: """ If all tracks deleted or detached, return dummy Track object to fill in required XML elements with empty or default data. """ return Track( product=Product( status=ProductStatus.in_content, label=Label( id=LabelID( vendor=0, subaccount=0 ), type=LabelType('Vendor'), uuid='', name='' ), subgenre=Subgenre( id=0, name='', genre=Genre( id=0, name='' ) ), release_date='', id='', display_upc='' ), tuid='', isrc='', name='', version=None, duration_seconds=0, duration_minutes=0, meta_language_code=None, language=None, p_info=None, explicit=ExplicitStatus.N, territories=[], participations=[], primary=False, original_rights_holder_country=None, recording_country=None, label_sound_recording=None ) return next( track for track in sound_recording_metadata.track_connection.tracks if track.primary ) def deduplicate_territories( sound_recording_metadata: OrchardSoundRecording ) -> List[Track]: """Apply duplicated territories to track with earliest release.""" formatted_tracks: List[Track] = [] claimed_territories: Set[str] = set() # iterate over tracks, earliest release date first for track in sorted(sound_recording_metadata.track_connection.tracks, key=lambda t: t.product.release_date): # noqa:E501 # filter out territories already claimed by older tracks track_territories = set([ x for x in track.territories if x not in claimed_territories ]) # mark territories as claimed for newer tracks to compare against claimed_territories = claimed_territories.union(track_territories) # add to list of tracks with modified territory list formatted_tracks.append( track._replace(territories=sorted(list(track_territories))) ) return formatted_tracks