From 85f9dac29e93100a8e2b04bfa32eeb628f9212b4 Mon Sep 17 00:00:00 2001 From: Blacktwin Date: Mon, 29 Jul 2019 11:20:52 -0400 Subject: [PATCH] adding logging. only errors will make it to the log file. --- fun/playlist_manager.py | 77 +++++++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 26 deletions(-) diff --git a/fun/playlist_manager.py b/fun/playlist_manager.py index dc8fa32..10f3033 100644 --- a/fun/playlist_manager.py +++ b/fun/playlist_manager.py @@ -100,7 +100,9 @@ optional arguments: """ import sys +import os import random +import logging import requests import argparse import operator @@ -109,6 +111,26 @@ import unicodedata from collections import Counter from plexapi.server import PlexServer, CONFIG +filename = os.path.basename(__file__) +filename = filename.split('.')[0] + +logger = logging.getLogger(filename) +logger.setLevel(logging.DEBUG) + +error_format = logging.Formatter('%(asctime)s:%(name)s:%(funcName)s:%(message)s') +stream_format = logging.Formatter('%(message)s') + +file_handler = logging.FileHandler('{}.log'.format(filename)) +file_handler.setLevel(logging.ERROR) +file_handler.setFormatter(error_format) + +stream_handler = logging.StreamHandler() +stream_handler.setFormatter(stream_format) + +logger.addHandler(file_handler) +logger.addHandler(stream_handler) + + # ### EDIT SETTINGS ### PLEX_URL = '' @@ -273,9 +295,9 @@ def sort_by_dates(video, date_type): return [[video.ratingKey] + [str(video.originallyAvailableAt)]] # todo-me return object - except Exception: - # print(e) - return + except Exception as e: + logger.exception(e) + exit() def multi_filter_search(keyword_dict, library, search_eps=None): @@ -450,6 +472,7 @@ def get_content(libraries, jbop, filters=None, search=None, limit=None): # Remove date used for sorting play_lst = [x[0] for x in aired_lst] else: + # todo-me probably will want to check limit by itself if jbop == "random" and limit: child_lst = random.sample(child_lst, limit) play_lst = child_lst @@ -487,8 +510,8 @@ def build_playlist(jbop, libraries=None, days=None, top=None, filters=None, sear try: keys_list = get_content(libraries, jbop, filters, search, limit) except TypeError as e: - print("Libraries are not defined for {}. Use --libraries.".format(jbop)) - exit("Error: {}".format(e)) + logger.exception("Libraries are not defined for {}. Use --libraries.".format(jbop)) + exit() return keys_list @@ -504,7 +527,7 @@ def share_playlists(playlist_titles, users): """ for user in users: for title in playlist_titles: - print("...Shared {title} playlist to '{user}'.".format(title=title, user=user)) + logger.info("...Shared {title} playlist to '{user}'.".format(title=title, user=user)) plex.playlist(title).copyToUser(user) exit() @@ -533,7 +556,7 @@ def show_playlist(playlist_title, playlist_keys): title = unicodedata.normalize('NFKD', title).encode('ascii', 'ignore').translate(None, "'") playlist_list.append(title) - print(u"Contents of Playlist {title}:\n{playlist}".format( + logger.info(u"Contents of Playlist {title}:\n{playlist}".format( title=playlist_title, playlist=', '.join(playlist_list))) exit() @@ -564,16 +587,14 @@ def create_playlist(playlist_title, playlist_keys, server, user): except Exception: try: obj = plex.fetchItem(key) - print("{} may not have permission to this title: {}".format(user, obj.title)) - # print("Error: {}".format(e)) + logger.exception("{} may not have permission to this title: {}".format(user, obj.title)) pass except Exception: - print('Rating Key: {}, may have been deleted or moved.'.format(key)) - # print("Error: {}".format(e)) + logger.exception('Rating Key: {}, may have been deleted or moved.'.format(key)) if playlist_list: server.createPlaylist(playlist_title, playlist_list) - print("...Added Playlist: {title} to '{user}'.".format(title=playlist_title, user=user)) + logger.info("...Added Playlist: {title} to '{user}'.".format(title=playlist_title, user=user)) def delete_playlist(playlist_dict, title): @@ -595,17 +616,17 @@ def delete_playlist(playlist_dict, title): # If str then updating playlist if playlist.title == title: playlist.delete() - print("...Deleted Playlist: {playlist.title} for '{user}'." + logger.info("...Deleted Playlist: {playlist.title} for '{user}'." .format(playlist=playlist, user=user)) if isinstance(title, list): # If list then removing selected playlists if playlist.title in title: playlist.delete() - print("...Deleted Playlist: {playlist.title} for '{user}'." + logger.info("...Deleted Playlist: {playlist.title} for '{user}'." .format(playlist=playlist, user=user)) except Exception: - # print("Playlist not found on '{user}' account".format(user=user)) + logger.exception("Playlist not found on '{user}' account".format(user=user)) pass @@ -668,7 +689,7 @@ def create_title(jbop, libraries, days, filters, search, limit): elif jbop == 'random': if not limit: - print("Random selector needs a limit. Use --limit.") + logger.info("Random selector needs a limit. Use --limit.") exit() title = selectors()['random'].format(count=limit, libraries='/'.join(libraries.values())) @@ -756,7 +777,7 @@ if __name__ == "__main__": filters[k] = v.split(",") # Check if provided filter exist, exit if it doesn't exist if not (set(filters.keys()) & set(filters_lst)): - print('({}) was not found in filters list: [{}]' + logger.error('({}) was not found in filters list: [{}]' .format(' '.join(filters.keys()), ', '.join(filters_lst))) exit() @@ -774,7 +795,7 @@ if __name__ == "__main__": for user in users: # todo-me smart playlists will have to recreated in users server instance if opts.action == 'share' and selected_playlists: - print("Sharing playlist(s)...") + logger.info("Sharing playlist(s)...") share_playlists(selected_playlists, users) user_acct = account.user(user) user_server = PlexServer(PLEX_URL, user_acct.get_token(plex.machineIdentifier)) @@ -794,11 +815,11 @@ if __name__ == "__main__": 'all_playlists': playlist_lst}) if not opts.jbop and opts.action == 'show': - print("Displaying the user's playlist(s)...") + logger.info("Displaying the user's playlist(s)...") for data in playlist_dict['data']: user = data['user'] playlists = data['all_playlists'] - print("{}'s current playlist(s): {}".format(user, ', '.join(playlists))) + logger.info("{}'s current playlist(s): {}".format(user, ', '.join(playlists))) exit() if libraries: @@ -807,7 +828,7 @@ if __name__ == "__main__": # Remove or build playlists if opts.action == 'remove': - print("Deleting the playlist(s)...") + logger.info("Deleting the playlist(s)...") for data in playlist_dict['data']: titles = data['user_selected'] delete_playlist(data, titles) @@ -824,19 +845,23 @@ if __name__ == "__main__": title = opts.name if opts.jbop and opts.action == 'show': - show_playlist(title, keys_list) + if len(libraries) > 0: + show_playlist(title, keys_list) + else: + logger.error("Missing --libraries or --allLibraries") + exit() if opts.action == 'update': - print("Deleting the playlist(s)...") + logger.info("Deleting the playlist(s)...") for data in playlist_dict['data']: delete_playlist(data, title) - print('Creating playlist(s)...') + logger.info('Creating playlist(s)...') for data in playlist_dict['data']: create_playlist(title, keys_list, data['server'], data['user']) if opts.action == 'add': - print('Creating playlist(s)...') + logger.info('Creating playlist(s)...') for data in playlist_dict['data']: create_playlist(title, keys_list, data['server'], data['user']) - print("Done.") + logger.info("Done.")