"""Metadata transformation module.""" from datetime import datetime, timezone import constants def transform_metadata(sound_recording_metadata): """Transform release metadata from graphQL into ddex ern srr facebook formatted metadata.""" sound_recording_metadata = find_canonical_sound_recordings(sound_recording_metadata) current_datetime = datetime.now(timezone.utc) transformed_metadata = {} # Message Header Metadata transformed_metadata['message_thread_id'] = sound_recording_metadata.get('isrc') transformed_metadata['message_id'] = build_message_id(sound_recording_metadata.get('isrc'), current_datetime) transformed_metadata['message_created_date_time'] = current_datetime.strftime( '%Y-%m-%dT%H:%M:%SZ') # iosformat with Zulu # Resource List Metadata transformed_metadata['isrc'] = sound_recording_metadata.get('isrc') transformed_metadata['resource_reference'] = 'A1' transformed_metadata['title_text'] = sound_recording_metadata.get('trackName') transformed_metadata['meta_language_code'] = sound_recording_metadata.get('metaLanguageCode') transformed_metadata['language_of_performance'] = build_language_of_performance( sound_recording_metadata) transformed_metadata['duration'] = 'PT{}M{}S'.format( sound_recording_metadata.get('durationMinutes'), sound_recording_metadata.get('durationSeconds')) # Sound Recording Details By Territory Metadata transformed_metadata['display_title'] = build_display_title( sound_recording_metadata.get('trackName'), sound_recording_metadata.get('version')) transformed_metadata['formal_title'] = sound_recording_metadata.get('trackName') transformed_metadata['sub_title'] = sound_recording_metadata.get('version') transformed_metadata['display_artists'] = build_display_artists( sound_recording_metadata.get('primaryArtists'), sound_recording_metadata.get('writers')) transformed_metadata['label'] = sound_recording_metadata.get('label') transformed_metadata['pline_year'] = build_pline_year(sound_recording_metadata.get('pInfo')) transformed_metadata['pline_text'] = sound_recording_metadata.get('pInfo') transformed_metadata['parental_warning_type'] = build_parental_warning_type( sound_recording_metadata.get('explicit')) return transformed_metadata def find_canonical_sound_recordings(sound_recording_metadata): """Return only track data from in-content, digital audio tracks.""" canoncial_tuid = None canonical_track_data = None for tuid, track_data in sound_recording_metadata.items(): product = track_data['product'] if (product['productConfiguration'] == 'Digital Audio' and product['status'] == 'in_content' # noqa: W503 and product['deletions'] == 'N'): # noqa: W503 if canoncial_tuid is None or tuid < canoncial_tuid: canoncial_tuid = tuid canonical_track_data = track_data return canonical_track_data def build_message_id(sound_recording_id, current_datetime): """Build ddex ern srr facebook formatted message_id element.""" release_created_datetime = current_datetime.strftime('%Y%m%d_%H%M%SZ') return f'{sound_recording_id}_{release_created_datetime}' def build_parental_warning_type(explicit_flag): """Build ddex ern srr facebook formatted parental_warning_type element.""" parental_warning_type = 'NotExplicit' if explicit_flag == 'Y': parental_warning_type = 'Explicit' elif explicit_flag == 'C': parental_warning_type = 'ExplicitContentEdited' return parental_warning_type def build_display_title(track_name, version): """Build ddex ern srr facebook formatted display_title element.""" display_title = track_name if version: display_title = track_name + ' ({})'.format(version) return display_title def build_display_artists(primary_artists, writers): """Build ddex ern srr facebook formatted display_artist list.""" display_artists = [] for artist in primary_artists: transformed_artist = {} if artist['artistType'] not in constants.DISPLAY_ARTIST_TYPES: continue elif artist['artistType'] == 'performer': transformed_artist['artistRole'] = 'MainArtist' elif artist['artistType'] == 'featuring': transformed_artist['artistRole'] = 'FeaturedArtist' elif artist['artistType'] == 'producer': transformed_artist['artistRole'] = 'Producer' elif artist['artistType'] == 'remixer': transformed_artist['artistRole'] = 'Remixer' transformed_artist['fullName'] = artist['artistName'] display_artists.append(transformed_artist) for writer in writers: transformed_writer = {} transformed_writer['fullName'] = writer['trackWriterName'] transformed_writer['artistRole'] = 'Composer' display_artists.append(transformed_writer) return display_artists def build_language_of_performance(sound_recording_metadata): """Build ddex ern srr facebook formatted language_of_performance.""" language_of_performance = sound_recording_metadata.get('language').get('iso_639_1_code') if language_of_performance: language_of_performance = language_of_performance.lower() return language_of_performance def build_pline_year(pline): """Extrat 4 digit year from start of the pline. Raise error if year is invalid.""" pline_year = pline[0:4] if not pline_year.isnumeric() or len(pline_year) < 4: raise Exception("pline '{}' has invalid year".format(pline)) return pline_year