
    gT                     z    d dl Z d dlmZ 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Z
dd	Zdd
Zd Zy)    N)minidom)activity_processor)database)helpers)logger)usersc                    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      }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}0d}1d}2|j                  d+      r|j                  d+      }3|3D ]l  }4t        j                  |4d,      j                  d-      d.   }/t        j                  |4d/      }0t        j                  |4d0      }1t        j                  |4d      }2n d }5d}6d1}7d}8d }9d}:d};d1}<d }=|j                  d2      r|j                  d2      }>|>D ]  }?t        j                  |?d"      }5t        j                  |?d#      }6t        j                  |?d3      }7t        j                  |?d%      }8t        j                  |?d&      }9t        j                  |?d4      }:t        j                  |?d'      };t        j                  |?d5      }<t        j                  |?d*      }= |<d6k(  s|7d6k(  rd6}@n|<d7k(  s|7d7k(  rd7}@nd1}@d }A|j                  d8      r.|j                  d8      }B|BD ]  }Ct        j                  |Cd9      }A g }D|j                  d:      r=|j                  d:      }E|ED ]'  }FDj                  t        j                  |Fd             ) g }G|j                  d;      r=|j                  d;      }H|HD ]'  }IGj                  t        j                  |Id             ) g }J|j                  d<      r=|j                  d<      }K|KD ]'  }LJj                  t        j                  |Ld             ) g }M|j                  d=      r=|j                  d=      }N|ND ]'  }LMj                  t        j                  |Ld             ) i d>|d?|d|d|	d@|
dA|d|dB|dC|dD|d|d|dE|dF|dG|dH|dI|i dJ|dK|d|d|dL|dM|dN|d|dO| dP|#dQ|$dR|%d$|&d%|'d&|(dS|)dT|*i dU|+d*|,dV|/dW|0d0|1dX|2dY|5dZ|6d[|7d\|8d]|9d^|:d_|;d`|<da|=db@dcADGJ|Mdd} |S #  t	        j
                  d       Y y xY w)eNz>Tautulli Importer :: Error parsing XML for Plexivity database.Video	ratingKeyaddedAtartdurationgrandparentRatingKeygrandparentThumbgrandparentTitleoriginalTitleguidlibrarySectionIDindexoriginallyAvailableAtlastViewedAtparentRatingKeyparentIndexparentThumbparentTitleratingthumbtype	updatedAt
viewOffsetyearstudiotitletaglineDirectortag MediaaspectRatioaudioChannels
audioCodecbitrate	containerheight
videoCodecvideoFrameRatevideoResolutionwidthPlayeraddressz::ffff:machineIdentifierplatformzdirect playTranscodeSessionaudioDecisionprotocolvideoDecision	transcodecopyUseridWriterRoleGenreLables
rating_keyadded_atgrandparent_rating_keygrandparent_thumbparent_titlegrandparent_titleoriginal_title
section_idmedia_indexoriginally_available_atlast_viewed_atparent_rating_key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genresr"   labels)
r   latinToAsciir   parseStringr   warngetElementsByTagNameget_xml_attrappendsplit)Oxmloutput	clean_xml	xml_parsexml_headarD   rE   r   r   rF   rG   rI   rJ   r   rK   rL   rM   rN   rO   rP   rQ   rH   r   r   rR   rS   rT   r!   r"   r#   r$   rU   director_elembrV   rW   rX   r,   r-   r.   rY   rZ   r[   r2   
media_elemcr\   r]   r7   r^   player_elemdr_   r`   ra   rb   rc   rd   re   rf   rg   transcode_elemerh   ri   	user_elemfrj   writer_elemgrk   
actor_elemhrl   
genre_elemirm   
label_elemsO                                                                                  (/opt/Tautulli/plexpy/plexivity_import.pyextract_plexivity_xmlr      s	   F$$S)I''	2	 --g6HTU ~))![9
''95""1e,'':6!(!5!5a9O!P#004FG#004FG --aA##Av.))!-?@
**1g6")"6"6q:Q"R --a@#004EF$11!]C++A}=++A}=%%a2$$Q0))!V4
))![9
**1l;##Av.%%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?EEiPQST
$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<=>8,
 8h88 h8 +,B	8
 &'88 58 !,8 &'88 #N8 W8 $8 
8  8 ,-D8 #N8  &'8!8" '(:#8$ !,%8& F'8( 5)8* 
+8, 
-8.  /80 $182 y384 !,586 #N788  98: W;8< y=8> F?8@  A8B $_C8D %&6E8F 5G8H 
I8J 
K8L hM8N FO8P -.FQ8R *+@S8T #NU8V ()<W8X %&6Y8Z '(:[8\ *+@]8^ #N_8` $_a8b '(:c8d We8f %""""o8M~@ MU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 xml from %ssuccess)sqlite3connectOperationalErrorr   error
ValueErrorexecuteclose)database_file
table_name
connections      r   validate_databaser      s    
%__]B?
%/*<= ) ## -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|j'                  |d         r|j'                  |d         }
n|	d   }
i dt)        j*                  |d         j-                         dt)        j*                  |d         j-                         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|	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   dI|	dI   dJ|	dJ   dK|	dK   dL|	dL   dM|	dM   dN|	dN   d|d   d'|	d'   d(|	d(   |	d)   |	d*   |	d+   |	d,   |	d-   |	d.   |	d/   |	d0   dO}|d   j/                         r|j1                  ||d|P       t        j                  dQ|d   z          t3                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 :: Plexivity data import in progress...TzGTautulli Importer :: Unable to refresh the users list. Aborting import.a  SELECT id AS id, time AS started, stopped, null AS user_id, user, ip_address, paused_counter, platform AS player, null AS platform, null as machine_id, null AS media_type, null AS view_offset, xml, rating as content_rating,summary,title AS full_title,(case when orig_title_ep = 'n/a' then orig_title else orig_title_ep end) as title,(case when orig_title_ep != 'n/a' then orig_title else null end) as grandparent_title FROM z ORDER BY idru   zETautulli Importer :: Skipping record with id %s due to malformed xml.r?   user)r   ri   startedstoppedrD   r#   rH   rI   rJ   
full_titler\   paused_counterr^   r7   r]   rO   rF   rR   rT   rK   rf   ra   rh   r   r2   r.   r-   rY   rX   r,   r[   rZ   rV   rW   rd   rb   re   r`   r_   rg   rc   )rd   rb   re   r`   r_   rg   rc   rL   rP   r   rQ   rG   r   r!   rM   rE   rS   rN   content_ratingsummaryr$   r   r   rU   rj   rk   rl   r"   rm   )r-   rY   rX   r,   r[   rZ   rV   rW   )sessionimport_metadata	is_importimport_ignore_intervalz0Tautulli Importer :: Item has bad rating_key: %sz4Tautulli Importer :: Plexivity data import complete.F)r   r   Rowrow_factoryr   r   r   r   r   debugr   set_is_importingr   ActivityProcessorr   Usersrefresh_usersr   strget_user_idarrowget	timestampisdigitwrite_session_historyimport_users)r   r   r   r   ap	user_dataqueryresultrowextracted_xmlri   session_historysession_history_metadatas                r   import_from_plexivityr   
  s|   __]B?
!(
/*<=
 LLLMd#		-	-	/BI
( !)!( $2)2E, &F tv-c%j9 LL`s4y>* +   c&k 2++V+=G#I.G)9eiiI&?&I&I&K )$eiiI&?&I&I&K)'|)D) #CL) *=+H	)
 /4G0H) ,];K-L) (\):) %g) "3v;) (c,>O\):UbcoUp) ,S1A-B) $S]) &}Z'@) (|)D) />Q0R)  4]C[5\!)" (|)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-2M *$&$7GZ9[*$&$<mLd>e*$& %,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 %0{1K3*$&4 %.}Y/G5*$&6 %-mH.E7*$&8 %-mH.E9*$&: %-mH.E;*$&< %-mH.E=*$&> %1#l2C?*$&@ %,]7-CA*$&B %-mH.EC*$&D 2?{1K3@3O3@3O/<Y/G8EFX8Y7DEV7W4A.4Q6CDT6US*$& \ $L199;$$_5M/3<R % T
 LLKNfgsNttuitvl N
LLGHe$W ## => => ## de^_s4   ,O P# Q (P  P P #(QQQ*c                      t        j                  d       t        j                         } d}	 | j	                  |       t        j                  d       y #  t        j                  d       Y y xY w)Nz1Tautulli Importer :: Importing Plexivity 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   r   plexpyr   r   r   r   r   r   r   r   r        r   <module>r      s8   $    %    Od4p%fEr   