
    i4                        d dl Z d dlZd dlZd dlZd dlm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m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  e
       Z e       Zej<                  j?                  dd      Z ej<                  j?                  ddd      Z!ej<                  j?                  dd      Z" G d d      Z#d Z$dde%de%de%de&de'de%de%fdZ(y)    N)partial)Console)Prompt)Progress
TextColumn)create_clientget_userAgent)config_manager
os_managerinternet_manager)CustomBarColumn)
create_nfo)download_trackercontext_trackerREQUESTSverifyM3U8_CONVERSIONgenerate_nfoF)defaultM3U8_DOWNLOADskip_downloadc                       e Zd Zd Zy)InterruptHandlerc                 <    d| _         d| _        d| _        d| _        y )Nr   F)interrupt_countlast_interrupt_timekill_download
force_quit)selfs    [/home/nidran/Documenti/script/streaming-community/StreamingCommunity/core/downloader/mp4.py__init__zInterruptHandler.__init__"   s!     #$ "    N)__name__
__module____qualname__r!    r"   r    r   r   !   s     r"   r   c                 r   t        j                          }||j                  z
  dkD  rd|_        |xj                  dz  c_        ||_        |j                  dk(  rd|_        t        j                  d       y|j                  dk\  r3d|_        t        j                  d       t        j                  | |       yy)	z8Enhanced signal handler for multiple interrupt scenarios   r      Tzs
[yellow]First interrupt received. Download will complete and save. Press Ctrl+C three times quickly to force quit.   z6
[red]Force quit activated. Saving partial download...N)timer   r   r   consoleprintr   signal)signumframeinterrupt_handleroriginal_handlercurrent_times        r    signal_handlerr4   )   s    99;L ';;;a?,-)%%*%,8)((A-*.'  M  	N		*	*a	/'+$OPf./ 
0r"   urlpathrefererheaders_show_final_infodownload_id	site_namec                    t        |       j                         } t        j                  |      }|xs t        j
                  }|xs t        j                  }t        j                  xs d}t        rt        j                  d       |dfS t        j                  j                  |      rt        j                  d       |dfS | j                         j                  d      sP| j                         j                  d      s1t!        j"                  d|         t        j                  d|         y	|rpt        j                  j%                  |      }t'        j(                  |||xs d
|t        j                  j+                  |             t'        j,                  |d       i }	|r||	d<   |r|	j/                  |       nt1               |	d<   | d}
t3               }	 t5        j6                         t5        j8                         u rWt;        j<                  t:        j>                        }t;        j:                  t:        j>                  tA        tB        ||             t        jF                  t        j                  jI                  |      d       tK               5 }	 |jM                  | |	      }|jO                          |jP                  jS                  d      xs dj                         }d|v sd|v rt        j                  d       	 |jS                  | |	      }|jO                          d}	 |jT                  dd }|jW                  dd      }t        j                  d       t        j                  |       	 ddd       y	|jY                  d!| |	      5 }|jO                          |jP                  jS                  d"      }	 |t[        |      nd}|t        j                  d#       t]        t_        d$      ta               t_        d%      t_        d&      t_        d'      t_        d(      t        )      }tc        jb                         }d*}d}|5  |r*te        jf                  |      ji                  d+      \  }}|}nd,\  }}d}|jk                  d-|d.d/||d0d1d23	      }tm        |
d4      5 }	 |jo                  d56      D ]z  } |jp                  s|rFt'        jr                  |      r1t        j                  d7       |rt'        jr                  |      rd8} n&| s[|ju                  |       }!||!z  }tc        jb                         |z
  }"te        jv                  |"      }#|"d*kD  r||"z  }$te        jx                  |$      }%nd2}%|r6t{        ||z
  d*      }&|"d*kD  r
$d*kD  r|&|$z  nd*}'te        jv                  |'      }(nd1}(te        jf                  |      ji                  d+      \  })}*|rA|r||z  d9z  nd*}+|r|d:z  d:z  d;d<nd
},t'        j|                  |d=|+|%|) |* d>|r|,nd? @       |j/                  |||)|*|#|(|%A       } 	 |j                          t        j                  |j                                ddd       ddd       ddd       ddd       t        j                  j                  |
      rtd8k(  r|rt'        j                  |dd8D       yEd}-t        dF      D ]  }.	 t        j                  |
|       d}- n |-r&t        j                  dK|-        d|j                  fS t        j                  j                  |      r)|rte        jf                  t        j                  j                  |            }0t        j                  dL       t        j                  dMt        j                  j+                  |              t        j                  dN|0        s$r7t        j                  j                  |      |k  rt        j                  dO       t        rt        |       |r7t        j                  j+                  |      }1t'        j                  |d|1P       ||j                  fS t        j                  dQ       |rt'        j                  |ddRD       d|j                  fS # tD        $ r Y [w xY w# tD        $ r d}Y w xY w# tD        $ r d}Y ddd       y	w xY w# tD        $ r*}t        j                  d |        Y d}~ddd       y	d}~ww xY w# tD        $ r d}Y Tw xY w# t~        $ r |jp                  sd|_@        Y tD        $ r-}d}d|_@        t        j                  dB| dC       Y d}~?d}~ww xY w# tD        $ r Y w xY w# 	 |j                          t        j                  |j                                w # tD        $ r Y w w xY wxY w# 1 sw Y   mxY w# 1 sw Y   rxY w# 1 sw Y   wxY w# 1 sw Y   |xY w# t        $ rT}|}-t        j                  dG|.dHz    dI|        tc        j                  dJ       d*dlJ}/|/j                          Y d}~d}~ww xY w)Sz
    Downloads an MP4 video with enhanced interrupt handling.
    - Single Ctrl+C: Completes download gracefully
    - Triple Ctrl+C: Saves partial download and exits
    FilmzL[yellow]Download skipped due to configuration. Returning intended file path.Fz[yellow]File already exists.zhttp://zhttps://zInvalid URL: z[red]Invalid URL: )NFUnknown)r6   downloadingRefererz
User-Agentz.temp)r1   r2   T)exist_ok)headerszcontent-type z	text/htmlzapplication/jsonzH[yellow]HEAD indicates non-video; retrying GET without Range/If-Range...Ni  zutf-8replace)errorsz<could not read body>z
[red]--- body preview ---z[red]Fallback GET failed: GETzcontent-lengthzK[yellow]No Content-Length received; streaming until peer closes connection.z/[yellow]MP4[/yellow] [cyan]Downloading[/cyan]: z[bright_green]{task.fields[downloaded]}[/bright_green] [bright_magenta]{task.fields[downloaded_unit]}[/bright_magenta][dim]/[/dim][bright_cyan]{task.fields[total_size]}[/bright_cyan] [bright_magenta]{task.fields[total_unit]}[/bright_magenta]z[dim]\[[/dim][bright_yellow]{task.fields[elapsed]}[/bright_yellow][dim] < [/dim][bright_cyan]{task.fields[eta]}[/bright_cyan][dim]][/dim]z"[bright_magenta]@[/bright_magenta]z/[bright_cyan]{task.fields[speed]}[/bright_cyan])r,   r    )--rC   downloadz0.00B0srH   z-- B/s)total
downloadeddownloaded_unit
total_size
total_unitelapsedetaspeedwbi   )
chunk_sizez0
[red]Force quitting... Saving partial download.	cancelledd   i   z.2fMBvideo/z??)progressrS   size)	completedrM   rN   rQ   rR   rS   z
[red]Download error: z. Saving partial download.)successerror)NT
   z[yellow]Rename attempt r)   z/10 failed: g      ?z/[red]Could not rename temp file after retries: z
[green]Output:z  [cyan]Path: [red]z  [cyan]Size: [red]z>[yellow]Warning: download was incomplete (partial file saved).)r^   r6   z&[red]Download failed or file is empty.zFile missing or empty)Ostrstripr   get_sanitize_pathr   r:   r;   
media_typeSKIP_DOWNLOADr,   r-   osr6   existslower
startswithloggingr_   basenamer   start_downloadabspathupdate_statusupdater	   r   	threadingcurrent_threadmain_threadr.   	getsignalSIGINTr   r4   	Exceptionmakedirsdirnamer   headraise_for_statusrB   getcontentdecodestreamintr   r   r   r+   r   format_file_sizesplitadd_taskopen
iter_bytesr   
is_stoppedwriteformat_timeformat_transfer_speedmaxupdate_progressKeyboardInterruptr   flushfsyncfilenocomplete_downloadrangerD   PermissionErrorlogsleepgccollectgetsizeCREATE_NFO_FILESr   )2r5   r6   r7   r8   r9   r:   r;   rd   filenamerB   	temp_pathr1   previous_handlerclientrx   content_type
resp_checkpreview_textprevieweresponsecontent_lengthrL   progress_bars
start_timerM   incomplete_errortotal_size_valuetotal_size_unit
task_totaltask_idfilechunkr\   rQ   elapsed_strrS   	speed_strremaining_byteseta_secondseta_strdownloaded_valuerN   percenttotal_size_strlast_excattemptr   	file_sizeabs_paths2                                                     r    MP4_Downloaderr   >   s	    c(..
C''-D <!<!<K6_66I ++5vJdeU{	ww~~d45U{IIK""9-1G1G
1ScU+,*3%01 77##D)''Xy?UIWahjhohohwhwx|h}~&&{MB G$	x  - &I(*##%)>)>)@@%//>MM"&7%5 KK%5	 M!F	;;sG;4D!!# LL,,^<BIIKL
 ,&*<*LMMde##ZZWZ=
++-#'(00$7G#*>>')>#LL
 ;<l+"5M! M!B ]]5#w]7 l	!8%%' &--112BCN/=/IN+t }kl %LM!  O  P  h  i?@LMM JJ$ P!8H8Y8YZ_8`8f8fgj8k5$o!&J8@5$o!%J'00:Z`ru  CS  `o  y}  CG  OW0  X)T* G!dF!%-%8%8E%8%J 5"E0;;P`PkPklwPx '.a b#.3C3N3N{3[7B$4 %$'+zz%'8 *d 2
 +/))+
*B.>.J.J7.S $+Q;,6,@E0@0V0VW\0]I08I#(69%*:La6PONUXYk^cfg^g/E2InoK.>.J.J;.WG.2G EUDeDefpDqDwDwx{D| A 0/ $/LQzE/AC/GWXGY^9Lc7RRT5UdmN$4$D$D(3(/18.70@/A/ARRSfkTbquSv-w%& !. 4 4$+.8/?4C,7(/*3 !5 !"[5"B! JJLHHT[[]3KG!P!9l	!CM!^ 
ww~~i {* 22;U`aRy 	G


9d+		 MMKH:VW*8888	ww~~d(99"''//$:OPIMM,-MM/0E/FGHMM/	{;<Ebggood.Ce.K^_twwt,H..{DxX&4444 	>?..{EQhi&4444I    	L	 ! '#:L&-M! M!('  # :1#>?"=M! M!8#  n . C0;;>B-;$ _+/(:>)7(?sB\&]^^_  ) ! !! JJLHHT[[]3( ! !MG! G!P! P!9l	! l	!CM! M!x # 5gai[QCPQ

3

s  A?b+ hAb;,h
%c&0"c*c&h,g7dA<g7Ag*,g	.A,d.D#d.?3f2g*:g7h"h+	b87b8;c
h	c

hc#c&"c##c&&	d/dhdhd+'g7*d++g7.f
ff"e=7f=ff	fg	fg	g3g
g	ggggg	g'"g**g4/g77h	<hh	i.A	i))i.)NNTNN))rf   r+   r.   rj   	functoolsr   rp   rich.consoler   rich.promptr   rich.progressr   r   $StreamingCommunity.utils.http_clientr   r	   StreamingCommunity.utilsr
   r   r    StreamingCommunity.source.N_m3u8r   -StreamingCommunity.core.processors.helper.nfor   'StreamingCommunity.source.utils.trackerr   r   msgr,   configget_boolREQUEST_VERIFYr   re   r   r4   ra   dictboolr   r&   r"   r    <module>r      s    
      !  . N Q Q < D U h
)&&//
HE!((112C^]b1c %%..P   0*5 53 5 5t 5ei 5  @C 5  WZ 5r"   