From 7a008e5dbcafce2492233f36ffa8b776c7d5b88b Mon Sep 17 00:00:00 2001
From: blacktwin <blacktwin@users.noreply.github.com>
Date: Sun, 17 Dec 2017 16:49:47 -0500
Subject: [PATCH] Create remove_inactive_users.py

---
 utility/remove_inactive_users.py | 98 ++++++++++++++++++++++++++++++++
 1 file changed, 98 insertions(+)
 create mode 100644 utility/remove_inactive_users.py

diff --git a/utility/remove_inactive_users.py b/utility/remove_inactive_users.py
new file mode 100644
index 0000000..0739dca
--- /dev/null
+++ b/utility/remove_inactive_users.py
@@ -0,0 +1,98 @@
+"""
+Unshare or Remove users who have been inactive for X days. Prints out last seen for all users.
+
+Just run. 
+
+Comment out `remove_friend(username)` and `unshare(username)` to test.
+"""
+
+import requests
+import datetime
+import time
+from plexapi.server import PlexServer
+
+
+## EDIT THESE SETTINGS ##
+PLEXPY_APIKEY = 'xxxx'  # Your PlexPy API key
+PLEXPY_URL = 'http://localhost:8182/'  # Your PlexPy URL
+
+PLEX_TOKEN = 'xxxx'
+PLEX_URL = 'http://localhost:32400'
+
+REMOVE_LIMIT = 30 # days
+UNSHARE_LIMIT = 15 # days
+
+USER_IGNORE = ('user1')
+##/EDIT THESE SETTINGS ##
+
+sess = requests.Session()
+sess.verify = False
+plex = PlexServer(PLEX_URL, PLEX_TOKEN, session=sess)
+
+sections_lst = [x.title for x in plex.library.sections()]
+today = time.mktime(datetime.datetime.today().timetuple())
+
+
+def get_users_table():
+    # Get the PlexPy history.
+    payload = {'apikey': PLEXPY_APIKEY,
+               'cmd': 'get_users_table',
+               'order_column': 'last_seen',
+               'order_dir': 'asc'}
+
+    try:
+        r = requests.get(PLEXPY_URL.rstrip('/') + '/api/v2', params=payload)
+        response = r.json()
+
+        res_data = response['response']['data']['data']
+        return [data for data in res_data if data['last_seen']]
+
+    except Exception as e:
+        print("PlexPy API 'get_history' request failed: {0}.".format(e))
+
+
+def unshare(user):
+    print('{user} has reached inactivity limit. Unsharing.'.format(user=user))
+    plex.myPlexAccount().updateFriend(user=user, server=plex, removeSections=True, sections=sections_lst)
+    print('Unshared all libraries from {user}.'.format(user=user))
+
+
+def remove_friend(user):
+    print('{user} has reached inactivity limit. Removing.'.format(user=user))
+    plex.myPlexAccount().removeFriend(user)
+    print('Removed {user}.'.format(user=user))
+
+
+def main():
+
+    user_tables = get_users_table()
+
+    for user in user_tables:
+        last_seen = (today - user['last_seen']) / 24 / 60 / 60
+        if int(last_seen) != 0:
+            last_seen = int(last_seen)
+
+        username = user['friendly_name']
+        if username not in USER_IGNORE:
+            if last_seen > REMOVE_LIMIT:
+                print('{} was last seen {} days ago. Removing.'.format(username, last_seen))
+                remove_friend(username)
+            elif last_seen > UNSHARE_LIMIT:
+                print('{} was last seen {} days ago. Unshsring.'.format(username, last_seen))
+                unshare(username)
+            elif last_seen > 1:
+                print('{} was last seen {} days ago.'.format(username, last_seen))
+            elif int(last_seen) == 1:
+                print('{} was last seen yesterday.'.format(username))
+            else:
+                hours_ago = last_seen * 24
+                if int(hours_ago) != 0:
+                    hours_ago = int(hours_ago)
+                    print('{} was last seen {} hours ago.'.format(username, hours_ago))
+                else:
+                    minutes_ago = int(hours_ago * 60)
+                    print('{} was last seen {} minutes ago.'.format(username, minutes_ago))
+
+
+if __name__ == '__main__':
+    main()