o
    Ê·6i©  ã                   @   s’   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mZ d dl	m
Z
mZ d dlmZmZ d dlmZ e  e¡Zdd	d
ddœZG dd„ dƒZdS )é    N)Údefault)Údefaults©Úsettings)Ú	serializeÚtokey)ÚDummyImageFileÚ	ImageFile)Úparse_geometryÚjpgÚpngÚgifÚwebp)ÚJPEGÚPNGÚGIFÚWEBPc                
   @   sr   e Zd ZdZejejejejdddej	ej
dœ	ZdZdd„ Zdd	„ Zd
d„ Zddd„Zdd„ Zdd„ Zdd„ ZdS )ÚThumbnailBackendz“
    The main class for sorl-thumbnail, you can subclass this if you for example
    want to change the way destination filename is generated.
    FN)	ÚformatÚqualityÚ
colorspaceÚupscaleÚcropÚcropboxÚroundedÚpaddingÚpadding_color))ÚprogressiveÚTHUMBNAIL_PROGRESSIVE)ÚorientationÚTHUMBNAIL_ORIENTATION)ÚblurÚTHUMBNAIL_BLURc                 C   s   t j |j¡d  ¡ S )Né   )ÚosÚpathÚsplitextÚnameÚlower)ÚselfÚsource© r+   úX/var/www/hoanhtaovolam_webdjango/env/lib/python3.10/site-packages/sorl/thumbnail/base.pyÚfile_extension.   s   zThumbnailBackend.file_extensionc                 C   s\   |   |¡}|dks|dkrdS |dkrdS |dkrdS |dkr!d	S d
dlm} t|dtjƒS )Nz.jpgz.jpegr   z.pngr   z.gifr   z.webpr   r   r   ÚTHUMBNAIL_FORMAT)r-   Údjango.confr   ÚgetattrÚdefault_settingsr.   )r)   r*   r-   r   r+   r+   r,   Ú_get_format1   s   
zThumbnailBackend._get_formatc              
   K   sÂ  t  d||¡ |rt|ƒ}ntdƒ‚tjr| d|  |¡¡ | j 	¡ D ]
\}}| ||¡ q#| j
D ]\}}tt|ƒ}|tt|ƒkrG| ||¡ q1|  |||¡}t|tjƒ}	tj |	¡}
|
r_|
S tjsf|	 ¡ sÒztj |¡}W n- ty› } z!t  |¡ tjrˆt|ƒW  Y d}~S t  d||¡ |	W  Y d}~S d}~ww tj |¡}||d< tj |¡}| |¡ z|  ||||	¡ |  ||||	j ¡ W tj !|¡ ntj !|¡ w tj "|¡ tj #|	|¡ |	S )zÈ
        Returns thumbnail as an ImageFile instance for file with geometry and
        options given. First it will try to get it from the key value store,
        secondly it will create it.
        z'Getting thumbnail for file [%s] at [%s]z(falsey file_ argument in get_thumbnail()r   Nz'Remote file [%s] at [%s] does not existÚ
image_info)$ÚloggerÚdebugr	   Ú
ValueErrorr   ÚTHUMBNAIL_PRESERVE_FORMATÚ
setdefaultr2   Údefault_optionsÚitemsÚextra_optionsr0   r1   Ú_get_thumbnail_filenamer   ÚstorageÚkvstoreÚgetÚTHUMBNAIL_FORCE_OVERWRITEÚexistsÚengineÚ	get_imageÚ	ExceptionÚ	exceptionÚTHUMBNAIL_DUMMYr   ÚwarningÚget_image_infoÚget_image_sizeÚset_sizeÚ_create_thumbnailÚ_create_alternative_resolutionsr'   ÚcleanupÚ
get_or_setÚset)r)   Úfile_Úgeometry_stringÚoptionsr*   ÚkeyÚvalueÚattrr'   Ú	thumbnailÚcachedÚsource_imageÚer3   Úsizer+   r+   r,   Úget_thumbnailA   s^   

€
þ€ô

ÿÿzThumbnailBackend.get_thumbnailTc                 C   s$   t |ƒ}|r
| ¡  tj |¡ dS )zg
        Deletes file_ references in Key Value store and optionally the file_
        it self.
        N)r	   Údeleter   r>   )r)   rP   Údelete_fileÚ
image_filer+   r+   r,   r\   Œ   s   zThumbnailBackend.deletec           	      C   sd   t  d|j||¡ tj ||¡}t||ƒ}tj |||¡}tj |||¡ tj 	|¡}| 
|¡ dS )z?
        Creates the thumbnail by using default.engine
        z.Creating thumbnail file [%s] at [%s] with [%s]N)r4   r5   r'   r   rB   Úget_image_ratior
   ÚcreateÚwriterI   rJ   )	r)   rX   rQ   rR   rV   ÚratioÚgeometryÚimagerZ   r+   r+   r,   rK   –   s   ÿ
z"ThumbnailBackend._create_thumbnailc                 C   s,  t j ||¡}t||ƒ}tj |¡\}}tjD ]|}	t	|d |	 ƒt	|d |	 ƒf}
| 
¡ }d|v rht|d tƒrh|d  d¡}tt|ƒƒD ]}t d|| ¡}|r`dt	t	| d¡ƒ|	 ƒ ||< qEd |¡|d< t j ||
|¡}d|d|	 |d	œ }t|t jƒ}t j |||¡ t j |¡}| |¡ qd
S )zˆ
        Creates the thumbnail by using default.engine with multiple output
        sizes.  Appends @<ratio>x to the file name.
        r   r#   r   ú z(\d+)pxz%spxz#%(file_name)s%(suffix)s%(file_ext)sz@%sx)Ú	file_nameÚsuffixÚfile_extN)r   rB   r_   r
   r$   r%   r&   r   Ú!THUMBNAIL_ALTERNATIVE_RESOLUTIONSÚintÚcopyÚ
isinstanceÚstrÚsplitÚrangeÚlenÚreÚmatchÚgroupÚjoinr`   r	   r=   ra   rI   rJ   )r)   rX   rQ   rR   r'   rb   rc   rf   Údot_file_extÚ
resolutionÚresolution_geometryÚresolution_optionsr   ÚiÚsrd   Úthumbnail_namerV   rZ   r+   r+   r,   rL   ¥   s2   

 €ýìz0ThumbnailBackend._create_alternative_resolutionsc                 C   sH   t |j|t|ƒƒ}d|dd… |dd… |f }dtj|t|d  f S )z4
        Computes the destination filename.
        z%s/%s/%sNé   é   z%s%s.%sr   )r   rS   r   r   ÚTHUMBNAIL_PREFIXÚ
EXTENSIONS)r)   r*   rQ   rR   rS   r%   r+   r+   r,   r<   Å   s   z(ThumbnailBackend._get_thumbnail_filename)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r.   ÚTHUMBNAIL_QUALITYÚTHUMBNAIL_COLORSPACEÚTHUMBNAIL_UPSCALEÚTHUMBNAIL_PADDINGÚTHUMBNAIL_PADDING_COLORr9   r;   r-   r2   r[   r\   rK   rL   r<   r+   r+   r+   r,   r      s(    ÷
K
 r   )Úloggingr$   rq   Úsorl.thumbnailr   Úsorl.thumbnail.confr   r1   r   Úsorl.thumbnail.helpersr   r   Úsorl.thumbnail.imagesr   r	   Úsorl.thumbnail.parsersr
   Ú	getLoggerr€   r4   r   r   r+   r+   r+   r,   Ú<module>   s     
ü