o
    ;j6                      @  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Zd dlm	Z	 d dl
mZ ee	e	ge	f Zdddd7ddZd8ddZd9ddZd:ddZd;ddZd;d d!Zd<d%d&Zd=d(d)Zd>d0d1Zd?d5d6ZdS )@    )annotationsN)Path)Callable	temp_rootheic_converterphoto_pathslist[str | Path]r   str | Path | Noner   HeicConverter | Nonereturn
list[dict]c                  s    fdd| D S )Nc                   s*   g | ]}t t|rtnd  dqS )Nr   )_prepare_one_photo_inputr   ).0pathr   r    D/opt/sixxie/releases/current/services/media_pipeline/photo_inputs.py
<listcomp>   s    z(prepare_photo_inputs.<locals>.<listcomp>r   )r   r   r   r   r   r   prepare_photo_inputs   s   r   r   r   Path | Nonedictc             
   C  s   |   stdt|  |  }t| }t| }d}|}|}|dkrdd}|p0tt	
 d }	|	jddd |	| d }
|pBt}|| |
}|  rS| jdkrWtd	| }t|}t|| t| }| jd
|||||||d	S )Nzphoto file does not existF
image/heicTzai-pet-prepared-inputs)parentsexist_ok.pngr   HEIC conversion failedraw_pet_photo)	name
input_kindsource_mimemimebytessha256source_sha256prepared_sha256	converted)exists
ValueError_validate_raw_photo_path
read_bytes_source_mime_for_pathhashlibr#   	hexdigestr   tempfile
gettempdirmkdir_convert_heic_with_quicklookstatst_size#_validate_prepared_image_is_visibler   )r   r   r   source_bytesr    r$   r&   prepared_bytesprepared_mimerootout_path	converterprepared_pathr%   r   r   r   r      s@   

r   Nonec                 C  s^   | j  }dd | jD }d|v rtdd | jD rtd|ds)|dr-td	d S )
Nc                 S  s   h | ]}|  qS r   )lowerr   partr   r   r   	<setcomp>J   s    z+_validate_raw_photo_path.<locals>.<setcomp>publicc                 s  s    | ]}d |v V  qdS )u   合成样例Nr   r>   r   r   r   	<genexpr>K   s    z+_validate_raw_photo_path.<locals>.<genexpr>z>public synthetic fixture cannot be used as raw pet photo inputzspritesheet.zatlas.zCspritesheet or atlas files are generated assets, not raw pet photos)r   r=   partsanyr(   
startswith)r   
lower_namerC   r   r   r   r)   H   s   
r)   strc                 C  s2   | j  }|dv rdS |dkrdS |dkrdS dS )N>   .heic.heifr   r   	image/pngz.webpz
image/webpz
image/jpeg)suffixr=   )r   rK   r   r   r   r+   Q   s   
r+   source_pathoutput_pathc              	   C  s   t jdddddt|jt| gddddd	}|j| j d
 }|jdkrG| rG| jdkrG||krE| r;|	  t
t|t| |S t| |S )Nqlmanagez-t-s512z-o   TFtimeoutcapture_outputtextcheckr   r   )
subprocessrunrG   parentr   
returncoder'   r2   r3   unlinkshutilmove_convert_heic_with_sips_png)rL   rM   resultgenerated_pathr   r   r   r1   \   s    
r1   c                 C  sZ   t jddddddt| dt|g	dd	d	d
d}|jdks'| r'| jdkr+td|S )NsipsrO   formatpngz-Z1536z--outrQ   TFrR   r   r   )rW   rX   rG   rZ   r'   r2   r3   r(   )rL   rM   r_   r   r   r   r^   n   s    r^   image_bytesr"   
image_mimec                 C  s<   |dkrd S t | }|d dkr|d dkrtdd S d S )NrJ   max_luminance   mean_luminance   z&HEIC conversion produced a blank image)_png_luminance_statsr(   )re   rf   statsr   r   r   r4   {   s   r4   dict[str, float]c           "      C  s  |  ds	tdd}d  } } } }}g }|d t| krrtd| ||d  d }| |d |d  }	| |d |d |  }
|d| 7 }|	dkr[td	|
\}}}}}}}n|	d
kre||
 n|	dkrjn|d t| ksd |||||hv rtd|dvs|dvs|dkrtdddddd}ddddd}t|d }|t| }|t| }|| }t|| }td	|}t
|}d}d}d}d}tt|D ]e}|| }|d7 }t
||||  }||7 }t|||| |}tdt||D ];}|dkr||  } }} n|| }|||  }|||d   } d| d|  d|   }!t||!}||!7 }|d7 }qq||t|d dS )Ns   PNG

z"converted HEIC output is not a PNG      z>I   r   s   IHDRz>IIBBBBBs   IDATs   IENDz)converted HEIC PNG is missing header data>   rn      >   r   rj   rp      z(converted HEIC PNG format is unsupported      rj   )r   rj   rp   rr       g        gz6?g,C?g]m{?)rg   ri   )rE   r(   lenstructunpackappendintzlib
decompressjoin	bytearrayrange_unfilter_png_rowmax)"re   positionwidthheight	bit_depth
color_type	interlace
idat_partslengthkinddata_compression_filterchannels_by_color_typecolor_channels_by_color_typebytes_per_samplechannelscolor_channelsbytes_per_pixelstriderawpreviousoffsetrg   luminance_sumpixel_count_filter_typerowindexredgreenblue	luminancer   r   r   rk      sn   



rk   r   r~   r   r   rz   r   c                 C  s   |dkrd S t t| D ]h}||kr| ||  nd}|| }||kr(|||  nd}|dkr9| | | d@ | |< q|dkrH| | | d@ | |< q|dkr[| | || d  d@ | |< q|dkrn| | t||| d@ | |< qtd| d S )Nr   rs      rj   rt   rp   z1unsupported PNG filter in converted HEIC output: )r   rv   
_png_paethr(   )r   r   r   r   r   leftup
upper_leftr   r   r   r      s    r   r   r   r   c                 C  sT   | | | }t ||  }t || }t || }||kr"||kr"| S ||kr(|S |S )N)abs)r   r   r   estimateleft_distanceup_distanceupper_left_distancer   r   r   r      s   r   )r   r	   r   r
   r   r   r   r   )r   r   r   r   r   r   r   r   )r   r   r   r<   )r   r   r   rG   )rL   r   rM   r   r   r   )re   r"   rf   rG   r   r<   )re   r"   r   rm   )
r   r~   r   r~   r   rz   r   rz   r   r<   )r   rz   r   rz   r   rz   r   rz   )
__future__r   r,   r\   rW   rw   r.   r{   pathlibr   typingr   HeicConverterr   r   r)   r+   r1   r^   r4   rk   r   r   r   r   r   r   <module>   s,    

,
	




;