
    gR                     r    d dl 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mZ ddZ	dd	Z
dd
Zd Zy)    N)minidom)activity_processor)database)helpers)logger)usersc                 T   i }t        j                  |       }	 t        j                  |      }|j                  d      }|st	        j
                  d       y |D ]/  }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }	t        j                  |d      }
t        j                  |d      }t        j                  |d	      }t        j                  |d
      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }g }|j                  d      r=|j                  d      }|D ]'  }|j                  t        j                  |d             ) d} d }!d}"d }#d}$d }%d}&d}'d}(d })|j                  d      r|j                  d      }*|*D ]  }+t        j                  |+d      } t        j                  |+d      }!t        j                  |+d       }"t        j                  |+d!      }#t        j                  |+d"      }$t        j                  |+d#      }%t        j                  |+d$      }&t        j                  |+d%      }'t        j                  |+d&      }(t        j                  |+d'      }) d},d}-d}.|j                  d(      rp|j                  d(      }/|/D ]Z  }0t        j                  |0d)      }1t        j                  |0d*      },t        j                  |0d+      }-t        j                  |0d      }.\ d }2d}3d,}4d}5d }6d}7d}8d,}9d }:|j                  d-      r|j                  d-      };|;D ]  }<t        j                  |<d      }2t        j                  |<d       }3t        j                  |<d.      }4t        j                  |<d"      }5t        j                  |<d#      }6t        j                  |<d/      }7t        j                  |<d$      }8t        j                  |<d0      }9t        j                  |<d'      }: |9d1k(  s|4d1k(  rd1}=n|9d2k(  s|4d2k(  rd2}=nd,}=d }>|j                  d3      r.|j                  d3      }?|?D ]  }@t        j                  |@d4      }> g }A|j                  d5      r=|j                  d5      }B|BD ]'  }CAj                  t        j                  |Cd             ) g }D|j                  d6      r=|j                  d6      }E|ED ]'  }FDj                  t        j                  |Fd             ) g }G|j                  d7      r=|j                  d7      }H|HD ]'  }IGj                  t        j                  |Id             ) g }J|j                  d8      r=|j                  d8      }K|KD ]'  }IJj                  t        j                  |Id             ) i d9|d|d|d:|	d|d;|d<|
d=|d|d	|d>|d?|d@|dA|dB|dC|d|i d|dD|dE|dF|d|dG|dH| dI|!dJ|"d!|#d"|$d#|%dK|&dL|'dM|(d'|)dN1i dO|,d+|-dP|.dQ|2dR|3dS|4dT|5dU|6dV|7dW|8dX|9dY|:dZ|=d[|>d\Ad]Dd^G|Jd_}2 |S #  t	        j
                  d       Y y xY w)`Nz>Tautulli Importer :: Error parsing XML for PlexWatch database.optaddedAtartdurationgrandparentThumbgrandparentTitleoriginalTitleguidlibrarySectionIDindexoriginallyAvailableAtlastViewedAtparentIndexparentThumbratingthumbtype	updatedAt
viewOffsetyearparentTitlestudiotitletaglineDirectortag MediaaspectRatioaudioChannels
audioCodecbitrate	containerheight
videoCodecvideoFrameRatevideoResolutionwidthPlayeraddressmachineIdentifierplatformzdirect playTranscodeSessionaudioDecisionprotocolvideoDecision	transcodecopyUseridWriterRoleGenreLablesadded_atgrandparent_thumbparent_titlegrandparent_titleoriginal_title
section_idmedia_indexoriginally_available_atlast_viewed_atparent_media_indexparent_thumb
media_type
updated_atview_offset	directorsaspect_ratioaudio_channelsaudio_codecvideo_codecvideo_frameratevideo_resolution
ip_address
machine_idplayertranscode_audio_channelstranscode_audio_codecaudio_decisiontranscode_containertranscode_heighttranscode_protocoltranscode_video_codecvideo_decisiontranscode_widthtranscode_decisionuser_idwritersactorsgenres)r   labels)	r   latinToAsciir   parseStringr   warngetElementsByTagNameget_xml_attrappend)Lxmloutput	clean_xml	xml_parsexml_headar@   r   r   rA   rC   rD   r   rE   rF   rG   rH   rI   rJ   r   r   rK   rL   rM   r   rB   r   r    r!   rN   director_elembrO   rP   rQ   r)   r*   r+   rR   rS   rT   r/   
media_elemcrV   r3   rW   player_elemdrU   rX   rY   rZ   r[   r\   r]   r^   r_   r`   transcode_elemera   rb   	user_elemfrc   writer_elemgrd   
actor_elemhre   
genre_elemirf   
label_elemsL                                                                               (/opt/Tautulli/plexpy/plexwatch_import.pyextract_plexwatch_xmlr      su	   F$$S)I''	2	
 --e4HTU w''95""1e,'':6#004FG#004FG --aA##Av.))!-?@
**1g6")"6"6q:Q"R --a@$11!]C++A}=%%a2$$Q0))!V4
))![9
**1l;##Av.++A}=%%a2$$Q0&&q)4	!!*-22:>M" A  !5!5a!?@A 	!!'*//8J 
9&33A}E!(!5!5a!I%221lC!..q)<#00K@	 --a:%221lC")"6"6q:J"K#*#7#7;L#M ,,Q8
9 
!!(+00:K  :$11!Y?
$11!5HI
"//:> --a9	: $(  "&  "&!!"45334FGN# 	C+2+?+??+S((/(<(<Q(M%!(!5!5a!I&-&:&:1k&J##*#7#78#D %,%9%9!Z%H"(/(<(<Q(M%!(!5!5a!I")"6"6q'"B	C [(Nk,I!,v%6)A!'!.!!&)..v6I 8!..q$78 !!(+00:K  ?w33Au=>? !!&)//7J >g221e<=> !!'*//8J >g221e<=> !!(+//9J >g221e<=>5*h 55h5 &'85 5	5
 !,5 &'85 #N5 W5 $5 
5  5 ,-D5 #N5 '(:5 !,5  F!5" 5#5$ 
%5& 
'5(  )5* $+5, y-5. !,/50 #N152  354 W556 y758 F95:  ;5< $_=5> %&6?5@ 5A5B 
C5D 
E5F hG5H FI5J -.FK5L *+@M5N #NO5P ()<Q5R %&6S5T '(:U5V *+@W5X #NY5Z $_[5\ '(:]5^ W_5` Wa5b Fc5d Fe5f #"i5Ewr METUs   ^ ^'c                    	 t        j                  | d      }	 |j                  d|z         |j                          y# t         j                  $ r t        j                  d       Y yt
        $ r t        j                  d       Y y t        j                  d       Y yxY w# t         j                  $ r t        j                  d       Y y t        j                  d       Y yxY w)	N   timeoutz0Tautulli Importer :: Invalid database specified.zInvalid database specified.z(Tautulli Importer :: Uncaught exception.zUncaught exception.SELECT ratingKey from %ssuccess)sqlite3connectOperationalErrorr   error
ValueErrorexecuteclose)database_file
table_name
connections      r   validate_databaser      s    
%__]B?
%5
BC ) ## -GH, -GH,%?@$
 ## -GH,%?@$s&   ? $B# (B )B B #(C%C%c                    	 t        j                  | d      }t         j                  |_        	 |j                  d|z         t        j                  d       t        j                  d       t        j                         }t        j                         }	 t        j                           d	|z   d
z   }|j                  |      }|D ]  }t#        |d         }	|	s%t        j                  dt%        |d         z         9|d   st        j                  d       T|j'                  |d         r|j'                  |d         }
n|	d   }
i d|d   d|d   d|d   d|d   d|	d   d|d   d|	d   d|d   d|
d|d   d|d   r|d   n|	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/   d0|	d0   |	d1   |	d2   |	d3   |	d4   |	d5   |	d6   |	d7   d8}i dt)        j*                  |d         d|d   d|d   d|d   d|	d   d|d   d|	d   d9|	d9   d:|	d:   d;|	d;   d<|	d<   d=|	d=   d>|	d>   d |	d    d?|	d?   d@|	d@   dA|	dA   i dB|	dB   dC|	dC   dD|dD   dE|dE   dF|	dF   dG|	dG   d&|	d&   dH|	dH   d"|	d"   dI|	dI   dJ|	dJ   dK|	dK   dL|	dL   dM|	dM   dN|	dN   d|d   d'|	d'   |	d(   |	d)   |	d*   |	d+   |	d,   |	d-   |	d.   |	d/   |	d0   dO	}|d   j-                         r|j/                  ||d|P       t        j                  dQ|d   z          t1                t        j                  dR       t        j                  dS       y # t         j                  $ r t        j                  d       Y y t        $ r t        j                  d       Y y w xY w# t         j                  $ r t        j                  d       Y y w xY w#  t        j                  d       Y y xY w)TNr   r   z&Tautulli Importer :: Invalid filename.r   zMTautulli Importer :: Database specified does not contain the required fields.z9Tautulli Importer :: PlexWatch data import in progress...TzGTautulli Importer :: Unable to refresh the users list. Aborting import.a  SELECT time AS started, stopped, cast(ratingKey as text) AS rating_key, null AS user_id, user, ip_address, paused_counter, platform AS player, null AS platform, null as machine_id, parentRatingKey as parent_rating_key, grandparentRatingKey as grandparent_rating_key, null AS media_type, null AS view_offset, xml, rating as content_rating,summary,title AS full_title,(case when orig_title_ep = '' then orig_title else orig_title_ep end) as title,(case when orig_title_ep != '' then orig_title else null end) as grandparent_title FROM z ORDER BY idrm   zLTautulli Importer :: Skipping record with ratingKey %s due to malformed xml.
rating_keyz;Tautulli Importer :: Skipping record due to null ratingKey.user)r   rb   startedstoppedr    rB   rC   rD   
full_titlerU   paused_counterrW   r3   rV   parent_rating_keygrandparent_rating_keyrK   rM   rE   r_   rZ   ra   r   r/   r+   r*   rR   rQ   r)   rT   rS   rO   rP   r]   r[   r^   rY   rX   r`   r\   )r]   r[   r^   rY   rX   r`   r\   rF   rI   r   rJ   rA   r   r   rG   r@   rL   rH   content_ratingsummaryr!   r   r   rN   rc   rd   re   r   rf   )	r+   r*   rR   rQ   r)   rT   rS   rO   rP   )sessionimport_metadata	is_importimport_ignore_intervalz0Tautulli Importer :: Item has bad rating_key: %sz4Tautulli Importer :: PlexWatch data import complete.F)r   r   Rowrow_factoryr   r   r   r   r   debugr   set_is_importingr   ActivityProcessorr   Usersrefresh_usersr   strget_user_idr   rg   isdigitwrite_session_historyimport_users)r   r   r   r   ap	user_dataqueryresultrowextracted_xmlrb   session_historysession_history_metadatas                r   import_from_plexwatchr      s   __]B?
!(
5
BC
 LLLMd#		-	-	/BI
, !-!, $2-2E0 &F uv-c%j9 LLgs<012 3 < LLVW   c&k 2++V+=G#I.G)9c)n )$c)n)'\):) #CL) *=+H	)
 /4G0H) ,];K-L) (\):) %g) "3v;) (c,>O\):UbcoUp) ,S1A-B) $S]) &}Z'@) (|)D) /4G0H)  4S9Q5R!)" (|)D#)$ )-*F%)& (|)D')( ,];K-L))* ,];K-L+), 0?S1T-). &}Z'@/)0 #M'$:1)2 $]8%<3)4 'k(B5)6 )-*F7)8 )-*F9): %mI&>;)< .}=O/P=)> -m<M.N?)@ *=+HA)B ,];K-LC)D 2??S1T2?@U2V4ABY4Z4ABY4Z7DE_7`.;<M.N/<=O/PQ)V+$&L'2F2Fs<GX2Y +$&$7=P9Q+$&$<cBZ>[+$& %,S\+$& %3M.4Q	+$&
 %8=P9Q+$& %5mDT6U+$& %2=3O+$& %9-H\:]+$& %,]7-C+$& %3M.4Q+$& %8GZ9[+$& %*=+?+$& %1-2M+$& %+M&,A+$& %>}Mf?g+$&  %/j0I!+$&" %1-2M#+$&$ %5mDT6U%+$&& %5c:J6K'+$&( %.s9~)+$&* %.}Y/G++$&, %-mH.E-+$&. %/j0I/+$&0 %+M&,A1+$&2 %1-2M3+$&4 %0{1K5+$&6 %.}Y/G7+$&8 %-mH.E9+$&: %-mH.E;+$&< %-mH.E=+$&> %-mH.E?+$&@ %1#l2CA+$&B %,]7-CC+$&D /<H.E1>{1K3@3O3@3O/<Y/G8EFX8Y7DEV7W4A.4Q6CDT6UU+$& ^ $L199;$$_5M/3<R % T
 LLKNfgsNttukuvn N
LLGHe$] ## => => ## de^_s4   ,O P Q (P0PP(P>=P>Qc                      t        j                  d       t        j                         } d}	 | j	                  |       t        j                  d       y #  t        j                  d       Y y xY w)Nz1Tautulli Importer :: Importing PlexWatch Users...z}INSERT OR IGNORE INTO users (user_id, username) SELECT user_id, user FROM session_history WHERE user_id != 1 GROUP BY user_idz$Tautulli Importer :: Users imported.z,Tautulli Importer :: Failed to import users.)r   r   r   MonitorDatabaseaction)
monitor_dbr   s     r   r   r     s[    
LLDE))+JGEE% ;<ECDs   &A A-)N)NN)NNr   )r   xml.domr   plexpyr   r   r   r   r   r   r   r   r        r   <module>r      s5   $   %    GT4s%lEr   