summaryrefslogtreecommitdiffstats
path: root/module/plugins/internal/misc.py
diff options
context:
space:
mode:
Diffstat (limited to 'module/plugins/internal/misc.py')
-rw-r--r--module/plugins/internal/misc.py139
1 files changed, 134 insertions, 5 deletions
diff --git a/module/plugins/internal/misc.py b/module/plugins/internal/misc.py
index 692052029..75f0dbef5 100644
--- a/module/plugins/internal/misc.py
+++ b/module/plugins/internal/misc.py
@@ -43,6 +43,135 @@ class misc(object):
__authors__ = [("Walter Purcaro", "vuolter@gmail.com")]
+class Config(object):
+
+ def __init__(self, plugin):
+ self.plugin = plugin
+
+
+ def set(self, option, value):
+ """
+ Set config value for current plugin
+
+ :param option:
+ :param value:
+ :return:
+ """
+ self.plugin.pyload.api.setConfigValue(self.plugin.classname, option, value, section="plugin")
+
+
+ def get(self, option, default=""):
+ """
+ Returns config value for current plugin
+
+ :param option:
+ :return:
+ """
+ try:
+ return self.plugin.pyload.config.getPlugin(self.plugin.classname, option)
+
+ except KeyError:
+ self.plugin.log_debug("Config option `%s` not found, use default `%s`" % (option, default or None)) #@TODO: Restore to `log_warning` in 0.4.10
+ return default
+
+
+class DB(object):
+
+ def __init__(self, plugin):
+ self.plugin = plugin
+
+
+ def store(self, key, value):
+ """
+ Saves a value persistently to the database
+ """
+ value = map(decode, value) if isiterable(value) else decode(value)
+ entry = json.dumps(value).encode('base64')
+ self.plugin.pyload.db.setStorage(self.plugin.classname, key, entry)
+
+
+ def retrieve(self, key=None, default=None):
+ """
+ Retrieves saved value or dict of all saved entries if key is None
+ """
+ entry = self.plugin.pyload.db.getStorage(self.plugin.classname, key)
+
+ if key:
+ if entry is None:
+ value = default
+ else:
+ value = json.loads(entry.decode('base64'))
+ else:
+ if not entry:
+ value = default
+ else:
+ value = dict((k, json.loads(v.decode('base64'))) for k, v in value.items())
+
+ return value
+
+
+ def delete(self, key):
+ """
+ Delete entry in db
+ """
+ self.plugin.pyload.db.delStorage(self.plugin.classname, key)
+
+
+class Periodical(object):
+
+ def __init__(self, plugin, task=lambda x: x, interval=None):
+ self.plugin = plugin
+ self.task = task
+ self.cb = None
+ self.interval = interval
+
+
+ def set_interval(self, value):
+ newinterval = max(0, value)
+
+ if newinterval != value:
+ return False
+
+ if newinterval != self.interval:
+ self.interval = newinterval
+
+ return True
+
+
+ def start(self, interval=None, threaded=False, delay=0):
+ if interval is not None and self.set_interval(interval) is False:
+ return False
+ else:
+ self.cb = self.plugin.pyload.scheduler.addJob(max(1, delay), self._task, [threaded], threaded=threaded)
+ return True
+
+
+ def restart(self, *args, **kwargs):
+ self.stop()
+ return self.start(*args, **kwargs)
+
+
+ def stop(self):
+ try:
+ return self.plugin.pyload.scheduler.removeJob(self.cb)
+
+ except Exception:
+ return False
+
+ finally:
+ self.cb = None
+
+
+ def _task(self, threaded):
+ try:
+ self.task()
+
+ except Exception, e:
+ self.log_error(_("Error performing periodical task"), e)
+
+ self.restart(threaded=threaded, delay=self.interval)
+
+
class SimpleQueue(object):
def __init__(self, plugin, storage="queue"):
@@ -233,10 +362,10 @@ def decode(value, encoding=None, errors='strict'):
return res
-
+
def transcode(value, decoding, encoding):
return value.decode(decoding).encode(encoding)
-
+
def encode(value, encoding='utf-8', errors='backslashreplace'):
"""
@@ -256,8 +385,8 @@ def encode(value, encoding='utf-8', errors='backslashreplace'):
res = str(value)
return res
-
-
+
+
def exists(path):
path = encode(path)
@@ -269,7 +398,7 @@ def exists(path):
return True
else:
return False
-
+
def fsjoin(*args):
"""