2018-07-13 02:46:02 +10:00
|
|
|
#!/usr/bin/env python
|
2017-01-03 00:07:24 +11:00
|
|
|
# -*- coding: utf-8 -*-
|
2018-07-13 02:46:02 +10:00
|
|
|
from __future__ import absolute_import, division, unicode_literals
|
2017-09-10 23:06:46 +10:00
|
|
|
from cPickle import dumps, loads
|
|
|
|
from xbmcgui import Window
|
2017-09-10 23:22:06 +10:00
|
|
|
from xbmc import log, LOGDEBUG
|
2018-04-24 03:50:16 +10:00
|
|
|
|
2017-01-03 00:07:24 +11:00
|
|
|
###############################################################################
|
2017-09-10 23:06:46 +10:00
|
|
|
WINDOW = Window(10000)
|
2018-06-22 03:24:37 +10:00
|
|
|
PREFIX = 'PLEX.pickler: '
|
2017-01-03 00:07:24 +11:00
|
|
|
###############################################################################
|
|
|
|
|
|
|
|
|
2018-04-24 03:50:16 +10:00
|
|
|
def try_encode(input_str, encoding='utf-8'):
|
|
|
|
"""
|
|
|
|
Will try to encode input_str (in unicode) to encoding. This possibly
|
|
|
|
fails with e.g. Android TV's Python, which does not accept arguments for
|
|
|
|
string.encode()
|
|
|
|
|
|
|
|
COPY to avoid importing utils on calling default.py
|
|
|
|
"""
|
|
|
|
if isinstance(input_str, str):
|
|
|
|
# already encoded
|
|
|
|
return input_str
|
|
|
|
try:
|
|
|
|
input_str = input_str.encode(encoding, "ignore")
|
|
|
|
except TypeError:
|
|
|
|
input_str = input_str.encode()
|
|
|
|
return input_str
|
|
|
|
|
|
|
|
|
2017-09-10 23:06:46 +10:00
|
|
|
def pickl_window(property, value=None, clear=False):
|
|
|
|
"""
|
|
|
|
Get or set window property - thread safe! For use with Pickle
|
|
|
|
Property and value must be string
|
|
|
|
"""
|
|
|
|
if clear:
|
|
|
|
WINDOW.clearProperty(property)
|
|
|
|
elif value is not None:
|
|
|
|
WINDOW.setProperty(property, value)
|
|
|
|
else:
|
2018-04-24 03:50:16 +10:00
|
|
|
return try_encode(WINDOW.getProperty(property))
|
2017-09-10 23:06:46 +10:00
|
|
|
|
|
|
|
|
2017-01-03 00:07:24 +11:00
|
|
|
def pickle_me(obj, window_var='plex_result'):
|
|
|
|
"""
|
|
|
|
Pickles the obj to the window variable. Use to transfer Python
|
|
|
|
objects between different PKC python instances (e.g. if default.py is
|
|
|
|
called and you'd want to use the service.py instance)
|
|
|
|
|
|
|
|
obj can be pretty much any Python object. However, classes and
|
|
|
|
functions won't work. See the Pickle documentation
|
|
|
|
"""
|
2018-01-22 21:20:37 +11:00
|
|
|
log('%sStart pickling' % PREFIX, level=LOGDEBUG)
|
2017-09-10 23:06:46 +10:00
|
|
|
pickl_window(window_var, value=dumps(obj))
|
2017-09-10 23:22:06 +10:00
|
|
|
log('%sSuccessfully pickled' % PREFIX, level=LOGDEBUG)
|
2017-01-03 00:07:24 +11:00
|
|
|
|
|
|
|
|
|
|
|
def unpickle_me(window_var='plex_result'):
|
|
|
|
"""
|
|
|
|
Unpickles a Python object from the window variable window_var.
|
|
|
|
Will then clear the window variable!
|
|
|
|
"""
|
|
|
|
result = pickl_window(window_var)
|
|
|
|
pickl_window(window_var, clear=True)
|
2017-09-10 23:22:06 +10:00
|
|
|
log('%sStart unpickling' % PREFIX, level=LOGDEBUG)
|
2017-09-10 23:06:46 +10:00
|
|
|
obj = loads(result)
|
2018-02-04 00:09:29 +11:00
|
|
|
log('%sSuccessfully unpickled' % PREFIX, level=LOGDEBUG)
|
2017-01-03 00:07:24 +11:00
|
|
|
return obj
|
|
|
|
|
|
|
|
|
|
|
|
class Playback_Successful(object):
|
|
|
|
"""
|
|
|
|
Used to communicate with another PKC Python instance
|
|
|
|
"""
|
|
|
|
listitem = None
|