Ë
    AjÍ  ã                   ój  — d Z ddlmZ ddlmZmZmZmZmZm	Z	 ddl
mZm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mZmZ dd	lmZ dd
lmZ  e«       Zdee   dee   defd„Z ej<                  d«      Zdedee   defd„Z ejC                  d«       edd¬«       eddd¬«       ed«       ed«       ee«      fde"de"dee   dee   def
d„«       Z#ejC                  d «       ee«      fd!edefd"„«       Z$ejK                  d «       ee«      fd!edefd#„«       Z&ejC                  d$«       ed«       ee«      fd!edee   defd%„«       Z'ejC                  d&«       ed«       e	d«      fd!ed'edee   dee   fd(„«       Z(ejC                  d)«       ed«       e	d«      fd!edee   dee   fd*„«       Z)y)+uˆ   
Generated Videos â€“ list, detail, download, delete.
Download uses the Authorization header (passed as query param for browser links).
é    )ÚOptional)Ú	APIRouterÚDependsÚQueryÚHTTPExceptionÚRequestÚHeader)ÚFileResponseÚStreamingResponseN)Úrequire_auth)Úvideos_store)ÚokÚerr)Úcfg)Úverify_tokenÚtokenÚauthorizationÚreturnc                 óª   — | }|s6|r4|j                  «       j                  d«      r|j                  dd«      d   }|st        dd¬«      ‚t	        |«      S )z¦
    Validate auth for media endpoints used directly by <video>/<img> tags, which
    cannot send an Authorization header. Accepts ?token=<jwt> OR Bearer header.
    zbearer Ú é   i‘  zMissing token©Ústatus_codeÚdetail)ÚlowerÚ
startswithÚsplitr   r   )r   r   Úraws      úi/Users/priyanka/Documents/AI_Agent_Assessment/ai-video-generator-gols-v2-new/backend/app/routes/videos.pyÚ_auth_from_query_or_headerr       sV   € ð
 €CÙ‘= ]×%8Ñ%8Ó%:×%EÑ%EÀiÔ%PØ×!Ñ! # qÓ)¨!Ñ,ˆÙÜ¨°OÔDÐDÜ˜ÓÐó    zbytes=(\d*)-(\d*)ÚpathÚrange_headerÚ
media_typec                 ó  ‡ ‡‡— t         j                  j                  ‰ «      }d|dz
  cŠ}d}d|ddœ}|r¢t        j	                  |«      }|r‹|j                  d«      |j                  d«      }	}|rt        |«      Š|	rt        |	«      }|dk(  r|	rt        d|t        |	«      z
  «      Š|dz
  }t        d‰«      Št        ||dz
  «      }d	}d
‰› d|› d|› �|d<   |‰z
  dz   Št        ‰«      |d<   dˆˆ ˆfd„	}
t         |
«       |||¬«      S )zGReturn a StreamingResponse honoring an HTTP Range request (seek/scrub).r   r   éÈ   Úbyteszno-cache)zAccept-RangeszContent-TypezCache-Controlé   Ú éÎ   zbytes Ú-Ú/zContent-RangezContent-Lengthc              3   óì   •K  — ‰}t        ‰d«      5 }|j                  ‰«       |dkD  r6|j                  t        | |«      «      }|sn|t	        |«      z  }|–— |dkD  rŒ6d d d «       y # 1 sw Y   y xY w­w)NÚrbr   )ÚopenÚseekÚreadÚminÚlen)ÚchunkÚ	remainingÚfÚdataÚlengthr"   Ústarts       €€€r   Ú_iterz_ranged_file.<locals>._iterB   sl   øè ø€ Øˆ	Ü�$˜Ô Ø�F‰F�5ŒMØ˜a’-Ø—v‘vœc %¨Ó3Ó4�ÙØØœS ›YÑ&�	Ø’
ð ˜a“-÷ ×Ñüs   ƒA4’AA(Á	A4Á(A1Á-A4)r   Úheadersr$   )i   )Úosr"   ÚgetsizeÚ	_RANGE_REÚmatchÚgroupÚintÚmaxr2   Ústrr   )r"   r#   r$   Ú	file_sizeÚendr   r;   ÚmÚg1Úg2r:   r8   r9   s   `          @@r   Ú_ranged_filerI   $   s!  ú€ ä—‘—‘ Ó%€IØ�I ‘M€J€Eˆ3Ø€Kà Ø"Ø#ñ€Gñ Ü�O‰O˜LÓ)ˆÙØ—W‘W˜Q“Z §¡¨£�ˆBÙÜ˜B›�ÙÜ˜"“g�Ø�RŠx™BÜ˜A˜y¬3¨r«7Ñ2Ó3�Ø !‘m�Ü˜˜5“MˆEÜ�c˜9 q™=Ó)ˆCØˆKØ)/°¨w°a¸°u¸A¸i¸[Ð'IˆG�OÑ$à�5‰[˜1‰_€FÜ # F£€GÐÑ÷	ô ™U›W°+Ø%,¸ôEð Er!   r,   r   )Úgeé   éd   )rJ   ÚleÚpageÚper_pageÚsearchÚstatusÚ_c              ƒ   ób   K  — t        j                  |rd|ind |dg| |¬«      }t        |«      S ­w)NrQ   Útitle)ÚfiltersrP   Úsearch_fieldsrN   rO   )r   Úlistr   )rN   rO   rP   rQ   rR   Úresults         r   Úlist_videosrY   Q   s<   è ø€ ô ×ÑÙ&,�˜6Ñ"°$Ø g YØ˜Hô€Fô
 ˆf‹:Ðùs   ‚-/z/{vid}Úvidc              ƒ   óf   K  — t        j                  | «      }|rt        |«      S t        dd«      S ­w)Nú	Not foundé”  )r   Úgetr   r   )rZ   rR   Úvs      r   Ú	get_videor`   a   s.   è ø€ ä×Ñ˜Ó€AÙŒ2ˆa‹5Ð0œ3˜{¨CÓ0Ð0ùs   ‚/1c              ƒ   ó®  K  — t        j                  | «      }|st        dd«      S t        j                  j                  t        j                  |j                  dd«      «      }t        j                  j                  |«      r	 t        j                  |«       t        j                  | «      rt        d d«      S t        dd«      S # t        $ r Y Œ8w xY w­w)Nr\   r]   Úfilenamer)   ÚDeleted)r   r^   r   r<   r"   Újoinr   Ú
OUTPUT_DIRÚexistsÚremoveÚ	ExceptionÚdeleter   )rZ   rR   r_   Ú	file_paths       r   Údelete_videork   g   s¦   è ø€ ä×Ñ˜Ó€AÙÜ�; Ó$Ð$ä—‘—‘œSŸ^™^¨Q¯U©U°:¸rÓ-BÓC€IÜ	‡w�w‡~�~�iÔ ð	Ü�I‰I�iÔ ô #/×"5Ñ"5°cÔ":Œ2ˆd�IÓÐUÄÀKÐQTÓ@UÐUøô ò 	Ùð	üs*   ‚BCÂC Â-CÃ	CÃCÃCÃCz/{vid}/downloadc           	   ƒ   óX  K  — t        j                  | «      }|st        dd¬«      ‚|j                  dd«      }t        j                  j                  t        j                  |«      }|rt        j                  j                  |«      st        dd¬«      ‚t        |d|dd	|› d
�i¬«      S ­w)zx
    Download the generated MP4.
    Auth via Bearer header OR ?token=<jwt> query param (for direct browser links).
    r]   úVideo not foundr   rb   r)   úVideo file not found on diskú	video/mp4zContent-Dispositionzattachment; filename="Ú")r"   r$   rb   r;   )
r   r^   r   r<   r"   rd   r   re   rf   r
   )rZ   r   rR   r_   rb   rj   s         r   Údownloadrq   v   s™   è ø€ ô 	×Ñ˜Ó€AÙÜ¨Ð4EÔFÐFà�u‰u�Z Ó$€HÜ—‘—‘œSŸ^™^¨XÓ6€Iáœ2Ÿ7™7Ÿ>™>¨)Ô4Ü¨Ð4RÔSÐSäØØØØ&Ð*@ÀÀ
È!Ð(LÐMô	ð ùs   ‚B(B*z/{vid}/streamÚrequestc              ƒ   óŠ  K  — t        ||«       t        j                  | «      }|st        dd¬«      ‚t        j
                  j                  t        j                  |j                  dd«      «      }t        j
                  j                  |«      st        dd¬«      ‚t        ||j                  j                  d«      d«      S ­w)	z�
    Stream the MP4 with HTTP Range support so the in-app player can play,
    pause, scrub and replay without downloading the whole file.
    r]   rm   r   rb   r)   rn   Úrangero   )r    r   r^   r   r<   r"   rd   r   re   rf   rI   r;   )rZ   rr   r   r   r_   rj   s         r   Ústreamru   ’   s’   è ø€ ô ˜u mÔ4Ü×Ñ˜Ó€AÙÜ¨Ð4EÔFÐFÜ—‘—‘œSŸ^™^¨Q¯U©U°:¸rÓ-BÓC€IÜ�7‰7�>‰>˜)Ô$Ü¨Ð4RÔSÐSÜ˜	 7§?¡?×#6Ñ#6°wÓ#?ÀÓMÐMùs   ‚CCz/{vid}/thumbnailc              ƒ   ó¬  K  — t        ||«       t        j                  | «      }|st        dd¬«      ‚|j                  d«      }|st        dd¬«      ‚t        j
                  j                  t        j                  |«      }t        j
                  j                  |«      st        dd¬«      ‚t        |t        j                  |«      d   xs d¬	«      S ­w)
z;Return the auto-generated poster frame (JPG) for the video.r]   rm   r   Ú	thumbnailzNo thumbnailzThumbnail file not foundr   z
image/jpeg)r$   )r    r   r^   r   r<   r"   rd   r   re   rf   r
   Ú	mimetypesÚ
guess_type)rZ   r   r   r_   ÚthumbÚ
thumb_paths         r   rw   rw   §   s«   è ø€ ô ˜u mÔ4Ü×Ñ˜Ó€AÙÜ¨Ð4EÔFÐFØ�E‰E�+Ó€EÙÜ¨°NÔCÐCÜ—‘—‘œcŸn™n¨eÓ4€JÜ�7‰7�>‰>˜*Ô%Ü¨Ð4NÔOÐOÜ˜
¬y×/CÑ/CÀJÓ/OÐPQÑ/RÒ/bÐVbÔcÐcùs   ‚CC)*Ú__doc__Útypingr   Úfastapir   r   r   r   r   r	   Úfastapi.responsesr
   r   r<   Úrerx   Úapp.middleware.authr   Úapp.repository.storer   Úapp.utils.responser   r   Ú
app.configr   Úapp.utils.jwtr   ÚrouterrC   r    Úcompiler>   rI   r^   rA   rY   r`   ri   rk   rq   ru   rw   © r!   r   Ú<module>r‰      sx  ðñõ ß M× Mß =Û 	Û 	Û Ý ,Ý -ß &Ý Ý &á	‹€ð
 h¨s¡mð 
ÀHÈSÁMð 
ÐVYó 
ð ˆB�J‰JÐ+Ó,€	ð*E�sð *E¨(°3©-ð *EÀSó *EðZ ‡�ˆCƒá�a˜A”Ù˜"  sÔ+Ù! $›KÙ! $›KÙ�\Ó"ñØ
ðàðð �S‰Mðð �S‰Mð	ð
 òó ðð ‡�ˆHÓÙ'.¨|Ó'<ñ 1˜ð 1 ò 1ó ð1ð
 ‡�ˆxÓÙ*1°,Ó*?ñ V˜Cð V Cò Vó ðVð ‡�ÐÓñ ! ›;Ù�\Ó"ñØ	ðà�C‰=ðð òó ðð6 ‡�ˆOÓñ ! ›;Ù#)¨$£<ñ	NØ	ðNàðNð �C‰=ðNð ˜C‘=ò	Nó ðNð( ‡�ÐÓñ ! ›;Ù#)¨$£<ñdØ	ðdà�C‰=ðdð ˜C‘=òdó  ñdr!   