
    i?%                        d dl Z d dlZd dlZd dlmZmZmZ d dlmZ d dl	m
Z
 d dlmZmZmZ d dlmZ d dlmZmZ d dlmZ d d	lmZmZmZ d d
lmZ  e       Zej:                  j=                  dd      Zej:                  jA                  dd      Z!ej:                  j=                  dd      Z"ej:                  j=                  ddd      Z# G d d      Z$y)    N)AnyDictOptional)Console)get_headers)
join_videojoin_audiosjoin_subtitles)
create_nfo)download_trackercontext_tracker)MediaPlayers)config_manager
os_managerinternet_manager)MediaDownloaderM3U8_DOWNLOADcleanup_tmp_folderM3U8_CONVERSION	extensionskip_downloadgenerate_nfoF)defaultc            
       l    e Zd Zddedee   deeeef      fdZdeeef   fdZd Z	dee   fd	Z
d
 Zy)HLS_DownloaderNm3u8_urloutput_pathheadersc                 r   t        |      j                         | _        || _        | j                  t	               | _        |s	dt
         }t        j                  |      | _        | j                  j                  dt
               s| xj                  dt
         z  c_        t        j                  j                  t        j                  j                  | j                              d   | _        t        j                  j                  t        j                  j!                  | j                        | j                  dz         | _        t        j                  j%                  | j                        | _        t(        j*                  | _        t(        j,                  | _        d| _        d| _        d| _        y)z
        Args:
            m3u8_url: Source M3U8 playlist URL
            output_path: Full path including filename and extension (e.g., /path/to/video.mp4)
            headers: Custom headers for requests
        Nz	download..r   	_hls_temp)strstripr   custom_headersr   EXTENSION_OUTPUTr   get_sanitize_pathr   endswithospathsplitextbasenamefilename_basejoindirname
output_direxistsfile_already_existsr   download_id	site_nameerrorlast_merge_resultmedia_players)selfr   r   r   s       [/home/nidran/Documenti/script/streaming-community/StreamingCommunity/core/downloader/hls.py__init__zHLS_Downloader.__init__#   sM    H++-%&"--D %&6%78K%77D((1-=,>)?@!$4#5 66  WW--bgg.>.>t?O?O.PQRST'',,rwwt7G7G'H$J\J\_jJjk#%77>>$2B2B#C  +66(22 
!%!    returnc                 &	   | j                   r#t        j                  d       | j                  dfS t	        | j
                  | j                  | j                  | j                  | j                  | j                        | _        | j                  j                          t        j                  | j                         t        r#t        j                  d       | j                  dfS 	 t!        | j                        | _        | j"                  j%                          | j                  r t)        j*                  | j                  d       | j                  j-                         }|j/                  d      dk(  r/| j                  r"t)        j0                  | j                  dd       y	| j3                  |      rDt5        j6                  d
       | j                  r"t)        j0                  | j                  dd
       y	| j                  r t)        j*                  | j                  d       | j9                  |      }|rt:        j<                  j?                  |      s| j                  rBt)        j@                  | j                        r#t)        j0                  | j                  dd       y	t5        j6                  d       | j                  r"t)        j0                  | j                  dd       y	t:        j<                  jC                  |      t:        j<                  jC                  | j                        k7  ri	 t:        j<                  j?                  | j                        rt;        jD                  | j                         t;        jF                  || j                         | jI                          tJ        rtM        | j                         | j                  rIt)        j0                  | j                  dt:        j<                  jC                  | j                               tN        r!tQ        jR                  | j                  d       | j                  dfS # t&        $ r Y Aw xY w# t&        $ r)}t        j                  d|        || _        Y d}~d}~ww xY w)z/Main execution flow for downloading HLS contentz[yellow]File already exists.F)urlr/   filenamer   r2   r3   z/[yellow]Skipping download as per configuration.downloadingr4   	cancelled)successr4   )NTzNo media downloadedz	Muxing...zMerge operation failedzMerge failedz&[yellow]Warning: Could not move file: NT)rA   r)   )ignore_errors)*r1   consoleprintr   r   r   r/   r,   r$   r2   r3   media_downloaderparser_streamr   create_pathSKIP_DOWNLOADr   r6   create	Exceptionr   update_statusstart_downloadgetcomplete_download_no_media_downloadedloggingr4   _merge_filesr(   r)   r0   
is_stoppedabspathremoverename_print_summaryCREATE_NFO_FILESr   CLEANUP_TMPshutilrmtree)r7   status
final_filees       r8   startzHLS_Downloader.startE   sf   ##MM89##U** !0''''((nn!
 	++- 	t/MMKL##U**	!-doo!>D%%' **4+;+;]K&&557 ::g+- 2243C3CUZef $$V,MM/0 2243C3CUZop **4+;+;[I&&v.

!;$4$?$?@P@P$Q 2243C3CUZef!MM23 2243C3CUZhi 77??:&"''//$:J:J*KK.77>>$"2"23IId../		*d&6&67 	t''(..t/?/?TVT[T[TcTcdhdtdtTuvMM$//>&&q  		T  . FqcJK#-  .s+   %4Q 1A(Q 	QQ	R'RRc                     |j                  d      du xr@ |j                  d      g k(  xr* |j                  d      g k(  xr |j                  d      g k(  S )z!Check if no media was downloaded.videoNaudios	subtitlesexternal_subtitles)rM   )r7   r[   s     r8   rO   z#HLS_Downloader._no_media_downloaded   sr    

7#t+  X

80D0J  XvzzZeOfjlOl  Xqwq{q{  }Q  rR  VX  rX  	Yr:   c                 v   |d   y|d   j                  d      }t        j                  j                  |      s t        j                  d|        d| _        y|d   sd|d   s_t        j                  d       t        || j                  	      \  }}|| _	        t        j                  j                  |      r|S d
| _        y|}|d   rt        j                  dt        |d          d       t        j                  j                  | j                  | j                   dt               }t        ||d   |      \  }}}|| _	        t        j                  j                  |      r|}nt        j                  d       |d   rt        j                  dt        |d          d       t        j                  j                  | j                  | j                   dt               }t!        ||d   |      \  }}|| _	        t        j                  j                  |      r|}|S t        j                  d       |S )z#Merge downloaded files using FFmpegr`   Nr)   z[red]Video file not found: zVideo file missingra   rb   z5[cyan]
No additional tracks to merge, muxing video...)
video_pathout_pathzVideo mux failedz[cyan]
Merging [red]z [cyan]audio track(s)...z_with_audio.)re   audio_tracksrf   z6[yellow]Audio merge failed, continuing with video onlyz [cyan]subtitle track(s)...z_final.)re   subtitles_listrf   z;[yellow]Subtitle merge failed, continuing without subtitles)rM   r(   r)   r0   rC   rD   r4   r   r   r5   lenr-   r/   r,   r%   r	   r
   )	r7   r[   re   merged_fileresult_jsoncurrent_fileaudio_outputuse_shortest
sub_outputs	            r8   rQ   zHLS_Downloader._merge_files   s   '?"G_((0
ww~~j)MM7
|DE-DJ h{(;MMRS'1%))($K &1D"ww~~k*""/
! (MM1#fX6F2G1HH`ab77<<D<N<N;O|\l[m9noL5@'#H-%62K{
 &1D"ww~~k**VW +MM1#f[6I2J1KKfghdoo$:L:L9MWUeTf7ghJ'5'%k2#($K
 &1D"ww~~k**  [\r:   c                 `   t         j                  j                  | j                        syt	        j
                  t         j                  j                  | j                              }d}| j                  r6t        | j                  t              r| j                  j                  dd      }t        j                  d       t        j                  dt         j                  j                  | j                                t        j                  d|        t        j                  d|        y)zPrint download summaryNzN/Atimez
[green]Output:z  [cyan]Path: [red]z  [cyan]Size: [red]z  [cyan]Duration: [red])r(   r)   r0   r   r   format_file_sizegetsizer5   
isinstancedictrM   rC   rD   rS   )r7   	file_sizedurations      r8   rV   zHLS_Downloader._print_summary   s    ww~~d../$55bggoodFVFV6WX	!!j1G1G&N--11&%@H()+BGGOOD<L<L,M+NOP+I;78/z:;r:   )NN)__name__
__module____qualname__r"   r   r   r9   r   r^   rO   rQ   rV    r:   r8   r   r   "   sg     "  "8C=  "RZ[_`ceh`h[iRj  "DT'tCH~ T'lY>hsm >@<r:   r   )%r(   rY   rP   typingr   r   r   rich.consoler   $StreamingCommunity.utils.http_clientr   "StreamingCommunity.core.processorsr   r	   r
   -StreamingCommunity.core.processors.helper.nfor   'StreamingCommunity.source.utils.trackerr   r   -StreamingCommunity.source.utils.media_playersr   StreamingCommunity.utilsr   r   r    StreamingCommunity.source.N_m3u8r   rC   configget_boolrX   rM   r%   rH   rW   r   r{   r:   r8   <module>r      s    
   & & ! = V V D U F Q Q = )##,,_>RS!((,,->L %%..P!((112C^]b1c K< K<r:   