ó
    Ò½Íj	  ã                   óº   • S 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	  \
" 1 Sk5      r\" SS	S
/5      rS\S\S\4S jrS\S\4S jrSS\S\4S jjrS	\SS4S jrg)z½File handling for video uploads: client-supplied names are never used as paths, and every file
the app opens for TikTok lives directly inside a configured folder under a server-chosen name.é    N)Ú
namedtuple)Úuuid4)Úsecure_filename)ÚValidationError>   ú.movú.mp4ú.webmÚStoredUploadÚpathÚoriginal_nameÚfolderÚnameÚreturnc                 ó  • [         R                  R                  U 5      n[         R                  R                  [         R                  R                  X!5      5      n[         R                  R	                  U5      U:w  a  [        S5      eU$ )zZReturn the real path of `name` inside `folder`, refusing anything that resolves elsewhere.z%file name resolves outside its folder)Úosr   ÚrealpathÚjoinÚdirnamer   )r   r   Úrootr   s       ÚFF:\Solutions\Thinkera\Publishers\TikTokManager\app\services\uploads.pyÚ_confined_pathr      s]   € ä�7‰7×Ñ˜FÓ#€DÜ�7‰7×ÑœBŸG™GŸL™L¨Ó4Ó5€DÜ	‡w�w‡��tÓ Ó$ÜÐEÓFÐFØ€Kó    c                 ó  • [        U [        5      (       a  U (       d  [        S5      e[        R                  R                  U 5      S   R                  5       nUb+  X!;  a&  [        SSR                  [        U5      5      -   5      eU$ )z^Return the lower-case extension of `name`; raises ValidationError when it is not in `allowed`.zfile name is requiredé   z'file type not allowed; expected one of z, )	Ú
isinstanceÚstrr   r   r   ÚsplitextÚlowerr   Úsorted)r   ÚallowedÚexts      r   Ú_checked_extensionr"      sp   € ä�dœC× Ñ ®ÜÐ5Ó6Ð6Ü
�'‰'×
Ñ
˜4Ó
  Ñ
#×
)Ñ
)Ó
+€CØÑ˜sÓ1ÜÐGÈ$Ï)É)ÔTZÐ[bÓTcÓJdÑdÓeÐeØ€Jr   c                 ó„  • [        U R                  U5      n[        U R                  5      n[        R                  " USS9  [        5       R                  U-   n[        X5      nU R                  U5        Ub9  [        R                  R                  U5      U:”  a  [        U5        [        S5      e[        Xu=(       d    US9$ )z¨Save a client file under a server-generated uuid name inside `folder`; raises
ValidationError for a bad name/extension/size. The caller decides when to remove the file.T)Úexist_okz$file is larger than the allowed size)r   r   )r"   Úfilenamer   r   Úmakedirsr   Úhexr   Úsaver   ÚgetsizeÚremove_quietlyr   r
   )Úfiler   Úallowed_extensionsÚ	max_bytesr!   r   Ústored_namer   s           r   Ústore_uploadr/   #   s”   € ô ˜TŸ]™]Ð,>Ó
?€CÜ# D§M¡MÓ2€MÜ‡K‚K� Ò&Ü“'—+‘+ Ñ#€KÜ˜&Ó.€DØ‡I�Iˆd„OØÑ¤§¡§¡°Ó!6¸Ó!BÜ�tÔÜÐDÓEÐEÜ˜T×1MÀ+ÑNÐNr   c                 óR   •  [         R                  " U 5        g! [         a     gf = f)zPDelete a file, swallowing every error: cleanup must never mask the real failure.N)r   ÚremoveÚOSError)r   s    r   r*   r*   2   s$   € ðÜ
�	Š	�$�øÜó Ùðús   ‚ ™
&¥&)NN)Ú__doc__r   Úcollectionsr   Úuuidr   Úwerkzeug.utilsr   Úapp.services.errorsr   Ú	frozensetÚVIDEO_EXTENSIONSr
   r   r   Úobjectr"   r/   r*   © r   r   Ú<module>r<      sŽ   ðñbã 	Ý "Ý å *å /áÒ6Ó7Ð á˜.¨6°?Ð*CÓD€ð˜3ð  cð ¨cô ð˜Vð °ô ñO˜sð OÐP\õ Oð˜ð  õ r   