18
18
WANTED
19
19
)
20
20
from medusa .server .api .v2 .base import BaseRequestHandler
21
+ from medusa .show .show import Show
22
+
23
+ from six .moves import map
21
24
22
25
23
26
class StatsHandler (BaseRequestHandler ):
@@ -28,93 +31,102 @@ class StatsHandler(BaseRequestHandler):
28
31
#: identifier
29
32
identifier = ('identifier' , r'\w+' )
30
33
#: path param
31
- path_param = ( 'path_param' , r'\w+' )
34
+ path_param = None
32
35
#: allowed HTTP methods
33
36
allowed_methods = ('GET' , )
34
37
35
- def get (self , identifier , path_param = None ):
38
+ def get (self , identifier ):
36
39
"""Query statistics.
37
40
38
- :param identifier:
39
- :param path_param:
40
- :type path_param: str
41
+ :param identifier: The type of statistics to query
42
+ :type identifier: str
41
43
"""
42
- pre_today = [SKIPPED , WANTED , FAILED ]
43
- snatched = [SNATCHED , SNATCHED_PROPER , SNATCHED_BEST ]
44
- downloaded = [DOWNLOADED , ARCHIVED ]
45
-
46
- def query_in (items ):
47
- return '({0})' .format (',' .join (map (str , items )))
48
-
49
- query = dedent ("""\
50
- SELECT indexer AS indexerId, showid AS seriesId,
51
- SUM(
52
- season > 0 AND
53
- episode > 0 AND
54
- airdate > 1 AND
55
- status IN {status_quality}
56
- ) AS epSnatched,
57
- SUM(
58
- season > 0 AND
59
- episode > 0 AND
44
+ if not identifier or identifier == 'overall' :
45
+ data = overall_stats ()
46
+ elif identifier == 'show' :
47
+ data = per_show_stats ()
48
+ else :
49
+ return self ._not_found ('Statistics not found' )
50
+
51
+ return self ._ok (data = data )
52
+
53
+
54
+ def overall_stats ():
55
+ """Generate overall library statistics."""
56
+ return Show .overall_stats ()
57
+
58
+
59
+ def per_show_stats ():
60
+ """Generate per-show library statistics."""
61
+ pre_today = [SKIPPED , WANTED , FAILED ]
62
+ snatched = [SNATCHED , SNATCHED_PROPER , SNATCHED_BEST ]
63
+ downloaded = [DOWNLOADED , ARCHIVED ]
64
+
65
+ def query_in (items ):
66
+ return '({0})' .format (',' .join (map (str , items )))
67
+
68
+ query = dedent ("""\
69
+ SELECT indexer AS indexerId, showid AS seriesId,
70
+ SUM(
71
+ season > 0 AND
72
+ episode > 0 AND
73
+ airdate > 1 AND
74
+ status IN {status_quality}
75
+ ) AS epSnatched,
76
+ SUM(
77
+ season > 0 AND
78
+ episode > 0 AND
79
+ airdate > 1 AND
80
+ status IN {status_download}
81
+ ) AS epDownloaded,
82
+ SUM(
83
+ season > 0 AND
84
+ episode > 0 AND
85
+ airdate > 1 AND (
86
+ (airdate <= {today} AND status IN {status_pre_today}) OR
87
+ status IN {status_both}
88
+ )
89
+ ) AS epTotal,
90
+ (SELECT airdate FROM tv_episodes
91
+ WHERE showid=tv_eps.showid AND
92
+ indexer=tv_eps.indexer AND
93
+ airdate >= {today} AND
94
+ (status = {unaired} OR status = {wanted})
95
+ ORDER BY airdate ASC
96
+ LIMIT 1
97
+ ) AS epAirsNext,
98
+ (SELECT airdate FROM tv_episodes
99
+ WHERE showid=tv_eps.showid AND
100
+ indexer=tv_eps.indexer AND
60
101
airdate > 1 AND
61
- status IN {status_download}
62
- ) AS epDownloaded,
63
- SUM(
64
- season > 0 AND
65
- episode > 0 AND
66
- airdate > 1 AND (
67
- (airdate <= {today} AND status IN {status_pre_today}) OR
68
- status IN {status_both}
69
- )
70
- ) AS epTotal,
71
- (SELECT airdate FROM tv_episodes
72
- WHERE showid=tv_eps.showid AND
73
- indexer=tv_eps.indexer AND
74
- airdate >= {today} AND
75
- (status = {unaired} OR status = {wanted})
76
- ORDER BY airdate ASC
77
- LIMIT 1
78
- ) AS epAirsNext,
79
- (SELECT airdate FROM tv_episodes
80
- WHERE showid=tv_eps.showid AND
81
- indexer=tv_eps.indexer AND
82
- airdate > 1 AND
83
- status <> {unaired}
84
- ORDER BY airdate DESC
85
- LIMIT 1
86
- ) AS epAirsPrev,
87
- SUM(file_size) AS seriesSize
88
- FROM tv_episodes tv_eps
89
- GROUP BY showid, indexer
90
- """ ).format (
91
- status_quality = query_in (snatched ),
92
- status_download = query_in (downloaded ),
93
- status_both = query_in (snatched + downloaded ),
94
- today = date .today ().toordinal (),
95
- status_pre_today = query_in (pre_today ),
96
- skipped = SKIPPED ,
97
- wanted = WANTED ,
98
- unaired = UNAIRED ,
99
- )
100
-
101
- main_db_con = db .DBConnection ()
102
- sql_result = main_db_con .select (query )
103
-
104
- stats_data = {}
105
- stats_data ['seriesStat' ] = list ()
106
- stats_data ['maxDownloadCount' ] = 1000
107
- for cur_result in sql_result :
108
- stats_data ['seriesStat' ].append (dict (cur_result ))
109
- if cur_result ['epTotal' ] > stats_data ['maxDownloadCount' ]:
110
- stats_data ['maxDownloadCount' ] = cur_result ['epTotal' ]
111
-
112
- stats_data ['maxDownloadCount' ] *= 100
113
-
114
- if identifier is not None :
115
- if identifier not in stats_data :
116
- return self ._bad_request ('{key} is a invalid path' .format (key = identifier ))
117
-
118
- stats_data = stats_data [identifier ]
119
-
120
- return self ._ok (data = stats_data )
102
+ status <> {unaired}
103
+ ORDER BY airdate DESC
104
+ LIMIT 1
105
+ ) AS epAirsPrev,
106
+ SUM(file_size) AS seriesSize
107
+ FROM tv_episodes tv_eps
108
+ GROUP BY showid, indexer
109
+ """ ).format (
110
+ status_quality = query_in (snatched ),
111
+ status_download = query_in (downloaded ),
112
+ status_both = query_in (snatched + downloaded ),
113
+ today = date .today ().toordinal (),
114
+ status_pre_today = query_in (pre_today ),
115
+ skipped = SKIPPED ,
116
+ wanted = WANTED ,
117
+ unaired = UNAIRED ,
118
+ )
119
+
120
+ main_db_con = db .DBConnection ()
121
+ sql_result = main_db_con .select (query )
122
+
123
+ stats_data = {}
124
+ stats_data ['seriesStat' ] = []
125
+ stats_data ['maxDownloadCount' ] = 1000
126
+ for cur_result in sql_result :
127
+ stats_data ['seriesStat' ].append (cur_result )
128
+ if cur_result ['epTotal' ] > stats_data ['maxDownloadCount' ]:
129
+ stats_data ['maxDownloadCount' ] = cur_result ['epTotal' ]
130
+
131
+ stats_data ['maxDownloadCount' ] *= 100
132
+ return stats_data
0 commit comments