docs: def get_match(session, match_id):
      """Get match metadata."""
      url = '{}{}/{}'.format(session.auth.base_url, MATCH_URL, match_id)
      parsed = make_scrape_request(session, url)
      game = parsed.find('h3').text
      if game != GAME_AOC:
          raise ValueError('not an aoc match')
      date_played = parsed.find(text=MATCH_DATE_PLAYED).find_next('td').text
      players = []
      colors = {}
      player_count = int(parsed.find('td', text='Players:').find_next('td').text)
      for div in parsed.find_all('div', style=True):
          if not div['style'].startswith('background-color:'):
              continue
          if len(players) == player_count:
              break
          username_elem = div.find_next('a', href=re.compile(PROFILE_PATH))
          username = username_elem.text
          color = div['style'].split(':')[1].split(';')[0].strip()
          colors[username] = color
  
          rec = None
          for dl_elem in parsed.find_all('a', href=re.compile('^/files/view')):
              rec_name = dl_elem.find('b', text=re.compile(username+'$'))
              if rec_name:
                  rec = rec_name.parent
  
          user = parsed.find('a', text=username)
          if not user:
              # bugged match page
              continue
          user_id = int(user['href'].split('/')[-1])
          children = list(user.find_next('span').children)
          rate_after = None
          rate_before = None
          if str(children[0]).strip() == MATCH_NEW_RATE:
              rate_after = int(children[1].text)
              rate_before = rate_after - int(children[3].text)
          elif str(children[4]).strip() == MATCH_NEW_RATE:
              rate_after = int(children[5].text)
              rate_before = rate_after - int(children[3].text)
          players.append({
              'url': rec['href'] if rec else None,
              'id': user_id,
              'username': username,
              'color_id': COLOR_MAPPING.get(colors[username]),
              'rate_before': rate_before,
              'rate_after': rate_after
          })
      return {
          'timestamp': dateparser.parse(date_played),
          'players': players
      }