
    g                         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	  G d	 d
e
      Zd Zy)    )defaultdictN)database)helpers)	libraries)logger)
pmsconnect)usersc                       e Zd ZddZddZddZddZddZddZddZ	dd	Z
dd
ZddZddZddZddZd ZddZddZddZddZddZd Zy)ActivityProcessorNc                    |	rMt        j                         }i d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d	|j                  d	d      d
|j                  d
d      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      i d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d |j                  d d      d!|j                  d!d      d"|j                  d"d      d#|j                  d#d      d$|j                  d$d      i d%|j                  d%d      xs dd&|j                  d&d      d'|j                  d'd      d(|j                  d(d      d)|j                  d)d      d*|j                  d*d      d+|j                  d+d      d,|j                  d,d      d-|j                  d-d      d.|j                  d.d      d/|j                  d/d      d0|j                  d0d      d1|j                  d1d      d2|j                  d2d      d3|j                  d3d      d4|j                  d4d      d5|j                  d5d      i d6|j                  d6d      d7|j                  d7d      d8|j                  d8d      d9|j                  d9d      d:|j                  d:d      d;|j                  d;d      d<|j                  d<d      d=|j                  d=d      d>|j                  d>d      d?|j                  d?d      d@|j                  d@d      dA|j                  dAd      dB|j                  dBd      dC|j                  dCd      dD|j                  dEd      dF|j                  dGd      dH|j                  dHd      i dI|j                  dId      dJ|j                  dJd      dK|j                  dKd      dL|j                  dLd      dM|j                  dMd      dN|j                  dNd      dO|j                  dOd      dP|j                  dPd      dQ|j                  dQd      dR|j                  dRd      dS|j                  dSd      dT|j                  dTd      dU|j                  dUd      dV|j                  dVd      dE|j                  dEd      dG|j                  dGd      dW|j                  dWd      i dX|j                  dXd      dY|j                  dYd      dZ|j                  dZd      d[|j                  d[d      d\|j                  d\d      d]|j                  d]d      d^|j                  d^d      d_|j                  d_d      d`|j                  d`d      da|j                  dad      db|j                  dbd      dc|j                  dcd      dd|j                  ddd      de|j                  ded      df|j                  dfd      dg|j                  dgd      dh|j                  dhd       |j                  did      |j                  djd      t        j                  |      |j                  dkd      |j                  dld      |j                  dmd      |j                  dnd      |j                  dod      |j                  dpd      t        j                         dq
}|j                  dd      |j                  dd      dr}|j                  ds||      }|dtk(  rt        j                         }| j                  |d	   |d   |d   |u      }||dv}	|j                  ds|	|       |rA|j                  |	       t        j                  j                  |j                         dwdx       |df   rt        j                          yyy y )zNsession_key 
session_idtranscode_key
section_id
rating_key
media_typestateuser_iduser
machine_idtitleparent_titlegrandparent_titleoriginal_title
full_titlemedia_indexparent_media_indexthumbparent_thumbgrandparent_thumbyearfriendly_name
ip_address	bandwidthr   locationplayerproductplatformparent_rating_keygrandparent_rating_keyoriginally_available_atadded_atguidview_offsetdurationvideo_decisionaudio_decisiontranscode_decisionwidthheight	containerbitratevideo_codecvideo_bitratevideo_widthvideo_heightvideo_resolutionvideo_frameratevideo_scan_typevideo_full_resolutionvideo_dynamic_rangeaspect_ratioaudio_codecaudio_bitrateaudio_channelsaudio_languageaudio_language_codesubtitle_codecsubtitle_forcedsubtitle_languagetranscode_protocoltranscode_containertranscode_video_codectranscode_audio_codectranscode_audio_channelstranscode_widthstream_video_widthtranscode_heightstream_video_heighttranscode_hw_decodingtranscode_hw_encodingsynced_versionsynced_version_profileoptimized_versionoptimized_version_profileoptimized_version_titlestream_bitratestream_video_resolutionquality_profilestream_container_decisionstream_containerstream_video_decisionstream_video_codecstream_video_bitratestream_video_frameratestream_video_scan_typestream_video_full_resolutionstream_video_dynamic_rangestream_audio_decisionstream_audio_codecstream_audio_bitratestream_audio_channelsstream_audio_languagestream_audio_language_codestream_subtitle_decisionstream_subtitle_codecstream_subtitle_forcedstream_subtitle_language	subtitleslive	live_uuidsecurerelayedrating_key_websocketchannel_call_sign
channel_idchannel_identifierchannel_titlechannel_thumbchannel_vcn)
rt   ru   raw_stream_inforv   rw   rx   ry   rz   r{   stopped)r   r   sessionsinsert)r   r   r   started)r   initial_streamon_play)stream_datanotify_actionT)r   MonitorDatabasegetjsondumpsr   	timestampupsertis_initial_streamupdateplexpyNOTIFY_QUEUEputcopyr   add_live_tv_library)
selfsessionnotifydbvalueskeysresultr   r   r   s
             */opt/Tautulli/plexpy/activity_processor.pywrite_sessionzActivityProcessor.write_session   s   ))+BpmW[[%C p"GKKb$Ap%w{{?B'Gp #GKKb$Ap #GKKb$A	p
 #GKKb$Ap w{{7B7p  Y!;p gkk&"5p #GKKb$Ap w{{7B7p %gkk."&Ep *7;;7JB+Op '4Db(Ip #GKKb$Ap $W[[%Cp  +GKK8Lb,Q!p" w{{7B7#p$ %gkk."&E%p& *7;;7JB+O'p( gkk&"5)p* &w{{?B'G+p, #GKKb$A-p. "7;;{A#>/p0 !'++j""=1p2 Hb 93p4  Y!;5p6 !'++j""=7p8 *7;;7JB+O9p: /<TVX0Y;p< 0=VXZ1[=p> !'++j""=?p@ gkk&"5ApB $W[[%CCpD !'++j""="BEpF '4Db(IGpH '4Db(IIpJ +GKK8Lb,QKpL w{{7B7MpN Hb 9OpP "7;;{B#?QpR  Y!;SpT $W[[%CUpV &w{{?B'GWpX $W[[%CYpZ %gkk."&E[p\ )'++6H"*M]p^ (5F)K_p` (5F)Kapb .w{{;RTV/Wcpd ,W[[9NPR-Sepf %gkk."&Egph $W[[%Cipj &w{{?B'Gkpl '4Db(Impn '4Db(Iopp ,W[[9NPR-Sqpr '4Db(Ispt (5F)Kupv *7;;7JB+Owpx +GKK8Lb,Qypz ,W[[9NPR-S{p| .w{{;RTV/W}p~ .w{{;RTV/Wp@ 1'++>XZ\2]ApB (5I2)NCpD )'++6KR*PEpF .w{{;RTV/WGpH .w{{;RTV/WIpJ '4Db(IKpL /<TVX0YMpN *7;;7JB+OOpP 27;;?Z\^3_QpR 0=VXZ1[SpT '4Db(IUpV 0=VXZ1[WpX (5F)KYpZ 27;;?Z\^3_[p\ )'++6H"*M]p^ .w{{;RTV/W_p` +GKK8Lb,Qapb -gkk:PRT.Ucpd +GKK8Lb,Qepf ,W[[9NPR-Sgph /<TVX0Yipj /<TVX0Ykpl 5gkkB`bd6empn 3GKK@\^`4aopp .w{{;RTV/Wqpr +GKK8Lb,Qspt -gkk:PRT.Uupv .w{{;RTV/Wwpx .w{{;RTV/Wypz 3GKK@\^`4a{p| 1'++>XZ\2]}p~ .w{{;RTV/Wp@ /<TVX0YApB 1'++>XZ\2]CpD "7;;{A#>EpF gkk&!4GpH "7;;{B#?IpJ Hd ;KpL ")Y!:.5kk:PRT.U)-G)<+2;;7JB+O$+KKb$A,3KK8Lb,Q'.{{?B'G'.{{?B'G%,[[%C!(!2!2!4_pFd $+;;}b#A")++lB"?AD YYz648F!!++-!%!7!7y@QCI,CWCI,CW@G "8 "I )0>R			*i6 NN9-''++GLLN]f,gh &>113' "u     c                 r   |s|d   n|d   }|sTt        j                         }|j                  |d         }t        j                         }|j                  |      }	|r|	sy|rd}
|j                  d      rqt        j                  |d         }|j                  dd        |j                  dd        |j                  d	d        |j                  d
d        |j                  |       t        t        |      }|r@t        |d	         j                         rt        |d	         }nTt        j                         }n?|d	   rt        |d	         }n+t        j                         }| j!                  |d   d	|       |s| j#                  |d   |d   |d   |       t        |d         j                         r
|d   dv rd}
n-t%        j&                  d|d   d|d   d|d   d       |d   S |t        j(                  |d         z
  t        j(                  |d         z
  }|st*        j,                  j.                  r|d   dk(  s|d   dk(  rq|t        t*        j,                  j.                        k  rKd}
t%        j&                  d|d   d|d   dt        |      dt*        j,                  j.                  d	       |sY|d   dk(  rQ|dk  rt        j(                  |d          d!k\  rd}
t%        j&                  d|d   d|d   dt        |      d"       nO|rM|rK|d   dk(  s|d   dk(  r;|t        |      k  r-d}
t%        j&                  d#|d   dt        |      d|d       |s#d$   sd}
t%        j&                  d%|d&   z         n$|s"	d$   sd}
t%        j&                  d'|	d(   z         |
r~t1        j2                         }i }|st%        j&                  d)|d   z         t5        j6                         }|d*   r$|j9                  t        |d         |d   d+      }n|j9                  t        |d         ,      }|d*   r|s|}n%|syd-|v rt;        |d-         d.kD  r|d-   d.   }n|}|}dd i}i d|d   d	|d|d   d/|d/   d0|d0   d|d   d|d   d1|d1   d2|d2   d|d   d3|d3   d4|d4   d5|d5   d6|d6   d7|d7   d8|d8   d|d   |d9   |d:   |d;   |d
   |d   |d<   |d=   d>}|j=                  d?||@       |j?                         }| jA                  |||       d|i}i d|d   dA|dA   dB|dB   dC|dC   d |d    dD|dD   dE|dE   dF|dF   dG|dG   dH|dH   dI|dI   dJ|dJ   dK|dK   dL|dL   dM|dM   dN|dN   dO|dO   i dP|dP   dQ|dQ   dR|dR   dS|dS   dT|dT   dU|dU   dV|dV   dW|dW   dX|dX   dY|dY   dZ|dZ   d[|d[   d\|d\   d]|d]   d^|d^   d_|d_   d`|d`   i da|da   db|db   dc|dc   dd|dd   de|de   df|df   dg|dg   dh|dh   di|di   dj|dj   dk|dk   dl|dl   dm|dm   dn|dn   do|do   dp|dp   dq|dq   i dr|dr   ds|ds   dt|dt   du|du   dv|dv   dw|dw   dx|dx   dy|dy   dz|dz   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}|j=                  d||@       djC                  |d         }djC                  |d         }djC                  |d         }djC                  |d         }djC                  |d         }d }d }|d   D ]  }|d   r|d   }|d   s|d   } d|i}i d|d   d/|d/   d0|d0   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   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|j                  d|j                  dd            |j                  d|j                  dd            |j                  d|j                  dd            |j                  d|j                  dd            |j                  d|j                  dd            |j                  d|j                  dd            ||d}|j=                  d||@       |d   S y )Nr   r   )r   )r   Fr|   idr   r}   r/   )r   r   r}   r   r   )r   r   r   r}   r   )movieepisodetrackTz&Tautulli ActivityProcessor :: Session z ratingKey z< not logged. Does not meet logging criteria. Media type is ''r   paused_counterr   r   z8Tautulli ActivityProcessor :: Play duration for session z is z secs which is less than z" seconds, so we're not logging it.r      r0      z8 secs, looks like it was skipped so we're not logging itz:Tautulli ActivityProcessor :: Play duration for ratingKey keep_historyzHTautulli ActivityProcessor :: History logging for user '%s' is disabled.usernamezKTautulli ActivityProcessor :: History logging for library '%s' is disabled.section_namezETautulli ActivityProcessor :: Fetching metadata for item ratingKey %srq   )r   	cache_keyreturn_cache)r   
media_infor   r*   r+   r   r$   r'   r(   product_versionr)   platform_versionprofiler%   r&   r\   rs   rt   )r%   r&   r\   r/   r   rs   rt   session_history
table_namekey_dict
value_dictr1   r2   r3   r6   r7   r4   r5   video_bit_depthr9   r8   video_codec_levelr:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rQ   transcode_hw_requestedtranscode_hw_full_pipelinerS   transcode_hw_decodetranscode_hw_decode_titlerT   transcode_hw_encodetranscode_hw_encode_titler^   r]   rZ   r_   ra   r`   stream_video_codec_levelstream_video_bit_depthrR   rP   r[   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   stream_subtitle_containerrn   ro   rp   rU   rV   rW   rX   rY   )rn   ro   rp   rU   rV   rW   rX   rY   session_history_media_info;	directorswritersactorsgenreslabelsmarkersfirststart_time_offsetfinalr   r   r   r   r   r   r   r   r    r!   artr"   r,   r-   
updated_atlast_viewed_atcontent_ratingsummarytaglineratingr.   studiorv   r   rw   rx   ry   rz   r{   )rw   rx   ry   rz   r{   marker_credits_firstmarker_credits_finalsession_history_metadata)"r	   Usersget_detailsr   	Librariesr   r   loadspopr   r   strisdigitintr   r   set_session_statewrite_continued_sessionr   debugcast_to_intr   CONFIGLOGGING_IGNORE_INTERVALr   r   r   
PmsConnectget_metadata_detailslenr   last_insert_idgroup_historyjoin)r   r   import_metadata	is_importimport_ignore_intervalr   	user_datauser_detailslibrary_datalibrary_detailslogging_enabledr|   r}   real_play_timer   r   pms_connectmetadatar   r   last_idr   r   r   r   r   r   r   markers                                r   write_session_historyz'ActivityProcessor.write_session_history   s   2;W\*Q]A^
I$009K0LL$..0L*66*6MO  #O {{,-"&**W5F-G"H##D$/##M48##It4##M48/!#w/Gwy)*224!')"45G%//1G#gi01!++-&&7=3I-6/6 ' 8 ,,WY5G8?8M8?8M5< - >
 7<()1138MQn8n"&%m4gl6KWUaMbd e t}$$w':':79;M'NNQXQdQdelm}e~QN!F!FL)W48MQZ8Z'#fmm.S.S*TT&+OLL")-"8',:OQTUcQd"(--"G"G"I J !6'!A!B&7+>+>wz?R+SWY+Y&+OLL")-"8',:OQTUcQd"f g 5L)W48MQZ8Z'#.D*EE&+OLL"),"7^9LNd"f g \.%A"'gjv  xB  kC  C  D~'F"'jm|  ~L  nM  M  N--/
 !LL!hkrs  lA  "A  B","7"7"9Kv#.#C#CsSZ[gShOiNUVcNdQU $D $W $/#C#CsSZ[gShOi#C#jvx#*%$'83H\<R8SVW8W)1,)?)BJ.H!(J d|)WY%7 #W&(= .w7J/K 3G<T4U	
 '(= $WY%7 !'&/ '(= +G4D,E #GH$5 $WY%7 ,W5F-G %gj&9 -g6H.I $WY%7  '(=!" (/{';&-j&9-45F-G)0)?(0(>$+H$5%,Y%7/8 		%6RX	Y ++-""7GX> gL,(= L*G4D,EL*G4D,EL /8L0ML %gj&9	L
 &w{';L $WY%7L "77#3L #GH$5L ,W5F-GL *7?+CL ()?L .w7J/KL ()?L )'.*AL -g6H.IL  ,W5F-G!L" ,W5F-G#L$ 27;R3S%L& 09N1O'L( )'.*A)L* ()?+L, *7?+C-L. +G4D,E/L0 +G4D,E1L2 09N1O3L4 +G4D,E5L6 ,W5F-G7L8 .w7J/K9L: /8L0M;L< 09N1O=L> 27;R3S?L@ 27;R3SALB 5g>X6YCLD ,W5F-GELF -g6H.IGLH 3G<T4UILJ 7@\8]KLL 27;R3SMLN 09N1OOLP 6w?Z7[QLR 27;R3SSLT 09N1OULV 6w?Z7[WLX -g6H.IYLZ 6w?Z7[[L\ +G4D,E]L^ 27;R3S_L` 1':P2QaLb /8L0McLd 5g>X6YeLf 3G<T4UgLh 09N1OiLj /8L0MkLl 4W=V5WmLn 3G<T4UoLp 3G<T4UqLr 9'B`:asLt 7@\8]uLv 27;R3SwLx /8L0MyLz 1':P2Q{L| 27;R3S}L~ 27;R3SL@ 7@\8]ALB 5g>X6YCLD 27;R3SELF 6w?Z7[GLH 5<<T4U6=>X6Y'.{';,34D,E4;<T4U/67J/K7>?Z7[5<=V5WWL` 		%AD]c	d  HHXk%:;	((8I#67(8"45(8"45(8"45'+$'+$&y1 KFg/56I/J,g/56I/J,	K g),(= )-w7J/K)2G<T4U) "77#3) )'.*A	)
 .w7J/K) +G4D,E) '(=) (-)@) /9M0N) "8G#4) )(>*B) .x8K/L)  %) '(=) !(6"2)  4X>W5X!)" %hz&:#)$ '(>%)& +H5E,F')( +H5E,F))* $Xi%8+), $Xi%8-). #HX$6/)0 %hz&:1)2 !(6"23)4 &y5)6 $W7)8 #F9): #F;)< #HX$6=)> #F?)@ !'&/A)B .z~~>QSZS^S^_rtvSw/xC)D )3|W[[Q]_aEb(c0:?SU\U`U`auwyUz0{+5>>/7;;WfhjKk+l+5>>/7;;WfhjKk+l)3w{{S`bdGe)f2F2FQ)Z 		%?$[a	b 4= M	 r   c                    d x}}d }t        j                         }|d   rVd}||d   g}	|j                  ||	      }
t        |
      dkD  r||r|d   n|d   |d}|
d   d   |
d   d   |
d   d	   d}d
}nd}||d   |d   g}	|j                  ||	      }
t        |
      dkD  r|
d   d   |
d   d   t	        j
                  |
d   d         |
d   d	   d}|
d   d   |
d   d   t	        j
                  |
d   d         |
d   d	   d}|rt	        j                  |d         \  }}n
|d   }|d   }t	        j                  |d   |d   |d   ||      }d}|d
u rF|d   s|d   |d   k  s|d   r1|d   |d   k(  r&|rt        j                  d|d          |d	   |d   g}	n|rt        j                  d|d          ||g}	|j                  ||	       y )Nrq   a  SELECT session_history.id, session_history_metadata.guid, session_history.reference_id FROM session_history JOIN session_history_metadata ON session_history.id == session_history_metadata.id WHERE session_history.id <= ? AND session_history.user_id = ? AND datetime(session_history.started, 'unixepoch', 'localtime') > datetime('now', '-1 day') ORDER BY session_history.id DESC LIMIT 1 r   )queryargsr   r.   )r   r.   reference_idr   r   FzSELECT id, rating_key, view_offset, reference_id FROM session_history WHERE id <= ? AND user_id = ? AND rating_key = ? ORDER BY id DESC LIMIT 2 r      r/   )r   r   r/   r   r   r   r   r   r0   z9UPDATE session_history SET reference_id = ? WHERE id = ? z@Tautulli ActivityProcessor :: Grouping history for sessionKey %sr   zDTautulli ActivityProcessor :: Not grouping history for sessionKey %s)r   r   selectr   r   r   get_first_final_markercheck_watchedr   r   action)r   r   r   r   new_sessionprev_sessionprev_watchedr   r   r   r   marker_firstmarker_finals                r   r   zActivityProcessor.group_history  sx   %))l%%'6?@E WY/0DYYUY6F6{Q%,;Cx'7QW/68 '-Qio(.q	&(906q	.0I K  %aE WY/1FGDYYUY6F6{Q%+AYt_-3AY|-D.5.A.A&)MBZ.[/5ay/HJ
 '-Qio.4Qi.E/6/B/B6!9]C[/\06q	.0I K
 181O1OPXYbPc1d.L,#*+A#BL#*+A#BL&44L)<+FPZH[ , 
 L 5 L$?;}C]$]FOV 4F8K K_ahivawx 0+d2CDD celmze{|W%D
		D	)r   c                     t        j                         }d}g }t        |      j                         r|rdnd}|d|z   z  }|j	                  |       |j                  ||      }|S )NzSELECT * FROM sessionsz GROUP BY ip_addressr   z WHERE user_id = ?)r   r   r   r   appendr   )r   r   r$   r   r   r   ipr~   s           r   get_sessionszActivityProcessor.get_sessions6  se    %%'(w<!+5'2B)B..EKK 99UD)r   c                     t        j                         }t        |      j                         r|j	                  d|g      }|r|S y )Nz-SELECT * FROM sessions WHERE session_key = ? r   r   r   r   r   select_singler   r   r   r   s       r   get_session_by_keyz$ActivityProcessor.get_session_by_keyC  sO    %%'{##%&& (E2= ' @G r   c                 `    t        j                         }|r|j                  d|g      }|r|S y )Nz,SELECT * FROM sessions WHERE session_id = ? r	  )r   r   r  )r   r   r   r   s       r   get_session_by_idz#ActivityProcessor.get_session_by_idN  s@    %%'&& (D2< ' ?G r   c                     t        j                         }t        |      j                         r?i }|r||d<   |j	                         D ]
  \  }}|||<    d|i}|j                  d||      }	|	S y )Nr   r   r~   )r   r   r   r   itemsr   )
r   r   r   kwargsr   r   kvr   r   s
             r   r   z#ActivityProcessor.set_session_stateY  sz    %%'{##%F"'w 1q	 ";/DYYz648FMr   c                     t        j                         }t        |      j                         r|j	                  d|g       y t        |      j                         r|j	                  d|g       y y )Nz*DELETE FROM sessions WHERE session_key = ?z!DELETE FROM sessions WHERE id = ?r   r   r   r   r   )r   r   row_idr   s       r   delete_sessionz ActivityProcessor.delete_sessionk  sX    %%'{##%IIB[MR[  "II9F8D #r   c                    t        j                         }t        |      j                         r|j	                  d|g      }d }|D ]V  }|d   s	t        j                         t        |d         z
  }|d   rt        |d         t        |      z   }Lt        |      }X d|i}|r||d<   d|i}	|j                  d||	       y y )NzFSELECT last_paused, paused_counter FROM sessions WHERE session_key = ?r	  last_pausedr   r   r~   )	r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   paused_offsetr   r   s
             r   set_session_last_pausedz)ActivityProcessor.set_session_last_pausedr  s    %%'{##%YY  <CN-  QF "N! <=)$+$5$5$7#gm>T:U$UM/0),W5E-F)G#mJ\)\),]);< $Y/F+9'(!;/DIIj&$/) &r   c                     t        j                         }t        |      j                         r|j	                  d|g       y y )NzIUPDATE sessions SET buffer_count = buffer_count + 1 WHERE session_key = ?r  r   r   r   s      r   increment_session_buffer_countz0ActivityProcessor.increment_session_buffer_count  <    %%'{##%II 3'=* &r   c                     t        j                         }t        |      j                         r|j	                  d|g      }|r|d   S yy )Nz7SELECT buffer_count FROM sessions WHERE session_key = ?buffer_countr   r
  )r   r   r   r"  s       r   get_session_buffer_countz*ActivityProcessor.get_session_buffer_count  sW    %%'{##%++ -I 3>@L #N33 &r   c                     t        j                         }t        |      j                         r|j	                  d|g       y y )NzWUPDATE sessions SET buffer_last_triggered = strftime('%s', 'now') WHERE session_key = ?r  r  s      r   set_session_buffer_trigger_timez1ActivityProcessor.set_session_buffer_trigger_time  r   r   c                     t        j                         }t        |      j                         r|j	                  d|g      }|r|d   S y y )Nz@SELECT buffer_last_triggered FROM sessions WHERE session_key = ?buffer_last_triggeredr
  )r   r   r   	last_times       r   get_session_buffer_trigger_timez1ActivityProcessor.get_session_buffer_trigger_time  sW    %%'{##%(( *F 0;m=I  !899 &r   c                 z    t        j                         }t        j                         }|j	                  d|g       y )NzUPDATE sessions SET stopped = ?)r   r   r   r   r   )r   r   stopped_times      r   set_temp_stoppedz"ActivityProcessor.set_temp_stopped  s/    %%'((*
		3l^Dr   c                     t        j                         }t        |      j                         r-| j	                  |      }|j                  d|d   dz   |g       y y )N)r   z<UPDATE sessions SET write_attempts = ? WHERE session_key = ?write_attemptsr   )r   r   r   r   r  r   r  s       r   increment_write_attemptsz*ActivityProcessor.increment_write_attempts  s\    %%'{##%--+-FGIIT#$459;GI &r   c                     t        j                         }t        |dk(        t        |dk(        t        |dk(        g}|j                  d|||gz          y )Nintro
commercialcreditsz\UPDATE sessions SET intro = ?, commercial = ?, credits = ?, marker = ? WHERE session_key = ?)r   r   r   r   )r   r   
marker_idxmarker_typer   marker_argss         r   
set_markerzActivityProcessor.set_marker  s_    %%'w&'|+,y()

 			 /"j+%>>	@r   c                 T    t        j                         }|j                  dd|g       y )Nz5UPDATE sessions SET watched = ? WHERE session_key = ?r   )r   r   r   r  s      r   set_watchedzActivityProcessor.set_watched  s)    %%'
		 /;'	)r   c                 h    t        j                         }|||d}d|i}|j                  d||       y )N)r   r   r   r}   sessions_continuedr   )r   r   r   )r   r   r   r   r}   r   r   r   s           r   r   z)ActivityProcessor.write_continued_session  s9    %%'"*JWW%
		1DV	Tr   c                     t        j                         }|j                  d|||g      }t        ||j	                  dd      z
  t
        j                  j                  k\        S )NztSELECT stopped FROM sessions_continued WHERE user_id = ? AND machine_id = ? AND media_type = ? ORDER BY stopped DESCr}   r   )r   r   r  r   r   r   r   "NOTIFY_CONTINUED_SESSION_THRESHOLD)r   r   r   r   r   r   last_sessions          r   r   z#ActivityProcessor.is_initial_stream  sa    %%''' )E /6z:-N	P
 7\--i;;v}}?o?ooppr   c                 @   t        j                  d       t        j                         syt        j                  d       t        j                         }d}|j                  |      }t        |      }d}t        |d      D ]Y  \  }}t        ||z  dz        |kD  r*t        ||z  dz        }t        j                  d	|dz         	 | j                  |d
   |       [ t        j                  d       y# t        $ r!}t        j                  d|       Y d }~ yd }~ww xY w)Nz9Tautulli ActivityProcessor :: Creating database backup...Fz;Tautulli ActivityProcessor :: Regrouping session history...zoSELECT * FROM session_history JOIN session_history_metadata ON session_history.id = session_history_metadata.idr   r   )start
   z>Tautulli ActivityProcessor :: Regrouping session history: %d%%r   zBTautulli ActivityProcessor :: Error regrouping session history: %szBTautulli ActivityProcessor :: Regrouping session history complete.T)r   infor   make_backupr   r   r   	enumerater   r   	Exceptionerror)	r   r   r   resultscountprogressir   es	            r   regroup_historyz!ActivityProcessor.regroup_history  s	   OP##%QR%%'` 	 ))E"G#G15 		JAw1u9r>"X-q5y2~.\^fik^kl""74=':		 	XY  acdes   C33	D<DD)NT)NNFr   N)NN)NNN)NNNN)__name__
__module____qualname__r   r   r   r  r  r  r   r  r  r  r#  r%  r)  r,  r/  r7  r9  r   r   rL   r   r   r   r      sr    N`t!l	P*d		$E00*
*
E
I	@)Uqr   r   c                  4    t               j                          y rM  )r   rL  rQ  r   r   rL  rL    s    '')r   )collectionsr   r   r   r   r   r   r   r   r	   objectr   rL  rQ  r   r   <module>rU     s6     $        \ \~*r   