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)