diff --git a/reporting/weekly_stats_reporting.py b/reporting/weekly_stats_reporting.py index 320a142..98a4fcf 100644 --- a/reporting/weekly_stats_reporting.py +++ b/reporting/weekly_stats_reporting.py @@ -7,14 +7,6 @@ User stats display username and hour, minutes, and seconds of view time PlexPy Settings > Extra Settings > Check - Calculate Total File Sizes [experimental] ...... wait -Usage: - Use PlexPy to pull library and user statistics for date range. - - optional arguments: - -h, --help show this help message and exit - -d , --days Enter in number of days to go back. - (default: 7) - """ import requests @@ -27,8 +19,8 @@ import argparse # EDIT THESE SETTINGS # -PLEXPY_APIKEY = 'xxxxxx' # Your PlexPy API key -PLEXPY_URL = 'http://localhost:8181/' # Your PlexPy URL +PLEXPY_APIKEY = 'xxxxx' # Your PlexPy API key +PLEXPY_URL = 'http://localhost:8182/' # Your PlexPy URL SUBJECT_TEXT = "PlexPy Weekly Server, Library, and User Statistics" # Notification agent ID: https://github.com/JonnyWong16/plexpy/blob/master/API.md#notify @@ -80,11 +72,11 @@ BODY_TEXT = """\ # /EDIT THESE SETTINGS # -def get_get_history(user_id, check_date): +def get_get_history(section_id, check_date): # Get the PlexPy history. payload = {'apikey': PLEXPY_APIKEY, 'cmd': 'get_history', - 'user_id': user_id, + 'section_id': section_id, 'start_date': check_date} try: @@ -92,28 +84,15 @@ def get_get_history(user_id, check_date): response = r.json() # print(json.dumps(response['response']['data'], indent=4, sort_keys=True)) res_data = response['response']['data'] - return res_data + if res_data['filter_duration'] != '0': + return res_data['data'] + else: + pass except Exception as e: sys.stderr.write("PlexPy API 'get_history' request failed: {0}.".format(e)) -def get_get_user_names(): - # Get a list of all user and user ids. - payload = {'apikey': PLEXPY_APIKEY, - 'cmd': 'get_user_names'} - - try: - r = requests.get(PLEXPY_URL.rstrip('/') + '/api/v2', params=payload) - response = r.json() - - res_data = response['response']['data'] - return [d for d in res_data if d['friendly_name'] != 'Local'] - - except Exception as e: - sys.stderr.write("PlexPy API 'get_user_names' request failed: {0}.".format(e)) - - def get_get_libraries(): # Get a list of all libraries on your server. payload = {'apikey': PLEXPY_APIKEY, @@ -184,54 +163,42 @@ def sizeof_fmt(num, suffix='B'): return "%.1f%s%s" % (num, 'Yi', suffix) -def add_to_dictlist(d, key, val): +def date_split(to_split): + split_year = int(to_split.split('-')[0]) + split_month = int(to_split.split('-')[1]) + split_day = int(to_split.split('-')[2]) + return [split_year, split_month, split_day] + + +def add_to_dictval(d, key, val): + #print(d, key, val) if key not in d: d[key] = val else: d[key] += val -def get_user_stats(dates_range_lst): - - user_stats_dict = {} - user_stats_lst = [] - - for check_date in dates_range_lst: - print('Checking user stats for date: {}'.format(check_date)) - - for users in get_get_user_names(): - history = get_get_history(users['user_id'], check_date) - if history['filter_duration'] != '0': - user_name = users['friendly_name'] - user_totals = sum([d['duration'] for d in history['data']]) - add_to_dictlist(user_stats_dict, user_name, user_totals) - - # print(user_stats_dict) - - for user, duration in sorted(user_stats_dict.items(), key=itemgetter(1), reverse=True): - if user not in USER_IGNORE: - m, s = divmod(duration, 60) - h, m = divmod(m, 60) - easy_time = TIME_DISPLAY.format(h, m, s) - USER_STATS = USER_STAT.format(user, easy_time) - # Html formatting - user_stats_lst += ['
  • {}
  • '.format(USER_STATS)] - else: - pass - - # print(user_stats_lst) - return user_stats_lst +def daterange(start_date, end_date): + for n in range(int((end_date - start_date).days) + 1): + yield start_date + datetime.timedelta(n) -def get_sections_stats(): +def get_server_stats(date_ranges): section_count = '' total_size = 0 + sections_id_lst = [] sections_stats_lst = [] + user_stats_lst = [] + user_stats_dict = {} + user_names_lst = [] + user_durations_lst =[] + print('Checking library stats.') for sections in get_get_libraries(): lib_size = get_get_library_media_info(sections['section_id']) total_size += lib_size + sections_id_lst += [sections['section_id']] if sections['section_type'] == 'artist': section_count = ARTIST_STAT.format(sections['count'], sections['parent_count'], sections['child_count']) @@ -245,30 +212,42 @@ def get_sections_stats(): elif sections['section_type'] == 'movie': section_count = MOVIE_STAT.format(sections['count']) - else: - pass - if sections['section_name'] not in LIB_IGNORE and section_count: # Html formatting sections_stats_lst += ['
  • {}: {}
  • '.format(sections['section_name'], section_count)] + print('Checking users stats.') + # print(sections_id_lst) + for check_date in date_ranges: + for section_id in sections_id_lst: + # print(check_date, section_id) + history = get_get_history(section_id, check_date) + if history: + # print(json.dumps(history, indent=4, sort_keys=True)) + for data in history: + # print(data) + user_names_lst += [data['friendly_name']] + user_durations_lst += [data['duration']] + # print(user_durations_lst, user_names_lst) + for user_name, user_totals in zip(user_names_lst, user_durations_lst): + add_to_dictval(user_stats_dict, user_name, user_totals) + + print('{} watched something on {}'.format(' & '.join(set(user_names_lst)), check_date)) + # print(json.dumps(user_stats_dict, indent=4, sort_keys=True)) + for user, duration in sorted(user_stats_dict.items(), key=itemgetter(1), reverse=True): + if user not in USER_IGNORE: + m, s = divmod(duration, 60) + h, m = divmod(m, 60) + easy_time = TIME_DISPLAY.format(h, m, s) + USER_STATS = USER_STAT.format(user, easy_time) + # Html formatting + user_stats_lst += ['
  • {}
  • '.format(USER_STATS)] + # Html formatting. Adding the Capacity to bottom of list. sections_stats_lst += ['
  • Capacity: {}
  • '.format(sizeof_fmt(total_size))] - # print(sections_stats_lst) - return sections_stats_lst - - -def daterange(start_date, end_date): - for n in range(int((end_date - start_date).days) + 1): - yield start_date + datetime.timedelta(n) - - -def date_split(to_split): - split_year = int(to_split.split('-')[0]) - split_month = int(to_split.split('-')[1]) - split_day = int(to_split.split('-')[2]) - return [split_year, split_month, split_day] + # print(sections_stats_lst, user_stats_lst) + return (sections_stats_lst, user_stats_lst) def main(): @@ -290,18 +269,14 @@ def main(): start_date = datetime.date(date_split(START_DATE)[0], date_split(START_DATE)[1], date_split(START_DATE)[2]) end_date = datetime.date(date_split(END_DATE)[0], date_split(END_DATE)[1], date_split(END_DATE)[2]) - + dates_range_lst = [] - for single_date in daterange(start_date, end_date): dates_range_lst += [single_date.strftime("%Y-%m-%d")] print('Checking user stats from {:02d} days ago.'.format(opts.days)) - user_stats_lst = get_user_stats(dates_range_lst) - # print(user_stats_lst) - print('Checking library stats.') - lib_stats = get_sections_stats() + lib_stats, user_stats_lst = get_server_stats(dates_range_lst) # print(lib_stats) end = datetime.datetime.strptime(time.ctime(float(TODAY)), "%a %b %d %H:%M:%S %Y").strftime("%a %b %d %Y") @@ -312,6 +287,7 @@ def main(): BODY_TEXT = BODY_TEXT.format(end=end, start=start, sections_stats=sections_stats, user_stats=user_stats) + print('Sending message.') send_notification(BODY_TEXT) if __name__ == '__main__':