
    g'                     4   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 d dlmZ d dlm	Z	 d dlm
Z
 d dlmZ dZej                  j                  ej                  j                  fZdadad ad	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!y)    N)activity_handler)activity_pinger)activity_processor)database)logger	websocketFc                  B   	 t        j                  d       t        j                  t              }d|_        |j                          y # t        $ rK} t        j                  d| z         t        j
                  d       t        j                          Y d } ~ d } ~ ww xY w)NT)
ws_requestz>Tautulli WebSocket :: Failed to check for active sessions: %s.zFTautulli WebSocket :: Attempt to fix by flushing temporary sessions...)target)r   check_active_sessions	Exceptionr   errorwarnr   delete_sessions	threadingThreadrundaemonstart)ethreads     "/opt/Tautulli/plexpy/web_socket.pystart_threadr   +   sx    #--> S)FFM
LLN  #UXYYZ\]  ""#s   A
 
	BABBc                     t         j                  dt         _        t         j                  svt        j                  d       dt         _        t        j
                  j                  d      r-t        j                  d       t	        j                  dd       n
t                t        j                          t         j                  j                  rt                y y )NTz7Tautulli WebSocket :: The Plex Media Server is back up.
on_intdownzETautulli WebSocket :: Cancelling scheduled Plex server down callback.)
remove_job)plexpyPLEX_SERVER_UPr   infor   ACTIVITY_SCHEDget_jobdebugschedule_callbackon_intupinitialize_schedulerCONFIGWEBSOCKET_MONITOR_PING_PONG	send_ping     r   
on_connectr+   :   s    $ $  MN $**22<@LL`a..|MJ
!}}00 1r*   c                     t         j                  dt         _        t         j                  rt        j                  d       dt         _        t        j                  dt         j
                  j                         t        j                  dt        t         j
                  j                         t        j                         j                          t        j                          y )NFzTTautulli WebSocket :: Unable to get a response from the server, Plex server is down.zITautulli WebSocket :: Scheduling Plex server down callback in %d seconds.r   )funcseconds)r   r   r   r   r"   r&   "NOTIFY_SERVER_CONNECTION_THRESHOLDr   r#   r   r   ActivityProcessorset_temp_stoppedr%   r)   r*   r   on_disconnectr2   M   s    $ %jk %`]]EE	G**<j39==3c3c	e ((*;;=
!r*   c                  F    t         j                  j                  ddi       y )Nnotify_actionr   r   NOTIFY_QUEUEputr)   r*   r   r   r   ^   s    
_l;<r*   c                  F    t         j                  j                  ddi       y )Nr4   r$   r5   r)   r*   r   r$   r$   b   s    
_j9:r*   c                  V    t                t        j                  d       t                y )Nz/Tautulli WebSocket :: Reconnecting websocket...)closer   r   r   r)   r*   r   	reconnectr;   f   s    	G
KKABNr*   c                      da t                y )NT)ws_shutdownr:   r)   r*   r   shutdownr>   l   s    K	Gr*   c                      t        j                  d       t        j                  j	                          dt        _        y )Nz0Tautulli WebSocket :: Disconnecting websocket...F)r   r   r   	WEBSOCKETr:   WS_CONNECTEDr)   r*   r   r:   r:   r   s)    
KKBC
Fr*   c                      t         j                  rYt         j                  j                  d       t	        j
                  dt              adt        _        t        j                          y y )NzHi?g      @T)
r   rA   r@   pingr   Timer	wait_pong
pong_timerr   r   r)   r*   r   r(   r(   x   sJ    e$ __S)4
 
 r*   c                      t         dz  a t        j                  dt        t               z         t         t        j
                  j                  k\  rda t                y y )N   zMTautulli WebSocket :: Failed to receive pong from websocket, ping attempt %s.r   )
pong_countr   r   strr   r&   WEBSOCKET_CONNECTION_ATTEMPTSr:   r)   r*   r   rE   rE      sF    !OJ
KK_befpbqqrV]]@@@
 Ar*   c                  >    t         rt         j                         a day y )Nr   )rF   cancelrI   r)   r*   r   receive_pongrN      s     &&(

 r*   c                     ddl m}  t        j                  j                  rt        j                  j
                  d d dk(  rst        j                  j
                  j                  dd      dz   }d}t        j                  j                  rd	t        j                         i}nPd
t        j                  i}n=dt        j                  j                  dt        j                  j                  d}d}d }t        j                  j                  rdt        j                  j                  i}nd }t        j                  j                  }dad}t#        j$                  d|z         	  | ||||      t        _        t#        j$                  d       dt        _        t        j(                  r
t3                t        j(                  r3	 t5        t7        t        j&                          d}t        j(                  r3t        j(                  st         s
tK                t#        jL                  d       y # t         j*                  t,        t.        f$ r }t#        j0                  d|       Y d }~d }~ww xY w# t         j8                  $ r: t         rY |dk(  rt#        j:                  d       t        j                  j<                  s|t        j                  j>                  k  r|dz  }|dkD  r-tA        jB                  t        j                  jD                         t#        j:                  dtG        |      z         	  | ||||      t        _        t#        j$                  d       dt        _        nN# t         j*                  t,        t.        f$ r }t#        j0                  d|       Y d }~nd }~ww xY wtI                Y Y t         j*                  t.        f$ r7}t         rY d }~t#        j0                  d|       tI                Y d }~d }~ww xY w)Nr   )create_connection   httpszhttps://zwss://z/:/websockets/notificationszsecure ca_certs	cert_reqszws://: zX-Plex-TokenFz*Tautulli WebSocket :: Opening %swebsocket.)timeoutheaderssloptzTautulli WebSocket :: ReadyTzTautulli WebSocket :: %s.z,Tautulli WebSocket :: Connection has closed.rH   z.Tautulli WebSocket :: Reconnection attempt %s.z%Tautulli WebSocket :: Leaving thread.)'r   rP   r   r&   PMS_SSLPMS_URLreplaceVERIFY_SSL_CERTcertifiwheressl	CERT_NONEPMS_IPPMS_PORT	PMS_TOKENPMS_TIMEOUTr=   r   r   r@   rA   WebSocketExceptionIOErrorr   r   r+   processreceive"WebSocketConnectionClosedExceptionr   PMS_IS_CLOUDrK   timesleepWEBSOCKET_CONNECTION_TIMEOUTrJ   r:   r2   r"   )rP   urisecurerY   rX   rW   
reconnectsr   s           r   r   r      s   +}}!6!6r!:g!Emm##++JADaa==(( '--/2F!3==1F MM  MM""
  }} &--"9"9:mm''G KJ KK<vEF5,S'&Y_`12" 


'	WV--./ J 

T {
LL89g (('9= 50!445 ;; 	QJK==--*v}}?j?j2ja
 >JJv}}IIJLsS]^_A'8gV\ek'lF$KK =>*.F'!44gyI ALL!<a@@A ,,i8 	LL4a8G	sm   !5H) !I* )I'I""I'*PB)P05M&%P&N$NPN$$P7PP PPc                 
   | j                         }|st        j                  d|z        |j                  t        v r|j                  |j
                  fS |j                  t        j                  j                  k(  r| j                          |j                  d fS |j                  t        j                  j                  k(  r| j                  d       y|j                  t        j                  j                  k(  r
t                y)NzNot a valid frame %szHi!)NN)
recv_framer   rf   opcodeopcode_datadataABNFOPCODE_CLOSE
send_closeOPCODE_PINGpongOPCODE_PONGrN   )wsframes     r   ri   ri      s    MMOE**+AE+IJJ		$||UZZ''	44	4
||T!!	33	3
  
33	3r*   c                    | t         vry	 |j                  d      }t        j                  |       t	        j
                  |      }|j                  d|      }|j                  d      }|sy|dk(  rd|j                  d|j                  di             }|st        j                  d	       y	 t        j                  |d
         }|j                          |dk(  rd|j                  d|j                  di             }|st        j                  d       y	 t        j                  |d
         }|j                          |dk(  re|j                  d|j                  di             }|st        j                  d       y	 t        j                   |d
         }|j                          yy# t        $ r7}t        j                  d|z         t        j                  |       Y d }~yd }~ww xY w# t        $ r#}t        j                  d|z         Y d }~>d }~ww xY w# t        $ r#}t        j                  d|z         Y d }~d }~ww xY w# t        $ r"}t        j                  d|z         Y d }~yd }~ww xY w)NFzutf-8z?Tautulli WebSocket :: Error decoding message from websocket: %sNotificationContainertypeplayingPlaySessionStateNotification	_childrenzKTautulli WebSocket :: Session event found but unable to get websocket data.r   )timelinez9Tautulli WebSocket :: Failed to process session data: %s.r   TimelineEntryzLTautulli WebSocket :: Timeline event found but unable to get websocket data.z:Tautulli WebSocket :: Failed to process timeline data: %s.reachabilityReachabilityNotificationzPTautulli WebSocket :: Reachability event found but unable to get websocket data.)rv   z>Tautulli WebSocket :: Failed to process reachability data: %s.T)ru   decoder   websocket_debugjsonloadsr   r   websocket_errorgetr"   r   ActivityHandlerrh   	exceptionTimelineHandlerReachabilityHandler)rt   rv   eventr   
event_type
event_dataactivitys          r   rh   rh     s?   [ {{7#t$

4  II-u5E6"JYYY=uyyVX?YZ
LLfg	^'77AOH ZYY		+r0JK
LLgh	_'77AOH ^#YY9599[RT;UV
LLkl	c';;AOH e  UXYYZt$*  	^X[\\]]	^  	_Y\]]^^	_  	c]`aabb	cs_   ;F) ,)G, )H >)I
 )	G)2-G$$G),	H5HH	I$II
	I5I00I5)"r   r`   r   rl   r^   r   r   r   r   r   r   r   namerw   OPCODE_TEXTOPCODE_BINARYru   r=   rF   rI   r   r+   r2   r   r$   r;   r>   r:   r(   rE   rN   r   ri   rh   r)   r*   r   <module>r      s   (  
      # " %   ~~))9>>+G+GH

&""=; W:t&:r*   