@@ -103,37 +103,37 @@ def to_frames(
103103 # Converting to image frame sets
104104 # This works for images and movies only
105105 format = "jpeg" if format == "jpg" else format
106-
106+
107107 # Handle GIF files first
108108 gif_to_frames (output , file_paths , self .file_handler )
109-
109+
110110 # Process regular image files
111111 for image_path_set in file_paths [Category .IMAGE ]:
112112 try :
113113 if image_path_set [2 ] == format :
114114 continue
115-
115+
116116 if image_path_set [2 ] == "gif" :
117117 # gif_to_frames already processed these
118118 self .file_handler .post_process (image_path_set , output , delete )
119119 continue
120-
120+
121121 # Ensure output directory exists
122122 output_dir = os .path .dirname (os .path .join (output , image_path_set [1 ]))
123123 os .makedirs (output_dir , exist_ok = True )
124-
124+
125125 # Construct full output path
126126 img_path = os .path .abspath (
127127 os .path .join (output , f"{ image_path_set [1 ]} .{ format } " )
128128 )
129-
129+
130130 # Convert and save the image
131131 with Image .open (self .file_handler .join_back (image_path_set )) as img :
132132 # Convert to RGB if needed (important for WebP to PNG)
133- if img .mode != ' RGB' :
134- img = img .convert (' RGB' )
133+ if img .mode != " RGB" :
134+ img = img .convert (" RGB" )
135135 img .save (img_path , format = format .upper ())
136-
136+
137137 # Verify the file was created before deleting source
138138 if os .path .exists (img_path ):
139139 self .file_handler .post_process (image_path_set , img_path , delete )
@@ -142,7 +142,7 @@ def to_frames(
142142 f"[!] { lang .get_translation ('conversion_failed' , self .locale )} : "
143143 f"{ self .file_handler .join_back (image_path_set )} "
144144 )
145-
145+
146146 except Exception as e :
147147 self .event_logger .error (
148148 f"[!] { lang .get_translation ('error' , self .locale )} "
@@ -477,47 +477,56 @@ def to_gif(
477477 images = []
478478 total_images = len (file_paths [Category .IMAGE ])
479479 processed = 0
480-
480+
481481 # Log start of GIF creation
482- if hasattr (self , 'prog_logger' ) and hasattr (self .prog_logger , 'bars_callback' ):
483- self .prog_logger .bars_callback ('gif' , 'index' , 0 , 0 )
484-
482+ if hasattr (self , "prog_logger" ) and hasattr (
483+ self .prog_logger , "bars_callback"
484+ ):
485+ self .prog_logger .bars_callback ("gif" , "index" , 0 , 0 )
486+
485487 # Create tqdm progress bar
486488 progress_bar = tqdm (
487489 total = total_images ,
488490 unit = "img" ,
489491 leave = False ,
490- disable = not getattr (self , ' verbose' , True ) # Respect verbosity setting
492+ disable = not getattr (self , " verbose" , True ), # Respect verbosity setting
491493 )
492-
494+
493495 try :
494496 for i , image_path_set in enumerate (file_paths [Category .IMAGE ], 1 ):
495497 if image_path_set [2 ] == format :
496498 progress_bar .update (1 ) # Update for skipped images too
497499 continue
498-
500+
499501 try :
500- with Image .open (self .file_handler .join_back (image_path_set )) as image :
502+ with Image .open (
503+ self .file_handler .join_back (image_path_set )
504+ ) as image :
501505 images .append (image .convert ("RGB" ))
502506 processed += 1
503-
507+
504508 # Update progress after each image
505- if hasattr (self , 'prog_logger' ) and hasattr (self .prog_logger , 'bars_callback' ):
506- self .prog_logger .bars_callback ('gif' , 'index' , i , i - 1 )
507-
508- progress_bar .set_postfix ({"current" : os .path .basename (image_path_set [1 ])}, refresh = False )
509+ if hasattr (self , "prog_logger" ) and hasattr (
510+ self .prog_logger , "bars_callback"
511+ ):
512+ self .prog_logger .bars_callback ("gif" , "index" , i , i - 1 )
513+
514+ progress_bar .set_postfix (
515+ {"current" : os .path .basename (image_path_set [1 ])},
516+ refresh = False ,
517+ )
509518 progress_bar .update (1 )
510-
519+
511520 except Exception as e :
512521 error_msg = f"Error processing image { os .path .basename (image_path_set [1 ])} : { str (e )} "
513- if hasattr (self , ' prog_logger' ):
522+ if hasattr (self , " prog_logger" ):
514523 self .prog_logger .log (error_msg )
515524 progress_bar .write (error_msg ) # Show error in tqdm output
516525 raise # Re-raise to maintain original error handling
517-
526+
518527 finally :
519528 progress_bar .close ()
520-
529+
521530 if images :
522531 output_path = os .path .join (output , f"{ output } _merged.{ format } " )
523532 try :
@@ -527,45 +536,57 @@ def to_gif(
527536 append_images = images [1 :],
528537 )
529538 # Log completion
530- if hasattr (self , 'prog_logger' ) and hasattr (self .prog_logger , 'bars_callback' ):
531- self .prog_logger .bars_callback ('gif' , 'index' , total_images , total_images - 1 )
539+ if hasattr (self , "prog_logger" ) and hasattr (
540+ self .prog_logger , "bars_callback"
541+ ):
542+ self .prog_logger .bars_callback (
543+ "gif" , "index" , total_images , total_images - 1
544+ )
532545 except Exception as e :
533- if hasattr (self , 'prog_logger' ):
534- self .prog_logger .log (f"Error saving GIF { output_path } : { str (e )} " )
546+ if hasattr (self , "prog_logger" ):
547+ self .prog_logger .log (
548+ f"Error saving GIF { output_path } : { str (e )} "
549+ )
535550 raise
536551 # Movies are converted to gifs as well, retaining 1/3 of the frames
537552 for i , movie_path_set in enumerate (file_paths [Category .MOVIE ], 1 ):
538553 if self .file_handler .has_visuals (movie_path_set ):
539554 try :
540555 # Log start of video to GIF conversion
541- if hasattr (self , 'prog_logger' ) and hasattr (self .prog_logger , 'bars_callback' ):
542- self .prog_logger .bars_callback ('video_gif' , 'index' , 0 , 0 )
543-
556+ if hasattr (self , "prog_logger" ) and hasattr (
557+ self .prog_logger , "bars_callback"
558+ ):
559+ self .prog_logger .bars_callback ("video_gif" , "index" , 0 , 0 )
560+
544561 video = VideoFileClip (
545562 self .file_handler .join_back (movie_path_set ),
546563 audio = False ,
547564 fps_source = "tbr" ,
548565 )
549566 gif_path = os .path .join (output , f"{ movie_path_set [1 ]} .{ format } " )
550-
567+
551568 # Calculate target fps, ensuring it's at least 1
552569 target_fps = max (1 , int (video .fps // 3 ))
553-
570+
554571 # Write GIF with progress logging
555572 video .write_gif (
556- gif_path ,
557- fps = target_fps ,
573+ gif_path ,
574+ fps = target_fps ,
558575 logger = self .prog_logger ,
559- verbose = False # Disable moviepy's default progress bar
576+ verbose = False , # Disable moviepy's default progress bar
560577 )
561-
578+
562579 # Log completion of this video
563- if hasattr (self , 'prog_logger' ) and hasattr (self .prog_logger , 'bars_callback' ):
564- self .prog_logger .bars_callback ('video_gif' , 'index' , i , i - 1 )
565-
580+ if hasattr (self , "prog_logger" ) and hasattr (
581+ self .prog_logger , "bars_callback"
582+ ):
583+ self .prog_logger .bars_callback ("video_gif" , "index" , i , i - 1 )
584+
566585 except Exception as e :
567- if hasattr (self , 'prog_logger' ):
568- self .prog_logger .log (f"Error converting video { movie_path_set } to GIF: { str (e )} " )
586+ if hasattr (self , "prog_logger" ):
587+ self .prog_logger .log (
588+ f"Error converting video { movie_path_set } to GIF: { str (e )} "
589+ )
569590 raise # Re-raise to maintain original error handling
570591 video .close ()
571592 self .file_handler .post_process (movie_path_set , gif_path , delete )
@@ -614,7 +635,7 @@ def to_gif(
614635 prs = pptx .Presentation (input_path )
615636 for slide in prs .slides :
616637 for shape in slide .shapes :
617- if shape .shape_type == 13 : # Picture
638+ if shape .shape_type == 13 : # Picture
618639 image = shape .image
619640 img_bytes = image .blob
620641 img = Image .open (img_bytes )
0 commit comments