"""Primary track selection utilities.""" from typing import List from soundrecording_utils.metadata.types import ( ExplicitStatus, Genre, Label, LabelID, LabelParticipant, LabelType, OrchardSoundRecording, Product, ProductStatus, Subgenre, Track, TrackParticipation, ) from .graphql import get_primary_track_isrc_and_tuid, get_track def get_primary_track( sound_recording_metadata: OrchardSoundRecording, application_name: str, ) -> Track: """Select primary parent track in a sound recording. Args: sound_recording_metadata: The OrchardSoundRecording to get the primary track from. application_name: Name of the application making the request. Returns: The primary Track from the sound recording, or a dummy Track if no tracks are available. """ 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 minimal data. These are being # fetched via GraphQL based on the ISRC. We pick the details of # the OSR's primary track, if that doesn't have participants # data, we're falling back to the first track found with that ISRC # that has participants data. track_name: str = '' label_name: str = '' genre_name: str = '' participations: List[TrackParticipation] = [] primary_track_ref = get_primary_track_isrc_and_tuid( sound_recording_metadata.isrc, application_name ) if primary_track_ref: track_isrc, track_tuid = primary_track_ref track_info = get_track(track_isrc, track_tuid, application_name) else: track_info = None if track_info: track_name = track_info.get('trackName', '') label_info = track_info.get('labelSoundRecording', {}) or {} label = label_info.get('label', {}) or {} label_name = label.get('name', '') product_info = track_info.get('product', {}) or {} subgenre_info = product_info.get('subgenre', {}) or {} genre_info = subgenre_info.get('genre', {}) or {} genre_name = genre_info.get('name', '') participations_raw = track_info.get('participations', []) participations = [ TrackParticipation( participant=LabelParticipant(**item['participant']), participated_as=item['participated_as'], ) for item in participations_raw ] return Track( product=Product( status=ProductStatus.in_content, label=Label( id=LabelID(vendor=0, subaccount=0), type=LabelType('Vendor'), uuid='', name=label_name, ), subgenre=Subgenre( id=0, name='', genre=Genre( id=0, name=genre_name ) ), release_date='', id='', display_upc='', ), tuid='', isrc='', name=track_name, version=None, duration_seconds=0, duration_minutes=0, meta_language_code=None, language=None, p_info=None, explicit=ExplicitStatus.N, territories=[], participations=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 )