ó
    æÌjU)  ã                   óÌ  • S r SSKrSSKrSSKJr  SSKJr  SSKJr  SSK	J
r
JrJrJr  SSKJr  SSKJrJr  SS	KJrJr  SS
KJr  \R0                  " \5      rSSS.rS\S\4S jrS\S\S\S\\   4S jrS\S\S\ 4S jr!S,S\S\S\S\4S jjr"S\S\S\#S\S\4
S jr$S\S\S\4S jr%S\S\4S jr&S\S\#S\S\4S jr'S\S\S\#S\S\4
S jr(Sr)S\S \S\S\S\4
S! jr*S\S \S\S\S\#S\S\\   4S" jr+S\S\S\4S# jr,S\S\S\#S\S\4
S$ jr-S\#4S% jr.S&\
R                  S\
R                  4S' jr/S,S(\S\S\\   4S) jjr0S,S\S\S\S\S\\   4
S* jjr1S\S\S\2\    4S+ jr3g)-uI  
media_service.py â€” acceso seguro a las fotos de las familias.

Antes de pagar, el navegador solo recibe una vista previa reducida, servida por una URL firmada con
caducidad. Los originales nunca se exponen como archivos estÃ¡ticos: se descargan Ãºnicamente con un
enlace firmado ligado a un pedido pagado (ver main.py::download_original).

La vista previa es, por orden de preferencia:
  1. La foto con las CARAS PROTEGIDAS en servidor (StoryFace KIS), si el colegio lo tiene activado
     (`protection_service`, mismo mecanismo que hec-photo-app).
  2. Un respaldo propio: versiÃ³n reducida con marca de agua. Se usa si la protecciÃ³n de caras estÃ¡
     apagada o si KIS falla â€” a diferencia de HEC, nunca se cae al original sin proteger.
Encima, el navegador puede dibujar el overlay animado (lens/puzzle) que estropea las capturas.
é    N)ÚPath)ÚOptional)Úquote)ÚImageÚ	ImageDrawÚ	ImageFontÚImageOps)Úconfig)ÚsignÚverify_signature)Úphoto_serviceÚprotection_service)ÚCODE_REiè  ià  )ÚfullÚthumbÚcodeÚreturnc                 óR   • [        [        R                  " U =(       d    S5      5      $ )NÚ )Úboolr   Úmatch)r   s    ÚYD:\Ingenieria\TRABAJOS ONLINE\Projects\11- Photo School\backend\services\media_service.pyÚ
valid_coder   !   s   € Ü”—’˜dŸj bÓ)Ó*Ð*ó    Ú	school_idÚfilenamec                 óR   • [        U5      (       d  g[        R                  " XU5      $ )uk   Ruta absoluta del original, o None si el cÃ³digo/archivo es sospechoso (../, absoluto, oculto) o no existe.N)r   r   Ú
find_photo)r   r   r   s      r   Úsafe_photo_pathr   %   s#   € ä�d×ÑØÜ×#Ò# I°XÓ>Ð>r   c                 óz  • S0 0n[         R                  " X5       H‹  u  p4US-  nUR                  5       (       d  M!   [        R                  " UR                  SS95      nUS   R                  UR                  S0 5      5        UR                  SUR                  SS5      5        M�     U$ ! [         a     Mž  f = f)ua   meta.json de la familia (nombre del niÃ±o, etiquetas de fotos IA), fusionando todas sus carpetas.Úphoto_namesz	meta.jsonzutf-8)ÚencodingÚ
child_namer   )
r   Úfamily_dirsÚis_fileÚjsonÚloadsÚ	read_textÚ	ExceptionÚupdateÚgetÚ
setdefault)r   r   ÚmergedÚ_phÚfolderÚfÚdatas          r   Ú	read_metar2   ,   s­   € à! 2Ð&€FÜ$×0Ò0°ÖA‰ˆØ�[Ñ ˆØ�9‰9�;‹;ðÜ—z’z !§+¡+°w +Ð"?Ó@�ð �=Ñ!×(Ñ(¨¯©°-ÀÓ)DÔEØ×Ñ˜l¨D¯H©H°\À2Ó,FÖGñ Bð €Møô	 ó Úðús   ½#B,Â,
B:Â9B:Úsizec           
      óz   • [        SU  SU 3[        R                  5      u  p4SU  S[        U5       SU SU SU 3
$ )Núpreview:Ú/z/api/media/preview/ú?exp=ú&sig=z&size=)r   r
   ÚMEDIA_URL_TTL_SECSr   )r   r   r3   ÚexpÚsigs        r   Úpreview_urlr<   =   sO   € Ü�h˜t˜f A h ZÐ0´&×2KÑ2KÓL�H€CØ    a¬¨h«Ð'8¸¸c¸UÀ%ÈÀuÈFÐSWÐRXÐYÐYr   r:   r;   c                 ó&   • [        SU  SU 3X#5      $ )Nr5   r6   ©r   )r   r   r:   r;   s       r   Úcheck_preview_signaturer?   B   s   € Ü˜h t f¨A¨h¨ZÐ8¸#ÓCÐCr   Úorder_idc                 ót   • [        SU  SU 3[        R                  5      u  p#SU  S[        U5       SU SU 3$ )Nú	download:r6   z/api/portal/download/r7   r8   )r   r
   ÚDOWNLOAD_URL_TTL_SECSr   ©r@   r   r:   r;   s       r   Údownload_urlrE   F   sG   € Ü�i ˜z¨¨8¨*Ð5´v×7SÑ7SÓT�H€CØ" 8 *¨A¬e°H«oÐ->¸eÀCÀ5ÈÈcÈUÐSÐSr   c                 óV   • [        SU  3[        R                  5      u  pSU  SU SU 3$ )Núdownloadzip:z/api/portal/download-zip/r7   r8   )r   r
   rC   ©r@   r:   r;   s      r   Údownload_zip_urlrI   K   s6   € Ü�l 8 *Ð-¬v×/KÑ/KÓL�H€CØ& x j°°c°U¸%À¸uÐEÐEr   c                 ó    • [        SU  3X5      $ )NrG   r>   rH   s      r   Úcheck_download_zip_signaturerK   P   s   € Ü˜l¨8¨*Ð5°sÓ@Ð@r   c                 ó&   • [        SU  SU 3X#5      $ )NrB   r6   r>   rD   s       r   Úcheck_download_signaturerM   T   s   € Ü˜i¨ z°°8°*Ð=¸sÓHÐHr   i,  Úphotographerc                 ó‚   • [        SU  SU SU SU 3S5      u  pESU  S[        U5       SU S[        U5       SU SU 3$ )Núadmin:r6   é  z/api/media/admin-thumb/r7   r8   )r   r   )r   rN   r   r   r:   r;   s         r   Úadmin_thumb_urlrR   _   se   € Ü�f˜Y˜K q¨¨°a¸°v¸Q¸x¸jÐIÈ4ÓP�H€CØ% i [°´%¸Ó2EÐ1FÀaÈÀvÈQÌuÐU]ËÐN_Ø�C�5˜˜c˜Uð$ð %r   c           
      ó¦  • [        SU  SU SU SU 3XE5      (       d  gXX#4 H.  nU(       a$  UR                  S5      (       d  SU;   d  SU;   d  M.    g   [        R                  " U 5      nXq-  U-  U-  nUS:X  d0  UR	                  5       (       a  [        R
                  " U5      (       d  g UR                  5       R                  UR                  5       5        [        R                  " US[         S35      n	 U	R                  5       (       a8  U	R                  5       R                  UR                  5       R                  :¼  a  U	$ U	R                  R                  S	S	S
9  [         R"                  " U5       n
[$        R&                  " U
5      n
U
R)                  [        [        4[         R*                  5        U	R-                  S5      nU
R/                  S5      R1                  USSS9  UR3                  U	5        SSS5        U	$ ! [         a     gf = f! , (       d  f       U	$ = f! [4         a   n[6        R9                  SXŒ5         SnAgSnAff = f)z`Miniatura del original (o None si la firma no vale o la ruta se sale de la carpeta del colegio).rP   r6   NÚ.Ú\r   z.adm.ú.webpT©ÚparentsÚexist_okú.tmpÚRGBÚWEBPéK   ©ÚformatÚqualityz#Miniatura de admin imposible %s: %s)r   Ú
startswithr   Úschool_rootr%   Úis_imageÚresolveÚrelative_toÚ
ValueErrorÚmirror_pathÚADMIN_THUMB_PXÚexistsÚstatÚst_mtimeÚparentÚmkdirr   Úopenr	   Úexif_transposeÚ	thumbnailÚLANCZOSÚwith_suffixÚconvertÚsaveÚreplacer)   ÚloggerÚwarning)r   rN   r   r   r:   r;   ÚpartÚbaseÚsrcÚdstÚimÚtmpÚexcs                r   Úadmin_thumb_pathr   e   sè  € ä˜f Y K¨q°°¸aÀ¸vÀQÀxÀjÐQÐSV×\Ñ\ØØ¨$Ó9ˆÞ�t—‘ s×+Ñ+¨s°d«{¸dÀd½lÙñ :ô ×$Ò$ YÓ/€DØ
Ñ
 Ñ
$ xÑ
/€CØ�rÓ §¡§¡´m×6LÒ6LÈX×6VÑ6VØðØ�‰‹×!Ñ! $§,¡,£.Ô1ô ×
#Ò
# C¨5´Ð0@ÀÐ)FÓ
G€CðØ�:‰:�<‰<˜CŸH™H›J×/Ñ/°3·8±8³:×3FÑ3FÓFØˆJØ�
‰
×Ñ °ÐÑ5Ü�ZŠZ˜Œ_ Ü×(Ò(¨Ó,ˆBØ�L‰Lœ.¬.Ð9¼5¿=¹=ÔIØ—/‘/ &Ó)ˆCØ�J‰J�uÓ×"Ñ" 3¨v¸rÐ"ÑBØ�K‰K˜Ô÷ ð ˆ
øô ó Ùðú÷ Œ_ð ˆ
ûÜó Ü�‰Ð<¸cÔGÜûðúsP   Â--H Ã:AH& Å0H& Å7BHÇ:	H& È
HÈHÈ
H#ÈH& È#H& È&
IÈ0IÉIc                 óF   • [        SU  SU 3S5      u  p#SU  SU SU SU 3$ )Núcard:r6   rQ   z/api/media/card/z	.png?exp=r8   )r   ©r   r   r:   r;   s       r   Úcard_urlrƒ   ‰   s<   € Ü�e˜I˜; a¨ vÐ.°Ó5�H€CØ˜i˜[¨¨$¨¨y¸¸¸UÀ3À%ÐHÐHr   c                 ó&   • [        SU  SU 3X#5      $ )Nr�   r6   r>   r‚   s       r   Úcheck_card_signaturer…   Ž   s   € Ü˜e I ;¨a°¨vÐ6¸ÓAÐAr   c                 óv   •  [         R                  " U S9$ ! [         a    [         R                  " 5       s $ f = f)N©r3   )r   Úload_defaultÚ	TypeErrorr‡   s    r   Ú_fontrŠ   ”   s6   € ð(Ü×%Ò%¨4Ñ0Ð0øÜó (Ü×%Ò%Ó'Ò'ð(ús   ‚ –8·8Úimgc           	      ó(  • U R                  S5      n U R                  u  p[        SUS-  5      n[        U5      n[        R
                  n[        R                  " SUS-  US-  4S5      n[        R                  " U5      n[        UR                  XTS95      =(       d    US-  nXƒS-  -   US-  p©S	u  p¼X²S-  :  a`  U	S-  * US-  -  nXÑS-  :  a9  UR                  US-   US-   4XTS
S9  UR                  XÛ4XTSS9  XÙ-  nXÑS-  :  a  M9  Xº-  nUS-  nX²S-  :  a  M`  UR                  S[        R                  S9nUR                  U-
  S-  UR                   U-
  S-  pþU R#                  UR%                  XïXá-   Xò-   45      5        U R                  S5      $ )NÚRGBAé   é   é   )r   r   r   r   )Úfonté   é   )r   r   )r   r   r   éF   )r‘   Úfill)éÿ   r–   r–   éx   é   é   )Úresampler[   )rs   r3   ÚmaxrŠ   r
   ÚWATERMARK_TEXTr   Únewr   ÚDrawÚintÚ
textlengthÚtextÚrotateÚBICUBICÚwidthÚheightÚalpha_compositeÚcrop)r‹   ÚwÚhr3   r‘   r¡   ÚlayerÚdrawÚtwÚstep_xÚstep_yÚyÚrowÚxÚleftÚtops                   r   Ú
_watermarkr´   ›   s”  € Ø
�+‰+�fÓ
€CØ�8‰8�D€AÜˆr�1˜‘7Ó€DÜ�‹;€DÜ× Ñ €DÜ�IŠI�f˜q 1™u a¨!¡e˜n¨lÓ;€EÜ�>Š>˜%Ó €DÜ	ˆT�_‰_˜Tˆ_Ð-Ó	.×	:°$¸±(€BØ ™(‘] D¨1¡HˆFØ�F€AØ
�!‰e‹)Ø˜‰kˆN˜c A™gÑ&ˆØ�a‘%‹iØ�I‰I�q˜1‘u˜a !™e�n d¸MˆIÑJØ�I‰I�q�f˜dÐ4HˆIÑIØ‰KˆAð �a‘%�ið 	
‰ˆØˆq‰ˆð �!‰e�)ð �L‰L˜¤e§m¡mˆLÐ4€EØ—‘˜q‘ QÑ&¨¯©¸Ñ)9¸aÑ(?ˆ#Ø×Ñ˜Ÿ
™
 D¨t©x¸¹Ð#AÓBÔCØ�;‰;�uÓÐr   rz   c                 óê  • [         R                  U[         S   5      n[        R                  " U SU S35      n UR	                  5       (       a8  UR                  5       R                  U R                  5       R                  :¼  a  U$ UR                  R                  SSS9  [        R                  " U 5       n[        R                  " U5      nUR                  X"4[        R                  5        [        U5      nSSS5        UR!                  S5      nWR#                  USS	S
9  UR%                  U5        U$ ! , (       d  f       NC= f! [&         a   n[(        R+                  SX5         SnAgSnAff = f)zFGenera (una vez) la vista previa con marca de agua y devuelve su ruta.r   z.wm.rV   TrW   NrZ   r\   r”   r^   zVista previa imposible %s: %s)Ú
PREVIEW_PXr+   r   rg   ri   rj   rk   rl   rm   r   rn   r	   ro   rp   rq   r´   rr   rt   ru   r)   rv   rw   )rz   r3   Úpxr{   r|   Úoutr}   r~   s           r   Úwatermark_previewr¹   ´   s  € ä	�‰˜œj¨Ñ0Ó	1€BÜ
×
#Ò
# C¨4°¨t°5Ð)9Ó
:€CðØ�:‰:�<‰<˜CŸH™H›J×/Ñ/°3·8±8³:×3FÑ3FÓFØˆJØ�
‰
×Ñ °ÐÑ5Ü�ZŠZ˜Œ_ Ü×(Ò(¨Ó,ˆBØ�L‰L˜"˜¤5§=¡=Ô1Ü˜R“.ˆC÷ ð �o‰o˜fÓ%ˆØ�‰�˜V¨RˆÑ0Ø�‰�CÔØˆ
÷ �_ûô ó Ü�‰Ð6¸ÔAÜûðús7   ºAE Â0E Â7AD7Ã:<E Ä7
EÅE Å
E2ÅE-Å-E2c              ƒ   óX  #   • SSK n[        XU5      nUc  g[        R                  U[        S   5      n [        R
                  " XPU5      I Sh  v•N nUb  U$  UR                  [        XS5      I Sh  v•N $  N(! [         a!  n[        R                  SXU5         SnANFSnAff = f N47f)zZVista previa a servir: caras protegidas si procede; si no (o si KIS falla), marca de agua.r   Nr   uV   [%s] ProtecciÃ³n de caras fallida para %s (%s): se sirve el respaldo con marca de agua)Úasyncior   r¶   r+   r   Úprotected_previewr)   rv   rw   Ú	to_threadr¹   )	r   r   r   r3   r»   rz   r·   Ú	protectedr~   s	            r   Úrender_previewr¿   É   s¬   é € ãÜ
˜)¨8Ó
4€CØ
�{ØÜ	�‰˜œj¨Ñ0Ó	1€Bð1Ü,×>Ò>¸sÈrÓR×Rˆ	ØÑ ØÐð !ð
 ×"Ñ"Ô#4°cÓ@×@Ð@ñ Søô ó 1Ü�‰ÐoØ ¨C÷	1ñ 	1ûð1úñ AùsL   ‚2B*µA: ÁA8ÁA: ÁB*Á3B(Á4B*Á8A: Á:
B%ÂB ÂB*Â B%Â%B*c                 ó0  • [        X5      nUR                  SS5      nUR                  S0 5      n/ n[        R                  " X5       HÊ  nUR	                  UR
                  UR                  [        XR                  S5      [        XR                  S5      [        R                  " UR                  5      S:X  a  UR                  UR                  S5      OS[        R                  " U5      [        R                  " UR                  5      S.5        MÌ     U$ )Nr#   r   r!   r   r   Úai)Úidr   ÚurlÚ	thumb_urlr#   rN   Úkind)
r2   r+   r   Úlist_family_filesÚappendÚstemÚnamer<   Ú
photo_kindÚphotographer_of)r   r   Úmetar#   Únamesr¸   r0   s          r   Úlist_family_photosrÎ   Ü   sÔ   € Ü�YÓ%€DØ—‘˜,¨Ó+€JØ�H‰H�] BÓ'€EØ
€CÜ×,Ò,¨YÖ=ˆØ�
‰
Ø—&‘&ØŸ™Ü˜t§V¡V¨VÓ4Ü$ T¯6©6°7Ó;ä3@×3KÒ3KÈAÏFÉFÓ3SÐW[Ó3[˜%Ÿ)™) A§F¡F¨BÔ/ÐacÜ)×9Ò9¸!Ó<Ü!×,Ò,¨Q¯V©VÓ4ñ	
ö 		ñ >ð €Jr   )r   )4Ú__doc__r&   ÚloggingÚpathlibr   Útypingr   Úurllib.parser   ÚPILr   r   r   r	   Úcorer
   Úcore.securityr   r   Úservicesr   r   Úservices.qr_detectr   Ú	getLoggerÚ__name__rv   r¶   Ústrr   r   r   Údictr2   r<   rŸ   r?   rE   rI   rK   rM   rh   rR   r   rƒ   r…   rŠ   r´   r¹   r¿   ÚlistrÎ   © r   r   Ú<module>rß      sÊ  ðñó Û Ý Ý Ý ç 5Ó 5å ß 0ß 6Ý &à	×	Ò	˜8Ó	$€à SÑ)€
ð+�Sð +˜Tô +ð?˜sð ?¨#ð ?¸ð ?ÀÈ$Áô ?ð˜ð  Cð ¨Dô ñ"Z�cð Z Sð Z°ð ZÀõ Zð
D #ð D°ð D¸3ð DÀSð DÈTô DðT˜3ð T¨#ð T°#ô Tð
F˜sð F sô Fð
A¨3ð A°Sð A¸sð AÀtô AðI sð I°cð IÀð IÈ#ð IÐRVô Ið €ð%˜sð %°#ð %¸Sð %ÈCð %ÐTWô %ð ð °3ð ¸cð ÈSð ÐWZð Ðadð ÐiqÐrvÑiwô ðHI˜ð I 3ð I¨3ô Ið
B Cð B¨sð B¸ð BÀ3ð BÈ4ô Bð(�ô (ð�E—K‘Kð  E§K¡Kô ñ2˜4ð  sð ¸À¹õ ñ*A Cð A¨sð A¸cð AÈð AÐZbÐcgÑZhõ Að& #ð ¨Sð °T¸$±Zõ r   