
oTc           @   s  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 d  d l m	 Z	 y d  d l
 Z
 e
 j Z Wn d  d l Z e j Z n Xd  d l Z d  d l m Z m Z m Z m Z m Z m Z d  d l m Z d  d l j Z d  d l m Z d  d l m Z d  d l Z d  d l m  Z  m! Z! d  d	 l" m# Z# m$ Z$ m% Z% d  d
 l& m' Z' d e f d     YZ( d   Z) d   Z* e+ d  Z, d   Z- e j. d e j/  Z0 d   Z1 d   Z2 d   Z3 d   Z4 d   Z5 d S(   iN(   t   Thread(   t   sleep(   t   get_filepatht   sanitize_filenamet   get_unique_patht   renamert   set_permissionst	   flag_file(   t   QCHECK_FILE(   t   ArticleCache(   t   PostProcessor(   t   RarFilet
   is_rarfile(   t   latin1t   unicodert   is_utf8(   t   Ratingt	   Assemblerc           B   s5   e  Z d Z d d   Z d   Z d   Z d   Z RS(   c         C   s;   t  j |   | r | |  _ n t j   |  _ |  t _ d  S(   N(   R    t   __init__t   queuet   QueueR   t   do(   t   selfR   (    (    s%   /var/www/SABnzbd/sabnzbd/assembler.pyR   6   s
    c         C   s   |  j  d   d  S(   N(   t   processt   None(   R   (    (    s%   /var/www/SABnzbd/sabnzbd/assembler.pyt   stop?   s    c         C   s   |  j  j |  d  S(   N(   R   t   put(   R   t   job(    (    s%   /var/www/SABnzbd/sabnzbd/assembler.pyR   B   s    c         C   sN  d d  l  } x;|  j j   } | s5 t j d  Pn  | \ } } | r| j   t | j  } | | _ | j |  } t	 t
 j j   | |  } | rFt j d | | j  y t | | |  } Wn t k
 rC\ } }	 | j r q^| d k rt j t d   n t j t d  t |   | j j j j d t  n t j d d	 t Pn X| j   | j }
 | j r| j j |
  d  k rt |  d
 } | r| | j |
 <t j  d |
  qn  t! | |  rkt
 j"   d k rt j# t d  t | j$   | j   qkt j# t d  t | j$   t% d  | _& d d  l  } | j' j( j j) |  n  t* |  } | rOt j# t d  t | j$  |  t j  t d  |  t
 j+   d k r| j, d
 k rt j  d  d | _, | j   n  t
 j+   d k rOt j  d  t% d  | _& d d  l  } | j' j( j j) |  qOn  t- |  \ } } | d k rt j# t d  t | j$  |  | j   nf | d k rt j# t d  t | j$  |  t% d  | | _& d d  l  } | j' j( j j) |  n  t | _. qFq | j' j( j j/ | j0 d t d t t1 j j2 |  q Wd  S(   Nis   Shutting downs   Decoding %s %si   s   Disk full! Forcing Pauses   Disk error on creating file %st   saves   Fatal error in Assemblert   exc_infoi    s   Got md5pack for set %si   s6   WARNING: Paused job "%s" because of encrypted RAR files7   WARNING: Aborted job "%s" because of encrypted RAR files   Aborted, encryption detectedsE   WARNING: In "%s" unwanted extension in RAR file. Unwanted file is %s s$   Unwanted extension is in rar file %ss   Unwanted extension ... pausingi   s   Unwanted extension ... abortings$   Aborted, unwanted extension detecteds/   WARNING: Paused job "%s" because of rating (%s)s0   WARNING: Aborted job "%s" because of rating (%s)s#   Aborted, rating filter matched (%s)t   add_to_historyt   cleanup(3   t   sabnzbd.nzbqueueR   t   gett   loggingt   infot   CheckFreeSpaceR   t   filenamet   check_for_dupeR   t   cfgt   download_dirt   get_patht   typet	   _assemblet   IOErrort   deletedt   errort   TaR   t
   downloadert
   DownloaderR   t   pauset   Falset   Truet   remove_admint   setnamet   is_par2t   md5packsR   t   GetMD5Hashest   debugt   check_encrypted_rart   pause_on_pwrart   warningt
   final_namet   Tt   fail_msgt   nzbqueuet   NzbQueuet   end_jobt   rar_contains_unwanted_filet   action_on_unwanted_extensionst   unwanted_extt   nzo_filtered_by_ratingt	   completedt   removet   nzo_idR
   R   (   R   t   sabnzbdR   t   nzot   nzfR%   t   dupet   filepatht   errnot   strerrorR6   t   packt   unwantedt   filtert   reason(    (    s%   /var/www/SABnzbd/sabnzbd/assembler.pyt   runE   s    
		
	!"!	""%N(   t   __name__t
   __module__R   R   R   R   R   RV   (    (    (    s%   /var/www/SABnzbd/sabnzbd/assembler.pyR   3   s
   			c         C   s  t  j j |  r= t |  } | r- | } q= t | |  n  t | d  } t j   rd t   } n d  } |  j
 } |  j } x| D]} t d  | | }	 t j j |	  }
 |
 s t j t d  |	  q | d k r | j |
  | rD| j |
  qDq | d k r |
 j d  }
 g  } x |
 D] } | s:q(n  | d k s(| j d  r[q(n  y  t j |  } | j |  Wq(t j k
 r
} t | d	  d
 d @d d d } y$ t j | |   } | j |  Wqt j k
 r} t j d |	 j |  qXq(Xq(Wd j |  }
 | j |
  | rD| j |
  qDq q W| j   | j   t  |  | r| j!   |  _" ~ n  | S(   Nt   abgMbP?s
   %s missingt   yenct   uus   
s   -- s   Posted via i    i    i?   i   i   i   s   Decode failed in part %s: %st    (#   t   ost   patht   existst   get_unique_filenameR   t   openR'   t   quick_checkt   new_md5R   R*   t   decodetableR   R	   R   t   load_articleR"   R#   R/   t   writet   updatet   splitt
   startswitht   binasciit   a2b_uut   appendt   Errort   ordt   articlet   joint   flusht   closeR   t   digestt   md5sum(   RM   R^   RN   t   unique_patht   foutt   md5t   _typeRd   t
   articlenumRo   t   datat   chunkst   linet   tmpdatat   msgt   nbytes(    (    s%   /var/www/SABnzbd/sabnzbd/assembler.pyR+      sd    			

 $" 


c         C   sY   t  } |  j } xC | D]; } t d  | | } t j j |  } | r t } q q W| S(   Ng{Gz?(   R3   Rd   R   R	   R   Re   R4   (   RM   t   hasRd   Ry   Ro   Rz   (    (    s%   /var/www/SABnzbd/sabnzbd/assembler.pyt   file_has_articles   s    	

c         C   s<  t  } i  } | s2 t t j j |   d t  r2y t |  d  } Wn | | f SXt } yg | j d  } xQ | r t	 | |  \ } } | t
 |  O} | r | | | <n  | j d  } qq WWn_ t j t f k
 r t j d |   i  } n0 t j d |   t j d d t  i  } n X| j   n  | | f S(   Ni    t   rbi   s1   Cannot use corrupt par2 file for QuickCheck, "%s"s$   QuickCheck parser crashed in file %ss   Traceback: R   (   R4   R   R]   R^   Rh   R   Ra   R3   t   readt   ParseFilePacketR   t   structR.   t
   IndexErrorR"   R#   R:   Rr   (   t   fnamet   forcet   new_encodingt   tablet   ft   headert   namet   hash(    (    s%   /var/www/SABnzbd/sabnzbd/assembler.pyR9      s2    &		
c   
      C   s  d } | d k r | St j d |  j d   d } t | d  d | k s[ | d k  r_ | S|  j d  } |  j | d  } t   } | j |  | | j   k r | Sxg t d | d  D]S } | | | d !d	 k r | | d | d
 !} | | d j	 d  }	 |	 | f Sq W| S(   Ns   PAR2 PKTs   <Qi   i    i   i   i   i    s   PAR 2.0 FileDesci0   iH   s    (   NN(
   R   R   t   unpackR   t   intRc   Rg   Rs   t   ranget   strip(
   R   R   t   nothingt   lenRt   Rz   Rw   t   offsetR   R%   (    (    s%   /var/www/SABnzbd/sabnzbd/assembler.pyR     s$    &	s/   \W+sub|subs|subpack|subtitle|subtitles(?![a-z])c         C   s  t  t j j |   d  j   } t j j |  d } x | D] } t j j | j    d } t j j t  |   \ } } | d k r | j |  r t |  t |  d k  r t |  d k  r t j	 |  r t
 j d |  t Sd | k r? t
 j d | |  t Sq? Wt S(	   Ni   i    u   .rari   i   sG   File %s is probably encrypted due to RAR with same name inside this RARt   passwords7   RAR %s is probably encrypted: "password" in filename %s(   R   R]   R^   Rh   t   lowert   splitextRi   R   t   RE_SUBSt   searchR"   R:   R4   R3   (   R^   t   namesR   R   t   ext(    (    s%   /var/www/SABnzbd/sabnzbd/assembler.pyt
   is_cloaked>  s    "Yc         C   s   t  } |  j r |  j j d  r t j   r t |  r yx t | d t } | j	 pk t
 | | j    } | r t |  j	  d k  r |  j r d |  _	 n t  } | j   ~ Wq t j d |  q Xn  | S(   NR   t	   all_namesi   i   s   RAR file %s cannot be inspected(   R3   R   t   metaR!   R'   R<   R   R   R4   t	   encryptedR   t   namelistR   t   reuseRr   R"   R:   (   RL   RO   R   t   zf(    (    s%   /var/www/SABnzbd/sabnzbd/assembler.pyR;   N  s    5%
c         C   s   d  } t |   r y t |  d t } x{ | j   D]m } t j d |  t j j	 |  d j
 d d  j   t j   k r4 t j d |  | } | j   q4 q4 WWq t j d |   q Xn  | S(   NR   s   file in rar file: %si   t   .R\   s   Unwanted file %ss    RAR file %s cannot be inspected.(   R   R   R   R4   R   R"   R:   R]   R^   R   t   replaceR   R'   t   unwanted_extensionsRr   (   RO   RS   R   t   somefile(    (    s%   /var/www/SABnzbd/sabnzbd/assembler.pyRD   `  s    4c         C   s   t  j r t j   r t j   r |  j d k  r t  j j |  j  } | d  k	 r d |  _ t | |  j	 j
   t  } | d  k	 r d | f St | |  j	 j
   t  } | d  k	 r d | f Sq n  d S(   Ni   i   i    R\   (   i    R\   (   R   R   R'   t   rating_enablet   rating_filter_enablet   rating_filteredt   get_rating_by_nzoRJ   R   R%   R   R4   R3   (   RL   t   ratingRU   (    (    s%   /var/www/SABnzbd/sabnzbd/assembler.pyRG   v  s    0	 
 c            s*   f d     | r! t  j   n	 t  j   } | r? t  j   n	 t  j   } | r] t  j   n	 t  j   } | r{ t  j   n	 t  j   } | r t  j	   n	 t  j
   } | r t  j   n	 t  j   } | r t  j   n	 t  j   }	 | r t  j   n	 t  j   }
 | d k r3|  j d k r3|  j | k r3t d  S| d k rg|  j d k rg|  j | k rgt d  S| r|  j d k s|  j s| r|  j rt d  S| r|  j d k s|  j s| r|  j rt d  S|	 r|  j |  j k  rt d  St   f d   |
 j d	  D  r&t d
  Sd  S(   Nc            s.   |  j    j   } t |  d k o- |   k S(   Ni    (   R   R   R   (   t   keywordt   clean_keyword(   R%   (    s%   /var/www/SABnzbd/sabnzbd/assembler.pyt   check_keyword  s    i    t   videot   audiot   spamt
   passwordedt	   downvotedc         3   s   |  ] }   |  Vq d  S(   N(    (   t   .0t   k(   R   (    s%   /var/www/SABnzbd/sabnzbd/assembler.pys	   <genexpr>  s    t   ,t   keywords(   R'   t   rating_filter_abort_audiot   rating_filter_pause_audiot   rating_filter_abort_videot   rating_filter_pause_videot   rating_filter_abort_spamt   rating_filter_pause_spamt    rating_filter_abort_spam_confirmt    rating_filter_pause_spam_confirmt   rating_filter_abort_encryptedt   rating_filter_pause_encryptedt%   rating_filter_abort_encrypted_confirmt%   rating_filter_pause_encrypted_confirmt   rating_filter_abort_downvotedt   rating_filter_pause_downvotedt   rating_filter_abort_keywordst   rating_filter_pause_keywordst	   avg_videoR?   t	   avg_audiot   avg_spam_cntt   avg_encrypted_confirmt   avg_spam_confirmt   avg_encrypted_cntt   avg_vote_upt   avg_vote_downt   anyRh   R   (   R   R%   t   abortR   R   R   t   spam_confirmR   t   encrypted_confirmR   R   (    (   R   R%   s%   /var/www/SABnzbd/sabnzbd/assembler.pyR     s,    *
*
-
-

%
(6   R]   R   Rj   R"   R   t   ret	   threadingR    t   timeR   t   hashlibRw   Rc   t   newRK   t   sabnzbd.miscR   R   R   R   R   R   t   sabnzbd.constantsR   t   sabnzbd.cfgR'   t   sabnzbd.articlecacheR	   t   sabnzbd.postprocR
   t   sabnzbd.downloadert   sabnzbd.utils.rarfileR   R   t   sabnzbd.encodingR   R   R   t   sabnzbd.ratingR   R   R+   R   R3   R9   R   t   compilet   IR   R   R;   RD   RG   R   (    (    (    s%   /var/www/SABnzbd/sabnzbd/assembler.pyt   <module>   sD   .i	D	"	)				