def load_meta_data(meta_data_file: Readable) -> EPTSMetaData:
    root = objectify.fromstring(meta_data_file.read())
    meta_data = root.find('Metadata')
    score_path = objectify.ObjectPath('Metadata.Sessions.Session[0].MatchParameters.Score')
    score_elm = score_path.find(meta_data)
    _team_map = {score_elm.attrib['idLocalTeam']: Team.HOME, score_elm.attrib['idVisitingTeam']: Team.AWAY}
    players = _load_players(meta_data.find('Players'), _team_map)
    data_format_specifications = _load_data_format_specifications(root.find('DataFormatSpecifications'))
    device_path = objectify.ObjectPath('Metadata.Devices.Device[0].Sensors')
    sensors = _load_sensors(device_path.find(meta_data))
    _channel_map = {channel.channel_id: channel for sensor in sensors for channel in sensor.channels}
    _player_map = {player.player_id: player for player in players}
    player_channels = [PlayerChannel(player_channel_id=player_channel_elm.attrib['id'], player=_player_map[player_channel_elm.attrib['playerId']], channel=_channel_map[player_channel_elm.attrib['channelId']]) for player_channel_elm in meta_data.find('PlayerChannels').iterchildren(tag='PlayerChannel')]
    team_name_map = {_team_map[team_elm.attrib['id']]: str(team_elm.find('Name')) for team_elm in meta_data.find('Teams').iterchildren(tag='Team')}
    frame_rate = int(meta_data.find('GlobalConfig').find('FrameRate'))
    periods = _load_periods(meta_data.find('GlobalConfig'), frame_rate)
    pitch_dimensions = _load_pitch_dimensions(meta_data, sensors)
    return EPTSMetaData(home_team_name=team_name_map[Team.HOME], away_team_name=team_name_map[Team.AWAY], players=players, periods=periods, pitch_dimensions=pitch_dimensions, data_format_specifications=data_format_specifications, player_channels=player_channels, frame_rate=frame_rate, sensors=sensors)
def load_meta_data(meta_data_file: Readable) -> EPTSMetaData:
    root = objectify.fromstring(meta_data_file.read())
    meta_data = root.find('Metadata')
    score_path = objectify.ObjectPath('Metadata.Sessions.Session[0].MatchParameters.Score')
    score_elm = score_path.find(meta_data)
    _team_map = {score_elm.attrib['idLocalTeam']: Team.HOME, score_elm.attrib['idVisitingTeam']: Team.AWAY}
    players = _load_players(meta_data.find('Players'), _team_map)
    data_format_specifications = _load_data_format_specifications(root.find('DataFormatSpecifications'))
    device_path = objectify.ObjectPath('Metadata.Devices.Device[0].Sensors')
    sensors = _load_sensors(device_path.find(meta_data))
    _channel_map = {channel.channel_id: channel for sensor in sensors for channel in sensor.channels}
    _player_map = {player.player_id: player for player in players}
    player_channels = [PlayerChannel(player_channel_id=player_channel_elm.attrib['id'], player=_player_map[player_channel_elm.attrib['playerId']], channel=_channel_map[player_channel_elm.attrib['channelId']]) for player_channel_elm in meta_data.find('PlayerChannels').iterchildren(tag='PlayerChannel')]
    team_name_map = {_team_map[team_elm.attrib['id']]: str(team_elm.find('Name')) for team_elm in meta_data.find('Teams').iterchildren(tag='Team')}
    frame_rate = int(meta_data.find('GlobalConfig').find('FrameRate'))
    periods = _load_periods(meta_data.find('GlobalConfig'), frame_rate)
    pitch_dimensions = _load_pitch_dimensions(meta_data, sensors)
    return EPTSMetaData(home_team_name=team_name_map[Team.HOME], away_team_name=team_name_map[Team.AWAY], players=players, periods=periods, pitch_dimensions=pitch_dimensions, data_format_specifications=data_format_specifications, player_channels=player_channels, frame_rate=frame_rate, sensors=sensors)