
    ?jY                        d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
Z
ddlmZmZmZmZmZmZmZ dZdZdd	Ze G d
 d             Z	 	 	 	 	 	 	 	 	 	 ddZddZddZy)z8File download with httpx (async) and Rich progress bars.    )annotationsN)	dataclassfield)Path)	BarColumnDownloadColumnProgressSpinnerColumn
TextColumnTimeRemainingColumnTransferSpeedColumni      c            
         t        t               t        d      t        d      dt	               t               t                     S )z8Create a pre-configured Rich progress bar for downloads.z"[bold blue]{task.fields[filename]}   )	bar_widthz-[progress.percentage]{task.percentage:>3.0f}%)r	   r
   r   r   r   r   r        D/home/ubuntu/.local/lib/python3.12/site-packages/gplaydl/download.pymake_progressr      s:    78B7 r   c                  ^    e Zd ZU dZded<   ded<    ee      Zded<   d	Zded
<   dZ	ded<   y)DownloadSpecz,Everything needed to download a single file.strurlr   dest)default_factoryz
list[dict]cookies labelFboolgzippedN)
__name__
__module____qualname____doc____annotations__r   listr   r   r    r   r   r   r   r   &   s1    6	H
J5GZ5E3OGTr   r   c           
       K   |4 d{    i }| j                   r8| j                   D cg c]  }|d    d|d     }}dj                  |      |d<   | j                  xs | j                  j                  }|j                  d|d      }| j                  r&t        j                  t        j                  d	z        nd}	|j                  d
| j                  |      4 d{   }
|
j                          t        |
j                  j                  dd            }|r|j!                  ||       t#        | j                  d      5 }|
j%                  t&              2 3 d{   }|	r!|j)                  |	j+                  |             n|j)                  |       |j-                  |t/        |             Y7 c c}w 7 7 ^6 |	r#|	j1                         }|r|j)                  |       ddd       n# 1 sw Y   nxY wddd      d{  7   n# 1 d{  7  sw Y   nxY wddd      d{  7   | j                  S # 1 d{  7  sw Y   | j                  S xY ww)z5Stream-download a single file with progress tracking.Nname=valuez; Cookiedownload)filenametotal   GET)headerszContent-Lengthr   )r.   wb)
chunk_size)r   joinr   r   r(   add_taskr    zlibdecompressobj	MAX_WBITSstreamr   raise_for_statusintr1   getupdateopenaiter_bytes
CHUNK_SIZEwrite
decompressadvancelenflush)specclientprogresssemr1   cpartsr   task_iddecompressorrespr.   fchunk	remainings                  r   _download_onerR   0   s      + +"$<<:>,,GQ&	{!AgJ<0GEG $		% 0GH

,diinn##Jd#K 8<||Dt~~23 	 =='=B 	+ 	+d!!#(()91=>Eu5dii& +!#'#3#3z#3#J : :%# 7 7 >?$$Wc%j93+ H	+:#J   , 2 2 4I 	*+ + +	+ 	+ 	+ 	+ 	++ + +@ 99A+ + +@ 99s   I"F7I"IF:B$I"F?#I&A!HG2G"G#G&AG27I":IG&G2)	H2G;7H>I	H
IH"	HH"	I%I"0H31I"II	II"c                  K   t        j                  t              }t        j                  dddd      }t               }t        j                  |d      4 d{   }|5  t        j                  | D cg c]  }t        ||||       c}  d{    ddd       ddd      d{    y7 Tc c}w 7 $# 1 sw Y   #xY w7 # 1 d{  7  sw Y   yxY ww)z>Download all files in parallel (up to MAX_CONCURRENT at once).g      .@g     r@g      >@)connectreadrA   poolT)timeoutfollow_redirectsN)	asyncio	SemaphoreMAX_CONCURRENThttpxTimeoutr   AsyncClientgatherrR   )specsrI   rW   rH   rG   ss         r   _run_downloadsrb   Z   s     


N
+CmmDuDtLGH  $  	 	..CHIa-68S9I  	  
 J	 	   s~   ACB/CC!B85B1
B8B6B8CC)C*C1B88C	=CCCCCCc                @    t        j                  t        |              y)u;   Public sync entry point — download all files in parallel.N)rY   runrb   )r`   s    r   download_batchre   i   s    KKu%&r   )returnr	   )
rF   r   rG   zhttpx.AsyncClientrH   r	   rI   zasyncio.Semaphorerf   r   )r`   zlist[DownloadSpec]rf   None)r$   
__future__r   rY   r6   dataclassesr   r   pathlibr   r\   rich.progressr   r   r	   r
   r   r   r   r@   r[   r   r   rR   rb   re   r   r   r   <module>rl      s    > "   (     

   '
'' ' 
	'
 
'T'r   