
    g;                         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 dlmZ d dlmZ d d	lm	Z	 d d
lm
Z
  e j                         Zd ZdZd ZddZddZd Zy)    N)activity_handler)activity_processor)database)helpers)logger)notification_handler)plextv)
pmsconnect)
web_socketc                    t         5  t        j                         }t        j                         }|j                         }|D ]  t        j                  d           t        j                         }|j                         }t        j                  d       |r|d   }|D ]  t        fd|D              rV|D ]N  }|d   t        d         k(  s|d   t        d         k(  s.|d   d   k7  r|d   dk(  rKt        j                  dd   z         t        j                   j#                  j%                         d	d
       |d   dk(  rSd   dk(  rKt        j                  dd   z         t        j                   j#                  j%                         dd
       |d   dk(  rKt        j                  dd   z         t        j                   j#                  j%                         dd
       d   dk(  rF| sDt'        d         t        j(                  j*                  z   }|j-                  d|d   d   g       |d   dk(  rt        j(                  j.                  dkD  r|j-                  dd   d   g       |j1                  dd   d   g      }	|	d   d   t        j(                  j.                  k\  r&|	d   d   t        j(                  j.                  k(  rft        j2                  dd   z         |j-                  dd   d   g       t        j                   j#                  j%                         dd
       nt5        j6                         |	d   d   t        j(                  j8                  z   kD  ret        j2                  dd   z         |j-                  dd   d   g       t        j                   j#                  j%                         dd
       t        j                  dd   d|	d   d   d |	d   d   d!       |d   dk7  sft5        j:                  |d"   |d#         }
t=        j>                  |$      }|d%   d&k(  r|
t        j(                  j@                  k\  sN|d%   d'k(  r|
t        j(                  jB                  k\  s)|d%   d(k(  s|
t        j(                  jD                  k\  st        d) |D              rt        j                   j#                  j%                         d*d
       Q od   d+k7  rit        j                  d,d   z         d+   s6t5        j6                         d+<   |j-                  d-d+   d+d   d   g       t5        j:                  d"   d#         }
t=        j>                  $      }d%   d&k(  r|
t        j(                  j@                  k\  sJd%   d'k(  r|
t        j(                  jB                  k\  s%d%   d(k(  r_|
t        j(                  jD                  k\  rBt        d. |D              s0t        j                   j#                  j%                         d*d
       t        j                   j#                  j%                         d/d
       |jG                  $      }|r6t        j                  d0d   d1d   d2       |jI                  |3       +d4xx   d5z  cc<   d4   t        j(                  jJ                  k  rHt        jL                  d6d   d1d   d7t        d4         d!       |jO                  d   8       t        jL                  d6d   d1d   d9t        d4         d!       t        j                  d0d   d1d   d2       |jI                  d   8       
 |D ]o  }|jQ                  |      }|st        j                  dt        |d         d:t        |d;         d<|d=   d>t        |d         d<|d?   d@|dA   rdBndCd!       q nt        j                  dD       d d d        y # 1 sw Y   y xY w)ENsession_keyz0Tautulli Monitor :: Checking for active streams.sessionsc              3   r   K   | ].  }|d    t        d          k(  xr |d   t        d         k(   0 yw)r   
rating_keyN)str).0dstreams     '/opt/Tautulli/plexpy/activity_pinger.py	<genexpr>z(check_active_sessions.<locals>.<genexpr>9   sK      1 '3vm/D+EEv!L/]`aghtau]vJvv 1s   47r   statepausedz&Tautulli Monitor :: Session %s paused.on_pause)stream_datanotify_actionplayingz'Tautulli Monitor :: Session %s resumed.	on_resumeerrorz4Tautulli Monitor :: Session %s encountered an error.on_errorpaused_counterzOUPDATE sessions SET paused_counter = ? WHERE session_key = ? AND rating_key = ?	bufferingr   z\UPDATE sessions SET buffer_count = buffer_count + 1 WHERE session_key = ? AND rating_key = ?zaSELECT buffer_count, buffer_last_triggered FROM sessions WHERE session_key = ? AND rating_key = ?buffer_countz=Tautulli Monitor :: User '%s' has triggered a buffer warning.userzjUPDATE sessions SET buffer_last_triggered = strftime('%s', 'now') WHERE session_key = ? AND rating_key = ?	on_bufferbuffer_last_triggeredzETautulli Monitor :: User '%s' has triggered multiple buffer warnings.zTautulli Monitor :: Session z is buffering. Count is now z. Last triggered .view_offsetduration)session
media_typemovieepisodetrackc              3   ,   K   | ]  }|d    dk(    ywr   
on_watchedN r   r   s     r   r   z(check_active_sessions.<locals>.<genexpr>   s     /jWX/0Bl0R/j   r0   stoppedz'Tautulli Monitor :: Session %s stopped.zSUPDATE sessions SET stopped = ?, state = ? WHERE session_key = ? AND rating_key = ?c              3   ,   K   | ]  }|d    dk(    ywr/   r1   r2   s     r   r   z(check_active_sessions.<locals>.<genexpr>   s     'bq/(:l(J'br3   on_stopz(Tautulli Monitor :: Removing sessionKey z ratingKey z from session queue)row_idwrite_attempts   z/Tautulli Monitor :: Failed to write sessionKey zA to the database. Will try again on the next pass. Write attempt )r   zD to the database. Removing session from the database. Write attempt z started by user user_idz (usernamez) with ratingKey 
full_title)livez	[Live TV] z0Tautulli Monitor :: Unable to read session list.))monitor_lockr   MonitorDatabaser   ActivityProcessorget_sessionsr   delete_metadata_cacher
   
PmsConnectget_current_activityr   debuganyr   plexpyNOTIFY_QUEUEputcopyintCONFIGMONITORING_INTERVALactionBUFFER_THRESHOLDselectinfor   	timestampBUFFER_WAITget_percentr   get_notify_stateMOVIE_WATCHED_PERCENTTV_WATCHED_PERCENTMUSIC_WATCHED_PERCENTwrite_session_historydelete_sessionSESSION_DB_WRITE_ATTEMPTSwarnincrement_write_attemptswrite_session)
ws_request
monitor_dbmonitor_process
db_streamspms_connectsession_listmedia_containerr)   r    buffer_valuesprogress_percentnotify_statesr7   new_sessionr   s                 @r   check_active_sessionsrl   $   s~   	 hM--/
,>>@$113
 ! 	JF226-3HI	J !++-"779GH*:6O % J^ 1 /1 1 $3 X{"=1S9N5OO ' 5VL=Q9R R  'w/6'?B#*7#3x#?$*LL1Y\bcp\q1q$r$*$7$7$;$;FKKMlv<w$x#*7#3y#@VG_X`E`$*LL1Z]cdq]r1r$s$*$7$7$;$;FKKMlw<x$y#*7#3w#>$*LL1gjpq~j1  %A$*$7$7$;$;FKKMlv<w$x%g(:: 25V<L5M1NQWQ^Q^QrQr1r * 1 1 3]3A6-CXZ`amZn2o!q  'w/;>6==CaCadeCe !+ 1 1 3]39-3H&Q]J^2_!a
 1;0A0A Cm DJ-CXZ`amZnBo1q
 $1#3N#Cv}}GeGe#e (5Q'7'G6==KiKi'i(.4s6<Vn5E )F )3(9(9 ;e <B-;PRXYeRf:g)i
 )/(;(;(?(?PVP[P[P]p{@|(} ,3+<+<+>qAQRiAj060I0IBJ ,J,2KK86<Vn9E -F -7,=,= ?i @Fm?TV\]iVj>k-m
 -3,?,?,C,CTZT_T_Tat  EA  -B &06}0E0=a0@0P0=a0@AX0Y.[ !\  'w/;>3:3F3Fw}G]_fgq_r3s 00D0U0U^e0f$+L$9W$DIY]c]j]j  ^A  ^A  JA$+L$9Y$FK[_e_l_l__K$+L$9W$DIY]c]j]j  ^A  ^A  JA,//j\i/j,j$*$7$7$;$;FKKMlx<y$zqX{x g)3%NQWXeQf%fg%i0070A0A0CF9-&-- /Y/5i/@)VTaMbdjkwdx.y{ ,3+>+>vm?TV\]gVh+i((<(M(MV\(]"<0G;@PTZTaTaTwTw@w"<0I=BRV\VcVcVvVvBv"<0G;@PTZTaTaTwTw@w$''bTa'b$b"//33FKKMdp4qr++//`i0jk -BB6BRF(.}(=vl?S&U V'66f6E/0A50!"23fmm6]6]]"KK+1-+@&BVX[\bcs\tXu)w x ,DDQWXeQfDg"KK+1-+@&BVX[\bcs\tXu)w x #LL,2=,A6,CW*Y Z+::vmG\:]UJ^Z + @-;;GDLL$'(>$?WYEWAXZablZm$'(=$>@UfmntfuWb{}W}" @	@ LLKLQhM hM hMs:   Caa,L6a$Ba*a	aK)aA1aa
c                 <   t         j                  j                  r| rt        j                  d       t        j                         }|j                         }|du rt        j                  d       n3|du r| r-t        j                  d       n| rt        j                  d       |s|rt        j                          nd}|r/| r|st        j                  d       	 t        j                          y y # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)	Nz<Tautulli Monitor :: Checking for Plex Cloud server status...Tz0Tautulli Monitor :: Plex Cloud server is active.Fz2Tautulli Monitor :: Plex Cloud server is sleeping.z@Tautulli Monitor :: Failed to retrieve Plex Cloud server status.z:Tautulli Monitor :: Attempting to reconnect Plex server...z+Websocket :: Unable to open connection: %s.)rI   rN   PMS_IS_CLOUDr   rS   r	   PlexTVget_cloud_server_statusr   r   on_disconnectstart_thread	Exception)logstartupplex_tvstatuses        r   connect_serverry      s    }}!!KKVW--/002T>KKJKu_PQ_`'$$& wKKTU	L##%   	LLLFJKK	Ls   C0 0	D9DDc                     t         5  t        j                  d       t        j                         } | j                         }|rt        j                  dt        j                  j                         |d   r<t        j                  d|d          t        j                  j                  d|d       nt        j                  d       d d d        y # 1 sw Y   y xY w)	Nz/Tautulli Monitor :: Checking for PMS updates...z+Tautulli Monitor :: Current PMS version: %supdate_availablez4Tautulli Monitor :: PMS update available version: %sversionon_pmsupdate)r   pms_download_infoz,Tautulli Monitor :: No PMS update available.)r@   r   rS   r	   ro   get_plex_updaterI   rN   PMS_VERSIONrJ   rK   )rv   download_infos     r   check_server_updatesr      s    	 LEF--///1KKEv}}G`G`a/0RTabkTlm##''._l(mn JKL L Ls   C CC)F)TF)	threadingrI   r   r   r   r   r   r   r	   r
   r   Lockr@   ext_ping_countext_ping_errorint_ping_countrl   ry   r   r1       r   <module>r      s\       # %    '    y~~jMZLBLr   