
    hhC                     v   d 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mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlZddlZ G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          ZdS )z2
Provides base classes for managing system calls.
    )	MythErrorMythDBErrorMythFileError)MythLog)DictDataOrdDict)levenshteinDequeBuffer)DBCache)Popen)select)etree)sleepNc                   |    e Zd ZdZdZ G d de          Zedd            Zdd	Z	d
 Z
d Zd Zd Zd Zd Zd ZdS )Systemz
    System(path=None, setting=None, db=None) -> System object

    'path' sets the object to use a path to an external command
    'setting' pulls the external command from a setting in the database
    zPython system call handlerc                        e Zd Zd Zd Zd ZdS )System.Processc                 >   || _         || _         |t          j        t          j        d|           |st          j        |          }t          |dd|          | _        t          | j        j
                  | _
        t          | j        j                  | _        d S )NzRunning external command)stdoutstderrshell)inp)cmdlogr   SYSTEMINFOshlexsplitr   _fdr
   r   r   )selfr   useshellr   s       //usr/lib/python3/dist-packages/MythTV/system.py__init__zSystem.Process.__init__   s    DHDHC.H#NNN 'k#&&SBhGGGDH%$(/:::DK%$(/:::DKKK    c                 4    | j                                         S N)r    pollr!   s    r#   r(   zSystem.Process.poll*   s    8==??"r%   c                     | j                                         }	 | j        j        r| j        j        rnt          d           )| j                                         S )NTg{Gz?)r    waitr   _closedr   r   )r!   ress     r#   r+   zSystem.Process.wait-   sT    (--//C;& 4;+> d	
 8==??"r%   N)__name__
__module____qualname__r$   r(   r+    r%   r#   Processr      sA        
	; 
	; 
	;	# 	# 	#	# 	# 	# 	# 	#r%   r2   Nc                 N   |                     dd          }|d         }d}t          |          dk    r|d         }	  | ||          } ||          }t          |          r?|                    t          j        t          j        d|                    d                     t          |j                  rD|                    t          j        t          j        d|j                            d                     dS # t          t          f$ r Y d	S t          $ r
 |j        cY S w xY w)
N    r    dbz---- Output ----zutf-8z---- Error  ----r   )r   lenr   r   r   DEBUGdecoder   r   r   r   
returncode)clscommandr8   pathargssr-   s          r#   systemzSystem.system6   s.   --A&&qzw<<!1:D	 DR   A!D''C3xx ^gngm5GT[I\I\]]]18}} ]gngm/A18??SZC[C[] ] ]1M* 	 	 	22 	  	  	 <	 s   B>C= =D$D$#D$Tr6   c                 @   t          j        | |           t          | j        |           | _        d | _        |{|                                 }| j        |         |         | _        | j        | j        d         |         | _        | j        || _        | j        t          t          j
        ||          | j        |t          d          || _        |r*t          j                            || j                  | _        | j                                        d         }| j                            d          r/t          j        |t          j                  st#          d          nt          j        d                             d          D ]k}t          j        t          j                            ||          t          j                  r,t          j                            || j                  | _         nlt#          d          d| _        d	| _        || _        d S )
Nr7   NULLzInvalid input to System()r   /z'Defined executable path does not exist.PATH:r6   )r   r$   r   	logmoduler   r?   gethostnamesettingsr   r   
DB_SETTINGosjoinr   
startswithaccessF_OKr   environr<   r   r"   )	r!   r?   settingr8   r"   prefixhostr   folders	            r#   r$   zSystem.__init__L   s   "%%%%4>d333	##%%Dd+G4DIy  M&1':	y  	y !)"6FFF9| ;<<<DI 	8VTY77DIioo"9$$ 	O9S"'** O#$MNNNO *V,22377 O O9RW\\&55rw??  "VDI > >DIE $$MNNN r%   c                      | j         | S r'   )r>   r!   r@   s     r#   __call__zSystem.__call__z   s    ldlD&99r%   c                     | j         dk    rdS | j         dd                    d |D                       }|                     |          S )ax  
        obj(*args) -> output string

        Executes external command, adding one or more strings to the
            command during the call. If call exits with a code not
            equal to 0, a MythError will be raised. The error code and
            stderr will be available in the exception and this object
            as attributes 'returncode' and 'stderr'.
        r6   r4   c                     g | ]}d |z  S z%sr1   .0as     r#   
<listcomp>z"System.command.<locals>.<listcomp>       -E-E-E1dQh-E-E-Er%   )r?   rM   _runcmdr!   r@   r   s      r#   r>   zSystem.command|   sT     9??2CHH-E-E-E-E-E$F$F$FG||C   r%   c                 f   |                      || j        | j                  }|                                 |                                | _        |j                                        | _        | j        r&t          t          j	        | j        || j                  |j
                                        S r'   )r2   r"   r   r+   r(   r<   r   readr   r   r   )r!   r   ps      r#   ra   zSystem._runcmd   s~    LLdmTX66	&&((hmmoo? 	NI,T_SMMMx}}r%   c           
          dt          | j                                      d          d                             d          d         d| j        dt	          t          |                     dS )	N<'r5   .r   z 'z' at >)str	__class__r   r?   hexidr)   s    r#   __str__zSystem.__str__   sb     T^$$**3//288==bAAAIIIs2d88}}}}. 	.r%   c                      t          |           S r'   )rk   r)   s    r#   __repr__zSystem.__repr__   s    4yyr%   c                 f    | xj         dd                    d |D                       z   z  c_         dS )z
        obj.append(*args) -> None

        Permenantly appends one or more strings to the command
            path, separated by spaces.
        r4   c                     g | ]}d |z  S r[   r1   r\   s     r#   r_   z!System.append.<locals>.<listcomp>   s    ":":":4!8":":":r%   N)r?   rM   rW   s     r#   appendzSystem.append   s8     			S":":T":":":;;;;				r%   c                     | j         dk    rdS | j         dd                    d |D                       }|                     || j        | j                  S )Nr6   r4   c                     g | ]}d |z  S r[   r1   r\   s     r#   r_   z$System._runasync.<locals>.<listcomp>   r`   r%   )r?   rM   r2   r"   r   rb   s      r#   	_runasynczSystem._runasync   sZ    9??2CHH-E-E-E-E-E$F$F$FG||C999r%   r'   )NNNTr6   )r.   r/   r0   __doc__rH   objectr2   classmethodrB   r$   rX   r>   ra   ro   rq   rt   rw   r1   r%   r#   r   r      s          -I# # # # #6 # # #2       [ *,! ,! ,! ,!\ :99! ! !	 	 	. . .
  < < <: : : : :r%   r   c            
          e Zd Zi ddddddddddddd	dd
dddddddddddddddddddi ddddddddddddddddddd dd!dd"dd#dd$dd%dd&dd'dddddddddd(Z G d) d*e          Z G d+ d,e          Z G d- d.e          Z G d/ d0e          Z	 G d1 d2e          Z
 G d3 d4e          Z G d5 d6e          Z G d7 d8e          Zd?d:Zd; Zd< Zd= Zd> Zd9S )@Metadatatitle   subtitletaglinedescriptionseasonr   episode	dvdseason
dvdepisode
albumtitlerB   inetrefimdbtmsrefcollectionrefhomepagetrailerlanguagereleasedate   lastupdated   
userratingr5   tracnum
popularitybudgetrevenueyearruntimeruntimesecsfilenamechanidchannumcallsignchannameplaybackfiltersrecgroup)	playgroupseriesid	programidstarttsendtsstoragegroup
recstarttsrecendtsc                       e Zd Zd Zd ZdS )Metadata._subgroup_namec                     t                               |            |d S t          |          D ]"}|                     |j        d                    #d S Nname)listr$   rt   attribr!   xmlitems      r#   r$   z Metadata._subgroup_name.__init__   sX    MM${FFS		 1 1DK/00001 1r%   c                     t          j        | j        j                                                  }| D ]F}t          j        | j                  }|                    d|           |                    |           G|S r   )r   Elementrl   r.   lower_subnamesetrt   )r!   erootr   es       r#   toXMLzMetadata._subgroup_name.toXML   sl    M$."9"?"?"A"ABBE    M$-00fd###QLr%   Nr.   r/   r0   r$   r   r1   r%   r#   _subgroup_namer      s2        	1 	1 	1
	 	 	 	 	r%   r   c                       e Zd Zd Zd ZdS )Metadata._subgroup_allc                     t                               |            |d S t          |          D ];}|                     t          |j                                                             <d S r'   )r   r$   rt   r   r   itemsr   s      r#   r$   zMetadata._subgroup_all.__init__   sg    MM${FFS		 : :GDK$5$5$7$7889999: :r%   c                 ,   t          j        | j        j                                                  }| D ]`}t          j        | j                  }|                                D ]\  }}|                    ||           |                    |           a|S r'   )	r   r   rl   r.   r   r   r   r   rt   )r!   r   r   r   kvs         r#   r   zMetadata._subgroup_all.toXML   s    M$."9"?"?"A"ABBE    M$-00::<<  CAaEE!AJJJJQLr%   Nr   r1   r%   r#   _subgroup_allr      s2        	: 	: 	:
	 	 	 	 	r%   r   c                       e Zd Zd Zd ZdS )Metadata.Certificationsc                     t          j        |            |d S t          |          D ]}|j        d         | |j        d         <   d S )Nr   locale)r   r$   r   r   )r!   r   certs      r#   r$   z Metadata.Certifications.__init__   sZ    T"""{FFS		 B B.2k&.AT[*++B Br%   c                    t          j        d          }|                                 D ]Z\  }}t          j        d          }|                    d|           |                    d|           |                    |           [|S )Ncertificationscertificationr   r   )r   r   r   r   rt   )r!   r   r   r   r   s        r#   r   zMetadata.Certifications.toXML   sz    M"233Ezz||    !M/22h"""fa   QLr%   Nr   r1   r%   r#   Certificationsr      s5        	B 	B 	B
	 	 	 	 	r%   r   c                       e Zd ZdZdS )Metadata.CategoriescategoryNr.   r/   r0   r   r1   r%   r#   
Categoriesr      s        :r%   r   c                       e Zd ZdZdS )Metadata.CountriescountryNr   r1   r%   r#   	Countriesr      s        )xxxr%   r   c                       e Zd ZdZdS )Metadata.StudiosstudioNr   r1   r%   r#   Studiosr      s        XXXr%   r   c                       e Zd ZdZdS )Metadata.PeoplepersonNr   r1   r%   r#   Peopler      s        h888r%   r   c                       e Zd ZdZdS )Metadata.ImagesimageNr   r1   r%   r#   Imagesr      s        g888r%   r   Nc                     t                               |            |                                  ||                     |           d S d S r'   )dictr$   	_fillNone_process)r!   r   s     r#   r$   zMetadata.__init__   sH    d?MM# ?r%   c                     || j         vrt          t          |                    | j        |         dv rt                              |          }t                              | ||           d S )N)   r   )_field_orderKeyErrorrk   _global_typedatetimeduckr   __setitem__)r!   keyvalues      r#   r   zMetadata.__setitem__   sf    d'''s3xx(((S!U**MM%((EsE*****r%   c                     t          j        |            | j        D ]5} t          | |                                          d           | j        |<   6d S r'   )r   r   _groupsgetattr
capitalize__dict__)r!   subgroups     r#   r   zMetadata._fillNone   s`    4    	; 	;H4h113344T:: M(##	; 	;r%   c                    t          |          D ]}	 |j        | v rQ|j        dk    s|j        d | |j        <   n | j        | j        |j                          |j                  | |j        <   nK|j        | j        v r= t          | |j                                                  |          | j        |j        <   #  Y xY wd S )Nr6   )	r   tagtext_transr   r   r   r   r   r!   r   elements      r#   r   zMetadata._process  s    Cyy 	 	G;$&&**0D,0W[)) !LD,=gk,J K%,\!3 !3 W[)) [DL00?gk&<&<&>&>??HH M'+.DD	 	s   B%B99B=c                    t          j        d          }|                                 D ]Y\  }}| | j        | j        |                  |          }t          j        |          }||_        |                    |           Z| j        D ]M}|                     |          }t          |          r'|                    |
                                           N|S Nr   )r   r   r   
_inv_transr   r   rt   r   __getattr__r9   r   )r!   r   r   r   r   groups         r#   r   zMetadata.toXML  s    f%%::<< 	 	CAay5 1! 45a88Aa  AAFLLOOOO\ 	, 	,E$$U++E5zz ,U[[]]+++r%   r'   )r.   r/   r0   r   r   r   r   r   r   r   r   r   r   r   r$   r   r   r   r   r1   r%   r#   r|   r|      sM       FGA FJq F	! F!!F$,QF8A!FF$0F8DQF QF %.aF 9?qF Q	F %4A	F 9C1	F
 aF
 %/qF F
 9FaF "!F %1F 9B!F !F %-QF 9B!F 1F %.aF 9FaF qF %-QF 9B!F qF %/qF 9J!F qF F 121 !a#$!1F F FL    $              '    >====n===;;;;;^;;;88888>88866666-66655555-555   + + +; ; ;      r%   r|   c                   $    e Zd Zg dZg dZd ZdS )VideoMetadata)&r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
categories	countriesstudiospeopleimagesc                    t                               | |           t          | j                  pt          | j                   }| j        D ]}|r| j        d|j        d|_        nJ|j        dk    r#d| j        | j        | j        |j        fz  |_        nd| j        | j        |j        fz  |_        |xj        |j	        
                    dd          d         z  c_        d S )N_ri   
screenshotz%s Season %dx%d_%s.z%s Season %d_%s.r5   r   )r|   r   boolr   r   r	  r}   typer   urlrsplit)r!   r   isMovier   s       r#   r   zVideoMetadata._process,  s    $$$$DL))>T$+->->?[ 
	: 
	:E ?-1ZZZ!D:--%:*dk4<L&MENN &8*dk5:>&?ENNNei..s155b99NNN
	: 
	:r%   N)r.   r/   r0   r   r   r   r1   r%   r#   r  r     sE             L, , ,G: : : : :r%   r  c                       e Zd Zg dZg dZdS )MusicMetadata)r}   r   
albumtitier   r   r   r   r   r   r   r   r   r  Nr.   r/   r0   r   r   r1   r%   r#   r  r  ;  s0        7 7 7L, , ,GGGr%   r  c                       e Zd Zg dZg dZdS )GameMetadata)r}   r   rB   r   r   r   r   )r   r  r  r  r	  Nr  r1   r%   r#   r  r  B  s*        ) ) )LLLLGGGr%   r  c                   "    e Zd Zg dZd Zd ZdS )InternetMetadata)r}   r   authorpubDater   linkplayer
playerargsdownloaddownloadargs	thumbnailcontentr  lengthdurationwidthheightlangratingr   r   r   c                 .    t          j        |            d S r'   )r   r   r)   s    r#   r   zInternetMetadata._fillNoneL  s    +D11111r%   c                    t          |                                          D ]e}|j        | v r|j        | |j        <   |j                            d          d         | v r(|j        | |j                            d          d         <   fd S )NrG   r   )r   iterr   r   r   r   s      r#   r   zInternetMetadata._processM  s    CHHJJ'' 	@ 	@G{d""$+LW[!!""3''+t333:<W[&&s++B/0		@ 	@r%   N)r.   r/   r0   r   r   r   r1   r%   r#   r  r  G  sG        K K KL 211@ @ @ @ @r%   r  c                   <     e Zd Zd Z fdZddZd	dZd
dZ xZS )Grabberc              #      K   	 t          j        |          }n#  t          xY wt          |                    d                    D ]}|                     |          V  d S r   )r   
fromstringStopIterationr   r+  r=   r   s      r#   _processMetadatazGrabber._processMetadataU  sr      	 "3''CC	 &))** 	! 	!D((4..    	! 	!s    	"c                 d    |                       t          t          |           j        |           S r'   )r1  superr-  r>   )r!   r@   rl   s     r#   r>   zGrabber.command^  s,    $$%AU7D%9%9%A4%HIIIr%   Nc              #   H  K   |s	|d }nd }|2t          | j        j        j                            dd                    }||                     dd|d|d          }n|                     d	d
|z            }|D ]$} ||||          |_        |j        |k    r |V  %dS )ah  
        obj.search(phrase, subtitle=None, tolerance=None) -> result generator

            Returns a generator of results matching the given search
                phrase.  A secondary phrase can be given through the
                'subtitle' parameter, and an optional levenshtein
                tolerance value can be given for filtering results.
        Nc                 ,    t          |j        |          S r'   )r	   r   re   rA   rs      r#   <lambda>z Grabber.search.<locals>.<lambda>l  s    [Q%?%? r%   c                 x    |j         t          |j        d|j         |           nt          |j        |           S )Nz : )r   r	   r}   r6  s      r#   r8  z Grabber.search.<locals>.<lambda>n  sO    +,:+A &1-.WWWQZZ2ABC&E &E &E -8,C,C r%   MetadataLookupTolerancer   z-N"z" "z-Mz"%s")intr8   rJ   rD   getr>   r	   )r!   phraser   	tolerancefuncr-   r7  s          r#   searchzGrabber.searcha  s        	D#??D D
 DG,1(+,Eq(I(IK KI,,ttFFFHHH%EFFCC,,tVf_55C 	 	A D155AM}y((GGGG		 	r%   c                 P    t          |                     |||          d           S )zj
        Behaves like obj.search(), but sorts results based off
            levenshtein distance.
        c                     | j         S r'   )r	   )r7  s    r#   r8  z&Grabber.sortedSearch.<locals>.<lambda>  s    am r%   )r   )sortedrA  )r!   r>  r   r?  s       r#   sortedSearchzGrabber.sortedSearch  s3    
 dkk&(I>>335 5 5 	5r%   Fc                 Z   	 |j         |j        |j        |j         |j        f}n|j        f}n#  |||||f}n|f}Y nxY wt          |          }|d                             d          d         |d<   |rt           | j        dg|R            S t           | j        dg|R            S )aL  
        obj.grabInetref(inetref, season=None, episode=None, search_collection=False)
                -> metadata object

            Returns a direct search for a specific movie or episode.
            'inetref' can be an existing VideoMetadata object, and
                this method will return a fully populated object.
        Nr   r  r   z-Cz-D)r   r   r   r   r   nextr>   )r!   r   r   r   search_collectionr@   s         r#   grabInetrefzGrabber.grabInetref  s    		"*1LI)	"")<1zDzzq'--$$R(Q 	3T1D111222T1D111222s   +. ?)NNN)NN)NNF)	r.   r/   r0   r1  r>   rA  rE  rI  __classcell__)rl   s   @r#   r-  r-  T  s        ! ! !J J J J J   @5 5 5 53 3 3 3 3 3 3 3r%   r-  c                        e Zd ZdZddZd ZdS )SystemEventz
    SystemEvent(eventname, db=None) -> SystemEvent object

    External function handler for system event messages.
        'eventname' is the event name sent in the BACKEND_MESSAGE message.
    Nc                     dd                     d |                    d          D                       z   }	 t                              | ||           d S # t          $ r d| _        Y d S   xY w)NEventCmdr6   c                 6    g | ]}|                                 S r1   )r   )r]   r   s     r#   r_   z(SystemEvent.__init__.<locals>.<listcomp>  s     FFFQ\\^^FFFr%   r  )rR   r8   )rM   r   r   r$   r   r?   )r!   eventr8   rR   s       r#   r$   zSystemEvent.__init__  s    RWWFFU[[5E5EFFFH H H	OOD'bO99999 	 	 	DIIII	s   A A,*A,c                    | j         dk    rdS | j         }d|v r|d                             |          }dD ]7}||v r1|                    d|                                z  ||                   }8|                     |          S )ay  
        obj(eventdata) -> output string

        Executes external command, substituting event information into the
            command string. If call exits with a code not
            equal to 0, a MythError will be raised. The error code and
            stderr will be available in the exception and this object
            as attributes 'returncode' and 'stderr'.
        r6   Nprogram)sendercardidsecsz%%%s%%)r?   	formatJobreplaceupperra   )r!   	eventdatar   r^   s       r#   r>   zSystemEvent.command  s     9??Fi	!!I&0055C+ 	F 	FAI~~kk(QWWYY"6	!EE||C   r%   r'   )r.   r/   r0   rx   r$   r>   r1   r%   r#   rL  rL    sA         	 	 	 	! ! ! ! !r%   rL  ) rx   MythTV.exceptionsr   r   r   MythTV.loggingr   MythTV.altdictr   r   MythTV.utilityr	   r
   MythTV.databaser   
subprocessr   r   lxmlr   timer   r   rL   r   r|   r  r  r  r  r-  rL  r1   r%   r#   <module>rb     sc    D C C C C C C C C C " " " " " " , , , , , , , , 3 3 3 3 3 3 3 3 # # # # # #                          				W: W: W: W: W:g W: W: W:rq q q q q q q qf: : : : :X : : :6, , , , ,X , , ,M M M M MH M M M
@ @ @ @ @ @ @ @N3 N3 N3 N3 N3v N3 N3 N3`$! $! $! $! $!6 $! $! $! $! $!r%   