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)
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)