
oTc           @   sz  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 d  d l m Z d  d l m Z m Z m Z m Z m Z m Z m Z m Z m Z m Z m Z m Z m Z d  d l m Z d  d l m Z m  Z  m! Z! m" Z" m# Z# m$ Z$ m% Z% m& Z& d  d l' m( Z( m) Z) d  d l* m+ Z+ d  d	 l, m- Z- d  d l. j/ Z/ d  d l0 j1 Z1 d  d l2 Z d  d l3 j4 Z4 d  d l5 j6 Z6 d  d l7 Z d  d l8 j9 Z9 d  d l: j; Z; d
 e f d     YZ< d   Z= d   Z> d   Z? d   Z@ d   ZA d   ZB d   ZC d   ZD d   ZE d   ZF d   ZG d   ZH d   ZI d   ZJ d   ZK d   ZL d S(   iN(   t   unpack_magict   par2_repairt   external_processingt	   sfv_check(   t   Thread(   t	   real_patht   get_unique_patht   create_dirst   move_to_patht   make_script_patht   sanitize_and_trim_patht   on_cleanup_listt   renamert
   remove_dirt
   remove_allt   globbert   set_permissionst   cleanup_empty_directories(   t   Sorter(   t   REPAIR_PRIORITYt   TOP_PRIORITYt   POSTPROC_QUEUE_FILE_NAMEt   POSTPROC_QUEUE_VERSIONt   sample_matcht	   JOB_ADMINt   Statust   VERIFIED_FILE(   t   TRANSt   unicoder(   t	   Bookmarks(   t   Ratingt   PostProcessorc           B   sz   e  Z d Z d d d   Z d   Z d   Z e d  Z d   Z	 d   Z
 d   Z d   Z d   Z d	   Z d
   Z RS(   c         C   s   t  j |   | r | |  _ n
 |  j   |  j d  k rD g  |  _ n  | rV | |  _ n0 t j   |  _ x |  j D] } |  j |  qo Wt |  _	 t |  _
 |  t _ t |  _ d  S(   N(   R   t   __init__t   history_queuet   loadt   Nonet   queuet   Queuet   processt   Falset   _PostProcessor__stopt   pausedR   t   dot   _PostProcessor__busy(   t   selfR$   R!   t   nzo(    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR    :   s    
			c         C   s*   t  j d  t j t |  j f t  d  S(   Ns   Saving postproc queue(   t   loggingt   infot   sabnzbdt
   save_adminR   R!   R   (   R,   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyt   saveS   s    c         C   s   g  |  _  t j d  t j t  } | d  k r5 d  Sy{ | \ } } t | k rl t j t	 d  t |  n  t
 | t  r g  | D]! } t j j | j  r | ^ q |  _  n  Wn* t j d t  t j d d t n Xd  S(   Ns   Loading postproc queuesF   Failed to load postprocessing queue: Wrong version (need:%s, found:%s)s   Corrupt %s file, discardings   Traceback: t   exc_info(   R!   R.   R/   R0   t
   load_adminR   R#   R   t   warningt   Tat
   isinstancet   listt   ost   patht   existst   downpatht   True(   R,   t   datat   versionR!   R-   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR"   X   s    	8c         C   sj   xc |  j  D]X } | j | k r
 |  j |  | j d t d |  t j d | j  d | _ Pq
 q
 Wd  S(   Nt
   keep_basict	   del_filess"   Removed job %s from postproc queuet    (   R!   t   nzo_idt   removet
   purge_dataR=   R.   R/   t	   work_name(   R,   RC   RA   R-   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyt   deletei   s    	c         C   s@   | |  j  k r" |  j  j |  n  |  j j |  |  j   d  S(   N(   R!   t   appendR$   t   putR2   (   R,   R-   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR&   s   s    c         C   sl   y |  j  j |  WnG t | d d  } t j t d  d |  t j d d t n X|  j   d  S(   NRC   s
   unknown ids-   Failed to remove nzo from postproc queue (id)t    s   Traceback: R3   (	   R!   RD   t   getattrR.   t   errorR6   R/   R=   R2   (   R,   R-   RC   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyRD   z   s    c         C   s'   t  |  _ |  j j d   |  j   d  S(   N(   R=   R(   R$   RI   R#   R2   (   R,   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyt   stop   s    	c         C   s   |  j  j   o |  j S(   N(   R$   t   emptyR+   (   R,   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyRN      s    c         C   s#   g  |  j  D] } | j r
 | ^ q
 S(   N(   R!   RF   (   R,   R-   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyt	   get_queue   s    c         C   s.   x' |  j  D] } | j | k r
 | j Sq
 Wd  S(   N(   R!   RC   R<   R#   (   R,   RC   R-   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyt   get_path   s    c         C   s  t  } x|  j st  |  _ |  j r7 t j d  q	 n  y |  j j d d  } Wn< t j	 k
 r | r| t  } t
   q	 q |  j j   } n X| s q	 n  | j s t } q	 n  t | _ t j   r t j j j j   n  t |  _ t |  |  j |  t } t j j j j   q	 Wd  S(   Ni   t   timeouti   (   R'   R(   R+   R)   t   timet   sleepR$   t   getR%   t   Emptyt   handle_empty_queueRF   R=   t	   pp_activet   cfgt   pause_on_post_processingR0   t
   downloadert
   DownloaderR*   t   wait_for_postproct   process_jobRD   t   resume_from_postproc(   R,   t	   check_eoqR-   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyt   run   s6    					
N(   t   __name__t
   __module__R#   R*   R    R2   R"   R'   RG   R&   RD   RM   RN   RO   RP   R`   (    (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR   6   s   		
		
				c   0      C   s  t  j    } t } t } t } t } g  } d } d } d }	 d }
 d } |  j   |  j \ } } } | rs t } n  | r t } n  |  j } |  j } t j   r | p | p | r |  j	 d  t
 j |  _ |  j   t } n  |  j rt
 j |  _ |  j   t } t } d } n  y-|  j } d  } | rEt t |   d k  rE|  j r|  j   \ } } t t j    d } | | k  r| | d k  r| d } n  d | d } d t t j    } t d	  | | f } n t d
  } t } | |  _ |  j d |  t
 j |  _ t } } t j   o*| } | sEt } d } qEn  |  j } |  j } t j d d | | | | | |  | r| rt |  |  \ } } | rt Sn  | rt j   r| o| } n  | } |  j } d  } | rt } t j   r!t  t j! j"   |  j#  } t$ |  } nT t% j& |  j'   } | j( d  r]| j) d  } t } n  t* t j! j"   |  } t j+   rt, |  |  }  n t, d  |  }  |  j- | |  } |  j. rt } n  t/ |  } | rt$ |  } n- t0 t1 j2 j3 | |  d t } t4 |  } | s.t1 j2 j5 |  r\t d  t6 t1 j2 j3 | |   } t7  n  t j8   r| rt9 | d  } y t: | |  WqqXn | } g  }! | r&| rt
 j; |  _ t j d |  t< |  | | | | d; d< d= d> 	 \ } }! t j d |  q&|  j d t d   n  t j   rB| o<| } n  | r8t
 j= |  _ |  j> t d  d  x t1 j? |  D] \ }" }# }$ |" j( t@  szx |$ D] }% t1 j2 j3 |" |%  }& |& jA | |  }' tB |& |'  \ }( }' |! jC |'  |( s|  j d t d  t6 |&  t6 |'  f  t } PqqWqzqzWn  tD |  | rw| rwtE t1 j2 j3 | |   tF | |!  n  | rtG | t  | rtH | |  j |  jI | | d |  jJ } n d  } | r|  j d t d  t6 |   tK |  qtG | t  qn  d }) d }* | s	t j8   r| r| r| ry tL | | |!  }! Wqt jM tN d  | |  t j d d t d  |  _. qXq| jA d d  } t0 | d  d d t } n  | rd! }+ n  tO |  tO tP |   d }+ t jQ   d k r
tR |  n  | r|  j. r|! rG|  jS |! |  |  jT |  \ } }( n |  jU |  \ } }( |( s|  j d t d"   t } qn  tV |  }, | st j   r	| r	|, r	t
 jW |  _ |  j> t d#  t6 |   |  j d$ t d%  t6 |  d& t tX |, | |  jY | | | |  jZ |+ |  j[ j\ d' d  	 \ }	 }* t] |	  }
 |	 r[	|  j^ }) n  |
 r	|  j d$ t6 |
  d& t q	|  j d$ t d(  t6 |  d& t q	d } d }
 d }* n  | rA
t j_   rA
t j_   d k s
t j_   d k rA
| s
| rA
t` ja | | | | | |  jb |  j |  jc | td |	  |*  qA
n  |) r
|* rZ
d) |* }* n d }* |
 r
|  j d$ d* |* t6 |
  te jf |)  t d+  f d& t q
|  j d$ d, |* te jf |)  t d-  f d& t n  | r
tG | t  n  | r| rtg jh ji |  n+ | r9tj |  jk tl  r9tm jn |  jk  n  | oC| } t jo   r|  jp d k r}tq jh jr |  j^ tq js  n  | rtt d.   tm ju jv jh jw |    }- |- sd  g }- n  x- |- D]" }. tq jh jr |  j^ tq jx |.  qWqn  | rty jz t d/  | d0  t
 j{ |  _ n% ty jz t d1  | d0  t
 j |  _ Wn t jM tN d2  | |  | st j d d t t d3  } n  t d4  t6 |  |  _ ty jz t d1  | d0  t
 j |  _ t } t } t j_   rt` ja | | | | | |  jb |  j |  jc d d d  qn X| r?t| |  } t1 j2 j} |  } n  tO t  j    |  } t~ j   }/ |/ j |  | |  j | |	 |
  |/ j   y; t j d5 | tl |   tm j j jh j |  d6 | Wn3 t jM tN d7  |  j  t j d d t n X| rpy9 t1 j2 j5 |  r9t j d8 |  t | d9 t n  Wqpt jM tN d:  |  t j d d t qpXn  | s| d? k rt |   n  t S(@   NRB   i    i   i   i   g      Y@gMbP?s   %.1f%%s5   Download might fail, only %s of required %s availables1   Download failed - Out of your server's retention?t   Fails   Starting PostProcessing on %ss6    => Repair:%s, Unpack:%s, Delete:%s, Script:%s, Cat:%st   *t
   create_dirs   Cannot create final folder %st   _UNPACK_s   Running unpack_magic on %ss   unpack_magic finished on %st   Unpacks1   No post-processing because of failed verificationt   Movings   ...s   Failed moving %s to %st   priorityt   Downloads   Sent %s to queues   Error renaming "%s" to "%s"s   Traceback: R3   t   _FAILED_t   nis   Failed to move filess   Running scriptt   Scripts   Running user script %st   uniquet   failures   Ran %ss	   Exit(%s) u+   %s%s <a href="./scriptlog?name=%s">(%s)</a>t   Moreu&   %s<a href="./scriptlog?name=%s">%s</a>s   View script outputc         S   s   |  j  S(   N(   t   host(   t   s(    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyt   <lambda>  s    s   Download Completedt   completes   Download Faileds"   Post Processing Failed for %s (%s)s   see logfiles   PostProcessing was aborted (%s)s   Cleaning up %s (keep_basic=%s)R@   s   Cleanup of %s failed.s   Removing workdir %st	   recursives   Error removing workdir (%s)(    (    (    (    (   i   i   (   RR   R=   R'   t   save_attribst   repair_optst
   final_namet   msgidRX   t   allow_streamingt   set_ppR   t   FAILEDt   statust   fail_msgR<   R#   t   lenR   t   precheckt   check_qualityt   floatt   req_completion_ratet   Tt   set_unpack_infot   empty_postproct   scriptt   catR.   R/   t   parringt   safe_postproct   create_group_folderst   addPrefixest   complete_dirRP   t	   dirprefixR   t   configt   get_categoriest   dirt   endswitht   stripR   t   enable_metaR   t   detectt	   sort_fileR
   R   R9   R:   t   joint
   set_markerR;   R   t   IOErrort   folder_renamet   prefixR   t
   EXTRACTINGR    t   MOVINGt   set_action_linet   walkR   t   replaceR   RH   R   t
   del_markert   remove_from_listt   cleanup_listt   nzb_redirectt   ppRi   R   t   rename_and_collapse_folderRL   R6   t   intt   boolt   ignore_samplest   remove_samplest   renamet   movet   rename_with_extR	   t   RUNNINGR   t   filenamet   groupt   nzo_infoRT   t   get_last_lineRC   t   email_endjobt   emailert   endjobt   bytes_downloadedt   unpack_infoR   t   urllibt   quoteR   R*   t   del_bookmarkR7   t   urlt   strR0   t   proxy_rm_bookmarkt   rating_enablet	   encryptedR   t   update_auto_flagt   FLAG_ENCRYPTEDt   mapRZ   R[   t   nzo_serverst   FLAG_EXPIREDt   growlert   send_notificationt	   COMPLETEDt   one_file_or_foldert   normpatht   databaset   get_history_handlet   add_history_dbt   closet   nzbqueuet   NzbQueuet   cleanup_nzot   debugR   t   try_alt_nzb(0   R-   t   startt   all_okt	   par_errort   unpack_errorRN   t   nzb_listt   workdir_completet   postproc_timet
   script_logt   script_linet	   crash_msgt   flag_repairt   flag_unpackt   flag_deleteR   Ry   t   workdirt   tmp_workdir_completet   enought   ratiot	   req_ratiot   emsgt   emsg2R   R   t   re_addt   dirnamet   marker_filet
   one_folderR   t   catdirt   file_sortert   newfilest   roott   dirst   filest   file_R:   t   new_patht   okt   script_outputt
   script_rett
   job_resultt   script_patht   hostsRq   t
   history_db(    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR]      s   
 	 			
		
				
							!%	*,
* 	  &)	0%		$ & 
!c         C   s  |  j  } t j t d  |  j  d  t j d |  t j t |  j	 d t
 pS i  } |  j rq |  j j   } n i  } | j   } t
 } t
 } t |  d k } | rxp| D]}	 t j   d k r d |	 j   k r q n  | j |	 t
  s t j d |	  | |	 }
 t j j t j j |  j |
 j   s:|
 j r t |
 |  | |	 d	 | \ } } | pd| } | r| rt j   rt |  | |	  } n  | | |	 <n q | p| } q q Wn] t j d
 |  |  j d t d  t |   t j   rt |  | d  } | | d <n  | rqt j d |  |  j t  k rKt! |  _ n  t j" j# |   t j$ j% j& j'   n  t j( | t |  j	  t j d |  | | f S(   Ns   Post-processingR   s   Par2 check starting on %sRD   i   i    t   samples   Running repair on set %st   singles   No par2 sets for %st   Repairs   [%s] No par2 setsRB   s   Readded %s to queues   Par2 check finished on %s()   Rx   R   R   R   R.   R/   R0   t	   load_dataR   t   workpathR'   t   partablet   copyt   keysR   RX   R   t   lowerRT   R9   R:   R;   R   R<   R   t	   extraparsR   R   t   try_sfv_checkR   R   Ri   R   R   R   t   add_nzoRZ   R[   R*   R^   t	   save_data(   R-   R   R   t   verifiedt	   par_tablet   repair_setsR   R   R   t   setnamet   parfile_nzft   need_re_addt   res(    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR   8  sP    	!	$
0! c   	      C   s  t  | d  } | j d    t } t } x | D] } | j   t j j |  j   k r2 t } |  j d t	 d   t
 |  } | r t	 d  t t j j |   } | d 7} | d j |  7} |  j d |  t } n |  j d t	 d   | rPqq2 q2 W| s| o| S(   Ns   *.sfvc         S   s   t  |   t  |  S(   N(   R   (   t   xt   y(    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyRs   z  s    R   s   Trying SFV verifications(   Some files failed to verify against "%s"s   ; s%   Verified successfully using SFV files(   R   t   sortR'   R  R9   R:   t   basenameR=   R   R   R   R   R   (	   R-   R   R
  t   sfvsR   t   foundt   sfvt   failedt   msg(    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR  r  s&    $"
	c         C   ss   xl | D]d } | s q n  |  s# Pn  t  j j t  j j |    } | | j   k r t  j j |  |  }  q q W|  S(   N(   R9   R:   R  t   abspathR  R   (   R:   R   t   foldert   basepath(    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR     s    c           C   s   t  j j j j   d k r t  j   t j d t  j t  j	  t  j	 rZ t  j t  j	  n t
 d t  j  j   t  j t j   d t n  d  S(   Ni    s&   Queue has finished, launching: %s (%s)t   targett   new(   R0   R   R   R*   t   activest
   save_stateR.   R/   t   QUEUECOMPLETEACTIONt   QUEUECOMPLETEARGR   R   t   change_queue_complete_actionRX   t   queue_completeR'   (    (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyRV     s    
		c         C   s  t  j   ry t j |   } Wn d } n Xx | D] } t j j |  |  } t j j |  rs t | |  q6 t | |  r6 y! t j	 d |  t j
 |  Wq t j t d  |  t j	 d d t q Xq6 q6 W| ry t |   Wq q Xqn  d  S(   Ns   Removing unwanted file %ss   Removing %s faileds   Traceback: R3   (    (   RX   R   R9   t   listdirR:   R   t   isdirR   R.   R/   RD   RL   R6   R=   R   (   t   wdirt   skip_nzbR   t   fileR:   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR     s*    
c         C   s/   t  j j |   \ } } t  j j | | |  S(   N(   R9   R:   t   splitR   (   R:   t   pret   pt   d(    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR     s    c         C   s   g  } xM t  j |   D]< \ } } }	 x* |	 D]" }
 | j t  j j | |
   q, Wq Wx4 | D], } t  j j |  d j   d k r] d  Sq] Wt |  d k r d  } n  xO | D]G } t	 j
 t  j j |  d | | | | d | d t d t d | q W| S(   Ni   s   .nzbRi   t   keept	   dup_checkt   nzbname(   R9   R   RH   R:   R   t   splitextR  R#   R   t
   dirscannert   ProcessSingleFileR'  R'   (   R$  R-  R   R   R   Ri   R   R   R   t   namest   nameR   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR     s    $"	(c         C   st   t  j j |   rp t  j j |   rp t  j |   } t |  d k rp t  j j |  | d  }  t |   }  qp n  |  S(   Ni   i    (   R9   R:   R;   R#  R"  R   R   R   (   R  t   cont(    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR     s    $c         C   s   |  j  d  } t |  d } x. | d k rO | | j d  rO | d } q" W| | j d  } t |  d k r | d  d } n  | S(   Ns   
i   i    s   	 i   i   s   ...(   R'  R   R   (   t   txtt   linesRl   t   line(    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR     s    #c         C   s   t  j t t  j  } x t j |   D] \ } } } x | D] } | j |  r; t j j | |  }  y! t	 j
 d |   t j |   Wq t	 j t d  |   t	 j
 d d t q Xq; q; Wq% Wd  S(   Ns    Removing unwanted sample file %ss   Removing %s faileds   Traceback: R3   (   t   ret   compileR   t   IR9   R   t   searchR:   R   R.   R/   RD   RL   R6   R=   (   R:   t	   RE_SAMPLER   R   R   R   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR      s    c         C   s  |  } t  |   } t |  d k r | d } t j j |  d } t j j |  r | d k r t j d t j j | |   | }  q n  t j j	 |   }  t j j	 |  } g  | D]$ } t j j	 |  j
 |  |  ^ q } t |  |  y t |  Wn n X| S(   Ni   i    t   VIDEO_TSt   AUDIO_TSs   Collapsing %s(   R<  R=  (   R   R   R9   R:   R'  R#  R.   R/   R   R   R   R   R   (   t   oldpatht   newpathR   t   orgpatht   itemst   folder_pathR  t   f(    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR     s"    
1c         C   s   t  j   } | r t j j |  |  } t j d |  y t | d  } | j   Wq t j	 d |  t j	 d d t
 d  } q Xn  | S(   Ns   Create marker file %st   ws   Cannot create marker file %ss   Traceback: R3   (   RX   R   R9   R:   R   R.   R   t   openR   R/   R=   R#   (   R  R2  R:   t   fp(    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR   +  s    c         C   sm   |  ri t  j j |   ri t j d |   y t  j |   Wqi t j d |   t j d d t qi Xn  d  S(   Ns   Removing marker file %ss   Cannot remove marker file %ss   Traceback: R3   (   R9   R:   R;   R.   R   RD   R/   R=   (   R:   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR   ;  s    c         C   sb   |  r^ xU t  t |   D]> } | | j |   r t j d | |  | j |  d  Sq Wn  d  S(   Ns
   Popping %s(   t   xrangeR   R   R.   R   t   pop(   R2  t   lstRl   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR   F  s    c         C   sP   |  j  j d  } | rL t j   rL t j | |  j |  j |  j |  j	  n  d  S(   NRo   (
   R   RT   RX   t   new_nzb_on_failureR0   t   add_urlR   R   R   Ri   (   R-   R   (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyR   N  s    (M   R9   R%   R.   R0   R   RR   R7  t   sabnzbd.newsunpackR    R   R   R   t	   threadingR   t   sabnzbd.miscR   R   R   R   R	   R
   R   R   R   R   R   R   R   t   sabnzbd.tvsortR   t   sabnzbd.constantsR   R   R   R   R   R   R   R   t   sabnzbd.encodingR   R   t   sabnzbd.newzbinR   t   sabnzbd.ratingR   t   sabnzbd.emailerR   t   sabnzbd.dirscannerR/  t   sabnzbd.downloadert   sabnzbd.configR   t   sabnzbd.cfgRX   t   sabnzbd.nzbqueuet   sabnzbd.databaseR   t   sabnzbd.growlerR   R   R]   R   R  R   RV   R   R   R   R   R   R   R   R   R   R   R   (    (    (    s$   /var/www/SABnzbd/sabnzbd/postproc.pyt   <module>   sP   "X:	 o	:							
						