
    -FhH                     T   U 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Zd dlZd dlZd dl	m
Z
mZmZmZmZ 	 d dlmZmZ ej&                  j)                  dd      ZdZej&                  j)                  dd      xs dj/                         Zej&                  j)                  d	d      xs dj/                         Zej&                  j)                  d
      xs dj/                         Zej&                  j)                  dd      xs dj/                         Zej&                  j)                  dej8                  j;                  ed            ZdZi Z ee!ee"ee!   f   f   e#d<   de!ddfdZ$d.dZ%d Z&de'de!fdZ(dddddZ)dee!   ddfdZ*d.de!de!d ee
e'ee!   gdf      deee!   ee!   f   fd!Z+d" Z,e-d#k(  rY e.ej^                        d$k  r e0d%        ejb                  d&       ej^                  d'   Z2 ejf                  ej^                  d&         Z4ej^                  d(   Z5ej^                  d)   Z6 ejn                  ed*+        ej                         Z8 ejr                  e      D ]m  Z:ej8                  j;                  ee:      Z;	 ej8                  jy                  e;      r3e8ej8                  j{                  e;      z
  d,kD  r ej|                  e;       o ej8                  j;                  ee5      Z?d- Z@ ej                   e@              yy# e$ r eZeZY w xY w# e$ r Y w xY w)/    N)CallableListOptionalTupleDict)DownloadErrorExtractorErrorWS_PROGRESS_URLzws://progress-ws:3002z/var/www/it7/html/downloadsYTDLP_PO_TOKEN YTDLP_COOKIES_FILEYTDLP_PLAYER_CLIENTYTDLP_USER_AGENTAUDIO_DL_LOGzaudio_dl.log(   _last_progress_statemessagereturnc                 D   t        j                  d      }	 t        j                  j	                  t
              }|rt        j                  |d       t        t
        dd      5 }|j                  d| d|  d	       d d d        y # 1 sw Y   y xY w# t        $ r Y y w xY w)
Nz%Y-%m-%d %H:%M:%STexist_okazutf-8)encoding[z] 
)
timestrftimeospathdirnameLOG_PATHmakedirsopenwrite	Exception)r   stamp	directoryfhs       6it7-nvidia/youtubeDownloader/youtube_download_audio.pylogr*   #   s    MM-.EGGOOH-	KK	D1(C'2 	/bHHqr'"-.	/ 	/ 	/ s0   AB %B>B BB B 	BBc                 R  K   	 t        |      }t        j                  |d      \  }}||k  r|}n||kD  s||k7  r||ft        |<   ny d||d}|||d<   | j                  t	        j
                  |             d {    y 7 # t        $ r}t        d|        Y d }~y d }~ww xY ww)N)Nprogress)type
session_idr-   r   zWS send error: )intr   getsendjsondumpsr%   print)	wsr/   r-   r   progress_intprev_progressprev_messagepayloades	            r)   send_wsr<   /   s     %8}&:&>&>z:&V#|-'(LM)W-D0<g/F ,%Z\Z!(GIggdjj)*** %s#$$%sM   B'AB B'4B ;B<B  B'B 	B$BB'B$$B'c           
         	 t        j                  ddddddd| gt         j                  t         j                  d	      }t        |j                  j                               S # t        $ r}t        d
|        Y d }~y d }~ww xY w)Nffprobez-verrorz-show_entrieszformat=durationz-ofz"default=noprint_wrappers=1:nokey=1TstdoutstderrtextzDuration error: )
subprocessrunPIPEfloatrA   stripr%   r5   )r   rr;   s      r)   ffprobe_durationrJ   B   sz    NNId7?CT!"FN",//*//PTV QXX^^%&&  $%s   AA" "	B+A>>Bspeedc                     g }t        |       }|dkD  r|j                  d       |dz  }|dkD  r|dk  r|j                  d       |dz  }|dk  r|j                  dt        |d              dj                  |      S )Ng       @z
atempo=2.0g      ?z
atempo=0.5zatempo=   ,)rG   appendroundjoin)rK   chainss      r)   build_atempo_chainrT   L   s    EeA
c'\"AHA c'
c'\"AHA c'	LL751:,'(88E?    zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36z?com.google.android.youtube/19.25.35 (Linux; U; Android 13) gzipz=com.google.ios.youtube/19.25.1 (iPhone15,3; iOS 17.5.1; gzip)z4Mozilla/5.0 (ChromiumStylePlatform) Cobalt/25.2.4.22)webandroidiostvhtml5simplypathsc                     | D ]8  }t         j                  j                  |      s#	 t        j                  |       : y # t        $ r Y Gw xY wN)r   r   existsremoveOSError)rZ   r   s     r)   cleanup_pathsr`   ^   sE     77>>$		$  s   ?	A
Aurloutput_fileprogress_cbc                     t         j                  j                        \  }dddddgddu d} d	d
 dddddu d}dgt        rddgdgt        r't         j                  j                  t              rddgg }t        r|j                  t               |j                  g d       t               }g |D ]/  }|xs d}	|	|vs|j                  |	       j                  |       1 dt        dt        dt        dt        dt        t        t        f   f
dddt        t            dt        t           ddffdr	 dd       dt        ffddt        dt"        g df   d t"        t        gt        t           f   d!t        dt        t        t           t$        t           f   f
 fd"}
d#t        dt        t           ffd$}d#t        dt        t           ffd%}fd&}fd'}g } |
|||d(      \  }}|r|dfS |j                  |        |
|||d)      \  }}|r|dfS |j                  |       |rd*j'                  |      nd+}d|fS ),z;Download the source audio and normalise the final filename.zbestaudio[ext=m4a]/bestaudioFFmpegExtractAudiom4a0)keypreferredcodecpreferredqualityTN)formatouttmplpostprocessorsquiet
noprogress_videozbest[ext=mp4]/bestz.%(ext)smp4)rk   rl   merge_output_formatprefer_ffmpegrn   ro   F)r   rV   rY   rW   z<auto>	base_optsclient	use_tokenuse_cookiesr   c                    t        j                  t        j                  |             }i }|r1|j                  di       j                  dg       j	                  |       |rFt
        r@|xs d}|j                  di       j                  dg       j	                  | dt
                |r||d<   |r2t        r,t        j                  j                  t              r	t        |d<   t        xs t        j                  |xs d      }|r$|j                  di       j                  |d	d
       d|xs d d|rt
        rdnd d|rt        rdnd }||fS )Nyoutubeplayer_clientrV   po_token+extractor_args
cookiefilehttp_headerszhttps://www.youtube.com/)z
User-AgentRefererzclient=autoz	 | token=YNz | cookies=)r3   loadsr4   
setdefaultrO   PO_TOKENCOOKIES_FILEr   r   isfile
USER_AGENTCLIENT_USER_AGENTSr1   update)	rt   ru   rv   rw   optsr}   channeluaattempt_labels	            r)   configure_optsz&download_audio.<locals>.configure_opts   sA   zz$**Y/0:<%%i4??QST[[\bcoG%%i4??
BOVVZaYbbcdlcmWno%3D!"<BGGNN<,H!-DB-11&/EBOONB/66 58  f&'y	hTW0X#3GI 	 ]""rU           ratior   c           	          | y 	 t        dt        dt        |                   }|k  ry |	  ||       y # t        t        f$ r Y y w xY w# t
        $ r Y y w xY w)Nr         ?)maxminrG   	TypeError
ValueErrorr%   )r   r   	ratio_vallast_hook_ratiorc   s      r)   report_download_progressz0download_audio.<locals>.report_download_progress   sy    %-	CS%,!78I '#		7+ :& 		  		s    : 	A AA	AAg{Gz?u   다운로드 시작…	tag_labelc                 $    dt         dd ffd}|S )Nstatusr   c                    | j                  d      }|dk(  r)d }| j                  d      }|r-	 t        |j                  dd      j                               dz  }|Q| j                  d      }| j                  d      xs | j                  d	      }|r|r	 t        |      t        |      z  }| j                  d
      }| j                  d      }g }|r"|j                  d|j                                 |r"|j                  d|j                                 d}	|r|	ddj                  |      z   dz   z  }	 
||	       y |dk(  r
 
dd       y y # t        t
        f$ r d }Y w xY w# t
        t        t        f$ r d }Y w xY w)Nr   downloading_percent_str%r   g      Y@downloaded_bytestotal_bytestotal_bytes_estimate
_speed_str_eta_stru   속도 u   남은 시간 u   다운로드 중…z (z, )finishedr      다운로드 완료)	r1   rG   replacerH   r   r   ZeroDivisionErrorrO   rQ   )r   status_typer   percent_str
downloadedtotalrK   etapartsr   r   s             r)   hookz8download_audio.<locals>.make_progress_hook.<locals>.hook   s    **X.Km+$jj8% %k&9&9#r&B&H&H&J Ke S =!',>!?J"JJ}5[DZ9[E!e)$)*$5e$DE 

<0jj,LL75;;=/!:;LL>#))+!?@/tdii&66<<G(8
*(.CD +- '	2 % $% !*:7HI )$(E)s#   ,E E* E'&E'*FF)dict)r   r   r   s     r)   make_progress_hookz*download_audio.<locals>.make_progress_hook   s!    	E 	E$ 	E@ rU   
cleanup_fnfinalize_fntagc                 d   g }D ]  }D ]  }D ]  } | |||      \  }}	t        d| d|	 d         |        r'|j                  dg       j                   |             	 t        j                  |      5 }
|
j                  g       d d d         ||	      }|
g fc c c S |j                  |          d |fS # 1 sw Y   8xY w# t        t        f$ r~}t        |      }t        d|        t        d| d|	 d|        |j                  |       |j                         t        fdd	D              }|rY d }~:d |fcY d }~c c c S d }~wt        $ rI}d| }t        |       t        d
| d|	 d|        |j                  |       d |fcY d }~c c c S d }~ww xY w)Nzyt-dlp attempt (z) | z | url=progress_hookszDownload error: zyt-dlp error ( | c              3   &   K   | ]  }|v  
 y wr\    ).0keywordlowers     r)   	<genexpr>z7download_audio.<locals>.run_attempts.<locals>.<genexpr>  s      	( ' $u,	(s   )zhttp error 403z!requested format is not availablezsign in to confirm your agezthis video is unavailablezincomplete readzyt-dlp unexpected error ()r*   r   rO   yt_dlp	YoutubeDLdownloadr   r	   strr5   r   anyr%   )rt   r   r   r   attempt_errorsru   rv   rw   r   r   ydlfinalize_errorr;   r   	retryabler   r   cookie_modesr   ordered_clientsrb   rc   token_modesra   s                  @r)   run_attemptsz$download_audio.<locals>.run_attempts   s   $&% +	4F( *4	#/ )4K*8FIWb*c'D-*3%tM?'#OPL"(8"=DDEWX[E\]!4#--d3 0sLL#/0 *5])C)1#.?2&--n=)4*4+	4Z ^##E0 0 *>: 4"%a& 0	:;nSEm_CyQR&--g6 '$' 	(,	( 	%	 %$#^333$ 4$4QC"8g7uDsSZR[\]&--g6#^3334sU   'C<C	C+CCCF/	!A$E	E	F/	F/	&8F*	F/	*F/	r   c                     d dg}|D ]P  }t         j                  j                  |      s#|k7  r	 t        j                  |       t        d|  d         y  d	}t        |       t        | d|         |S # t        $ r4}d| d d| }t        |       t        | d|         |cY d }~c S d }~ww xY w)
N.m4a.M4AzRename error (z -> z): r   zyt-dlp download complete (z) | output=z(Download error: converted file not found)r   r   r]   r   r_   r5   r*   )r   
candidates	candidateexcr   	base_pathrb   s        r)   finalize_audioz&download_audio.<locals>.finalize_audio  s    !i[#5)D7IJ
# 	Iww~~i(+'

9k: 0{;-XY	 =gwis=/*+ # '$29+T+cRUQV"Wgwis=/:;&	's   B	B>
'B91B>9B>c           
         t        j                    d      }t        j                  j                        r|j	                         |sd}t        | d|         |S |j                  d d       |d   }dd	d
|dddddg
}t        d|  ddj                  |              t        j                  |t        j                  t        j                  d      }|j                  dk7  st        j                  j                        s=d|j                   d}t        | d|  d|j                  j                                 |S t        d|  d        	 t        j                  |       y # t         $ r Y y w xY w)N.*z/Video fallback error: downloaded file not foundr   c                 @    t         j                  j                  |       S r\   )r   r   getmtime)r   s    r)   <lambda>z8download_audio.<locals>.finalize_video.<locals>.<lambda>;  s    )9)9$)? rU   T)rh   reverser   ffmpeg-y-i-vn-c:aaac-b:a128kzvideo fallback convert | z | cmd= r@   z'Video fallback conversion failed (code r   z | out=zvideo fallback success | z
 | output=)globr   r   r]   rO   r*   sortrQ   rD   rE   rF   STDOUT
returncoderA   rH   r^   r_   )r   r   r   video_inputcmdprocrb   
video_bases         r)   finalize_videoz&download_audio.<locals>.finalize_video2  sm   YY*R01
77>>*%j)GG7)3}o./N?N m dD+65&&

 	'gchhsm_MN~~c*//*BSBSZ^_??arww~~k'B??PPQRG7)3}oWT[[5F5F5H4IJKN'jNO	IIk"   		s   E- -	E98E9c                  .    t          d  dg       y )Nr   r   )r`   )r   rb   s   r)   cleanup_audioz%download_audio.<locals>.cleanup_audioQ  s     {yk$69+T8JKLrU   c                      t        j                    d      } t        j                  j                        r| j	                         t        |        t        g       y )Nr   )r   r   r   r]   rO   r`   )rZ   rb   r   s    r)   cleanup_videoz%download_audio.<locals>.cleanup_videoT  sF    		ZL+,77>>*%LL$e{m$rU   audiovideoz; zDownload failed)r   r   splitextr   r   r   PLAYER_CLIENTrO   extendsetaddr   r   boolr   r   rG   r   r   rQ   )ra   rb   rc   _audio_base_optsvideo_base_optsclient_candidatesseen_clientsru   rh   r   r   r   r   r   collected_errorsresulterrorsmerged_errorr   r   r   r   r   r   r   r   r   s   ```                @@@@@@@@@r)   download_audior  g   s   77##K0LIq 1'# #
 
 !T)
O ;f%J& \*$!T)O 'KUm7L|4e}  /DE5LO# + l"S!""6*	+#$ # # #SW #\abfhkbk\l #< O (3- TX    '?@!c !F0$ 0$(2t82D 0$S[]`\acklocp\pSq 0$x{ 0$  AF  GO  PS  GT  VZ  [^  V_  G_  A` 0$ 0$dc hsm (c hsm >M% #%!/=.RYZNFFt|F#!/=.RYZNFFt|F#2B499-.HYLrU   c                 l  K   t        |      }|sy t        t        |            }ddd|dd|dddd	d
d|g}t        ddj	                  |             t        j                  |t
        j                  t
        j                  d      }d}	| d}
|j                  D ]}  }|j                  d      s	 t        |j                         j                  d      d         }|dz  }t        ||z  dz        }||	kD  r"|}	t        | |t        |d      |
       d {     |j#                          |j$                  dk(  xr t&        j(                  j+                  |      }t        |	dz   d      }|rt        | ||| d       d {    |S t        | ||| d       d {    y 7 # t         $ r Y w xY w7 27 w)Nr   r   r   r   z	-filter:ar   r   r   r   z	-progresszpipe:1zRUN:r   Tr@   r   u   x 변환 중…zout_time_ms==   i@B d   c   u   x 변환 완료u   x 변환 실패)rJ   rT   rG   r5   rQ   rD   PopenrF   r   rA   
startswithr0   rH   splitr<   r   r%   waitr   r   r   r]   )r6   in_fileout_filerK   r/   duratempor   r   laststatus_messagelinemscurprogsuccessfinal_progresss                    r)   convert_audior  j  s    
7
#Ce-FdGk6uVFHC 
&#((3- C

@Q@QX\]DDwo.N 
??>*++C0349n39s?+$;D!"j#dB-PPP
 	IIKoo"?rww~~h'?G2&Nb*n6OPPP
"j.UG?2K
LLL Q  	QLs\   B*F4.A#F FF A'F4=F0>F4F2F4F  	F-)F4,F--F42F4__main__   zUUsage: youtube_download_audio.py <url> <speeds_json> <original_filename> <session_id>rM   r        Tr   i,  c            
        
K   t        j                  t              4 d {   t        j                         ddt
        dt        t           dd ffd
dt        dt        t           dd f
fd} t        t        dd	       d {    t        t        t        |       \  }}|sTd
}|rd|v rd}nd| }t        t        d|       d {    t        dt         d|        t        j                   d       t"        k  r 
t"        d       t        t        t"        dz   d       d {    g }t$        D ]t  }t        |      }t&        j(                  j+                  t,        dt         d| d      }t/        ||t        |      t               d {   }|sd|j1                  |       v 	 t&        j(                  j3                  |      rt'        j4                  |       |rdnd}	t        t        d|	       d {    t9        t;        j<                  d|i             d d d       d {    y 7 7 7 q7 7 # t6        $ r Y jw xY w7 R7 $# 1 d {  7  sw Y   y xY ww)Nr   progress_valuerC   r   c                 H    j                  t        t        | |             y r\   )create_taskr<   r/   )r   rC   loopr6   s     r)   enqueue_progresszrun.<locals>.enqueue_progress  s      Z!NOrU   r   r   c                    	 t        dt        dt        |                   }t        dt        t
        t        t        |t
        z                          }|k  ry | ||xs d| d       y # t        t        f$ r Y y w xY w)Nr   r   r  u   다운로드 중… r   )r   r   rG   r   r   DOWNLOAD_PROGRESS_LIMITr0   rP   )r   r   r   r   r$  last_download_progresss       r)   download_progress_cbz!run.<locals>.download_progress_cb  s     #CS%,)? @I "%/E).E"EFG" "%;;)7& 1d>RSaRbbc<de ":. s   A/ /B Bu   다운로드 준비…u   다운로드 실패zHTTP Error 403uY   다운로드가 차단되었습니다(HTTP 403). 토큰/쿠키 설정을 확인하세요.u   다운로드 실패: r  zsession=z | failed | r  r   u   변환 준비…audio_r   zx.m4au    변환이 완료되었습니다.u!   생성된 파일이 없습니다.converted_files)
websocketsconnectWEBSOCKET_SERVER_URLasyncioget_running_loopr0   r   r   rG   r<   r/   r  ra   original_pathr*   sysexitr&  speedsr   r   rQ   DOWNLOAD_DIRr  rO   r]   r^   r%   r5   r3   r4   )r(  r   download_errorhuman_error	out_filesrS   spr  okfinal_messager$  r'  r#  r6   s             @@@@r)   rE   rE     sQ    %%&:; 8	> 8	>r++-D%&"P PHSM Pd PfE fHSM fd f$ "j!-EFFF)7]L`)a&J3!'>9 'B(=n=M&Nb*c;???hzl,~6FGH%(?? !8:OP"j*AA*EGYZZZI ,V77<<zl!B4u6UV(Z59jYYy''+	,77>>*-ryy/D CL>QtM"j#}===$**/;<=q8	> 8	> 8	>2 G @ [
 Z
   >o8	> 8	> 8	> 8	>s   I1H;I1A$IH>AIIA I1I2A(III"I64I	*II$I*I15I6I1>IIII		IIIII1I."I%#I.*I1r\   )Ar   r   r   rD   r1  r3   r   r.  r+  typingr   r   r   r   r   yt_dlp.utilsr   r	   r%   environr1   r-  r4  rH   r   r   r   r   r   rQ   r!   r&  r   r   r0   __annotations__r*   r<   rJ   rG   rT   r   r`   r  r  __name__lenargvr5   r2  ra   r   r3  original_filenamer/   r"   nowlistdirfpr   r   r^   r0  rE   r   rU   r)   <module>rG     sb    	   
     8 8: zz~~&79PQ ,JJNN+R06B==?

3R8>BEEG 56<"CCEjjnn/4:AAC
::>>."'',,|^*TU =? d3c8C=&8 99: ?	 	 	%&e   }PJK	 c t A A# AHXuV^_bVcNdfjNjEk<l Ax}  G  HK  L  NV  WZ  N[  [  y\ AF#L z
388}qef
((1+CTZZ$F!JBKKt, $))+CRZZ% GGLLq)	ww~~a S277+;+;A+>%>%D		!	 GGLL/@AM9>v GKKe E  MNh  		s$   L AL	LLL'&L'