
    i                     l    d dl Z d dlZd dlmZmZmZ  G d d      Z G d d      Z e       Z e       Z	y)    N)DictAnyListc                       e Zd ZdZ ej
                         Z fdZd Zdde	de	de	de	de	f
d	Z
dde	d
e	dede	de	de	de	fdZde	de	fdZde	fdZde	defdZde	defdZdde	dede	de	fdZdeee	ef      fdZdeee	ef      fdZ xZS )DownloadTrackerNc                     | j                   5  | j                  2t        t        |   |       | _        | j                  j                          | j                  cd d d        S # 1 sw Y   y xY wN)_lock	_instancesuperr   __new___init_tracker)cls	__class__s    \/home/nidran/Documenti/script/streaming-community/StreamingCommunity/source/utils/tracker.pyr   zDownloadTracker.__new__   sS    YY 	!}}$ %os CC H++-==		! 	! 	!s   A
A""A+c                 n    i | _         g | _        i | _        i | _        t	        j
                         | _        y r	   )	downloadshistorystop_eventsactive_processes	threadingLockr
   selfs    r   r   zDownloadTracker._init_tracker   s.    46-/7968^^%
    download_idtitlesite
media_typepathc                 (   | j                   5  t        j                         | j                  |<   g | j                  |<   ||||d|ddddt        j
                         t        j
                         i d| j                  |<   d d d        y # 1 sw Y   y xY w)Nstartingr   0B/s0B/0B0/0)idr   r   typestatusr    progressspeedsizesegments
start_timelast_updatetasks)r
   r   Eventr   r   timer   )r   r   r   r   r   r    s         r   start_downloadzDownloadTracker.start_download   s    ZZ 	,5OO,=D[)13D!!+.!"$!"iik#yy{+DNN;'	 	 	s   A2BBtask_keyr)   r*   r+   r,   r(   c                 `   | j                   5  || j                  v rb| j                  |   }|xs d|d<   t        j                         |d<   ||d   vrddddd	|d   |<   |d   |   }	|	 t        |      |	d
<   |r||	d<   |r||	d<   |r||	d<   |d   j                         D 
cg c]P  \  }
}d|
j                         v s7d|
j                         v s%d|
j                         v sd|
j                         v sO|R }}
}|rat        d |D              t        |      z  |d
<   t        d |d   j                         D        |d         }|d   |d<   |d   |d<   |d   |d<   n |	d
   |d
<   |	d   |d<   |	d   |d<   |	d   |d<   d d d        y # t        t
        f$ r Y !w xY wc c}}
w # 1 sw Y   y xY w)Ndownloadingr(   r.   r/   g        r#   r$   r%   )r)   r*   r+   r,   r)   r*   r+   r,   videoaudiovidaudc              3   &   K   | ]	  }|d      yw)r)   N ).0ts     r   	<genexpr>z2DownloadTracker.update_progress.<locals>.<genexpr>R   s     (R1:(Rs   c              3   p   K   | ].  \  }}d |j                         v sd|j                         v s+| 0 yw)r6   r8   N)lower)r<   kr=   s      r   r>   z2DownloadTracker.update_progress.<locals>.<genexpr>S   s7     "sASTSZSZS\H\`eijipipir`r1"ss   ,66r   )r
   r   r1   float
ValueError	TypeErroritemsr@   sumlennext)r   r   r3   r)   r*   r+   r,   r(   dltaskrA   r=   video_audio_tasksv_tasks                 r   update_progresszDownloadTracker.update_progress.   sQ   ZZ ,	6dnn,^^K0%68$(IIK=! 2g;.$'!' '$)	-BwK) '{8, '+0?Z( $)DM#'DL'/D$ 46g;3D3D3F  %d41a'UVU\U\U^J^bimnmtmtmvbvz  DE  DK  DK  DM  {M  QV  Z[  Za  Za  Zc  QcQ  %d!  %d$%((R@Q(R%RUXYjUk%kBzN!"sG1B1B1D"s  vG  HI  vJ  KF"(/BwK!'BvJ%+J%7BzN%)*%5BzN"&w-BwK!%fBvJ%)*%5BzNY,	6 ,	6* '	2  %dA,	6 ,	6sD   AF$+F9+F$$AF5F9BF$FF$F	F$$F-c                     | j                   5  || j                  v r6|| j                  |   d<   t        j                         | j                  |   d<   d d d        y # 1 sw Y   y xY w)Nr(   r.   )r
   r   r1   )r   r   r(   s      r   update_statuszDownloadTracker.update_status]   sZ    ZZ 	Idnn,8>{+H5=AYY[{+M:	I 	I 	Is   AAA$c                    | j                   5  || j                  v r| j                  |   j                          || j                  v rd| j                  |   d<   || j                  v rN| j                  |   D ]<  }	 t        |d      r|j                          nt        |d      r|j                          > ddd       y# t        $ r Y Sw xY w# 1 sw Y   yxY w)z6Signal a download to stop and terminate its processes.zcancelling...r(   	terminatecancelN)	r
   r   setr   r   hasattrrQ   rR   	Exception)r   r   procs      r   request_stopzDownloadTracker.request_stopc   s    ZZ 	d...  -113dnn,8G{+H5 d333 11+> D"45 NN,$T84 KKM	 	 % 	 	s0   A,C:9B>3C>	C
C	C

CCreturnc                     | j                   5  | j                  j                  |      }|r|j                         ndcddd       S # 1 sw Y   yxY w)z5Check if a stop has been requested for this download.FN)r
   r   getis_set)r   r   events      r   
is_stoppedzDownloadTracker.is_stoppedw   sA    ZZ 	6$$((5E%*5<<>	6 	6 	6s   /AAprocessc                     | j                   5  |r,|| j                  v r| j                  |   j                  |       ddd       y# 1 sw Y   yxY w)zHRegister a subprocess or task to be terminated if download is cancelled.N)r
   r   append)r   r   r^   s      r   register_processz DownloadTracker.register_process}   sK    ZZ 	C{d.C.CC%%k299'B	C 	C 	Cs   /AAsuccesserrorc                 $   | j                   5  || j                  v r| j                  j                  |      }| j                  j                  |d        | j                  j                  |d        |rdnd|d<   |dk(  rd|d<   t        j
                         |d<   ||d<   ||d<   |rdn|d	   |d	<   | j                  j                  |       t        | j                        d
kD  r| j                  j                  d       d d d        y # 1 sw Y   y xY w)N	completedfailedr(   	cancelledend_timerc   r    d   r)   2   r   )	r
   r   popr   r   r1   r   r`   rG   )r   r   rb   rc   r    rI   s         r   complete_downloadz!DownloadTracker.complete_download   s    ZZ 	(dnn,^^''4   $$[$7%%))+t<.5{88K'#.BxL!%:#7!6
(/R
^:##B' t||$r)LL$$Q')	( 	( 	(s   C0DDc                    | j                   5  t        j                         }g }| j                  j                         D ]"  \  }}||d   z
  dkD  s|j	                  |       $ |D ]=  }| j                  j                  |      }d|d<   | j                  j	                  |       ? t        | j                  j                               cd d d        S # 1 sw Y   y xY w)Nr.   i,  	timed_outr(   )	r
   r1   r   rE   r`   rk   r   listvalues)r   now	to_removedidrI   s        r   get_active_downloadsz$DownloadTracker.get_active_downloads   s    ZZ 	1 ))+CI>>//1 *RM**S0$$S)* ! (^^'',*8##B'(
 --/0	1 	1 	1s   ACA7CCc                     | j                   5  t        t        | j                              cd d d        S # 1 sw Y   y xY wr	   )r
   ro   reversedr   r   s    r   get_historyzDownloadTracker.get_history   s/    ZZ 	0./	0 	0 	0s   5>)FilmN)NNNNN)TNN)__name__
__module____qualname__r   r   r   r
   r   r   strr2   rB   rM   rO   rW   boolr]   r   ra   rl   r   r   rt   rw   __classcell__)r   s   @r   r   r      s,   IINNE!&# c  RU fi (-63 -6# -6 -6^a -6ps -6  GJ -6  [^ -6^I Ic I (6c 6d 6CC C# C(S (4 (s (ad (.1d4S>&: 1"0T$sCx.1 0r   r   c                       e Zd Zd Zed        Zej                  d        Zed        Zej                  d        Zed        Zej                  d        Zy)	ContextTrackerc                 6    t        j                         | _        y r	   )r   localr   s    r   __init__zContextTracker.__init__   s    __&
r   c                 0    t        | j                  dd       S )Nr   getattrr   r   s    r   r   zContextTracker.download_id   s    tzz=$77r   c                 &    || j                   _        y r	   )r   r   r   values     r   r   zContextTracker.download_id   s    !&

r   c                 0    t        | j                  dd      S )Nr   rx   r   r   s    r   r   zContextTracker.media_type   s    tzz<88r   c                 &    || j                   _        y r	   )r   r   r   s     r   r   zContextTracker.media_type   s     %

r   c                 0    t        | j                  dd       S )N	site_namer   r   s    r   r   zContextTracker.site_name   s    tzz;55r   c                 &    || j                   _        y r	   )r   r   r   s     r   r   zContextTracker.site_name   s    $

r   N)	ry   rz   r{   r   propertyr   setterr   r   r;   r   r   r   r      s    ' 8 8 ' ' 9 9 & & 6 6 % %r   r   )
r1   r   typingr   r   r   r   r   download_trackercontext_trackerr;   r   r   <module>r      s=      " "e0 e0P% %< #$  "r   