summaryrefslogtreecommitdiffstats
path: root/module/plugins/Plugin.py
diff options
context:
space:
mode:
Diffstat (limited to 'module/plugins/Plugin.py')
-rw-r--r--module/plugins/Plugin.py89
1 files changed, 57 insertions, 32 deletions
diff --git a/module/plugins/Plugin.py b/module/plugins/Plugin.py
index 68b2311b3..8a2554ea0 100644
--- a/module/plugins/Plugin.py
+++ b/module/plugins/Plugin.py
@@ -14,8 +14,7 @@ if os.name != "nt":
from itertools import islice
-from module.utils import save_join, save_path, fs_encode, fs_decode
-
+from module.utils import safe_join, safe_path, fs_encode, fs_decode
def chunks(iterable, size):
it = iter(iterable)
@@ -74,7 +73,7 @@ class Base(object):
def setConf(self, option, value):
""" see `setConfig` """
- self.core.config.setPlugin(self.__name__, option, value)
+ self.config.setPlugin(self.__name__, option, value)
def setConfig(self, option, value):
""" Set config value for current plugin
@@ -85,9 +84,10 @@ class Base(object):
"""
self.setConf(option, value)
+ #: Deprecated method
def getConf(self, option):
""" see `getConfig` """
- return self.core.config.getPlugin(self.__name__, option)
+ return self.getConfig(option)
def getConfig(self, option):
""" Returns config value for current plugin
@@ -95,7 +95,7 @@ class Base(object):
:param option:
:return:
"""
- return self.getConf(option)
+ return self.config.getPlugin(self.__name__, option)
def setStorage(self, key, value):
""" Saves a value persistently to the database """
@@ -127,7 +127,7 @@ class Plugin(Base):
"""
__name__ = "Plugin"
__type__ = "hoster"
- __version__ = "0.4"
+ __version__ = "0.5"
__pattern__ = None
__config__ = [("name", "type", "desc", "default")]
@@ -140,10 +140,13 @@ class Plugin(Base):
def __init__(self, pyfile):
Base.__init__(self, pyfile.m.core)
+ #: engage wan reconnection
self.wantReconnect = False
- #: enables simultaneous processing of multiple downloads
+
+ #: enable simultaneous processing of multiple downloads
self.multiDL = True
self.limitDL = 0
+
#: chunk limit
self.chunkLimit = 1
self.resumeDownload = False
@@ -152,7 +155,9 @@ class Plugin(Base):
self.waitUntil = 0
self.waiting = False
- self.ocr = None #captcha reader instance
+ #: captcha reader instance
+ self.ocr = None
+
#: account handler instance, see :py:class:`Account`
self.account = pyfile.m.core.accountManager.getAccountPlugin(self.__name__)
@@ -161,7 +166,9 @@ class Plugin(Base):
#: username/login
self.user = None
- if self.account and not self.account.canUse(): self.account = None
+ if self.account and not self.account.canUse():
+ self.account = None
+
if self.account:
self.user, data = self.account.selectAccount()
#: Browser instance, see `network.Browser`
@@ -177,18 +184,28 @@ class Plugin(Base):
#: associated pyfile instance, see `PyFile`
self.pyfile = pyfile
+
self.thread = None # holds thread in future
#: location where the last call to download was saved
self.lastDownload = ""
#: re match of the last call to `checkDownload`
self.lastCheck = None
+
#: js engine, see `JsEngine`
self.js = self.core.js
- self.cTask = None #captcha task
- self.retries = 0 # amount of retries already made
- self.html = None # some plugins store html code here
+ #: captcha task
+ self.cTask = None
+
+ #: amount of retries already made
+ self.retries = 0
+
+ #: some plugins store html code here
+ self.html = None
+
+ #: quick caller for API
+ self.api = self.core.api
self.init()
@@ -248,7 +265,7 @@ class Plugin(Base):
return True, 10
- def setWait(self, seconds, reconnect=False):
+ def setWait(self, seconds, reconnect=None):
"""Set a specific wait time later used with `wait`
:param seconds: wait time in seconds
@@ -258,15 +275,23 @@ class Plugin(Base):
self.wantReconnect = True
self.pyfile.waitUntil = time() + int(seconds)
- def wait(self):
- """ waits the time previously set """
+ def wait(self, seconds=None, reconnect=None):
+ """ Waits the time previously set or use these from arguments. See `setWait`
+ """
+ if seconds:
+ self.setWait(seconds, reconnect)
+
+ self._wait()
+
+ def _wait(self):
self.waiting = True
self.pyfile.setStatus("waiting")
while self.pyfile.waitUntil > time():
self.thread.m.reconnecting.wait(2)
- if self.pyfile.abort: raise Abort
+ if self.pyfile.abort:
+ raise Abort
if self.thread.m.reconnecting.isSet():
self.waiting = False
self.wantReconnect = False
@@ -372,7 +397,7 @@ class Plugin(Base):
self.fail(_("No captcha result obtained in appropiate time by any of the plugins."))
result = task.result
- self.log.debug("Received captcha result: %s" % str(result))
+ self.logDebug("Received captcha result: %s" % str(result))
if not self.core.debug:
try:
@@ -462,23 +487,23 @@ class Plugin(Base):
download_folder = self.config['general']['download_folder']
- location = save_join(download_folder, self.pyfile.package().folder)
+ location = safe_join(download_folder, self.pyfile.package().folder)
if not exists(location):
- makedirs(location, int(self.core.config['permission']['folder'], 8))
+ makedirs(location, int(self.config['permission']['folder'], 8))
- if self.core.config['permission']['change_dl'] and os.name != "nt":
+ if self.config['permission']['change_dl'] and os.name != "nt":
try:
uid = getpwnam(self.config['permission']['user'])[2]
gid = getgrnam(self.config['permission']['group'])[2]
chown(location, uid, gid)
except Exception, e:
- self.log.warning(_("Setting User and Group failed: %s") % str(e))
+ self.logWarning(_("Setting User and Group failed: %s") % str(e))
# convert back to unicode
location = fs_decode(location)
- name = save_path(self.pyfile.name)
+ name = safe_path(self.pyfile.name)
filename = join(location, name)
@@ -492,23 +517,23 @@ class Plugin(Base):
self.pyfile.size = self.req.size
if disposition and newname and newname != name: #triple check, just to be sure
- self.log.info("%(name)s saved as %(newname)s" % {"name": name, "newname": newname})
+ self.logInfo("%(name)s saved as %(newname)s" % {"name": name, "newname": newname})
self.pyfile.name = newname
filename = join(location, newname)
fs_filename = fs_encode(filename)
- if self.core.config['permission']['change_file']:
- chmod(fs_filename, int(self.core.config['permission']['file'], 8))
+ if self.config['permission']['change_file']:
+ chmod(fs_filename, int(self.config['permission']['file'], 8))
- if self.core.config['permission']['change_dl'] and os.name != "nt":
+ if self.config['permission']['change_dl'] and os.name != "nt":
try:
uid = getpwnam(self.config['permission']['user'])[2]
gid = getgrnam(self.config['permission']['group'])[2]
chown(fs_filename, uid, gid)
except Exception, e:
- self.log.warning(_("Setting User and Group failed: %s") % str(e))
+ self.logWarning(_("Setting User and Group failed: %s") % str(e))
self.lastDownload = filename
return self.lastDownload
@@ -531,12 +556,12 @@ class Plugin(Base):
if api_size and api_size <= size: return None
elif size > max_size and not read_size: return None
- self.log.debug("Download Check triggered")
+ self.logDebug("Download Check triggered")
f = open(lastDownload, "rb")
content = f.read(read_size if read_size else -1)
f.close()
#produces encoding errors, better log to other file in the future?
- #self.log.debug("Content: %s" % content)
+ #self.logDebug("Content: %s" % content)
for name, rule in rules.iteritems():
if type(rule) in (str, unicode):
if rule in content:
@@ -577,9 +602,9 @@ class Plugin(Base):
raise SkipDownload(pyfile.pluginname)
download_folder = self.config['general']['download_folder']
- location = save_join(download_folder, pack.folder, self.pyfile.name)
+ location = safe_join(download_folder, pack.folder, self.pyfile.name)
- if starting and self.core.config['download']['skip_existing'] and exists(location):
+ if starting and self.config['download']['skip_existing'] and exists(location):
size = os.stat(location).st_size
if size >= self.pyfile.size:
raise SkipDownload("File exists.")
@@ -589,7 +614,7 @@ class Plugin(Base):
if exists(location):
raise SkipDownload(pyfile[0])
- self.log.debug("File %s not skipped, because it does not exists." % self.pyfile.name)
+ self.logDebug("File %s not skipped, because it does not exists." % self.pyfile.name)
def clean(self):
""" clean everything and remove references """