import asyncio from delivery_metadata.api.app import app from delivery_metadata.models import Model class Performer(Model): performer_id: int type: str performer_role_id: int birth_name: str class TrackPerformerResponse(Model): tuid: int performers: list[Performer] class TrackPerformerRoleResponse(Model): performer_role_id: int performer_role: str class TrackPerformer(Model): role: str birth_name: str async def get_track_performers_with_role_names( release_id: int, ) -> dict[int, list[TrackPerformer]]: ( track_performers, performer_roles, ) = await asyncio.gather( get_track_performers(release_id), get_track_performer_roles(), ) role_map = {role.performer_role_id: role.performer_role for role in performer_roles} track_performers_with_role_names: dict[int, list[TrackPerformer]] = {} for track in track_performers: for performer in track.performers: track_performers_with_role_names.setdefault(track.tuid, []).append( TrackPerformer( role=role_map[performer.performer_role_id], birth_name=performer.birth_name, ) ) return track_performers_with_role_names async def get_track_performers(release_id: int) -> list[TrackPerformerResponse]: response = await app.state.ows_connector.get( service_name="ows-track", path=f"/product/{release_id}/tracks/performers", ) response.raise_for_status() track_performers: list[TrackPerformerResponse] = [] for track_performer in response.json()["items"]: track_performers.append(TrackPerformerResponse(**track_performer)) return track_performers async def get_track_performer_roles() -> list[TrackPerformerRoleResponse]: response = await app.state.ows_connector.get( service_name="ows-track", path="/performer/roles" ) response.raise_for_status() return [TrackPerformerRoleResponse(**role) for role in response.json()["items"]]