summaryrefslogtreecommitdiffstats
path: root/module/plugins/Base.py
diff options
context:
space:
mode:
authorGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2011-12-31 16:01:24 +0100
committerGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2011-12-31 16:01:24 +0100
commitd35c003cc53d4723d1dfe0d81eeb9bea78cee594 (patch)
treeff9d47a0cee6116836955e37bf4471c1f1d82bee /module/plugins/Base.py
parentsome account fixes (diff)
downloadpyload-d35c003cc53d4723d1dfe0d81eeb9bea78cee594.tar.xz
new crypter plugin API, now decrypting possible for now.
Diffstat (limited to 'module/plugins/Base.py')
-rw-r--r--module/plugins/Base.py101
1 files changed, 90 insertions, 11 deletions
diff --git a/module/plugins/Base.py b/module/plugins/Base.py
index 36df7e423..b2338a01f 100644
--- a/module/plugins/Base.py
+++ b/module/plugins/Base.py
@@ -18,12 +18,19 @@
"""
import sys
+from module.utils.fs import exists, makedirs, join
-# TODO: config format definition
+# TODO
# more attributes if needed
# get rid of catpcha & container plugins ?! (move to crypter & internals)
# adapt old plugins as needed
+class Fail(Exception):
+ """ raised when failed """
+
+class Retry(Exception):
+ """ raised when start again from beginning """
+
class Base(object):
"""
The Base plugin class with all shared methods and every possible attribute for plugin definition.
@@ -31,7 +38,8 @@ class Base(object):
__version__ = "0.1"
#: Regexp pattern which will be matched for download plugins
__pattern__ = r""
- #: Flat config definition
+ #: Config definition: list of (name, type, verbose_name, default_value) or
+ #: (name, type, verbose_name, short_description, default_value)
__config__ = tuple()
#: Short description, one liner
__description__ = ""
@@ -41,7 +49,7 @@ class Base(object):
__dependencies__ = tuple()
#: Tags to categorize the plugin
__tags__ = tuple()
- #: Base64 encoded .png icon
+ #: Base64 encoded .png icon, please don't use sizes above ~3KB
__icon__ = ""
#: Alternative, link to png icon
__icon_url__ = ""
@@ -62,18 +70,25 @@ class Base(object):
self.config = core.config
#log functions
- def logInfo(self, *args):
- self.log.info("%s: %s" % (self.__name__, " | ".join([a if isinstance(a, basestring) else str(a) for a in args])))
+ def logInfo(self, *args, **kwargs):
+ self._log("info", *args, **kwargs)
+
+ def logWarning(self, *args, **kwargs):
+ self._log("warning", *args, **kwargs)
- def logWarning(self, *args):
- self.log.warning("%s: %s" % (self.__name__, " | ".join([a if isinstance(a, basestring) else str(a) for a in args])))
+ def logError(self, *args, **kwargs):
+ self._log("error", *args, **kwargs)
- def logError(self, *args):
- self.log.error("%s: %s" % (self.__name__, " | ".join([a if isinstance(a, basestring) else str(a) for a in args])))
+ def logDebug(self, *args, **kwargs):
+ self._log("debug", *args, **kwargs)
- def logDebug(self, *args):
- self.log.debug("%s: %s" % (self.__name__, " | ".join([a if isinstance(a, basestring) else str(a) for a in args])))
+ def _log(self, level, *args, **kwargs):
+ if "sep" in kwargs:
+ sep = "%s" % kwargs["sep"]
+ else:
+ sep = " | "
+ getattr(self.log, level)("%s: %s" % (self.__name__, sep.join([a if isinstance(a, basestring) else str(a) for a in args])))
def setConf(self, option, value):
""" see `setConfig` """
@@ -129,3 +144,67 @@ class Base(object):
#noinspection PyUnresolvedReferences
sys.stdout = sys._stdout
embed()
+
+ def load(self, url, get={}, post={}, ref=True, cookies=True, just_header=False, decode=False):
+ """Load content at url and returns it
+
+ :param url:
+ :param get:
+ :param post:
+ :param ref:
+ :param cookies:
+ :param just_header: if True only the header will be retrieved and returned as dict
+ :param decode: Wether to decode the output according to http header, should be True in most cases
+ :return: Loaded content
+ """
+ if not hasattr(self, "req"): raise Exception("Plugin type does not have Request attribute.")
+
+ if type(url) == unicode: url = str(url)
+
+ res = self.req.load(url, get, post, ref, cookies, just_header, decode=decode)
+
+ if self.core.debug:
+ from inspect import currentframe
+
+ frame = currentframe()
+ if not exists(join("tmp", self.__name__)):
+ makedirs(join("tmp", self.__name__))
+
+ f = open(
+ join("tmp", self.__name__, "%s_line%s.dump.html" % (frame.f_back.f_code.co_name, frame.f_back.f_lineno))
+ , "wb")
+ del frame # delete the frame or it wont be cleaned
+
+ try:
+ tmp = res.encode("utf8")
+ except:
+ tmp = res
+
+ f.write(tmp)
+ f.close()
+
+ if just_header:
+ #parse header
+ header = {"code": self.req.code}
+ for line in res.splitlines():
+ line = line.strip()
+ if not line or ":" not in line: continue
+
+ key, none, value = line.partition(":")
+ key = key.lower().strip()
+ value = value.strip()
+
+ if key in header:
+ if type(header[key]) == list:
+ header[key].append(value)
+ else:
+ header[key] = [header[key], value]
+ else:
+ header[key] = value
+ res = header
+
+ return res
+
+ def fail(self, reason):
+ """ fail and give reason """
+ raise Fail(reason) \ No newline at end of file