
    gJ                         d dl m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 dlm
Z
 d d	lmZ d d
lmZ d Z G d de      Zy)    )	parse_qslN)common)database)
datatables)helpers)	libraries)logger)plextv)sessionc            
      &   t        j                  d       t        j                         j	                         } t
        j                  j                  }|st        j                  d       y | rt        j                         }dg}g }| D ]  }|j                  d      r?dj                  |d         |d<   |j                  t        j                  |d                n|j                  d      rwt!        j"                         j%                         }dj                  |D cg c]  }t'        |d          c}      |d<   |j                  t        j                  |d                d|j)                  d      i}|d   rB|j+                  d	|d   g      }	|	r"|	d   d
   r|	d   d
   |	d   d   k(  r|d   |d
<   n|d   |d
<   |d   |d   k(  rd |d<   |d   s|d   |d<   |j-                  d||      } | dk(  sn|j                  |d           dj/                  dj                  dgt1        |      z              }
|j3                  |
|       t        j4                  |       t        j                  d       yt        j6                  d       yc c}w )Nz2Tautulli Users :: Requesting users list refresh...zUTautulli Users :: No PMS identifier, cannot refresh users. Verify server in settings.r   shared_libraries;user_idserver_token
section_idz<SELECT thumb, custom_avatar_url FROM users WHERE user_id = ?custom_avatar_urlthumbtitleusernameusers)key_dict
value_dictinsertz8UPDATE users SET is_active = 0 WHERE user_id NOT IN ({})z, ?queryargsz'Tautulli Users :: Users list refreshed.Tz/Tautulli Users :: Unable to refresh users list.F)r	   infor
   PlexTVget_full_users_listplexpyCONFIGPMS_IDENTIFIERerrorr   MonitorDatabasegetjoinappendr   cast_to_intr   	Librariesget_sectionsstrpopselectupsertformatlenactionfilter_usernameswarn)result	server_id
monitor_dbuser_ids	new_usersitemlibsl	keys_dictavatar_urlsr   s              /opt/Tautulli/plexpy/users.pyrefresh_usersr@   "   s   
KKDE]]_002F,,Ilm--/
 3	 $	3Dxx*++.88D9K4L+M'( 3 3DO DE.) **,99;+.88SW4XaS<5I4X+Y'( 3 3DO DE"DHHY$78I #(// 1O1:91E0FH &q>*=>'N+>?;q>RYCZZ48M0104WD,- G}Z 00 $W 
##'=Z &&wt&TF!  j!12I$	3L KQQRVR[R[]`\adghpdq\qRrsH5 		*=>EFS 5Ys   J
c                       e Zd 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dZddZ	 	 ddZd ZddZddZd Zy) Usersc                      y N )selfs    r?   __init__zUsers.__init__g   s        Nc                 R   dddg d}t        j                         }ddgg}|t        j                  j                  }t        j                         r%|j                  dt        j                         g       |j                  d      r"|j                  d|j                  d      g       |rdnd}g ddd	d
ddddd|z  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)||dgg d*g d+d,dgdd-gdd.gg|/      }|d1   }
g }|
D ]'  }|d2   d3k(  r|d4   r|d4   }n|d2   d3k(  r|d5   }n|d6   }|d7   r|d7   |d8   k7  r|d7   }n|d8   r|d8   }nt        j                  }t        j                  j                  |d9   |d9         }i d:|d:   d|d   d;|d;   d<|d<   d=|d=   d>|d>   d8|d?|d?   d@|d@   dA|dA   dB|dB   dC|dC   dD|dD   d9|dE|dE   dF|dF   d2|d2   ||dG   |dH   |dI   |dJ   |dK   |dL   |dM   |dN   |dO   |dP   |dQ   |dR   dS}|j                  |       * |dT   |dU   t        j                   |      |dV   dW}|S # t        $ r$}	t        j                  d0|	z         |cY d }	~	S d }	~	ww xY w)XNr   recordsFilteredrecordsTotaldrawdatazusers.deleted_userusers.user_idr   zsession_history.reference_idsession_history.idzusers.id AS row_idzusers.username(CASE WHEN users.friendly_name IS NULL OR TRIM(users.friendly_name) = ''                     THEN users.username ELSE users.friendly_name END) AS friendly_namezusers.titlezusers.emailzusers.thumb AS user_thumbz'users.custom_avatar_url AS custom_thumbzCOUNT(DISTINCT %s) AS playsa	  SUM(CASE WHEN session_history.stopped > 0 THEN (session_history.stopped - session_history.started)                     ELSE 0 END) - SUM(CASE WHEN session_history.paused_counter IS NULL THEN 0 ELSE                     session_history.paused_counter END) AS duration)MAX(session_history.started) AS last_seenz)MAX(session_history.id) AS history_row_id2session_history_metadata.full_title AS last_playedsession_history.ip_addresssession_history.platformsession_history.playersession_history.rating_key#session_history_metadata.media_typesession_history_metadata.thumb%session_history_metadata.parent_thumb*session_history_metadata.grandparent_thumb%session_history_metadata.parent_titlesession_history_metadata.year$session_history_metadata.media_index+session_history_metadata.parent_media_indexsession_history_metadata.live!session_history_metadata.added_at0session_history_metadata.originally_available_atsession_history_metadata.guid-session_history_media_info.transcode_decisionzusers.do_notify AS do_notifyz"users.keep_history AS keep_historyz users.allow_guest AS allow_guestzusers.is_active AS is_activer   )LEFT OUTER JOINre   re   )session_historysession_history_metadatasession_history_media_infosession_history.user_idsession_history_metadata.idsession_history_media_info.id
table_namecolumnscustom_wheregroup_by
join_typesjoin_tables
join_evalskwargszDTautulli Users :: Unable to execute database query for get_list: %s.r5   
media_typeepisodeparent_thumbgrandparent_thumbr   custom_thumb
user_thumbplatformrow_idr   friendly_namer   emailplaysduration	last_seenlast_playedhistory_row_id
ip_addressplayer
rating_keyparent_titleyearmedia_indexparent_media_indexliveoriginally_available_atguidtranscode_decision	do_notifykeep_historyallow_guest	is_active)r   r   r   r   r   r   r   r   r   r   r   r   r   filteredCount
totalCountrM   rK   rL   rN   rM   )r   
DataTablesr!   r"   GROUP_HISTORY_TABLESr   get_session_user_idr(   r&   	ssp_query	Exceptionr	   r4   r   DEFAULT_USER_THUMBPLATFORM_NAME_OVERRIDESfriendly_name_to_username)rF   rt   groupingdefault_returndata_tablesro   rp   rn   r   er   rowsr:   r   rz   r{   rowdicts                     r?   get_datatables_listzUsers.get_datatables_listj   s   -.*+"#"$&
 !++--q12}}99H&&('2M2M2O PQ::i &**Y2G HI5=1CW%' %"%#%X%
 !% !% /% =% 18;%E% ?% ?% H%  0!%" .#%$ ,%%& 0'%( 9)%* 4+%, ;-%. @/%0 ;1%2 33%4 :5%6 A7%8 39%: 7;%< F=%> 3?%@ CA%B 2C%D 8E%F 6G%H 2I%L	"))W297C4C3D6I7U 8QRa6b7KMj6k7KMl6m6o 28 * 9E$ h 2	DL!Y.43G^,l#y001WN#^(<\@R(R!.1
l#!,/
#66
 5599$z:JDQ[L\]H8T(^ d9otJ/ #D$9 DM	
 DM   DM tJ/ [ 1 !$}"5 $T*:%;  l!3 x T(^  l!3   l!3!" "#'#7<"&}"5)-.B)C<.23L.M<)-.B)C $[ 1#'#7"&}"5 $[ 1;C@ KKe2	h $)#9 %l 399$?f C  	"KK^abbc!!	"s   9'I9 9	J&J!J&!J&c                 2   dddg d}t        j                  |      s|S t        j                         }d|g}g d}	 |j	                  d||gdgg dg dd	dgd
dgd
dgg|      }|d   }	g }
|	D ]  }|d   dk(  r|d   r|d   }n|d   dk(  r|d   }n|d   }t        j                  j                  |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"   |d#   |d$   |d%   |d&   d'}|
j                  |        |d(   |d)   t        j                  |
      |d*   d+}|S # t
        $ r$}t        j                  d|z         |cY d }~S d }~ww xY w),Nr   rJ   rO   )z$session_history.id AS history_row_idz*MIN(session_history.started) AS first_seenrR   rT   z'COUNT(session_history.id) AS play_countrU   rV   rW   rS   rY   rZ   r[   rX   r\   r]   r^   r_   r`   ra   rb   rc   rd   zsession_history.userz)session_history.user_id as custom_user_idrQ   rf   r   )JOINr   r   )r   rg   rh   ri   rP   rj   rk   rl   zJTautulli Users :: Unable to execute database query for get_unique_ips: %s.r5   ru   rv   rw   rx   r   r{   r   r   
first_seen
play_countr   r   r   r   r   r   r   r   r   r   r   r}   custom_user_id)r   r   r}   r   r   r   rM   r   )r   allow_session_userr   r   r   r   r	   r4   r   r   r&   r(   r   )rF   r   rt   r   r   ro   rn   r   r   resultsr   r:   r   r{   r   r   s                   r?   get_datatables_unique_ipszUsers.get_datatables_unique_ips   s   -.*+"#"$&
 ))'2!! ++-'18	"))5F298D~4@>6>7U 8QRa6b7KMj6k7KMl6m6o 28 * 9E$ / "	DL!Y.43G^,l#y001W 5599$z:JDQ[L\]H#T*:%; [ 1l!3  l!3  l!3	
 x T(^ !$}"5  l!3 E  l!3 "4#7 4< !$}"5 (.B)C 4<  -d3L.M!"  <)-.B)C$($9"#34)C. KKE"	H $)#9 %l 399$?f c  	"KKdghhi!!	"s   (E) )	F2FFFc                 N   t        |      j                         r^t        j                         }|j	                  d|g      }|j                  d      |k(  rd }d|i}	|||||d}
	 |j                  d|
|	       y y # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)Nz,SELECT username FROM users WHERE user_id = ?r   r   )r}   r   r   r   r   r   zFTautulli Users :: Unable to execute database query for set_config: %s.)
r,   isdigitr   r%   select_singler&   r/   r   r	   r4   )rF   r   r}   ry   r   r   r   r7   userr   r   r   s               r?   
set_configzUsers.set_configb  s    w<!!113J++,Z]d\efDxx
#}4 $!7+H+8/;'0*6)4	Jj!!':x@ "   jdghhiijs   $A9 9	B$BB$c                    i dddddddddt         j                  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v r|s|s|S | j                  ||||      }|r|S t        j                  |rd|z  n|       t                | j                  ||||      }|r|S t        j                  |rd|z         |S |       |S )Nr|   r   r   r   Localr}   rz   r~    r      is_adminis_home_useris_allow_syncis_restrictedr   r   r   deleted_userr   rE   r   )Nr   )r   r   r~   include_last_seenzYTautulli Users :: Unable to retrieve user %s from database. Requesting user list refresh.zSTautulli Users :: Unable to retrieve user %s from database. Returning 'Local' user.)r   r   get_user_detailsr	   r4   r@   )rF   r   r   r~   r   r   user_detailss          r?   get_detailszUsers.get_detailsv  s   (A #Q$g *7 '(A(A	
 "2 &q %b )! *1 *1 &q )! ( )! -b  &t!& j e!!,,W4u?P - R  KK%, t!"268 O00tSXCT 1 VL ## )0 r%& < &% 7;< &%rH   c                 H   d}d}|rd}d}t        j                         }	 t        |      j                         rd}|g}	n|rd}|g}	n|rd}|g}	nt	        d      d	|d
|d|d}
|j                  |
|	      }i }|r|D ]  }t        j                         rt        j                         }n|d   r|d   }n|d   }|d   r|d   |d   k7  r|d   }n|d   r|d   }nt        j                  }|d   rt        |d   j                  d            n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"   } |S # t        $ r%}t        j                  d|z         g }Y d }~#d }~ww xY w)#NNULLr   zMAX(session_history.started)zJLEFT OUTER JOIN session_history ON users.user_id = session_history.user_idzusers.user_id = ?zusers.username = ?zusers.email = ?z#Missing user_id, username, or emaila	  SELECT users.id AS row_id, users.user_id, username, friendly_name, thumb AS user_thumb, custom_avatar_url AS custom_thumb, email, is_active, is_admin, is_home_user, is_allow_sync, is_restricted, do_notify, keep_history, deleted_user, allow_guest, shared_libraries, z AS last_seen FROM users z WHERE z COLLATE NOCASEr   zLTautulli Users :: Unable to execute database query for get_user_details: %s.r}   r   ry   rz   r   r   rE   r|   r   r~   r   r   r   r   r   r   r   r   r   r   )r   r%   r,   r   r   r.   r	   r4   r   r   get_session_userr   r   tuplesplit)rF   r   r   r~   r   r   r'   r7   wherer   r   r5   r   r   r:   r}   rz   r   s                     r?   r   zUsers.get_user_details  s   	6I_D--/
	7|##%+y,v)w EFF 2;D%IE  &&u4&8F
  ""..0$+$<$<$>M/*$($9M$($4M'D,@DDV,V!%n!5J,'!%l!3J!'!:!:JQUVhQi5.@)A)G)G)L#Moq  "$x.  " )4	? " *D,< " !0 " !-j	 "
 !(g " !,T+-> " !+D,< " !/^0D " !0o1F " !0o1F " !,T+-> " !/^0D " !/^0D " !.tM/B " !34D "  !,T+->! "#""F S  	KKfijjkF	s   AE3 3	F!<FF!c                    t        j                  |      sg S |t        j                  j                  }|r5|3t        t        j                  t        |      j                  d            }ng d}t        j                         }t        j                         }g }|rdnd}|D ]  }||dz  dz  dz  z
  }		 |dkD  r:t        |      j                         rd|d	|	d
}
|j                  |
|g      }n8g }n5t        |      j                         rd|z  }
|j                  |
|g      }ng }|D ]-  }|d   r|d   }|d   }nd}d}|||d}|j%                  |       /  |S # t        $ r$}t!        j"                  d|z         g }Y d }~^d }~ww xY w)N,)r         r   reference_idid   <   r   zSELECT (SUM(stopped - started) -    SUM(CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END)) AS total_time, COUNT(DISTINCT z7) AS total_plays FROM session_history WHERE stopped >= z AND user_id = ? r   zSELECT (SUM(stopped - started) -    SUM(CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END)) AS total_time, COUNT(DISTINCT %s) AS total_plays FROM session_history WHERE user_id = ? zPTautulli Users :: Unable to execute database query for get_watch_time_stats: %s.
total_timetotal_plays)
query_daysr   r   )r   r   r!   r"   r   mapr   r)   r,   r   	timestampr   r%   r   r.   r   r	   r4   r(   )rF   r   r   r   r   r7   user_watch_time_statsrp   daystimestamp_queryr   r5   r   r:   r   r   r   s                    r?   get_watch_time_statszUsers.get_watch_time_stats  s   ))'2I}}99H*0W00#j/2G2G2LMJ&J%%'	--/
 "%->4 *	2D'$)b.2*==O!87|++- 7?!Q ",!2!25y!2!I!#7|++-!5 8@	!@
 ",!2!25y!2!I!#
  2%!%l!3J"&}"5K!"J"#K%)%/&1
 &,,S12;*	2X %$'  nqrrss   3A4E	F
&FF
c                    t        j                  |      sg S |t        j                  j                  }t        j                         }g }d}|rdnd}	 t        |      j                         rd|z  }|j                  ||g      }ng }|D ]  }
t        j                  j                  |
d   |
d         t!        fdt        j"                  j%                         D        d	      }|
d
   ||
d   |
d   |d}|j'                  |       |dz  } |S # t        $ r$}	t        j                  d|	z         g }Y d }	~	d }	~	ww xY w)Nr   r   r   a  SELECT player, COUNT(DISTINCT %s) as total_plays, (SUM(stopped - started) - SUM(CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END)) AS total_time, platform FROM session_history WHERE user_id = ? GROUP BY player ORDER BY total_plays DESC, total_time DESCr   zLTautulli Users :: Unable to execute database query for get_player_stats: %s.r{   c              3   N   K   | ]  \  }}|j                         v s|  y wrD   )lower).0kvr{   s      r?   	<genexpr>z)Users.get_player_stats.<locals>.<genexpr>R  s'     !g1QRV^VdVdVfQf!!gs   %%defaultr   r   r   )player_namer{   platform_namer   r   	result_idr   )r   r   r!   r"   r   r   r%   r,   r   r.   r   r	   r4   r   r   r&   nextPLATFORM_NAMESitemsr(   )rF   r   r   r7   player_statsr   rp   r   r5   r   r:   r   r   r{   s                @r?   get_player_statszUsers.get_player_stats1  s\   ))'2I}}99H--/
	%->4	7|##%E HPP $**5y*A
  	D5599$z:JDQ[L\]H !g0E0E0K0K0M!girsM"&x.'$1"&}"5!%l!3 )C $NI	 '  	KKfijjkF	s   5D 	D>D99D>c                    t        j                  |      sg S t        j                         }g }|j	                         sd}	 t        |      j	                         rd}|j                  |||g      }ng }|D ]  }|d   dk(  r|d   r|d   }	n|d   dk(  r|d   }	n|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|d   d|d   i}
|j                  |
        |S # t        $ r$}t        j                  d|z         g }Y d }~d }~ww xY w)N10a  SELECT session_history.id, session_history.media_type, guid, session_history.rating_key, session_history.parent_rating_key, session_history.grandparent_rating_key, title, parent_title, grandparent_title, original_title, thumb, parent_thumb, grandparent_thumb, media_index, parent_media_index, year, originally_available_at, added_at, live, started, user FROM session_history_metadata JOIN session_history ON session_history_metadata.id = session_history.id WHERE user_id = ? GROUP BY (CASE WHEN session_history.media_type = 'track' THEN session_history.parent_rating_key    ELSE session_history.rating_key END) ORDER BY MAX(started) DESC LIMIT ?r   zPTautulli Users :: Unable to execute database query for get_recently_watched: %s.ru   rv   rw   rx   r   r|   r   r   parent_rating_keygrandparent_rating_keyr   r   grandparent_titleoriginal_titler   r   r   r   r   r   timestartedr   )r   r   r   r%   r   r,   r.   r   r	   r4   r(   )rF   r   limitr7   recently_watchedr   r5   r   r   r   recent_outputs              r?   get_recently_watchedzUsers.get_recently_watched`  s3   ))'2I--/
}}E	7|##%
= $**57G*H
  	3C< I-#n2EN+\"i//0GXs4y )3|+<)3|+< 1#6I2J 6s;S7T	
 %c'l ,S-@ 1#6I2J .s3C/D %e +C,> 237K3L $S[ 7<U8V $S[ $S[  $S^!" $S[#M& ##M27	3:  C  	KKjmnnoF	s   3D   	E)EEc                 J   t        j                         }|rdnd}	 d|z  }|j                  |      }g }|D ]  }|d   rt        |d   j                  d            nd}	i d	|d	   d
|d
   d|d   d|d   xs |d   d|d   xs |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                  |
        |S # t        $ r$}t	        j
                  d|z         g cY d }~S d }~ww xY w)Nr   zWHERE deleted_user = 0a   SELECT id AS row_id, user_id, username, friendly_name, thumb, custom_avatar_url, email, is_active, is_admin, is_home_user, is_allow_sync, is_restricted, do_notify, keep_history, allow_guest, shared_libraries, filter_all, filter_movies, filter_tv, filter_music, filter_photos FROM users %s)r   zETautulli Users :: Unable to execute database query for get_users: %s.r   r   rE   r|   r   r   r}   r   r   r~   r   r   r   r   r   r   r   r   
filter_allfilter_movies	filter_tvfilter_musicfilter_photos)r   r   r   )	r   r%   r.   r   r	   r4   r   r   r(   )rF   include_deletedr7   r   r   r5   r   r   r:   r   r   s              r?   	get_userszUsers.get_users  s   --/
%+C		$ ',	,E
  &&U&3F
  	DMQRdMeuT*<%=%C%CC%HIkmHd8n tIZ 0 $T/%:%Nd:>N T"56G$w-	
 T']  k!2 Z 0 #D$8 $T/%: $T/%:  k!2 #D$8 "4#6 '(8 !$|"4  $T/%:!" "&k!2$($8%)/%:'D* LL1	4 ?  	KK_bccdI	s   C5 5	D">DD"D"c           
         t        j                         }|r|t        t        t        j
                  |j                  d                  }|j                  dj                  dj                  dgt        |      z              |      }g }|D ]'  }|j                  | j                  |d   |             ) t        |      S t        |      j                         rHt        j                   |      }|r|S t#        j$                  d|z         	 |j'                  d|g       |S y
# t(        $ r"}	t#        j*                  d	|	z         Y d }	~	y d }	~	ww xY w)Nr   z*SELECT user_id FROM users WHERE id IN ({})r   r   )r   
purge_only)r   z>Tautulli Users :: Deleting user with user_id %s from database.zTUPDATE users SET deleted_user = 1, keep_history = 0, do_notify = 0 WHERE user_id = ?zBTautulli Users :: Unable to execute database query for delete: %s.F)r   r%   listr   r   r)   r   r.   r0   r'   r1   r(   deleteallr,   r   delete_user_historyr	   r   r2   r   r4   )
rF   r   row_idsr   r7   r5   successr   delete_successr   s
             r?   r   zUsers.delete  sU   --/
w*3w22GMM#4FGHG  && (::@&3%RUV]R^J^A_:`bikF G Ct{{4	?6@  +  B CC w<\!!#%99'JN%%\%& 'j%% ':<C9F *)
 	 ! jKK dgh hiijs   D# #	E,E		Ec                    t        j                         }	 |r^t        |      j                         rEd}|j	                  ||g      }|r,t        j                  d|z         |j                  d|g       yy|rEd}|j	                  ||g      }|r,t        j                  d|z         |j                  d	|g       yyy # t        $ r"}t        j                  d
|z         Y d }~y d }~ww xY w)Nz%SELECT * FROM users WHERE user_id = ?r   z8Tautulli Users :: Re-adding user with id %s to database.zTUPDATE users SET deleted_user = 0, keep_history = 1, do_notify = 1 WHERE user_id = ?TFz&SELECT * FROM users WHERE username = ?z>Tautulli Users :: Re-adding user with username %s to database.zUUPDATE users SET deleted_user = 0, keep_history = 1, do_notify = 1 WHERE username = ?zDTautulli Users :: Unable to execute database query for undelete: %s.)
r   r%   r,   r   r.   r	   r   r2   r   r4   )rF   r   r   r7   r   r5   r   s          r?   undeletezUsers.undelete  s    --/
	d3w<//1?#**gY*GKK Z]d de%% ':<C9F   @#**hZ*HKK `ck kl%% ';=EJH      	dKK^abbcc	ds   AB> 6AB> >	C)C$$C)c                 |    |r3	 t        j                         }d}|j                  ||g      }|r|d   S y y #  Y y xY w)Nz,SELECT user_id FROM users WHERE username = ?r   r   r   r%   r   )rF   r   r7   r   r5   s        r?   get_user_idzUsers.get_user_id  sT    	%557
F#11%tf1E!),, s   07 ;c                 8   t        j                         }d}t        j                         rdt        j                         z  }	 d|z  }|j	                  |      }t        j                  |      S # t
        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)Nr   zAND user_id = %s zSELECT user_id, (CASE WHEN users.friendly_name IS NULL OR TRIM(users.friendly_name) = ''                     THEN users.username ELSE users.friendly_name END) AS friendly_name FROM users WHERE deleted_user = 0 %szJTautulli Users :: Unable to execute database query for get_user_names: %s.)	r   r%   r   r   r.   r   r	   r4   r   )rF   rt   r7   	user_condr   r5   r   s          r?   get_user_nameszUsers.get_user_names  s    --/
	&&(+g.I.I.KKI
	0 3<	<E  &&u-F
 0088	  	KKdghhi	s   A. .	B7BBc                     dddd}|r@	 t        j                         }d}|j                  ||g      }|r|d   |d   |d   d}|S |S |S #  |cY S xY w)	Nr   r   )r   
user_tokenr   z^SELECT allow_guest, user_token, server_token FROM users WHERE user_id = ? AND deleted_user = 0r   r   r  r   r  )rF   r   tokensr7   r   r5   s         r?   
get_tokenszUsers.get_tokens1  s    
 %557
A#11%wi1H-3M-B,2<,@.4^.D F "M!M s   <A A Ac           	      Z   |si S 	 t        j                         }d}|j                  ||g      }i }|j                         D ]  \  }}i }	|j                  d      D ].  }
d|
v sd|
v s|	j                  t        t        |
                   0 t        d |	j                  dd	      j                  d
      D              |	d<   t        d |	j                  dd	      j                  d
      D              |	d<   |	||<    |S # t        $ r$}t	        j
                  d|z         i }Y d }~d }~ww xY w)NzeSELECT filter_all, filter_movies, filter_tv, filter_music, filter_photos FROM users WHERE user_id = ?r   zGTautulli Users :: Unable to execute database query for get_filters: %s.|zcontentRating=zlabel=c              3   &   K   | ]	  }|s|  y wrD   rE   r   fs     r?   r   z$Users.get_filters.<locals>.<genexpr>`  s     -jAhia-j   contentRatingr   r   content_ratingc              3   &   K   | ]	  }|s|  y wrD   rE   r  s     r?   r   z$Users.get_filters.<locals>.<genexpr>a  s     %ZAXYa%Zr  labellabels)r   r%   r   r   r	   r4   r   r   updater   r   r   r-   )rF   r   r7   r   r5   r   filters_listr   r   filtersr  s              r?   get_filterszUsers.get_filtersK  s1   I	!113J(E--e7)-DF
 LLN 
	&DAqGWWS\ 7#q(HMNN4	!#567 ).-j_VX9Y9_9_`c9d-j(jG$% %%ZWb1I1O1OPS1T%Z ZGH%LO
	& #  	KKadeefF	s   *C= =	D*D%%D*c
           	      \   |t        |      j                         rct        j                         }
|t	        j
                  |      }t	        j                         |d}||||||||	d}	 |
j                  d||       y y # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)N)r   r   )r   
user_groupr   host
user_agentr  expiry	jwt_token
user_login)rm   r   r   zITautulli Users :: Unable to execute database query for set_login_log: %s.)r,   r   r   r%   r   datetime_to_isor   r/   r   r	   r4   )rF   r   r   r!  r   r"  r#  r  r$  r%  r7   keysvaluesr   s                 r?   set_user_loginzUsers.set_user_loging  s     ?c'l224!113J! 008!(!2!2!4&(D #$.$."$.!( &#,.Fm!!\DU[!\' 5(  mgjkkllms   *B   	B+	B&&B+c                 T    t        j                         }|j                  d|g      }|S )Nz,SELECT * FROM user_login WHERE jwt_token = ?r  )rF   r%  r7   r5   s       r?   get_user_loginzUsers.get_user_login  s2    --/
)) +@+4+7 rH   c           
      J   t        j                         }|r*t        j                  d       	 |j	                  d|g       y
|r|t        t        t        j                  |j                  d                  }t        j                  d|       	 |j	                  dj                  dj                  dgt        |      z              |       y
y
# t
        $ r }t        j                  d|       Y d }~yd }~ww xY w# t
        $ r }t        j                  d	|       Y d }~yd }~ww xY w)Nz*Tautulli Users :: Clearing user JWT token.z:UPDATE user_login SET jwt_token = NULL WHERE jwt_token = ?z5Tautulli Users :: Unable to clear user JWT token: %s.Fr   z5Tautulli Users :: Clearing JWT tokens for row_ids %s.z7UPDATE user_login SET jwt_token = NULL WHERE id in ({})r   z1Tautulli Users :: Unable to clear JWT tokens: %s.T)r   r%   r	   debugr2   r   r$   r   r   r   r)   r   r0   r'   r1   )rF   r%  r  r7   r   s        r?   clear_user_login_tokenzUsers.clear_user_login_token  s   --/
LLEF!! #8#,+/$  ,3w22GMM#4FGHGLLPRYZ!! #55;VCHHcUSQX\EY<Z5[")+   TVWX  PRSTs/   C =C9 	C6C11C69	D"DD"c                 D   dddg d}t        j                  |      s|S t        j                         }t        j                         rdt        j                         gg}n	|rd|ggng }g d}	 |j                  d||g dgdgddgg|	      }|d   }
g }|
D ]  }t        j                  |d         \  }}d }d}|d   rM|d   rHt        j                  |d         }|t        j                         kD  r|j                  d      }|d   |k(  }|d   |d   |d   |d   |d   |d   |d   |||d   |||d   xs |d   d}|j!                  |        |d   |d   t        j"                  |      |d   d}|S # t        $ r$}	t        j                  d
|	z         |cY d }	~	S d }	~	ww xY w)Nr   rJ   user_login.user_id)zuser_login.id AS row_idzuser_login.timestampr1  zuser_login.userzuser_login.user_groupzuser_login.ip_addresszuser_login.hostzuser_login.user_agentzuser_login.successzuser_login.expiryzuser_login.jwt_tokenrQ   r&  re   r   rO   rl   zUTautulli Users :: Unable to execute database query for get_datatables_user_login: %s.r5   r#  Fr%  r$  z%Y-%m-%d %H:%M:%Sr|   r   r   r!  r   r"  r  r}   r   )r|   r   r   r!  r   r"  r#  osbrowserr  r$  currentr}   r   r   rM   r   )r   r   r   r   r   r   r   r	   r4   httpagentparsersimple_detectr   iso_to_datetimearrownowstrftimer(   r   )rF   r   r%  rt   r   r   ro   rn   r   r   r   r   r:   r2  r3  r$  r4  _expiryr   r   s                       r?   get_datatables_user_loginzUsers.get_datatables_user_login  s   -.*+"#"$&
 ))'2!! ++-&&(173N3N3PQRL@G17;<RL	"))\297C356G5H7>i7K_6]5^17 * 9E / 	D+99$|:LMMRFGK T(^!11$x.AUYY[($--.ABF,	9!(^ $[ 1"9o!%l!3!%l!3<!%l!3%"9o#%$($9$IT&\C KK5	8 $)#9 %l 399$?f S  	"KKorsst!!	"s   -E2 2	F;FFFc                     t        j                         }	 t        j                  d       |j	                  d       |j	                  d       y# t
        $ r"}t        j                  d|z         Y d }~yd }~ww xY w)Nz4Tautulli Users :: Clearing login logs from database.zDELETE FROM user_loginVACUUMTzLTautulli Users :: Unable to execute database query for delete_login_log: %s.F)r   r%   r	   r   r2   r   r4   )rF   r7   r   s      r?   delete_login_logzUsers.delete_login_log  sh    --/
	KKNO67h' 	KKfijjk	s   7A 	A9A44A9)NN)Nr   r   r   r   r   )NNNF)NNN)Nr   )F)NNFrD   )	NNNNNNr   NN)__name__
__module____qualname__rG   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r*  r,  r/  r<  r?  rE   rH   r?   rB   rB   e   s    KZiVj(.&`GR@%D-^; z+Z!Fd@9*48 ^bJNm44Qf
rH   rB   )urllib.parser   r8  r5  r!   r   r   r   r   r   r	   r
   r   r@   objectrB   rE   rH   r?   <module>rE     s@   $ #           @FZF ZrH   