This function is giving me an error but I’ve copied it from the video-diet program and I don’t really understand it so I can’t simplify it. Could someone who understands it, explain it step by step?

def convert_video_progress_bar(self, manager, cmd):
    name = self.path.rsplit(os.path.sep, 1)[-1]
    proc = expect.spawn(cmd, encoding='utf-8')
    pbar = None
    try:
        proc.expect(pattern_duration)
        total = sum(map(lambda x: float(
            x[1])*60**x[0], enumerate(reversed(proc.match.groups()[0].strip().split(':')))))
        cont = 0
        pbar = manager.counter(
            total=100,
            desc=name,
            unit='%',
            bar_format=BAR_FMT,
            counter_format=COUNTER_FMT,
            leave=False
        )
        while True:
            proc.expect(pattern_progress)
            progress = sum(map(lambda x: float(
                x[1])*60**x[0], enumerate(reversed(proc.match.groups()[0].strip().split(':')))))
            percent = progress/total*100
            pbar.update(percent-cont)
            cont = percent
    except expect.EOF:
        traceback.print_exc()
    finally:
        if pbar is not None:
            pbar.close()
    proc.expect(expect.EOF)
    res = proc.before
    res += proc.read()
    exitstatus = proc.wait()
    if exitstatus:
        raise ffmpeg.Error('ffmpeg', '', res)
    • thann@heapoverflow.mlM
      link
      fedilink
      arrow-up
      3
      ·
      2 years ago
      def convert_video_progress_bar(self, manager, cmd):
          name = self.path.rsplit(os.path.sep, 1)[-1]
          # Run ffmpeg
          proc = expect.spawn(cmd, encoding='utf-8')
          pbar = None
          try:
              # extract the total number of frames 
              proc.expect(pattern_duration)
              total = sum(map(lambda x: float(
                  x[1])*60**x[0], enumerate(reversed(proc.match.groups()[0].strip().split(':')))))
              cont = 0
              # keeps track of the progress to show it to the user
              pbar = manager.counter(
                  total=100,
                  desc=name,
                  unit='%',
                  bar_format=BAR_FMT,
                  counter_format=COUNTER_FMT,
                  leave=False
              )
              # infinite loop
              while True:
                  # look for a progress indicator, and extract the frame count
                  proc.expect(pattern_progress)
                  progress = sum(map(lambda x: float(
                      x[1])*60**x[0], enumerate(reversed(proc.match.groups()[0].strip().split(':')))))
                  # compute the percentage complete
                  percent = progress/total*100
                  # update the counter, to show the user
                  pbar.update(percent-cont)
                  cont = percent
          # because of the infinite loop, 
          # `proc.expect` will throw an error once ffmpeg has completed.
          # catch that error, and clean things up
          except expect.EOF:
              traceback.print_exc()
          finally:
              if pbar is not None:
                  pbar.close()
          proc.expect(expect.EOF)
          res = proc.before
          res += proc.read()
          # check to see if ffmpeg threw and error
          exitstatus = proc.wait()
          if exitstatus:
              raise ffmpeg.Error('ffmpeg', '', res)