
    )iK                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
 d dlZd dlmZ d dlmZmZ d dlZd dlmZmZmZmZmZ d dlmZ d dlmZ  e         ej:                  d	      Z ed
e       dde de de!de	e    dee   f
dZ"dee!e f   fdZ#dde
e!e!f   de!dejH                  fdZ%de de&de
e!e!f   fdZ'ddZ(y)    N)Path)DictListOptionalTuple)convert_from_path)Image	ImageDraw)	ImageClipAudioFileClipVideoFileClipCompositeVideoClipconcatenate_videoclips)	ColorClip)load_dotenvPOPPLER_PATHzPoppler pathpdf_pathout_dirdpipoppler_pathreturnc                 L   t        |       }|j                         st        d|        t        |      }|j                  dd       t	        t        |      ||      }g }t        |d      D ]3  \  }}	|d|dd	z  }
|	j                  |
d
       |j                  |
       5 |S )z
    Convert PDF pages to images using pdf2image.
    Returns list of image Paths in page order (1-based indexing -> list index 0 = page 1).
    poppler_path: optionally required on Windows to point to poppler bin folder.
    zPDF not found: T)parentsexist_ok)r   r      )startpage_03dz.pngPNG)format)	r   existsFileNotFoundErrormkdirr   str	enumeratesaveappend)r   r   r   r   poutdirimagessavediimgout_files              3C:\xampp\htdocs\eduruby\Video_generation\helpers.pypdf_to_imagesr0      s     	XA88:/( <==']F
LLL- s1v3\JFEF!,3eAc7$//%(X - L    c                 V   t        | t              r| }nNt        |       }|j                         st	        d|        t        j                  |j                  d            }i }|j                         D ]  \  }}	 t        |      }t        |      ||<   ! |S #  t        d|       xY w)z
    Load audio map from JSON filepath or accept a dict. Keys expected to be page numbers (1-based).
    Returns dict[int,page_audio_path].
    zAudio map not found: zutf-8)encodingz#Audio map key is not integer-like: )
isinstancedictr   r!   r"   jsonloads	read_textitemsint
ValueErrorr$   )path_or_dictdr(   outkvns          r/   load_audio_maprB   (   s    
 ,%xxz#&;L>$JKKJJq{{G{45C	1	HAA QA  J	HB1#FGGs   ;BB(sizeborderc                     | \  }}t        j                  d||fd      }t        j                  |      }|j	                  |||dz
  |z
  |dz
  |z
  fd       t        j                  |      S )z4Return grayscale mask (0..255) with a filled circle.Lr   r      )fill)r	   newr
   Drawellipsenparray)rC   rD   whmaskdraws         r/   create_circle_mask_arrayrR   =   sf    
CAa99S1a&!$D>>$DLL&&!A#f*ac&j9LD88D>r1   avatar_pathdurationavatar_sizec                     t        |       j                         }|j                  |      }|j                  |      }|S )zMLoad avatar video, loop to duration, resize, and return clip (without audio).)rT   )newsize)r   without_audioloopresize)rS   rT   rU   avataravatar_loopedavatar_resizeds         r/   make_avatar_clip_for_durationr^   E   s>    ;'557FKKK2M"))+)>Nr1   c                    t        | t              rt        j                  j	                  |       st        d|        t        j                  |d       t        j                  |       }|j                         st        d|        |j                  t        j                  |       |j                         \  }}|j                          |r|t        d      t        j                  j                  t        j                  j                  |             d   }t        j                  j!                  || d      }t        j"                  ||       |S )aZ  
    Extracts a frame from a video file and saves it as an image (icon).

    Args:
        video_path (str): Path to the input video file (.mp4).
        output_dir (str): Directory where the image will be saved.
        frame_number (int): Frame number to extract (default: first frame).

    Returns:
        str: Path to the saved image.
    zInvalid video path: T)r   zUnable to open video: z Failed to read frame from video.r   z	_icon.jpg)r4   r$   ospathr!   r;   makedirscv2VideoCaptureisOpenedsetCAP_PROP_POS_FRAMESreadreleasesplitextbasenamejoinimwrite)
video_path
output_dirframe_numbercapsuccessframe	base_nameoutput_paths           r/   extract_iconrv   L   s    j#&bggnnZ.H/
|<== KK
T* 

:
&C<<>1*>?? GGC##\2 XXZNGUKKMem;<<   !1!1*!=>qAI'',,zi[	+BCK KKU#r1   )   N)r   )zuploads/thumbnailsr   ))argparser6   r`   uuidpathlibr   typingr   r   r   r   rc   	pdf2imager   PILr	   r
   numpyrL   moviepy.editorr   r   r   r   r   moviepy.video.VideoClipr   dotenvr   getenvr   printr$   r:   r0   rB   ndarrayrR   floatr^   rv    r1   r/   <module>r      s      	   . . 
 '    n n -  bii' nl #C # C XVY] fjkofp *DcN *5S> 3 rzz s e RWX[\_X_R` )r1   