
    g{                         d dl Z d dlZd dlZd dlm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 dlmZ d d	lmZ dZi a G d
 de      Z G d de      Z G d de      Zd ZddZd Zd Zd Zd Zy)    N)DateTrigger)activity_processor)common)datafactory)helpers)logger)notification_handler)
pmsconnectc                       e Zd Zd Zd ZddZddZddZddZd Z	d	 Z
dd
ZddZd Zd Zd Zd Zd Zd Zd ZddZd Zd Zd Zd Zd ZddZy)ActivityHandlerc                    t        j                         | _        || _        d | _        d | _        d| j                  v xr& t        | j                  d         j                         | _        | j                  r:t        | j                  d         | _        t        | j                  d         | _        | j                  j                  d      | _        | j                  j                  d      | _        | j                  j                  d      | _        | j                  j                  dd      | _        d | _        d | _        d | _        y )N
sessionKey	ratingKeykeystate
viewOffsettranscodeSession )r   ActivityProcessoraptimelinesession_key
rating_keystrisdigitis_valid_sessionintgetr   r   view_offsettranscode_key
db_sessionsessionmetadataselfr   s     (/opt/Tautulli/plexpy/activity_handler.py__init__zActivityHandler.__init__(   s    $668 !-!>!m3t}}UaGbCcCkCkCm  "4==#>?D!$--"<=DO==$$U+]]&&w/
==,,\:!]]../A2F    c                 Z    | j                   j                  | j                        | _        y Nr   )r   get_session_by_keyr   r!   r%   s    r&   get_db_sessionzActivityHandler.get_db_session=   s!    ''44AQAQ4Rr(   c                     | j                   L|rd n| j                  }t        j                         }|j	                  | j
                  |      }|r|| _         y y y )N)r   	cache_key)r#   r   r
   
PmsConnectget_metadata_detailsr   )r%   
skip_cacher0   pms_connectr#   s        r&   get_metadatazActivityHandler.get_metadataA   sW    ==  *0@0@I$//1K"774??^g7hH (  !r(   c                     t        j                         }|j                  |      }|rT|d   D ]K  }t        |d         | j                  k(  s|d   s| j
                  |d<   | j
                  |d<   || _        |c S  y y )Nr3   sessionsr   r   rating_key_websocket)r
   r1   get_current_activityr   r   r   r"   )r%   r3   r4   session_listr"   s        r&   get_live_sessionz ActivityHandler.get_live_sessionJ   s     ++-"77:7N'
3 #w}-.$2B2BB #<004-6:ooG23#*DL"N# r(   c                     | j                   | j                          | j                   r'| j                  j                  | j                   |       | j	                          y )N)r"   notify)r"   r<   r   write_sessionset_session_state)r%   r>   s     r&   update_db_sessionz!ActivityHandler.update_db_sessionY   sF    <<!!#<<GG!!$,,v!F r(   Nc                     | j                   j                  | j                  | j                  |xs | j                  t        j                                | j                          y )N)r   r   r   stopped)r   r@   r   r   r   r   	timestampr.   )r%   r   s     r&   r@   z!ActivityHandler.set_session_statec   sQ    !!((**#7t'7'7%%'	 	" 	
 	r(   c                     | j                   j                         |d}|j                  |       t        j                  j                  |       y )Nstream_datanotify_action)r!   copyupdateplexpyNOTIFY_QUEUEput)r%   rH   kwargsnotifications       r&   put_notificationz ActivityHandler.put_notificationl   s<    '+';';'=P]^F#-r(   c                    | j                  d       | j                  sy | j                  d   dk(  r2t        j                  d       | j                          | j                  sy t	        j
                  dt        | j                  d         dt        | j                  d	         d
| j                  d   dt        | j                  d         d
| j                  d   d| j                  d   rdndd       | j                  d       t        dj                  | j                        t        | j                  | j                  d   | j                  d   gd       | j                          y )NTr7   platformDLNA   $Tautulli ActivityHandler :: Session r   z started by user user_idz (usernamez) with ratingKey r   
full_title)livez
 [Live TV]r   .)r>   session_key-{}   funcargsminutes)r<   r"   timesleepr   debugr   rA   schedule_callbackformatr   force_stop_streamcheck_markersr-   s    r&   on_startzActivityHandler.on_startq   s;   .|| <<
#v-JJqM!!#<<t||M:;SiAX=Y[_[g[ghr[sDLL67l9SeieqeqrxeyUa  @B  VBC 	D
 	d+ 	*11$2B2BC!2"&"2"2DLL4NPTP\P\]gPh!i$%	'
 	r(   c                    t        j                  dt        | j                        d|rdndd       | j                  j                  | j                  d        |s_| j                  d   dkD  r/| j                  d   | j                  z
  d	k  r| j                  d   }n| j                  }| j                  |
       | j                  j                  | j                        }|r| j                  d       t        dj                  | j                        d       t        j                  dt        | j                        dt        | j                        d       | j                  j                  |       t        | j                         y t        dj                  | j                        t         | j                  | j                  d   | j                  d   gd       y )NrU    zforce r   zstopped.r   rD   durationr   '  r   r"   on_stopr\   T
remove_jobz0Tautulli ActivityHandler :: Removing sessionKey  ratingKey  from session queuerow_idrX   user   r_   r`   seconds)r   rd   r   r   r   set_session_last_pausedr!   r   r@   write_session_historyrP   re   rf   r   delete_sessiondelete_metadata_cacherg   )r%   
force_stopr   rw   s       r&   rq   zActivityHandler.on_stop   s   t//0j(b2PR 	S 	''D4D4DPT'U z*Q.4??:3NQUQaQa3aej3j"ooj9"..""{"; ..t.G!!),.55d6F6FGTXY LL"4#3#34c$//6JL MGG""&"1!$"2"23.55d6F6FG%6&*&6&68UW[WfWfgmWn%o(*,r(   c                    |s+t        j                  dt        | j                        z         | j                  j                  | j                  t        j                                | j                          |s| j                  d       y y )Nz.Tautulli ActivityHandler :: Session %s paused.rl   on_pause)
r   rd   r   r   r   r|   r   rD   rA   rP   )r%   still_pauseds     r&   r   zActivityHandler.on_pause   sn    LLICPTP`P`Laab 	''D4D4DPWPaPaPc'd !!*- r(   c                     t        j                  dt        | j                        z         | j                  j                  | j                  d        | j                          | j                  d       y )Nz/Tautulli ActivityHandler :: Session %s resumed.rl   	on_resume)r   rd   r   r   r   r|   rA   rP   r-   s    r&   r   zActivityHandler.on_resume   sY    FTM]M]I^^_ 	''D4D4DPT'U k*r(   c                    t        j                  d| j                  z         | j                  j	                  | j                         | j                  j                  | j                        }t        j                  d| j                  d|d       | j                  j                  | j                        }| j                          d}|rFt        j                  d| j                  d|d       t        j                         t        |      z
  }|t        j                  j                  k\  r|dk(  s|t        j                  j                  k\  r8| j                  j                  | j                         | j!                  d       y y )	Nz4Tautulli ActivityHandler :: Session %s is buffering.r+   rU   z buffer count is r[   r   z buffer last triggered at 	on_buffer)r   rd   r   r   increment_session_buffer_countget_session_buffer_countget_session_buffer_trigger_timerA   r   rD   r   rK   CONFIGBUFFER_THRESHOLDBUFFER_WAITset_session_buffer_trigger_timerP   )r%   current_buffer_countbuffer_last_triggeredtime_since_last_triggers       r&   r   zActivityHandler.on_buffer   s:   KdN^N^^_ 	..4;K;K.L  $ww??@P@PQ))+?A 	B !% G GHXHX Y "# LL!--/DF G&-&7&7&9C@U<V&V#6==#A#AAF]abFb'6==+D+DDGG33@P@P3Q!!+. Er(   c                     t        j                  dt        | j                        z         | j	                          | j                  d       y )Nz<Tautulli ActivityHandler :: Session %s encountered an error.on_errorr   rd   r   r   rA   rP   r-   s    r&   r   zActivityHandler.on_error   s;    SVYZ^ZjZjVkkl j)r(   c                     t        j                  dt        | j                        z         | j	                          | j                  d       y )NzFTautulli ActivityHandler :: Session %s has changed transcode decision.	on_changer   r-   s    r&   r   zActivityHandler.on_change   s;    ]`cdhdtdt`uuv k*r(   c                     t        j                  dt        | j                        z         | j	                  |d          | j                  d|       y )Nz<Tautulli ActivityHandler :: Session %s reached intro marker.start_time_offsetro   on_intromarkerr   rd   r   r   r@   rP   r%   r   s     r&   r   zActivityHandler.on_intro   sK    SVYZ^ZjZjVkkl62E+FGj8r(   c                     t        j                  dt        | j                        z         | j	                  |d          | j                  d|       y )NzATautulli ActivityHandler :: Session %s reached commercial marker.r   ro   on_commercialr   r   r   s     r&   r   zActivityHandler.on_commercial   sK    X[^_c_o_o[ppq62E+FGof=r(   c                     t        j                  dt        | j                        z         | j	                  |d          | j                  d|       y )Nz>Tautulli ActivityHandler :: Session %s reached credits marker.r   ro   
on_creditsr   r   r   s     r&   r   zActivityHandler.on_credits   sK    UX[\`\l\lXmmn62E+FGl6:r(   c                 (   t        j                  dt        | j                        z         |r| j	                  |d          n| j                          t        j                  | j                  dd      }|D ]  }| j                  d|d           y )	Nz/Tautulli ActivityHandler :: Session %s watched.r   ro   
on_watchedF)r"   rH   notifiednotifier_id)r   )
r   rd   r   r   r@   rA   r	   get_notify_state_enabledr!   rP   )r%   r   watched_notifiersds       r&   r   zActivityHandler.on_watched  s    FTM]M]I^^_""v6I/J"K""$0IIOO<%Q # 	NA!!,Am<L!M	Nr(   c                    | j                   sy | j                          | j                  s | j                  dk7  r| j	                          y t        dj                  | j                        t        | j                  | j                  d   | j                  d   gd       | j                  d   }t        | j                  d         }| j                  d	   }| j                  d
   }t        |t              r|j                  d      d   }| j                  d   }| j                  d   }| j                  d   }| j                  j                  d      r| j                  j                  d      d   nd }|}	| j                  d   rTt        j                         | j                  d   z
  dkD  r-| j!                  d       | j"                  r| j"                  d   }	| j$                  |k(  s| j$                  |k(  s||k(  rL|	|k(  rF| j                  dk(  r7t        j                         | j                  d   z
  dkD  r| j'                          | j                  |k7  r| j                  dk(  r| j)                          n|r | j                  dk(  r| j+                          na| j                  dk(  r| j-                          nA| j                  dk(  r2| j/                          n!| j                  dk(  r| j)                  d       | j                  dk(  r| j1                          | j2                  |k7  rB| j                  dk7  r3| j5                          n"| j-                  d       | j	                          | j7                          | j9                          y )N	bufferingr\   rX   rx   r]   r^   r   r   	live_uuidr    /last_pausedr9   guidz/livetv/sessionsrZ   rC   <   Tr7   playingpausederror)r   )r   )r   r.   r!   r   ri   re   rf   r   rg   r   
isinstancesplitr   
startswithr   rD   r5   r#   r   rA   r   r   rq   r   r   r    r   rh   check_watched)
r%   
last_statelast_rating_keylast_live_uuidlast_transcode_keyr   last_rating_key_websocket	last_guidthis_live_uuid	this_guids
             r&   processzActivityHandler.process  s   $$zz[( 	*11$2B2BC!2"&"2"2DOOL4QSWSbSbciSj!k$%	'
 __W-
dool;<5!___=(#.!3!9!9#!>r!Boom4$(OO4J$K!OOF+	 59HH4G4GHZ4[,R0ae	??6"w'8'8':T__Y=W'WZ\'\.}} MM&1	 OO.??&??!^3*zzY& $$&)CCbH**, zzZ'::)MMO TZZ9%<NN$ZZ9,LLNZZ7*MMOx'40zz[( !!%77DJJ)<S  LLDL)MMO 	r(   c                 T   | j                          d}t        | j                  d   d      D ]  \  }}|d   dz
  | j                  cxk  r	|d   k  s%n (d}| j                  d	   |k7  r| j
                  j                  | j                  ||d
          | j                  |d   k  rEt        dj                  | j                  |      | j                  |g|d   | j                  z
         n| j                  |        n |s(| j
                  j                  | j                  d       y y )NFmarkersrT   )startr   rn   end_time_offsetTr   type)r   
marker_idxmarker_typezsession_key-{}-marker-{})r_   r`   millisecondsr   )r   r   )r5   	enumerater#   r   r!   r   
set_markerr   re   rf   _marker_callback)r%   marker_flagr   r   s       r&   rh   zActivityHandler.check_markersi  s)   "+DMM),DA"N 	J )*U2d6F6Fc&QbJcc"??8,
:GG&&43C3CPZhnouhv&w''&1D*EE)6==d>N>NPZ[!%!6!6"()/0C)DtGWGW)W	 --f5)	, GG4+;+;J r(   c                    | j                         rt        j                         | _        |d   dk(  r| j	                  |       y |d   dk(  r| j                  |       y |d   dk(  r| j                  |       | j                  d   si|d   r/t        j                  j                  dk(  r| j                  |       y |d   r/t        j                  j                  d	v r| j                  |       y y y y y y )
Nr   intro
commercialcreditswatchedfinalrT   first)      )r<   r   r   r   r   r   r   r!   rK   r   WATCHED_MARKER_marker_watchedr   s     r&   r   z ActivityHandler._marker_callback  s      "(::<DGf~(f%</""6*9,'y1g6==+G+G1+L,,V4fmm.J.Jf.T,,V4 /U 2 - #r(   c                 F    | j                   d   s| j                  |       y y )Nr   )r!   _watched_callbackr   s     r&   r   zActivityHandler._marker_watched  s!    y)""6* *r(   c                 R   t         j                  j                  dk(  st         j                  j                  dk(  ry | j                  d   s]| j                  dk7  rMt        j                  | j                  d   | j                  | j                  d         r| j                          y y y y )NrT   r   r   r   
media_typerm   )	rK   r   r   r!   r   r   r   r   r   r-   s    r&   r   zActivityHandler.check_watched  s    ==''1,0L0LPQ0Q y)djjK.GGLaLaOOL)4+;+;T__Z=XM
 ""$M
.G)r(   c                 r    | j                   j                  | j                         | j                  |       y r*   )r   set_watchedr   r   r   s     r&   r   z!ActivityHandler._watched_callback  s)    (8(89r(   )FN)__name__
__module____qualname__r'   r.   r5   r<   rA   r@   rP   ri   rq   r   r   r   r   r   r   r   r   r   r   rh   r   r   r   r    r(   r&   r   r   &   s    *S)#!.
:",H
.+/8*+9>;NQfK>5$+% r(   r   c                       e Zd Zd Zd Zy)TimelineHandlerc                    || _         d | _        d| j                   v | _        | j                  rt        | j                   d         | _        t	        j
                  | j                   j                  d            xs d | _        t	        j
                  | j                   j                  d            xs d | _        | j                   j                  d      | _	        | j                   j                  d      | _
        t        j                  j                  | j                   j                  d            | _        t	        j
                  | j                   j                  dd            | _        | j                   j                  d	d
      | _        | j                   j                  d      | _        | j                   j                  d      | _        | j                   j                  d      | _        y )NitemIDparentItemID
rootItemID
identifierr   r   	sectionIDr   titleUnknownmetadataState
mediaState	queueSize)r   r   is_itemr   r   cast_to_intr   parent_rating_keygrandparent_rating_keyr   
state_typer   MEDIA_TYPE_VALUESr   
section_idr   metadata_statemedia_state
queue_sizer$   s     r&   r'   zTimelineHandler.__init__  s^     DMM1<<!$--"9:DO!(!4!4T]]5F5F~5V!W!_[_&-&9&9$--:K:KL:Y&Z&b^b#--++L9--++G4 2266t}}7H7H7PQ!--dmm.?.?Q.OP]]&&w	:
"mm//@==,,\:--++K8r(   c           
      
   | j                   sy | j                  dk7  ry | j                  r| j                  dkD  r| j                  dk(  r| j
                  dk(  rp| j                  dv rtt        j                  | j                  t                     }|j                  | j                         |t        | j                  <   t        j                  | j                  t                     }|j                  | j                         |t        | j                  <   | j                  ht        | j                  <   t        j                  d| j                  dt!        | j                        dt!        | j                        d       t#        d	j%                  | j                        t&        | j                  | j                  gt(        j*                  j,                  
       y | j                  dv r t        j                  | j                  t                     }|j                  | j                         |t        | j                  <   t        j                  d| j                  dt!        | j                        dt!        | j                        d       t#        d	j%                  | j                        t&        | j                  | j                  gt(        j*                  j,                  
       y | j                  dv rt        j                  | j                  t                     }|t        | j                  <   t        j                  d| j                  dt!        | j                        d       t#        d	j%                  | j                        t&        | j                  | j                  gt(        j*                  j,                  
       y y | j                  dv r| j                  dkD  rs| j                  dk(  rd| j
                  X| j.                  L| j                  t        v r:t        j                  d| j                  dt!        | j                        d       y | j                  dk(  r| j
                  dk(  r| j                  t        v r{t        | j                     sgt        j                  dt!        | j                        z         t1        | j                         t#        d	j%                  | j                        d       y y y y y )Nzcom.plexapp.plugins.libraryr   created)episodetrackz*Tautulli TimelineHandler :: Library item 'z' (z, grandparent z ) added to recently added queue.zrating_key-{}rz   )seasonalbumz
 , parent )movieshowartistr]   z) done processing metadata.	   deletedzNTautulli TimelineHandler :: Library item %s removed from recently added queue.Trr   )r   r   r   r   r   r   RECENTLY_ADDED_QUEUEr   r   setaddr   r   r   rd   r   r   re   rf   clear_recently_added_queuerK   r   NOTIFY_RECENTLY_ADDED_DELAYr   del_keys)r%   grandparent_set
parent_set	queue_sets       r&   r   zTimelineHandler.process  s   || ??;;
 ??t2t!7KPTPcPcgpPp"66"6":":4;V;VX[X]"^##D$:$:;DS$T%@%@A155d6L6LceT
t/?I$T%;%;<9=9T9T8U$T__5#'::s4??/CSIdIdEeg h
 "/"8"89T9T"U)C*.*E*Etzz)R,2MM,U,UW
 $77155d6L6LceT
t/?I$T%;%;<#'::s4??/CSI_I_E`b c
 "/"8"89O9O"P)C*.*@*@$**)M,2MM,U,UW
 $??044T__ceL	8A$T__5#'::s4??/CE F
 "/"8"8"I)C*.//4::)F,2MM,U,UW @ __ ;;RS@S1$)<)<)DI`#77LL#zz3t+?A B
 __!d&9&9Y&F"66?STXTcTc?d E"%doo"67 8 ) "/"8"8"IVZ[ @e6 'G!r(   N)r   r   r   r'   r   r   r(   r&   r   r     s    9*Q\r(   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)ReachabilityHandlerc                 T    || _         | j                   j                  dd      | _        y )NreachabilityF)datar   is_reachable)r%   r  s     r&   r'   zReachabilityHandler.__init__  s     	 IIMM.%@r(   c                 x    t        j                         }|j                  d      }t        j                  |      S )NPublishServerOnPlexOnlineKey)pref)r
   r1   get_server_prefr   	bool_true)r%   r4   r  s      r&   remote_access_enabledz)ReachabilityHandler.remote_access_enabled  s5     ++-**0N*O  &&r(   c                 H    t         j                  j                  d|d       y )N
on_extdownrH   remote_access_inforK   rL   rM   r%   server_responses     r&   r  zReachabilityHandler.on_extdown$  s    ,Ve fgr(   c                 H    t         j                  j                  d|d       y )Non_extupr  r  r  s     r&   r"  zReachabilityHandler.on_extup'  s    *Tc der(   c                    | j                         sy | j                  rt        j                  ry t	        j
                         }|j                         }|sy |d   dk(  rt        j                  d       y t        j                  dur|d   rt        j                  d|d   z         t        j                  d       dt        _        t        j                  d      sat        j                  d	t        j                  j                         t        d| j                   |gt        j                  j                  
       y y t        j                  du ro|d   sjt        j                  d       dt        _        t        j                  d      r#t        j                  d       t        dd       y | j#                  |       y t        j                  | j                  t        _        y y )Nmapping_statewaitingzGTautulli ReachabilityHandler :: Remote access waiting for port mapping.Freasonz8Tautulli ReachabilityHandler :: Remote access failed: %sz;Tautulli ReachabilityHandler :: Plex remote access is down.r  zUTautulli ReachabilityHandler :: Scheduling remote access down callback in %d seconds.rz   z>Tautulli ReachabilityHandler :: Plex remote access is back up.TzQTautulli ReachabilityHandler :: Cancelling scheduled remote access down callback.rr   )r  r  rK   PLEX_REMOTE_ACCESS_UPr
   r1   get_server_responser   warninfoACTIVITY_SCHEDget_jobrd   r   NOTIFY_REMOTE_ACCESS_THRESHOLDre   r  r"  )r%   r4   r   s      r&   r   zReachabilityHandler.process*  sw   ))+ !=!= ++-%99; ?+y8KKab))6?8;TKKRUdemUnnoKKUV+0F(!)),7t & L LN!,T__OK\,2MM,X,XZ 8 ))U2?8;TKKXY+/F(%%l3pq!,4@o.))1+/+<+<F( 2r(   N)r   r   r   r'   r  r  r"  r   r   r(   r&   r  r    s    A
'
hf+=r(   r  c                     t        | t              r| D ]  }t        |        y | t        v rt        t        j	                  |              y y r   )r   r  r
  r  pop)r   	child_keys     r&   r
  r
  X  sE    #s 	 IY	 	$	$%))#./ 
%r(   c                 2   t         j                  |       r|rt         j                  |        y t         j                  | |t	        t
        j
                  j                  t        j                        t        j                  di |z   t        j                               y |sut         j                  ||| t	        t
        j
                  j                  t        j                        t        j                  di |z   t        j                        d        y y )N)run_datetimezone)r`   trigger)r`   idr4  misfire_grace_timer   )r+  r,  rs   reschedule_jobr   datetimenowpytzUTC	timedeltaadd_job)r5  r_   rs   r`   rN   s        r&   re   re   `  s    b!%%b))){%..22488<x?Q?Q?[TZ?[[!XX(' * ( tK!**..txx88;M;M;WPV;WW-#  $	 	 	% r(   c                 p   t        j                         }|j                  |       }|j                  |      }|rpt        j
                  j                  |j                         dd       t        j                  d|d   d|d   d	       |j                  |
       t        |        y |dxx   dz  cc<   |d   t        j                  j                  k  rot        j                  d|d   d|d   dt        |d         d       |j!                  |        t#        dj%                  |       t&        | |d   |d   gd       y t        j                  d|d   d|d   dt        |d         d       t        j                  d|d   d|d   d	       |j                  |        t        |        y )Nr+   rp   rq   rF   zBTautulli ActivityHandler :: Removing stale stream with sessionKey r   rt   r   ru   rv   write_attemptsrT   zCTautulli ActivityHandler :: Failed to write stream with sessionKey z> to the database. Will try again in 30 seconds. Write attempt r[   r\   rX   rx   ry   rz   zD to the database. Removing session from the database. Write attempt )r   r   r,   r}   rK   rL   rM   rI   r   r*  r~   r   r   SESSION_DB_WRITE_ATTEMPTSr)  r   increment_write_attemptsre   rf   rg   )r   r   rx   r   r"   rw   s         r&   rg   rg   q  s   		-	-	/B###<G%%g%6FQZ [\ 	}-w|/DF 	G
(k* 	 !Q&!#$v}}'N'NNKK"=17<3H#gVfNgJhj k ''K'@ .55kBIZ$/1FPV#Xbdf KK"=17<3H#gVfNgJhj k KK"=17<3HJ K+6!+.r(   c                    t        j                  d|t        |              t        |    }t        j
                  j                  rt        |      dkD  rt        | |       n|rt|D ]n  }t        j                  |g       }t        j
                  j                  rt        |      dkD  rt        ||       O|r|D ]  }t        |        dt        |       p nt        |        t        |        y )NzUTautulli TimelineHandler :: Starting callback for library item '%s' (%s) after delay.rT   )
child_keys)r   rd   r   r  rK   r   'NOTIFY_GROUP_RECENTLY_ADDED_GRANDPARENTlen
on_createdr   "NOTIFY_GROUP_RECENTLY_ADDED_PARENTr
  )r   r   rC  r0  grandchild_keysgrandchild_keys         r&   r  r    s    
LLhJ) &j1J}}<<ZSTAT:*5	# 	&I266y"EO}}??CDX[\D\9A &5 /N~./ 9%	& 	: Zr(   c                    t        j                         }|j                  |       }t        j                  d|d   t        |              |rd}t        j                         }d|vr4|j                  |       r#t        j                  dt        |       z         d}|r5|dd}|j                  |       t        j                  j                  |       | g}d|v r|j                  |d          |D ]  }|j                  |        t        j                  d	t        t        |            z         y t        j                   d
t        |       z         y )NzATautulli TimelineHandler :: Library item '%s' (%s) added to Plex.rX   TrC  zOTautulli TimelineHandler :: Library item %s added already. Not notifying again.FrF  )timeline_datarH   z4Added %s items to the recently_added database table.zITautulli TimelineHandler :: Unable to retrieve metadata for rating_key %s)r
   r1   r2   r   rd   r   r   DataFactoryget_recently_added_itemrJ   rK   rL   rM   extendset_recently_added_itemrE  r   )	r   rN   r4   r#   r>   data_factoryr  all_keysr   s	            r&   rF  rF    s2   '')K//
;H
LLT,'Z:  #..0v%33J?n":/ 0%-MDKK##D)<6!OOF<01 	6C005	6 	KcRUV^R_N``a 	`cfgqcrrsr(   c                    	 t        j                  t         j                  j                  t        j
                  j                  dd| z               y # t        $ r%}t        j                  d| d|       Y d }~y d }~ww xY w)Nsession_metadatazmetadata-sessionKey-%s.jsonzMTautulli ActivityHandler :: Failed to remove metadata cache file (sessionKey z): )
osremovepathjoinrK   r   	CACHE_DIROSErrorr   r   )r   es     r&   r   r     sa    )
		"'',,v}}668JLilwLwxy )#Q( 	) 	))s   AA 	B A;;B )NFN)r8  rT  rb   apscheduler.triggers.dater   r:  rK   r   r   r   r   r   r	   r
   r+  r  objectr   r   r  r
  re   rg   r  rF  r   r   r(   r&   <module>r]     s      	  1   %     '   D f D Nh\f h\V==& ==@0%"#/L<&tR)r(   