o
    <:eT                     @   s   d dl m Z  d dlZ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	 ddl
T ddlT dZejd d	Zd
ZG dd dZdS )    )datetimeN)BytesIO)Image   )*z./temp/~z/Downloads/z.zipc                   @   s   e Zd ZefddZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd=d d!Zd"d# Zd$d% Zd>d&d'Zd(d) Zd*d+ Zd,d- Zd.d/ Zd?d1d2Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z dS )@ImageHandlerc                 C   sd   d| _ d| _d| _d| _g | _g | _g | _d| _d| _d| _	g | _
g | _|| _d| _d| _t| _d S N )imageIDfolderID
uploadtimeoriginalfolderpathoriginalimagenameoriginalimagetypeoriginalimagestreamedittedfolderpathedittedimagenameedittedimagetypeedittedimagestreameditinghistorytemp_folderpathtemp_input_filepathtemp_output_filepathDEFAULT_SAVE_FOLDER_PATHsave_folderpath)selftemp_folder_path r   M/var/www/html/file-convertor/convertpro/convertor/imageeditor/imagehandler.py__init__   s    
zImageHandler.__init__c                 C   sL   d| _ d| _d| _g | _g | _g | _d| _d| _d| _g | _	g | _
d| _d S r	   )r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   _reset_values&   s   
zImageHandler._reset_valuesc                 C   s,   t jjt jjt jjf}| |rdS dS )NTF)
FileFormatJPEGvaluePNGBMPlowerendswith)r   filenamesupported_formatsr   r   r   check_file_extension5   s   z!ImageHandler.check_file_extensionc                 C   s   |dkrAt j|}| |r;|   t j|d | _t j|d gt j|d g| _| _	| j	| _
td dS td dS td	 dS )
Nr
   /r   r   Valid filetypeTInvalid filetypeFFilepath is empty)ospathbasenamer+   r!   dirnamer   splitextr   r   r   print)r   filepathr)   r   r   r   check_file_type<   s   
*zImageHandler.check_file_typec                 C   s*   |dkrt |}|g krdS td dS )Nr
   TzEmpty Folder.F)r0   listdirr5   )r   
folderpathitemsr   r   r   check_folder_dataM   s   
zImageHandler.check_folder_datac                    s   dkr|    |d dkrt|ndt| }g }g }t } fdd|D }td|  |D ]}| |rB|| q5|| q5td|  td|  d	d
| }t| g }	g }
|D ]}| 	|rv|
| qg|	| qgdd
|
 }t| |

|}
 	dr n d | _dd |	D | _dd |	D | _td| j  td| j  |	g krdnd}||
fS d S )Nr
   r   .c                    s&   g | ]}t jt j |r|qS r   )r0   r1   isfilejoin).0itemr9   r   r   
<listcomp>`   s   & z2ImageHandler.check_folder_type.<locals>.<listcomp>zFilenames: zSupported files: zUnsupported files: zPThe following files have been skipped since they are not in valid file formats: z, zTThe following files have been skipped since they are already in output file format: r,   c                 S      g | ]
}t j|d  qS )r   r0   r1   r4   r?   r)   r   r   r   rB   ~       c                 S   rC   r   rD   rE   r   r   r   rB      rF   zInput filenames: zInput filetype: TF)r!   strr'   r0   r8   r5   r+   appendr>   r(   extendinputfolderpathinputfilenameinputfiletype)r   r9   output_filetypesupported_filesunsupported_filesr:   	filenamesr)   unsupported_files_infovalid_filesskipped_filesskipped_files_inforesultr   rA   r   check_folder_typeV   sB   $


zImageHandler.check_folder_typec                 C   @   |t jjkr
tjjS |t jjkrtjjS |t jjkrtjjS d S N)r"   r#   r$   ImageFormatr%   r&   )r   file_formatr   r   r   _get_image_format      zImageHandler._get_image_formatc                 C   rX   rY   )rZ   r#   r$   r"   r%   r&   )r   image_formatr   r   r   _get_file_format   r]   zImageHandler._get_file_formatc                 C   s2   |dks|dks| dd dkrtd dS dS )Nr
   zdata:,r   zData is empty.FT)splitr5   )r   imager   r   r   check_image_data   s   "zImageHandler.check_image_datac                 C   s   |dkrB| dd  dd }tjjtjjtjjf}||v r<|   | |g| _| j| _	t
d| j  t
d dS t
d	 d
S t
d d
S )Nr
   ;r   :r   zOriginal filetype: r-   Tr.   Fr/   )ra   rZ   r#   r$   r%   r&   r!   r_   r   r   r5   )r   docdoc_typer*   r   r   r   check_doc_type   s   zImageHandler.check_doc_typec                 C   s   t  }|d}|tjkr| jdd n| jd }t	|| }t
dd|| _|| _td| j td| j |tjkrI| jg| _| j| _d S d S )	Nz%d%m%y%H%M%Sr,   r   z[^a-zA-Z0-9]r
   zImageID:zUpload Time:)r   nowstrftimeFileCategoryINPUT_FOLDERPATHr   ra   r   rH   upperresubr   r   r5   INPUT_BASE64r   r   )r   file_categoryrj   formatted_datetime
first_partimage_IDr   r   r   get_imageID_uploadtime   s   
$

z#ImageHandler.get_imageID_uploadtimec                 C   s$   t d|  |dkrt|S d S )NzBase64 data to convert: r
   )r5   base64	b64decode)r   base64_datar   r   r   _convert_base64_to_bytestream   s   
z*ImageHandler._convert_base64_to_bytestreamc                 C   s   |dkrt |dS d S )Nr
   utf-8)rw   	b64encodedecode)r   
bytestreamr   r   r   _convert_bytestream_to_base64   s   z*ImageHandler._convert_bytestream_to_base64c                 C   s,   |dkrt |}t|}t|}|S d S r	   )rw   rx   r   imgopen)r   ry   decoded_data
image_datarb   r   r   r   _convert_base64_to_image   s   

z%ImageHandler._convert_base64_to_imagec                 C   s   t | |d krT|tjjtjjtjjfv rVt }t d|  t d|j  t d|  |tjjkrB|	d}t d|j d |
|| t| d}|S d S d S )Nz
Input File Format: zImage Mode: zOutput File Format: RGB
r{   )r5   rZ   r#   r$   r%   r&   r   moder"   convertsaverw   r|   getvaluer}   )r   r   input_formatoutput_formatoutput_bufferry   r   r   r   _convert_image_to_base64   s   
z%ImageHandler._convert_image_to_base64Nc              
   C   sB  |t jks
|t jkrl| jdkrltt| jD ]N}t| j| j|  | j|  d}| j	
| | | j| | j|  f W d    n1 sHw   Y  | j
d| j	| d  d| j d| j d qt| j	 dS |t jkr|dkr|d	d }|| j| j fg| _	| j
d| j	d
 d  d| j d| j d dS dS )Nr
   rbz	Uploaded r   z
 image in z directory with image ID r<   Tr`   r   F)rl   INPUT_FILEPATHrm   r   rangelenr   r   r   r   rI   r   readr   r   r5   rq   ra   )r   rr   rf   numfiledatar   r   r   convert_file_to_base64   s    
",0

.z#ImageHandler.convert_file_to_base64c                 C   s.   | drt|| _d S dt| | _d S )Nr<   )
startswithrH   r'   r   )r   rN   r   r   r   _assign_output_filetype   s   
z$ImageHandler._assign_output_filetypec
           
      C   sB   |    || _|| _|| _|| _|| _|| _|| _|| _|	| _	d S rY   )
r!   r   r   r   r   r   r   r   r   r   )
r   r   r   original_folderpathoriginal_filenameoriginal_filetypeoriginal_filestreameditted_filetypeeditted_filestreamediting_historyr   r   r   assign_select_item_details  s   
z'ImageHandler.assign_select_item_detailsc                 C   sx   | j dkr:|d u rd| j | _n|| _td| j  |d u r$| j| _n|dr+|n|d | _td| j  d S d S )Nr
   edittedimages_zEditted Filename: r,   zEditted Filepath: )r   r   r   r5   r   r   r(   )r   output_filenameoutput_filepathr   r   r   declare_output_filepath_details  s   

z,ImageHandler.declare_output_filepath_detailsc              	   C   sL  t  }t|dtjF}| jD ]}td|d  d || jd |d  | 	|d  qtd| j
 d| j d	 | jd| j
 d| j d	 W d    n1 sUw   Y  | jd
krtj| jslt| j t| j| j t d}||  W d    n1 sw   Y  td| j d	 | jd| j d	 dS dS )Nwz!Initiating image compression for r   r<   r,   r   zCompressed editted images in  directory to z folder in ZIP format.r
   wbzDownloaded TF)ior   zipfileZipFileZIP_DEFLATEDr   r5   writestrr   rz   r   r   rI   r   r0   r1   existsmakedirsr   ZIP_FILE_EXTENSIONwriter   )r   
zip_bufferzipfstreamzip_filer   r   r   save_to_output_folder#  s$   
& 
z"ImageHandler.save_to_output_folderc                    sN  |   r| jg kr| j| _| jD ]n}tj|d d  krc| | |d tj|d d |  |d< tj|d d   |d< | j	
dtj|d d  d| j d|   d q| j	
dtj|d d  d| j d|   d q fd	d
| jD | _td  ddd
 | jD   dS td  d dS )Nr   r   zConverted image file named  in r   z file format.z Didn't convert image file named z" directory since it is already in c                    s   g | ]} qS r   r   )r?   	imagetypefiletyper   r   rB   H  s    z5ImageHandler.convert_image_format.<locals>.<listcomp>z4Editted Image Stream File Names after Conversion to z: c                 S   s   g | ]}|d  qS rG   r   )r?   r   r   r   r   rB   I  s    TzFile format z is not supported.F)r+   r   r   r0   r1   r4   r   r   r\   r   rI   r   r   r5   )r   r   r   r   r   r   convert_image_format9  s   


2:: z!ImageHandler.convert_image_formatc                 C   s4   |d krt  }||| | | j}|S d S rY   )r   r   r   r\   	getbuffernbytes)r   rb   r   buffer	file_sizer   r   r   _get_image_file_sizeP  s   
z!ImageHandler._get_image_file_sizec                 C   s\   |t jjkr|S |t jjkr|d S |t jjkr|d d S |t jjkr,|d d d S d S )Ni   )FileSizeUnitBYTESr$   
KILO_BYTES
MEGA_BYTES
GIGA_BYTES)r   
targetsizeunitr   r   r   _target_size_in_bytesX  s   z"ImageHandler._target_size_in_bytesr   c                 C   s  | j g kr	| j| _ | j D ]}| |d }|j\}}	td|d   td|  td|	  |tjkr|tjkr|r|t	j
krW|d t|	|d  | }}	td np|t	jkrpt||d  |	 |d }}	td nWtd	| d
 | jd| d  dS |d |d }}	td n4|tjkrt||d  d t|	|d  d }}	td ntd| d
 | jd| d  dS td|  td|	 d |||	f}n|tjkr| |tj|d d | |d |d kr(td|d  d|d  d|d  d
 | jd|d  d|d  d|d  d
 qd}
tddd D ]A}t|| d t|	| d }}|||f}| |tj|d d }|| |d |d krp||}}	|}d!}
 nq0|
s| jd"tj|d d  d#| j d$ qntd%| d
 | jd&| d  dS | |tj|d d | tj|d d |d< | jd'tj|d d  d#| j d(||	f d
 qd!S ))Nr   z
Filename: r   zWidth: zHeight: r$   z)Changed dimensions with respect to width.z*Changed dimensions with respect to height.zInvalid Dimension: r<   z%Didn't resize images since Dimension  is invalid.FwidthheightzChanged dimensions.
percentaged   z.Changed dimensions with respect to percentage.z%Invalid Resize By Image Size Option: z7Didn't resize images since Resize By Image Size Option zNew Width: zNew Height: r   
targetSizer   zFilesize of z is already within  z*Didn't resize image since the filesize of _   Tz!Couldn't resize image file named r   z1 directory since it did not achieve target size).zInvalid Resize Option: z)Didn't resize images since Resize Option zResized image file named z directory to new size )r   r   r   sizer5   ResizeOptionsBY_IMAGESIZEResizeByImageSizeOptionsBY_DIMENSIONS	DimensionWIDTHroundHEIGHTr   rI   BY_PERCENTAGEresizeBY_FILESIZEr   r0   r1   r4   r   r   r   r   r\   )r   r$   	resize_byresize_image_size_byaspect_ratio_lockresize_by_dimensionr   rb   r   r   resizedr   	new_width
new_heightresized_imagefilesizer   r   r   resize_imagec  sr   









*
2(,"
,88zImageHandler.resize_imagec                 C      |t jjkrdS dS )N	ClockwisezAnti-clockwise)RotationOrientation
CLOCK_WISEr$   )r   orientationr   r   r   _get_rotation_direction     z$ImageHandler._get_rotation_directionc                 C   s  | j g kr	| j| _ |tjjks|tjjkro|tjjkrtjjntjj	}| j D ]F}| 
|d }||}| |tj|d d | tj|d d |d< | jdtj|d d  d| j d| | d q&dS td| d	 | jd
| d dS )Nr   r   zRotated image file named r    directory in  direction.TzInvalid Orientation: r<   z.Didn't rotate images since the Orientation of r   F)r   r   r   r   r$   ANTI_CLOCK_WISEr   	Transpose
ROTATE_270	ROTATE_90r   	transposer   r0   r1   r4   r\   r   rI   r   r   r5   )r   r   r   r   rb   r   r   r   rotate_image  s   


8:zImageHandler.rotate_imagec                 C   r   )N
HorizontalVertical)FlippingDirection
HORIZONTALr$   )r   	directionr   r   r   _get_flipping_direction  r   z$ImageHandler._get_flipping_directionc                 C   s  | j g kr	| j| _ |tjjks|tjjkrm|tjjkrtjntj}| j D ]F}| 	|d }|
|}| |tj|d d | tj|d d |d< | jdtj|d d  d| j d| | d q$dS td| d	 | jd
| d dS )Nr   r   zFlipped image file named r   r   r   TzInvalid Direction: r<   z*Didn't flip images since the Direction of r   F)r   r   r   r   r$   VERTICALr   FLIP_LEFT_RIGHTFLIP_TOP_BOTTOMr   r   r   r0   r1   r4   r\   r   rI   r   r   r5   )r   r   flipr   rb   r   r   r   
flip_image  s   


8:zImageHandler.flip_imagec           	      C   s  | j g kr	| j| _ | j D ]}| |d }|j\}}||krc||krc|dkrc|dkrctd||f d||||f d | jdtj	|d d  d| j
 d|d  d	||f d||||f d q|dkri|nd}|dkrq|nd}||k ry|n|}||k r|n|}|||||f}| |tj	|d d | tj	|d d |d< | jd
tj	|d d  d| j
 d||||f d qdS )Nr   zImage size z( is not compatible with cropping window r<   zDidn't crop image file named r   r   z# directory since the image size of r   zCropped image file named z  directory with cropping window T)r   r   r   r   r5   r   rI   r0   r1   r4   r   cropr   r\   )	r   lefttoprightbottomr   rb   r   r   r   r   r   
crop_image  s"   


 "N8<zImageHandler.crop_imagerY   )NN)Nr   N)!__name__
__module____qualname__DEFAULT_TEMP_FOLDER_PATHr    r!   r+   r7   r;   rW   r\   r_   rc   rh   rv   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   r   r      s<    	2		


Yr   )r   ro   r0   r   rw   r   r   PILr   r   enumsserializersr  r1   
expanduserr   r   r   r   r   r   r   <module>   s    