
    g                     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  G d d	e	      Z
y)
    N)common)database)helpers)logger)	libraries)sessionc                   z    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y)Graphsc                      y N )selfs    /opt/Tautulli/plexpy/graphs.py__init__zGraphs.__init__!   s        Nc                    t        j                         }t        j                  |      xs d}t        j                         |dz  dz  dz  z
  }| j                  |      }|t        j                  j                  }|rdnd}	 |dk(  rd|d|d	|d
}	|j                  |	      }
nd|d|d|d
}	|j                  |	      }
|
D ci c]  }|d   |
 }}t        j                  j                         }t!        dt#        |            D cg c]  }|t        j$                  |      z
   }}g }g }g }g }g }t'        |      D ]  }|j)                  d      }|j+                  |       |j-                  |i       }|j-                  dd      }|j-                  dd      }|j-                  dd      }|j-                  dd      }|j+                  |       |j+                  |       |j+                  |       |j+                  |        d|d}d|d}d|d}d|d} g }!t/        j0                  d      r|!j+                  |       t/        j0                  d      r|!j+                  |       t/        j0                  d      r|!j+                  |       t/        j0                  d      r|!j+                  |        ||!d}"|"S # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY wc c}w c c}w ) N      <   session_history.reference_idsession_history.idplaysa  SELECT sh.date_played, SUM(CASE WHEN sh.media_type = 'episode' AND shm.live = 0 THEN 1 ELSE 0 END) AS tv_count, SUM(CASE WHEN sh.media_type = 'movie' AND shm.live = 0 THEN 1 ELSE 0 END) AS movie_count, SUM(CASE WHEN sh.media_type = 'track' AND shm.live = 0 THEN 1 ELSE 0 END) AS music_count, SUM(shm.live) AS live_count FROM (SELECT *,      date(started, 'unixepoch', 'localtime') AS date_played     FROM session_history     WHERE session_history.stopped >=       GROUP BY date_played, zj) AS sh JOIN session_history_metadata AS shm ON shm.id = sh.id GROUP BY sh.date_played ORDER BY sh.starteda  SELECT sh.date_played, SUM(CASE WHEN sh.media_type = 'episode' AND shm.live = 0   THEN sh.d ELSE 0 END) AS tv_count, SUM(CASE WHEN sh.media_type = 'movie' AND shm.live = 0   THEN sh.d ELSE 0 END) AS movie_count, SUM(CASE WHEN sh.media_type = 'track' AND shm.live = 0   THEN sh.d ELSE 0 END) AS music_count, SUM(CASE WHEN shm.live = 1   THEN sh.d ELSE 0 END) AS live_count FROM (SELECT *,      date(started, 'unixepoch', 'localtime') AS date_played,      SUM(CASE WHEN stopped > 0 THEN (stopped - started) -         (CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END) ELSE 0 END)         AS d     FROM session_history     WHERE session_history.stopped >=     GROUP BY date_played, zTTautulli Graphs :: Unable to execute database query for get_total_plays_per_day: %s.date_playedr   days%Y-%m-%dtv_countmovie_countmusic_count
live_countTVnamedataMoviesMusicLive TVshowmovieartistlive
categoriesseries)r   MonitorDatabaser   cast_to_int	timestamp_make_user_condplexpyCONFIGGROUP_HISTORY_TABLESselect	Exceptionr   warndatetimedatetodayrangeint	timedeltasortedstrftimeappendgetr   has_library_type)#r   
time_rangey_axisuser_idgrouping
monitor_dbr4   	user_condgroup_byqueryresulteitemresult_by_date_playedbasex	date_listr0   series_1series_2series_3series_4	date_itemdate_stringresult_dateseries_1_valueseries_2_valueseries_3_valueseries_4_valueseries_1_outputseries_2_outputseries_3_outputseries_4_outputseries_outputoutputs#                                      r   get_total_plays_per_dayzGraphs.get_total_plays_per_day$   s   --/
((4:
%%'*r/B*>*CC	((1	}}99H5=1CW*	  2;IxQ $**51 !H 2;Ix'Q* $**51
 HN Ntm!4d!: N N }}""$@EaZ@YZ1TH..A66Z	Z
	* 	,I#,,Z8Kk*/33KDK(__Z;N(__]A>N(__]A>N(__\1=NOON+OON+OON+OON+	,  $(#+-#+#+-#*#+-#,#+- %%f-  1%%g.  1%%h/  1%%f-  1 *)+m  	KKnqrrs	 !O
 [s%   A J; K)
 K.;	K&K!!K&c                 @   t        j                         }t        j                  |      xs d}t        j                         |dz  dz  dz  z
  }| j                  |      }|t        j                  j                  }|rdnd}	 |dk(  rd|d|d	|d
}	|j                  |	      }
nd|d|d|d
}	|j                  |	      }
|
D ci c]  }|d   |
 }}t        j                  j                  rg d}ng d}g }g }g }g }g }|D ]  }|j                  |       |j                  |i       }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  |       |j                  |       |j                  |       |j                  |        d|d}d|d}d|d}d|d}g }t!        j"                  d      r|j                  |       t!        j"                  d      r|j                  |       t!        j"                  d      r|j                  |       t!        j"                  d      r|j                  |       ||d}|S # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY wc c}w ) Nr   r   r   r   r   r   a  SELECT sh.daynumber, (CASE sh.daynumber   WHEN 0 THEN 'Sunday'   WHEN 1 THEN 'Monday'   WHEN 2 THEN 'Tuesday'   WHEN 3 THEN 'Wednesday'   WHEN 4 THEN 'Thursday'   WHEN 5 THEN 'Friday'   ELSE 'Saturday' END) AS dayofweek, SUM(CASE WHEN sh.media_type = 'episode' AND shm.live = 0 THEN 1 ELSE 0 END) AS tv_count, SUM(CASE WHEN sh.media_type = 'movie' AND shm.live = 0 THEN 1 ELSE 0 END) AS movie_count, SUM(CASE WHEN sh.media_type = 'track' AND shm.live = 0 THEN 1 ELSE 0 END) AS music_count, SUM(shm.live) AS live_count FROM (SELECT *,       CAST(strftime('%w', date(started, 'unixepoch', 'localtime')) AS INTEGER) AS daynumber    FROM session_history     WHERE session_history.stopped >= r   z     GROUP BY daynumber, zg) AS sh JOIN session_history_metadata AS shm ON shm.id = sh.id GROUP BY dayofweek ORDER BY sh.daynumbera  SELECT sh.daynumber, (CASE sh.daynumber   WHEN 0 THEN 'Sunday'   WHEN 1 THEN 'Monday'   WHEN 2 THEN 'Tuesday'   WHEN 3 THEN 'Wednesday'   WHEN 4 THEN 'Thursday'   WHEN 5 THEN 'Friday'   ELSE 'Saturday' END) AS dayofweek, SUM(CASE WHEN sh.media_type = 'episode' AND shm.live = 0   THEN sh.d ELSE 0 END) AS tv_count, SUM(CASE WHEN sh.media_type = 'movie' AND shm.live = 0   THEN sh.d ELSE 0 END) AS movie_count, SUM(CASE WHEN sh.media_type = 'track' AND shm.live = 0   THEN sh.d ELSE 0 END) AS music_count, SUM(CASE WHEN shm.live = 1   THEN sh.d ELSE 0 END) AS live_count FROM (SELECT *,       CAST(strftime('%w', date(started, 'unixepoch', 'localtime')) AS INTEGER) AS daynumber,       SUM(CASE WHEN stopped > 0 THEN (stopped - started) -         (CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END) ELSE 0 END)         AS d     FROM session_history     WHERE session_history.stopped >= z    GROUP BY daynumber, zZTautulli Graphs :: Unable to execute database query for get_total_plays_per_dayofweek: %s.	dayofweek)MondayTuesday	WednesdayThursdayFridaySaturdaySunday)rp   rj   rk   rl   rm   rn   ro   r    r   r!   r"   r#   r$   r%   r(   r)   r*   r+   r,   r-   r.   r/   )r   r2   r   r3   r4   r5   r6   r7   r8   r9   r:   r   r;   WEEK_START_MONDAYrD   rE   r   rF   ) r   rG   rH   rI   rJ   rK   r4   rL   rM   rN   rO   rP   rQ   result_by_dayofweek	days_listr0   rV   rW   rX   rY   day_item
result_dayr]   r^   r_   r`   ra   rb   rc   rd   re   rf   s                                    r   get_total_plays_per_dayofweekz$Graphs.get_total_plays_per_dayofweek   s   --/
((4:
%%'*r/B*>*CC	((1	}}99H5=1CW:	 * 4=i)S, $**51/ !h 4=i7S: $**51
 DJJ4tK0$6JJ==**EI;I 
! 	,Hh',002>J'^^J:N'^^M1=N'^^M1=N'^^L!<NOON+OON+OON+OON+	, $(#+-#+#+-#*#+-#,#+- %%f-  1%%g.  1%%h/  1%%f-  1 *)+o  	KKtwxxy	 Ks   A I- J-	J6JJc                    t        j                         }t        j                  |      xs d}t        j                         |dz  dz  dz  z
  }| j                  |      }|t        j                  j                  }|rdnd}	 |dk(  rd|d|d	|d
}	|j                  |	      }
nd|d|d|d
}	|j                  |	      }
|
D ci c]  }|d   |
 }}g d}g }g }g }g }g }|D ]  }|j                  |       |j                  |i       }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  |       |j                  |       |j                  |       |j                  |        d|d}d|d}d|d}d|d}g }t        j                   d      r|j                  |       t        j                   d      r|j                  |       t        j                   d      r|j                  |       t        j                   d      r|j                  |       ||d}|S # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY wc c}w )Nr   r   r   r   r   r   a  SELECT sh.hourofday, SUM(CASE WHEN sh.media_type = 'episode' AND shm.live = 0 THEN 1 ELSE 0 END) AS tv_count, SUM(CASE WHEN sh.media_type = 'movie' AND shm.live = 0 THEN 1 ELSE 0 END) AS movie_count, SUM(CASE WHEN sh.media_type = 'track' AND shm.live = 0 THEN 1 ELSE 0 END) AS music_count, SUM(shm.live) AS live_count FROM (SELECT *,       strftime('%H', datetime(started, 'unixepoch', 'localtime')) AS hourofday    FROM session_history     WHERE session_history.stopped >= r   z     GROUP BY hourofday, zj) AS sh JOIN session_history_metadata AS shm ON shm.id = sh.id GROUP BY sh.hourofday ORDER BY sh.hourofdaya  SELECT sh.hourofday, SUM(CASE WHEN sh.media_type = 'episode' AND shm.live = 0   THEN sh.d ELSE 0 END) AS tv_count, SUM(CASE WHEN sh.media_type = 'movie' AND shm.live = 0   THEN sh.d ELSE 0 END) AS movie_count, SUM(CASE WHEN sh.media_type = 'track' AND shm.live = 0   THEN sh.d ELSE 0 END) AS music_count, SUM(CASE WHEN shm.live = 1   THEN sh.d ELSE 0 END) AS live_count FROM (SELECT *,       strftime('%H', datetime(started, 'unixepoch', 'localtime')) AS hourofday,       SUM(CASE WHEN stopped > 0 THEN (stopped - started) -         (CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END) ELSE 0 END)         AS d     FROM session_history     WHERE session_history.stopped >= z    GROUP BY hourofday, zZTautulli Graphs :: Unable to execute database query for get_total_plays_per_hourofday: %s.	hourofday)000102030405060708091011121314151617181920212223r    r   r!   r"   r#   r$   r%   r(   r)   r*   r+   r,   r-   r.   r/   )r   r2   r   r3   r4   r5   r6   r7   r8   r9   r:   r   r;   rD   rE   r   rF   ) r   rG   rH   rI   rJ   rK   r4   rL   rM   rN   rO   rP   rQ   result_by_hourofday
hours_listr0   rV   rW   rX   rY   	hour_itemresult_hourr]   r^   r_   r`   ra   rb   rc   rd   re   rf   s                                    r   get_total_plays_per_hourofdayz$Graphs.get_total_plays_per_hourofday  s   --/
((4:
%%'*r/B*>*CC	((1	}}99H5=1CW*	  4=iS $**51 !H 4=i'S* $**51
 DJJ4tK0$6JJ:

 
# 	,Ii(-11)R@K(__Z;N(__]A>N(__]A>N(__\1=NOON+OON+OON+OON+	, $(#+-#+#+-#*#+-#,#+- %%f-  1%%g.  1%%h/  1%%f-  1 *)+k  	KKtwxxy	 Ks   A I I<	I9I44I9c                 &   t        j                         }t        j                  |      xs d}t	        j
                  t        j                               j                  |       j                  d      j                         }| j                  |      }|t        j                  j                  }|rdnd}	 |dk(  rd|d|d	|d
}	|j                  |	      }
nd|d|d|d
}	|j                  |	      }
|
D ci c]  }|d   |
 }}t"        j$                  j'                         }|}|g}t)        t+        |      dz
        D ]{  }|j,                  |z
  dz  dz
  s%t#        j$                  |j.                  dz
  dd      }n.t#        j$                  |j.                  |j,                  dz
  d      }|j1                  |       } g }g }g }g }g }t3        |      D ]  }|j5                  d      }|j1                  |j5                  d             |j                  |i       }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j1                  |       |j1                  |       |j1                  |       |j1                  |        d|d}d|d}d|d}d|d} g }!t7        j8                  d      r|!j1                  |       t7        j8                  d      r|!j1                  |       t7        j8                  d      r|!j1                  |       t7        j8                  d      r|!j1                  |        ||!d }"|"S # t        $ r"}t        j                   d|z         Y d }~y d }~ww xY wc c}w )!N   )monthsmonthr   r   r   a  SELECT sh.datestring, SUM(CASE WHEN sh.media_type = 'episode' AND shm.live = 0 THEN 1 ELSE 0 END) AS tv_count, SUM(CASE WHEN sh.media_type = 'movie' AND shm.live = 0 THEN 1 ELSE 0 END) AS movie_count, SUM(CASE WHEN sh.media_type = 'track' AND shm.live = 0 THEN 1 ELSE 0 END) AS music_count, SUM(shm.live) AS live_count FROM (SELECT *,       strftime('%Y-%m', datetime(started, 'unixepoch', 'localtime')) AS datestring    FROM session_history     WHERE session_history.stopped >= r   z     GROUP BY datestring, zl) AS sh JOIN session_history_metadata AS shm ON shm.id = sh.id GROUP BY sh.datestring ORDER BY sh.datestringa  SELECT sh.datestring, SUM(CASE WHEN sh.media_type = 'episode' AND shm.live = 0   THEN sh.d ELSE 0 END) AS tv_count, SUM(CASE WHEN sh.media_type = 'movie' AND shm.live = 0   THEN sh.d ELSE 0 END) AS movie_count, SUM(CASE WHEN sh.media_type = 'track' AND shm.live = 0   THEN sh.d ELSE 0 END) AS music_count, SUM(CASE WHEN shm.live = 1   THEN sh.d ELSE 0 END) AS live_count FROM (SELECT *,       strftime('%Y-%m', datetime(started, 'unixepoch', 'localtime')) AS datestring,       SUM(CASE WHEN stopped > 0 THEN (stopped - started) -         (CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END) ELSE 0 END)         AS d     FROM session_history     WHERE session_history.stopped >= z    GROUP BY datestring, zVTautulli Graphs :: Unable to execute database query for get_total_plays_per_month: %s.
datestring   z%Y-%mz%b %Yr    r   r!   r"   r#   r$   r%   r(   r)   r*   r+   r,   r-   r.   r/   )r   r2   r   r3   arrowrE   r4   shiftfloorr5   r6   r7   r8   r9   r:   r   r;   r<   r=   r>   r?   r@   r   yearrD   rB   rC   r   rF   )#r   rG   rH   rI   rJ   rK   r4   rL   rM   rN   rO   rP   rQ   result_by_datestringdt_todaydtmonth_rangenr0   rV   rW   rX   rY   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   s#                                      r   get_total_plays_per_monthz Graphs.get_total_plays_per_month{  sh   --/
((4:
IIg//12888LRRSZ[eeg	((1	}}99H5=1CW*	  5>y(T $**51 !H 5>y('T* $**51
 FLLT\ 2D 8LL ==&&(ds:q() 	#A^^A%+Q.]]27719b!4]]277BHHQJ:r"	# 
% 	,B++g.Kbkk'23.22;CK(__Z;N(__]A>N(__]A>N(__\1=NOON+OON+OON+OON+	,  $(#+-#+#+-#*#+-#,#+- %%f-  1%%g.  1%%h/  1%%f-  1 *)+{  	KKpsttu	  Ms   7A M  ;N 	N)NNc                 v   t        j                         }t        j                  |      xs d}t        j                         |dz  dz  dz  z
  }| j                  |      }|t        j                  j                  }|rdnd}	 |dk(  rd|d|d	|d
}	|j                  |	      }
nd|d|d|d}	|j                  |	      }
g }g }g }g }g }|
D ]  }|j                  t        j                  j!                  |d   |d                |j                  |d          |j                  |d          |j                  |d          |j                  |d           d|d}d|d}d|d}d|d}g }t#        j$                  d      r|j                  |       t#        j$                  d      r|j                  |       t#        j$                  d      r|j                  |       t#        j$                  d      r|j                  |       ||d}|S # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)Nr   r   r   r   r   r   a  SELECT sh.platform, SUM(CASE WHEN sh.media_type = 'episode' AND shm.live = 0 THEN 1 ELSE 0 END) AS tv_count, SUM(CASE WHEN sh.media_type = 'movie' AND shm.live = 0 THEN 1 ELSE 0 END) AS movie_count, SUM(CASE WHEN sh.media_type = 'track' AND shm.live = 0 THEN 1 ELSE 0 END) AS music_count, SUM(shm.live) AS live_count, COUNT(sh.id) AS total_count FROM (SELECT *     FROM session_history     WHERE session_history.stopped >= r        GROUP BY z) AS sh JOIN session_history_metadata AS shm ON shm.id = sh.id GROUP BY sh.platform ORDER BY total_count DESC, sh.platform ASC LIMIT 10az  SELECT sh.platform, SUM(CASE WHEN sh.media_type = 'episode' AND shm.live = 0   THEN sh.d ELSE 0 END) AS tv_count, SUM(CASE WHEN sh.media_type = 'movie' AND shm.live = 0   THEN sh.d ELSE 0 END) AS movie_count, SUM(CASE WHEN sh.media_type = 'track' AND shm.live = 0   THEN sh.d ELSE 0 END) AS music_count, SUM(CASE WHEN shm.live = 1   THEN sh.d ELSE 0 END) AS live_count, SUM(sh.d) AS total_duration FROM (SELECT *,       SUM(CASE WHEN stopped > 0 THEN (stopped - started) -         (CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END) ELSE 0 END)         AS d     FROM session_history     WHERE session_history.stopped >=     GROUP BY zy) AS sh JOIN session_history_metadata AS shm ON shm.id = sh.id GROUP BY sh.platform ORDER BY total_duration DESC LIMIT 10z`Tautulli Graphs :: Unable to execute database query for get_total_plays_by_top_10_platforms: %s.platformr    r!   r"   r#   r$   r%   r(   r)   r*   r+   r,   r-   r.   r/   )r   r2   r   r3   r4   r5   r6   r7   r8   r9   r:   r   r;   rD   r   PLATFORM_NAME_OVERRIDESrE   r   rF   )r   rG   rH   rI   rJ   rK   r4   rL   rM   rN   rO   rP   r0   rV   rW   rX   rY   rQ   ra   rb   rc   rd   re   rf   s                           r   #get_total_plays_by_top_10_platformsz*Graphs.get_total_plays_by_top_10_platforms  sR   --/
((4:
%%'*r/B*>*CC	((1	}}99H5=1CW,	  '0HF $**51! !L '0H)F, $**51
 
 	0Df<<@@jAQSWXbScdeOOD,-OOD/0OOD/0OOD./	0 $(#+-#+#+-#*#+-#,#+- %%f-  1%%g.  1%%h/  1%%f-  1 *)+O  	KKz}~~	s   A H 	H8H33H8c                    t        j                         }t        j                  |      xs d}t        j                         |dz  dz  dz  z
  }| j                  |      }|t        j                  j                  }|rdnd}	 |dk(  rd|d|d	|d
}	|j                  |	      }
nd|d|d|d}	|j                  |	      }
g }g }g }g }g }t        j                         }|
D ]  }|r(|j                  t!        |d         |k(  r|d   nd       n|j                  |d          |j                  |d          |j                  |d          |j                  |d          |j                  |d           d|d}d|d}d|d}d|d}g }t#        j$                  d      r|j                  |       t#        j$                  d      r|j                  |       t#        j$                  d      r|j                  |       t#        j$                  d      r|j                  |       ||d }|S # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)!Nr   r   r   r   r   r   a/  SELECT u.user_id, u.username, (CASE WHEN u.friendly_name IS NULL OR TRIM(u.friendly_name) = ''   THEN u.username ELSE u.friendly_name END) AS friendly_name,SUM(CASE WHEN sh.media_type = 'episode' AND shm.live = 0 THEN 1 ELSE 0 END) AS tv_count, SUM(CASE WHEN sh.media_type = 'movie' AND shm.live = 0 THEN 1 ELSE 0 END) AS movie_count, SUM(CASE WHEN sh.media_type = 'track' AND shm.live = 0 THEN 1 ELSE 0 END) AS music_count, SUM(shm.live) AS live_count, COUNT(sh.id) AS total_count FROM (SELECT *     FROM session_history     WHERE session_history.stopped >= r   r   z) AS sh JOIN session_history_metadata AS shm ON shm.id = sh.id JOIN users AS u ON u.user_id = sh.user_id GROUP BY sh.user_id ORDER BY total_count DESC LIMIT 10a  SELECT u.user_id, u.username, (CASE WHEN u.friendly_name IS NULL OR TRIM(u.friendly_name) = ''  THEN u.username ELSE u.friendly_name END) AS friendly_name,SUM(CASE WHEN sh.media_type = 'episode' AND shm.live = 0   THEN sh.d ELSE 0 END) AS tv_count, SUM(CASE WHEN sh.media_type = 'movie' AND shm.live = 0   THEN sh.d ELSE 0 END) AS movie_count, SUM(CASE WHEN sh.media_type = 'track' AND shm.live = 0   THEN sh.d ELSE 0 END) AS music_count, SUM(CASE WHEN shm.live = 1   THEN sh.d ELSE 0 END) AS live_count, SUM(sh.d) AS total_duration FROM (SELECT *,       SUM(CASE WHEN stopped > 0 THEN (stopped - started) -          (CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END) ELSE 0 END)          AS d     FROM session_history     WHERE session_history.stopped >= r   z) AS sh JOIN session_history_metadata AS shm ON shm.id = sh.id JOIN users AS u ON u.user_id = sh.user_id GROUP BY sh.user_id ORDER BY total_duration DESC LIMIT 10z\Tautulli Graphs :: Unable to execute database query for get_total_plays_by_top_10_users: %s.rI   username	Plex Userfriendly_namer    r!   r"   r#   r$   r%   r(   r)   r*   r+   r,   r-   r.   r/   )r   r2   r   r3   r4   r5   r6   r7   r8   r9   r:   r   r;   r   get_session_user_idrD   strr   rF   )r   rG   rH   rI   rJ   rK   r4   rL   rM   rN   rO   rP   r0   rV   rW   rX   rY   session_user_idrQ   ra   rb   rc   rd   re   rf   s                            r   get_total_plays_by_top_10_usersz&Graphs.get_total_plays_by_top_10_usersO  so   --/
((4:
%%'*r/B*>*CC	((1	}}99H5=1CW2	 " '0H!F$ $**51' !X '0H/F2 $**51
 
!557 		0D!!c$y/6Jo6]$z"2cno!!$"78OOD,-OOD/0OOD/0OOD./		0 $(#+-#+#+-#*#+-#,#+- %%f-  1%%g.  1%%h/  1%%f-  1 *)+Y  	KKvyzz{	s   A H* *	I3IIc                 d   t        j                         }t        j                  |      xs d}t        j                         |dz  dz  dz  z
  }| j                  |      }|t        j                  j                  }|rdnd}	 |dk(  rd|d|d	|d
}	|j                  |	      }
nd|d|d|d
}	|j                  |	      }
|
D ci c]  }|d   |
 }}t        j                  j                         }t!        dt#        |            D cg c]  }|t        j$                  |      z
   }}g }g }g }g }t'        |      D ]  }|j)                  d      }|j+                  |       |j-                  |i       }|j-                  dd      }|j-                  dd      }|j-                  dd      }|j+                  |       |j+                  |       |j+                  |        d|d}d|d}d|d}||||gd}|S # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY wc c}w c c}w )Nr   r   r   r   r   r   a  SELECT sh.date_played, SUM(CASE WHEN shmi.transcode_decision = 'direct play' THEN 1 ELSE 0 END) AS dp_count, SUM(CASE WHEN shmi.transcode_decision = 'copy' THEN 1 ELSE 0 END) AS ds_count, SUM(CASE WHEN shmi.transcode_decision = 'transcode' THEN 1 ELSE 0 END) AS tc_count FROM (SELECT *,       date(started, 'unixepoch', 'localtime') AS date_played     FROM session_history     WHERE session_history.stopped >= r   r   zn) AS sh JOIN session_history_media_info AS shmi ON shmi.id = sh.id GROUP BY sh.date_played ORDER BY sh.startedaA  SELECT sh.date_played, SUM(CASE WHEN shmi.transcode_decision = 'direct play' THEN sh.d ELSE 0 END) AS dp_count, SUM(CASE WHEN shmi.transcode_decision = 'copy' THEN sh.d ELSE 0 END) AS ds_count, SUM(CASE WHEN shmi.transcode_decision = 'transcode' THEN sh.d ELSE 0 END) AS tc_count FROM (SELECT *,       date(started, 'unixepoch', 'localtime') AS date_played,      SUM(CASE WHEN stopped > 0 THEN (stopped - started) -         (CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END) ELSE 0 END)         AS d     FROM session_history     WHERE session_history.stopped >= r   \Tautulli Graphs :: Unable to execute database query for get_total_plays_per_stream_type: %s.r   r   r   r   dp_countds_counttc_countDirect Playr%   Direct Stream	Transcoder/   )r   r2   r   r3   r4   r5   r6   r7   r8   r9   r:   r   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   )r   rG   rH   rI   rJ   rK   r4   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   r0   rV   rW   rX   rZ   r[   r\   r]   r^   r_   ra   rb   rc   rf   s                                  r   get_total_plays_per_stream_typez&Graphs.get_total_plays_per_stream_type  sW   --/
((4:
%%'*r/B*>*CC	((1	}}99H5=1CW$	  2;IxQ $**51 !< 2;IxQ  $**51
 HN Ntm!4d!: N N }}""$@EaZ@YZ1TH..A66Z	Z
	* 	,I#,,Z8Kk*/33KDK(__Z;N(__Z;N(__Z;NOON+OON+OON+	, $1#+-#2#+-#.#+- !+,oOQO  	KKvyzz{	 !O
 [s%   A G: H(
 H-:	H%H  H%c                 p   t        j                         }t        j                  |      xs d}t        j                         |dz  dz  dz  z
  }| j                  |d      }d }d|d|d}|j                  |      }t        j                  |d
      }
t        j                  |d      }t        j                  j                         }t        dt        |            D cg c]  }|t        j                   |      z
   }}g }g }g }g }g }t#        |      D ]  }|j%                  d      }|j'                  |        ||
j)                  |dfg             } ||
j)                  |dfg             } ||
j)                  |dfg             } ||j)                  |g             }|j'                  |       |j'                  |       |j'                  |       |j'                  |        d|d}d|d}d|d}d|d}|||||gd}|S # t        $ r"}	t        j                  d	|	z         Y d }	~	y d }	~	ww xY wc c}w )Nr   r   r   WHEREc                    g }| D ]H  }|j                  t        |d         dz   dd       |j                  t        |d         dz   dd       J t        |d 	      }d
}d
}d
}|D ]$  }|d   dk(  r	||d   z  }||k\  r|}|}||d   z  }& |S )NstartedBr   )timecountstoppedAc                     | d   S )Nr   r   )ks    r   <lambda>zcGraphs.get_total_concurrent_streams_per_stream_type.<locals>.calc_most_concurrent.<locals>.<lambda>  s
    &	 r   )keyr   r   )rD   r   rB   )rO   timesrQ   r   final_count
last_countds          r   calc_most_concurrentzQGraphs.get_total_concurrent_streams_per_stream_type.<locals>.calc_most_concurrent  s    E Pc$y/&:S&@1MNc$y/&:S&@2NOP 5&9:EEKJ (W:?QwZ'E
*%*
&+QwZ'E( r   zSELECT sh.date_played, sh.started, sh.stopped, shmi.transcode_decision FROM (SELECT *, date(started, 'unixepoch', 'localtime') AS date_played FROM session_history zc GROUP BY id) AS sh JOIN session_history_media_info AS shmi ON sh.id = shmi.id WHERE sh.stopped >= z ORDER BY sh.startedr   )r   transcode_decisionr   r   r   r   zdirect playcopy	transcoder   r%   r   r   zMax. Concurrent Streamsr/   )r   r2   r   r3   r4   r5   r9   r:   r   r;   group_by_keysr<   r=   r>   r?   r@   rA   rB   rC   rD   rE   )r   rG   rI   rK   r4   rL   r   rN   rO   rP   result_by_date_and_decisionresult_by_daterS   rT   rU   r0   rV   rW   rX   rY   rZ   r[   r]   r^   r_   r`   ra   rb   rc   rd   rf   s                                  r   ,get_total_concurrent_streams_per_stream_typez3Graphs.get_total_concurrent_streams_per_stream_type  sj   --/
((4:
%%'*r/B*>*CC	((':		,	 .7	CE  &&u-F
 '.&;&;FDi&j# ..v}E }}""$@EaZ@YZ1TH..A66Z	Z
	* 	,I#,,Z8Kk*1+//m0LbQN 2+//f0ErJN 2+//k0JBON 2"";3N OON+OON+OON+OON+)	,, $1#+-#2#+-#.#+-#<#+- !+,oP_`bg  	KKvyzz{	 [s   #H  H3	H0H++H0c                    t        j                         }t        j                  |      xs d}t        j                         |dz  dz  dz  z
  }| j                  |      }|t        j                  j                  }|rdnd}	 |dk(  rd|d|d	|d
}	|j                  |	      }
nd|d|d	|d}	|j                  |	      }
g }g }g }g }|
D ]R  }|j                  |d          |j                  |d          |j                  |d          |j                  |d          T d|d}d|d}d|d}||||gd}|S # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)Nr   r   r   r   r   r   a  SELECT shmi.video_full_resolution AS resolution, SUM(CASE WHEN shmi.transcode_decision = 'direct play' THEN 1 ELSE 0 END) AS dp_count, SUM(CASE WHEN shmi.transcode_decision = 'copy' THEN 1 ELSE 0 END) AS ds_count, SUM(CASE WHEN shmi.transcode_decision = 'transcode' THEN 1 ELSE 0 END) AS tc_count, COUNT(sh.id) AS total_count FROM (SELECT *     FROM session_history     WHERE session_history.stopped >= <     AND session_history.media_type IN ('movie', 'episode') r   y) AS sh JOIN session_history_media_info AS shmi ON shmi.id = sh.id GROUP BY resolution ORDER BY total_count DESC LIMIT 10a:  SELECT shmi.video_full_resolution AS resolution,SUM(CASE WHEN shmi.transcode_decision = 'direct play' THEN sh.d ELSE 0 END) AS dp_count, SUM(CASE WHEN shmi.transcode_decision = 'copy' THEN sh.d ELSE 0 END) AS ds_count, SUM(CASE WHEN shmi.transcode_decision = 'transcode' THEN sh.d ELSE 0 END) AS tc_count, SUM(sh.d) AS total_duration FROM (SELECT *,       SUM(CASE WHEN stopped > 0 THEN (stopped - started) -         (CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END) ELSE 0 END)         AS d     FROM session_history     WHERE session_history.stopped >= |) AS sh JOIN session_history_media_info AS shmi ON shmi.id = sh.id GROUP BY resolution ORDER BY total_duration DESC LIMIT 10zaTautulli Graphs :: Unable to execute database query for get_total_plays_by_source_resolution: %s.
resolutionr   r   r   r   r%   r   r   r/   r   r2   r   r3   r4   r5   r6   r7   r8   r9   r:   r   r;   rD   r   rG   rH   rI   rJ   rK   r4   rL   rM   rN   rO   rP   r0   rV   rW   rX   rQ   ra   rb   rc   rf   s                        r   $get_total_plays_by_source_resolutionz+Graphs.get_total_plays_by_source_resolutionp  s   --/
((4:
%%'*r/B*>*CC	((1	}}99H5=1CW(	  '0HF $**51! !D '0H!F$ $**51
 
 	.Dd<01OOD,-OOD,-OOD,-	. $1#+-#2#+-#.#+- !+,oOQ3  	KK{~  A	   A D: :	E%E  E%c                    t        j                         }t        j                  |      xs d}t        j                         |dz  dz  dz  z
  }| j                  |      }|t        j                  j                  }|rdnd}	 |dk(  rd|d|d	|d
}	|j                  |	      }
nd|d|d	|d}	|j                  |	      }
g }g }g }g }|
D ]R  }|j                  |d          |j                  |d          |j                  |d          |j                  |d          T d|d}d|d}d|d}||||gd}|S # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)Nr   r   r   r   r   r   a  SELECT (CASE WHEN shmi.stream_video_full_resolution IS NULL THEN   (CASE WHEN shmi.video_decision = 'transcode' THEN     (CASE       WHEN shmi.transcode_height <= 360 THEN 'SD'       WHEN shmi.transcode_height <= 480 THEN '480'       WHEN shmi.transcode_height <= 576 THEN '576'       WHEN shmi.transcode_height <= 720 THEN '720'       WHEN shmi.transcode_height <= 1080 THEN '1080'       WHEN shmi.transcode_height <= 1440 THEN 'QHD'       WHEN shmi.transcode_height <= 2160 THEN '4k'       ELSE 'unknown' END)    ELSE shmi.video_full_resolution END)   ELSE shmi.stream_video_full_resolution END) AS resolution, SUM(CASE WHEN shmi.transcode_decision = 'direct play' THEN 1 ELSE 0 END) AS dp_count, SUM(CASE WHEN shmi.transcode_decision = 'copy' THEN 1 ELSE 0 END) AS ds_count, SUM(CASE WHEN shmi.transcode_decision = 'transcode' THEN 1 ELSE 0 END) AS tc_count, COUNT(sh.id) AS total_count FROM (SELECT *     FROM session_history     WHERE session_history.stopped >= r   r   r   ao  SELECT (CASE WHEN shmi.stream_video_full_resolution IS NULL THEN   (CASE WHEN shmi.video_decision = 'transcode' THEN     (CASE       WHEN shmi.transcode_height <= 360 THEN 'SD'       WHEN shmi.transcode_height <= 480 THEN '480'       WHEN shmi.transcode_height <= 576 THEN '576'       WHEN shmi.transcode_height <= 720 THEN '720'       WHEN shmi.transcode_height <= 1080 THEN '1080'       WHEN shmi.transcode_height <= 1440 THEN 'QHD'       WHEN shmi.transcode_height <= 2160 THEN '4k'       ELSE 'unknown' END)    ELSE shmi.video_full_resolution END)   ELSE shmi.stream_video_full_resolution END) AS resolution, SUM(CASE WHEN shmi.transcode_decision = 'direct play' THEN sh.d ELSE 0 END) AS dp_count, SUM(CASE WHEN shmi.transcode_decision = 'copy' THEN sh.d ELSE 0 END) AS ds_count, SUM(CASE WHEN shmi.transcode_decision = 'transcode' THEN sh.d ELSE 0 END) AS tc_count, SUM(sh.d) AS total_duration FROM (SELECT *,       SUM(CASE WHEN stopped > 0 THEN (stopped - started) -         (CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END) ELSE 0 END)         AS d     FROM session_history     WHERE session_history.stopped >= r   zaTautulli Graphs :: Unable to execute database query for get_total_plays_by_stream_resolution: %s.r   r   r   r   r   r%   r   r   r/   r   r   s                        r   $get_total_plays_by_stream_resolutionz+Graphs.get_total_plays_by_stream_resolution  s   --/
((4:
%%'*r/B*>*CC	((1	}}99H5=1CWB	 6 '0H5F8 $**51; !x '0H;F> $**51
 
 	.Dd<01OOD,-OOD,-OOD,-	. $1#+-#2#+-#.#+- !+,oOQ3  	KK{~  A	r   c                    t        j                         }t        j                  |      xs d}t        j                         |dz  dz  dz  z
  }| j                  |      }|t        j                  j                  }|rdnd}	 |dk(  rd|d|d	|d
}	|j                  |	      }
nd|d|d	|d}	|j                  |	      }
g }g }g }g }|
D ]s  }|j                  t        j                  j!                  |d   |d                |j                  |d          |j                  |d          |j                  |d          u d|d}d|d}d|d}||||gd}|S # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)Nr   r   r   r   r   r   av  SELECT sh.platform, SUM(CASE WHEN shmi.transcode_decision = 'direct play' THEN 1 ELSE 0 END) AS dp_count, SUM(CASE WHEN shmi.transcode_decision = 'copy' THEN 1 ELSE 0 END) AS ds_count, SUM(CASE WHEN shmi.transcode_decision = 'transcode' THEN 1 ELSE 0 END) AS tc_count, COUNT(sh.id) AS total_count FROM (SELECT *     FROM session_history     WHERE session_history.stopped >= r   r   zz) AS sh JOIN session_history_media_info AS shmi ON shmi.id = sh.id GROUP BY sh.platform ORDER BY total_count DESC LIMIT 10a  SELECT sh.platform, SUM(CASE WHEN shmi.transcode_decision = 'direct play' THEN sh.d ELSE 0 END) AS dp_count, SUM(CASE WHEN shmi.transcode_decision = 'copy' THEN sh.d ELSE 0 END) AS ds_count, SUM(CASE WHEN shmi.transcode_decision = 'transcode' THEN sh.d ELSE 0 END) AS tc_count, SUM(sh.d) AS total_duration FROM (SELECT *,       SUM(CASE WHEN stopped > 0 THEN (stopped - started) -         (CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END) ELSE 0 END)         AS d     FROM session_history     WHERE session_history.stopped >= z}) AS sh JOIN session_history_media_info AS shmi ON shmi.id = sh.id GROUP BY sh.platform ORDER BY total_duration DESC LIMIT 10z`Tautulli Graphs :: Unable to execute database query for get_stream_type_by_top_10_platforms: %s.r   r   r   r   r   r%   r   r   r/   )r   r2   r   r3   r4   r5   r6   r7   r8   r9   r:   r   r;   rD   r   r   rE   r   s                        r   #get_stream_type_by_top_10_platformsz*Graphs.get_stream_type_by_top_10_platforms&  s   --/
((4:
%%'*r/B*>*CC	((1	}}99H5=1CW&	  '0HF $**51 !@ '0HF" $**51
 
 	.Df<<@@jAQSWXbScdeOOD,-OOD,-OOD,-	. $1#+-#2#+-#.#+- !+,oOQ 5  	KKz}~~	s   A E 	F$FFc                 L   t        j                         }t        j                  |      xs d}t        j                         |dz  dz  dz  z
  }| j                  |      }|t        j                  j                  }|rdnd}	 |dk(  rd|d|d	|d
}	|j                  |	      }
nd|d|d	|d}	|j                  |	      }
g }g }g }g }t        j                         }|
D ]|  }|r(|j                  t!        |d         |k(  r|d   nd       n|j                  |d          |j                  |d          |j                  |d          |j                  |d          ~ d|d}d|d}d|d}||||gd}|S # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)Nr   r   r   r   r   r   a  SELECT u.user_id, u.username, (CASE WHEN u.friendly_name IS NULL OR TRIM(u.friendly_name) = ''   THEN u.username ELSE u.friendly_name END) AS friendly_name,SUM(CASE WHEN shmi.transcode_decision = 'direct play' THEN 1 ELSE 0 END) AS dp_count, SUM(CASE WHEN shmi.transcode_decision = 'copy' THEN 1 ELSE 0 END) AS ds_count, SUM(CASE WHEN shmi.transcode_decision = 'transcode' THEN 1 ELSE 0 END) AS tc_count, COUNT(sh.id) AS total_count FROM (SELECT *     FROM session_history     WHERE session_history.stopped >= r   r   z) AS sh JOIN session_history_media_info AS shmi ON shmi.id = sh.id JOIN users AS u ON u.user_id = sh.user_id GROUP BY u.user_id ORDER BY total_count DESC LIMIT 10a  SELECT u.user_id, u.username, (CASE WHEN u.friendly_name IS NULL OR TRIM(u.friendly_name) = ''   THEN u.username ELSE u.friendly_name END) AS friendly_name,SUM(CASE WHEN shmi.transcode_decision = 'direct play' THEN sh.d ELSE 0 END) AS dp_count, SUM(CASE WHEN shmi.transcode_decision = 'copy' THEN sh.d ELSE 0 END) AS ds_count, SUM(CASE WHEN shmi.transcode_decision = 'transcode' THEN sh.d ELSE 0 END) AS tc_count, SUM(sh.d) AS total_duration FROM (SELECT *,       SUM(CASE WHEN stopped > 0 THEN (stopped - started) -         (CASE WHEN paused_counter IS NULL THEN 0 ELSE paused_counter END) ELSE 0 END)         AS d     FROM session_history     WHERE session_history.stopped >= z) AS sh JOIN session_history_media_info AS shmi ON shmi.id = sh.id JOIN users AS u ON u.user_id = sh.user_id GROUP BY u.user_id ORDER BY total_duration DESC LIMIT 10z\Tautulli Graphs :: Unable to execute database query for get_stream_type_by_top_10_users: %s.rI   r   r   r   r   r   r   r   r%   r   r   r/   )r   r2   r   r3   r4   r5   r6   r7   r8   r9   r:   r   r;   r   r   rD   r   )r   rG   rH   rI   rJ   rK   r4   rL   rM   rN   rO   rP   r0   rV   rW   rX   r   rQ   ra   rb   rc   rf   s                         r   get_stream_type_by_top_10_usersz&Graphs.get_stream_type_by_top_10_userss  s   --/
((4:
%%'*r/B*>*CC	((1	}}99H5=1CW,	   '0HF" $**51% !L '0H%F( $**51
 
!557 	.D!!c$y/6Jo6]$z"2cno!!$"78OOD,-OOD,-OOD,-	. $1#+-#2#+-#.#+- !+,oOQ ?  	KKvyzz{	s   A E8 8	F#FF#c                 .   d}t        j                         r>|r<|t        t        j                               k7  r|dt        j                         z  z   }|S |r>t        j                  |      }t        d |D              r|ddj                  |      z  z   }|S )zG
        Expects user_id to be a comma-separated list of ints.
         z session_history.user_id = %s c              3   <   K   | ]  }|j                           y wr   )isdigit).0ids     r   	<genexpr>z)Graphs._make_user_cond.<locals>.<genexpr>  s     3B2::<3s   z! session_history.user_id IN (%s) ,)r   r   r   r   split_stripalljoin)r   rI   cond_prefixrL   user_idss        r   r5   zGraphs._make_user_cond  s     	&&(WCHcHcHeDf9f#&FIdIdIf&ffI
 	 **73H3(33'*MPSPXPXYaPb*bb	r   )30r   NN)r   r   NN)r   N)AND)__name__
__module____qualname__r   rg   rv   r   r   r   r   r   r   r   r   r   r   r5   r   r   r   r
   r
      s`    kZ||jXrh^@iVVp\|L\fPKZVpr   r
   )r<   r   r6   r   r   r   r   r   r   objectr
   r   r   r   <module>r      s0   $         xV xr   