From 57269ad3afb3ed3c72833669fe97041ccdfea6e7 Mon Sep 17 00:00:00 2001 From: blacktwin Date: Wed, 12 Jul 2017 14:17:37 -0400 Subject: [PATCH] Create find_unwatched.py https://gist.github.com/blacktwin/603d5da5b70b366e98d0d82d1aa1a470 --- find_unwatched.py | 168 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 find_unwatched.py diff --git a/find_unwatched.py b/find_unwatched.py new file mode 100644 index 0000000..f309fdc --- /dev/null +++ b/find_unwatched.py @@ -0,0 +1,168 @@ +""" + +Find what was added TFRAME ago and not watched using PlexPy. + +""" + +import requests +import sys +import time + +TFRAME = 1.577e+7 # ~ 6 months in seconds +TODAY = time.time() + + +## EDIT THESE SETTINGS ## +PLEXPY_APIKEY = 'XXXXXX' # Your PlexPy API key +PLEXPY_URL = 'http://localhost:8181/' # Your PlexPy URL +LIBRARY_NAMES = ['My TV Shows', 'My Movies'] # Name of libraries you want to check. + + +class LIBINFO(object): + def __init__(self, data=None): + d = data or {} + self.added_at = d['added_at'] + self.parent_rating_key = d['parent_rating_key'] + self.play_count = d['play_count'] + self.title = d['title'] + self.rating_key = d['rating_key'] + self.media_type = d['media_type'] + + +class METAINFO(object): + def __init__(self, data=None): + d = data or {} + self.added_at = d['added_at'] + self.parent_rating_key = d['parent_rating_key'] + self.title = d['title'] + self.rating_key = d['rating_key'] + self.media_type = d['media_type'] + self.grandparent_title = d['grandparent_title'] + self.file_size = d['file_size'] + self.file = d['file'] + + +def get_get_new_rating_keys(rating_key, media_type): + # Get a list of new rating keys for the PMS of all of the item's parent/children. + payload = {'apikey': PLEXPY_APIKEY, + 'cmd': 'get_new_rating_keys', + 'rating_key': rating_key, + 'media_type': media_type} + + try: + r = requests.get(PLEXPY_URL.rstrip('/') + '/api/v2', params=payload) + response = r.json() + + res_data = response['response']['data'] + show = res_data['0'] + episode_lst = [episode['rating_key'] for _, season in show['children'].items() for _, episode in + season['children'].items()] + + return episode_lst + + except Exception as e: + sys.stderr.write("PlexPy API 'get_new_rating_keys' request failed: {0}.".format(e)) + + +def get_get_metadata(rating_key): + # Get the metadata for a media item. + payload = {'apikey': PLEXPY_APIKEY, + 'rating_key': rating_key, + 'cmd': 'get_metadata', + 'media_info': True} + + try: + r = requests.get(PLEXPY_URL.rstrip('/') + '/api/v2', params=payload) + response = r.json() + + res_data = response['response']['data']['metadata'] + return METAINFO(data=res_data) + + except Exception as e: + # sys.stderr.write("PlexPy API 'get_get_metadata' request failed: {0}.".format(e)) + pass + + +def get_get_library_media_info(section_id): + # Get the data on the PlexPy media info tables. + payload = {'apikey': PLEXPY_APIKEY, + 'section_id': section_id, + 'cmd': 'get_library_media_info', + 'length': 10000} + + try: + r = requests.get(PLEXPY_URL.rstrip('/') + '/api/v2', params=payload) + response = r.json() + + res_data = response['response']['data']['data'] + return [LIBINFO(data=d) for d in res_data if d['play_count'] is None and (TODAY - int(d['added_at'])) > TFRAME] + + except Exception as e: + sys.stderr.write("PlexPy API 'get_library_media_info' request failed: {0}.".format(e)) + +def get_get_libraries_table(): + # Get the data on the PlexPy libraries table. + payload = {'apikey': PLEXPY_APIKEY, + 'cmd': 'get_libraries_table'} + + try: + r = requests.get(PLEXPY_URL.rstrip('/') + '/api/v2', params=payload) + response = r.json() + + res_data = response['response']['data']['data'] + return [d['section_id'] for d in res_data if d['section_name'] in LIBRARY_NAMES] + + except Exception as e: + sys.stderr.write("PlexPy API 'get_libraries_table' request failed: {0}.".format(e)) + +def delete_files(tmp_lst): + del_file = raw_input('Delete all unwatched files? (yes/no)').lower() + if del_file.startswith('y'): + for x in tmp_lst: + print("Removing {}".format(x)) + os.remove(x) + else: + print('Ok. doing nothing.') + +show_lst = [] +path_lst = [] + +glt = [lib for lib in get_get_libraries_table()] + +for i in glt: + try: + gglm = get_get_library_media_info(i) + for x in gglm: + try: + if x.media_type in ['show', 'episode']: + # Need to find TV shows rating_key for episode. + show_lst += get_get_new_rating_keys(x.rating_key, x.media_type) + else: + # Find movie rating_key. + show_lst += [int(x.rating_key)] + except Exception as e: + print("Rating_key failed: {e}").format(e=e) + + except Exception as e: + print("Library media info failed: {e}").format(e=e) + +# Remove reverse sort if you want the oldest keys first. +for i in sorted(show_lst, reverse=True): + try: + x = get_get_metadata(str(i)) + added = time.ctime(float(x.added_at)) + if x.grandparent_title == '' or x.media_type == 'movie': + # Movies + print(u"{x.title} ({x.rating_key}) was added {when} and has not been" + u"watched. \n File location: {x.file}".format(x=x, when=added)) + else: + # Shows + print(u"{x.grandparent_title}: {x.title} ({x.rating_key}) was added {when} and has" + u"not been watched. \n File location: {x.file}".format(x=x, when=added)) + path_lst += [x.file] + + except Exception as e: + print("Metadata failed. Likely end of range: {e}").format(e=e) + + +# delete_files(tmp_lst)