docs: def parse_loudnorm_stats(self):
          """
          Run a first pass loudnorm filter to get measured data.
          """
          logger.info(
              "Running first pass loudnorm filter for stream {}".format(self.stream_id)
          )
  
          opts = {
              'i': self.media_file.ffmpeg_normalize.target_level,
              'lra': self.media_file.ffmpeg_normalize.loudness_range_target,
              'tp': self.media_file.ffmpeg_normalize.true_peak,
              'offset': self.media_file.ffmpeg_normalize.offset,
              'print_format': 'json'
          }
  
          if self.media_file.ffmpeg_normalize.dual_mono:
              opts['dual_mono'] = 'true'
  
          filter_str = '[0:{}]'.format(self.stream_id) + \
              'loudnorm=' + dict_to_filter_opts(opts)
  
          cmd = [
              self.media_file.ffmpeg_normalize.ffmpeg_exe, '-nostdin', '-y',
              '-i', self.media_file.input_file,
              '-filter_complex', filter_str,
              '-vn', '-sn', '-f', 'null', NUL
          ]
  
          cmd_runner = CommandRunner(cmd)
          for progress in cmd_runner.run_ffmpeg_command():
              yield progress
          output = cmd_runner.get_output()
  
          logger.debug("Loudnorm first pass command output:")
          logger.debug(output)
  
          output_lines = [line.strip() for line in output.split('\n')]
          loudnorm_start = False
          loudnorm_end = False
          for index, line in enumerate(output_lines):
              if line.startswith('[Parsed_loudnorm'):
                  loudnorm_start = index + 1
                  continue
              if loudnorm_start and line.startswith('}'):
                  loudnorm_end = index + 1
                  break
  
          if not (loudnorm_start and loudnorm_end):
              raise FFmpegNormalizeError("Could not parse loudnorm stats; no loudnorm-related output found")
  
          try:
              loudnorm_stats = json.loads('\n'.join(output_lines[loudnorm_start:loudnorm_end]))
          except Exception as e:
              raise FFmpegNormalizeError("Could not parse loudnorm stats; wrong JSON format in string: {}".format(e))
  
          logger.debug("Loudnorm stats parsed: {}".format(json.dumps(loudnorm_stats)))
  
          self.loudness_statistics['ebu'] = loudnorm_stats
          for key, val in self.loudness_statistics['ebu'].items():
              if key == 'normalization_type':
                  continue
              # FIXME: drop Python 2 support and just use math.inf
              if float(val) == -float("inf"):
                  self.loudness_statistics['ebu'][key] = -99
              elif float(val) == float("inf"):
                  self.loudness_statistics['ebu'][key] = 0