Skip to content

Instantly share code, notes, and snippets.

@Hellowlol
Last active April 7, 2016 23:16
Show Gist options
  • Save Hellowlol/0047e27e2e17593b48ab708312956b71 to your computer and use it in GitHub Desktop.
Save Hellowlol/0047e27e2e17593b48ab708312956b71 to your computer and use it in GitHub Desktop.
Parse plexhistory
import requests
import time
from collections import Counter
from functools import wraps
import arrow
def timeme(func):
@wraps(func)
def inner(*args, **kwargs):
start = time.time()
res = func(*args)
print '%s took %s' % (func.__name__, time.time() - start)
return res
return inner
url = 'http://10.0.0.97:32400/status/sessions/history/all'
plextoken = '<token>'
h = {'Accept': 'application/json',
'X-Plex-Token': plextoken}
response = requests.get(url, headers=h)
res = response.json()
class History(object):
""" Simple parser to query the plex history """
def __init__(self, data): # data should be htmlresponse['_children']
self.data = self._parse(data)
@timeme
def _parse(self, data):
results = []
for item in data:
try:
for i in item['children']:
i['user_id'] = i['id']
i['username'] = i['title']
i.update(item)
try:
del i['children']
except:
pass
results.append(i)
except KeyError:
for i in item['_children']: # shit api
i['user_id'] = i['id']
i['username'] = i['title']
i.update(item)
try:
del i['children']
except:
pass
results.append(i)
return results
def _count(self, key=None, wanted=None, data=None):
if data is None:
data = self.data
if wanted:
return dict(Counter([z[key] for z in data if z[key] == wanted]))
else:
return dict(Counter([z[key] for z in data if z[key]]))
def _filt(self, key=None, wanted=None, sort=None, data=None):
if data is None:
data = self.data
r = []
if wanted:
r = [z for z in data if z[key] == wanted]
else:
r = [z for z in data if z[key]]
if sort:
return sorted(r, key=lambda v: v[sort])
return r
def watched(self, key, key_type='title'):
return self._filt(key_type, key)
#@timeme
def most_watched(self, key, key_type='title', data=None, username=None):
data = self.watched(key, key_type)
return self._count(key_type, key, data=data)
#@timeme
def most_popular_type(self, t, username=None):
if username:
data = self.watched_by(username)
return self._count('type', data=data)
#@timeme
def user_most_watched(self):
return self._count('username')
#@timeme
def watched_by(self, username, data=None):
if data is None:
data = self.data
return self._filt('username', username)
#@timeme
def watched_since(self, date, username=None):
""" date: int, float, tuple, string """
r = [z for z in self.data if arrow.get(date) > arrow.get(z.get('viewedAt', 0))]
if username:
return self.watched_by(username, data=r)
return r
def to_plexpy(self):
""" Add missing keys, values to the dicts
so we can loop it and add it via plexpy api
"""
pass # TODO
h = History(res['_children'])
# Examples
#print h.watched('The Revenant')
#print h.most_popular_type('movie')
#print h.user_most_watched()
#print h.watched_by('Hellowlol')
#print h.watched_since('2016-04-01', 'Hellowlol')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment