Last active
April 7, 2016 23:16
-
-
Save Hellowlol/0047e27e2e17593b48ab708312956b71 to your computer and use it in GitHub Desktop.
Parse plexhistory
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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