summaryrefslogtreecommitdiffstats
path: root/module/plugins/internal
diff options
context:
space:
mode:
Diffstat (limited to 'module/plugins/internal')
-rw-r--r--module/plugins/internal/Account.py69
-rw-r--r--module/plugins/internal/Addon.py4
-rw-r--r--module/plugins/internal/Base.py19
-rw-r--r--module/plugins/internal/Crypter.py9
-rw-r--r--module/plugins/internal/Hook.py6
-rw-r--r--module/plugins/internal/Hoster.py21
-rw-r--r--module/plugins/internal/Plugin.py8
-rw-r--r--module/plugins/internal/SimpleCrypter.py4
-rw-r--r--module/plugins/internal/SimpleHoster.py2
-rw-r--r--module/plugins/internal/UnRar.py2
10 files changed, 94 insertions, 50 deletions
diff --git a/module/plugins/internal/Account.py b/module/plugins/internal/Account.py
index 724322a4c..2ca01de0e 100644
--- a/module/plugins/internal/Account.py
+++ b/module/plugins/internal/Account.py
@@ -13,7 +13,7 @@ from module.utils import compare_time, lock
class Account(Plugin):
__name__ = "Account"
__type__ = "account"
- __version__ = "0.54"
+ __version__ = "0.55"
__status__ = "testing"
__description__ = """Base account plugin"""
@@ -21,8 +21,8 @@ class Account(Plugin):
__authors__ = [("Walter Purcaro", "vuolter@gmail.com")]
- LOGIN_TIMEOUT = 10 * 60 #: Relogin accounts every 10 minutes
- AUTO_TIMEOUT = True #: Automatically adjust relogin interval
+ LOGIN_TIMEOUT = 30 * 60 #: Relogin accounts every 30 minutes
+ AUTO_INTERVAL = True #: Automatically adjust relogin interval
def __init__(self, manager, accounts):
@@ -34,8 +34,11 @@ class Account(Plugin):
self.accounts = accounts #@TODO: Recheck in 0.4.10
self.user = None
- self.interval = self.LOGIN_TIMEOUT
- self.auto_timeout = self.interval if self.AUTO_TIMEOUT else False
+ self.timeout = self.LOGIN_TIMEOUT
+
+ #: Callback of periodical job task
+ self.cb = None
+ self.interval = self.LOGIN_TIMEOUT
self.init()
@@ -47,6 +50,28 @@ class Account(Plugin):
pass
+ def init_periodical(self, delay=0, threaded=False):
+ self.cb = self.pyload.scheduler.addJob(max(0, delay), self._periodical, [threaded], threaded=threaded)
+
+
+ def _periodical(self, threaded):
+ if self.interval < 0:
+ self.cb = None
+ return
+
+ try:
+ self.periodical()
+
+ except Exception, e:
+ self.log_error(_("Error executing periodical task: %s") % e)
+
+ self.init_periodical(self.interval, threaded)
+
+
+ def periodical(self):
+ raise NotImplementedError
+
+
@property
def logged(self):
"""
@@ -57,7 +82,7 @@ class Account(Plugin):
self.sync()
- if self.info['login']['timestamp'] + self.interval < time.time():
+ if self.info['login']['timestamp'] + self.timeout < time.time():
self.log_debug("Reached login timeout for user `%s`" % self.user)
return False
else:
@@ -87,15 +112,17 @@ class Account(Plugin):
self.sync()
+ timestamp = time.time()
+
try:
- self.info['login']['timestamp'] = time.time() #: Set timestamp for login
self.signin(self.user, self.info['login']['password'], self.info['data'])
except Skip:
self.info['login']['valid'] = True
- if self.auto_timeout:
- self.auto_timeout *= 3
- self.interval = self.auto_timeout
+
+ new_timeout = timestamp - self.info['login']['timestamp']
+ if self.AUTO_INTERVAL and new_timeout > self.timeout:
+ self.timeout = new_timeout
except Exception, e:
self.log_error(_("Could not login user `%s`") % user, e)
@@ -103,12 +130,12 @@ class Account(Plugin):
else:
self.info['login']['valid'] = True
- if self.interval is self.auto_timeout:
- self.interval = self.auto_timeout / 3
- self.auto_timeout = False
finally:
+ self.info['login']['timestamp'] = timestamp #: Set timestamp for login
+
self.syncback()
+
return bool(self.info['login']['valid'])
@@ -399,9 +426,19 @@ class Account(Plugin):
###########################################################################
- def parse_traffic(self, size, unit="KB"): #@NOTE: Returns kilobytes in 0.4.9
- size = re.search(r'(\d*[\.,]?\d+)', size).group(1) #@TODO: Recjeck in 0.4.10
- return parse_size(size, unit) / 1024 #@TODO: Remove `/ 1024` in 0.4.10
+ def parse_traffic(self, size, unit="byte"): #@NOTE: Returns kilobytes in 0.4.9
+ unit = unit.lower().strip() #@TODO: Remove in 0.4.10
+ size = re.search(r'(\d*[\.,]?\d+)', size).group(1) #@TODO: Recheck in 0.4.10
+
+ self.log_debug("Size: %s" % size, "Unit: %s" % unit)
+
+ #@NOTE: Remove in 0.4.10
+ if unit.startswith('t'):
+ traffic = float(size.replace(',', '.')) * 1 << 40
+ else:
+ traffic = parse_size(size, unit)
+
+ return traffic / 1024 #@TODO: Remove `/ 1024` in 0.4.10
def fail_login(self, msg=_("Login handshake has failed")):
diff --git a/module/plugins/internal/Addon.py b/module/plugins/internal/Addon.py
index 371f1da1b..cf3f01df1 100644
--- a/module/plugins/internal/Addon.py
+++ b/module/plugins/internal/Addon.py
@@ -23,7 +23,7 @@ def threaded(fn):
class Addon(Plugin):
__name__ = "Addon"
__type__ = "hook" #@TODO: Change to `addon` in 0.4.10
- __version__ = "0.06"
+ __version__ = "0.07"
__status__ = "testing"
__threaded__ = [] #@TODO: Remove in 0.4.10
@@ -105,7 +105,7 @@ class Addon(Plugin):
def periodical(self):
- pass
+ raise NotImplementedError
@property
diff --git a/module/plugins/internal/Base.py b/module/plugins/internal/Base.py
index bc9ef9158..28bc47556 100644
--- a/module/plugins/internal/Base.py
+++ b/module/plugins/internal/Base.py
@@ -52,7 +52,7 @@ def check_abort(fn):
class Base(Plugin):
__name__ = "Base"
__type__ = "base"
- __version__ = "0.02"
+ __version__ = "0.03"
__status__ = "testing"
__pattern__ = r'^unmatchable$'
@@ -270,6 +270,8 @@ class Base(Plugin):
if self.thread.m.reconnecting.isSet():
self.waiting = False
self.wantReconnect = False
+
+ self.req.clearCookies()
raise Reconnect
time.sleep(2)
@@ -334,6 +336,21 @@ class Base(Plugin):
self.fail("temp. offline")
+ def restart(self, msg="", premium=True):
+ if not msg:
+ msg = _("Restart plugin") if premium else _("Fallback to free processing")
+
+ if not premium:
+ if self.premium:
+ self.rst_free = True
+ else:
+ self.fail("%s | %s" % (msg, _("Url was already processed as free")))
+
+ self.req.clearCookies()
+
+ raise Retry(encode(msg)) #@TODO: Remove `encode` in 0.4.10
+
+
def retry(self, attemps=5, wait=1, msg=""):
"""
Retries and begin again from the beginning
diff --git a/module/plugins/internal/Crypter.py b/module/plugins/internal/Crypter.py
index a5c88aed9..cc1eeb5fd 100644
--- a/module/plugins/internal/Crypter.py
+++ b/module/plugins/internal/Crypter.py
@@ -7,7 +7,7 @@ from module.utils import save_path as safe_filename
class Crypter(Base):
__name__ = "Crypter"
__type__ = "crypter"
- __version__ = "0.11"
+ __version__ = "0.12"
__status__ = "testing"
__pattern__ = r'^unmatchable$'
@@ -83,11 +83,12 @@ class Crypter(Base):
subfolder_per_package = self.get_config('subfolder_per_package', True)
for name, links, folder in self.packages:
- self.log_debug("Parsed package: %s" % name,
- "%d links" % len(links),
- "Saved to folder: %s" % folder if folder else "Saved to download folder")
+ self.log_info(_("Parsed package: %s") % name,
+ _("Found %d links") % len(links),
+ _("Saved to folder: %s") % folder if folder else _("Saved to default download folder"))
links = map(self.fixurl, links)
+ self.log_debug("LINKS for package " + name, *links)
pid = self.pyload.api.addPackage(name, links, package_queue)
diff --git a/module/plugins/internal/Hook.py b/module/plugins/internal/Hook.py
index 8ae731a7f..6ead5cf0b 100644
--- a/module/plugins/internal/Hook.py
+++ b/module/plugins/internal/Hook.py
@@ -6,7 +6,7 @@ from module.plugins.internal.Addon import Addon, threaded
class Hook(Addon):
__name__ = "Hook"
__type__ = "hook"
- __version__ = "0.13"
+ __version__ = "0.14"
__status__ = "testing"
__description__ = """Base hook plugin"""
@@ -24,3 +24,7 @@ class Hook(Addon):
#@TODO: Remove in 0.4.10
def _log(self, level, plugintype, pluginname, messages):
return super(Addon, self)._log(level, plugintype, pluginname.replace("Hook", ""), messages)
+
+
+ def periodical(self):
+ pass
diff --git a/module/plugins/internal/Hoster.py b/module/plugins/internal/Hoster.py
index 86b684414..b0458ca95 100644
--- a/module/plugins/internal/Hoster.py
+++ b/module/plugins/internal/Hoster.py
@@ -13,7 +13,7 @@ from module.utils import fs_decode, fs_encode, save_join as fs_join, save_path a
class Hoster(Base):
__name__ = "Hoster"
__type__ = "hoster"
- __version__ = "0.35"
+ __version__ = "0.36"
__status__ = "testing"
__pattern__ = r'^unmatchable$'
@@ -93,19 +93,6 @@ class Hoster(Base):
raise Fail(e)
- def restart(self, msg="", premium=True):
- if not msg:
- msg = _("Simple restart") if premium else _("Fallback to free download")
-
- if not premium:
- if self.premium:
- self.rst_free = True
- else:
- self.fail("%s | %s" % (msg, _("Download was already free")))
-
- raise Retry(encode(msg)) #@TODO: Remove `encode` in 0.4.10
-
-
@check_abort
def download(self, url, get={}, post={}, ref=True, cookies=True, disposition=True):
"""
@@ -291,8 +278,10 @@ class Hoster(Base):
return True
else:
- size = self.pyfile.size / 1024 #@TODO: Remove in 0.4.10
- self.log_info(_("Filesize: %s KiB, Traffic left for user %s: %s KiB") % (size, self.account.user, traffic)) #@TODO: Rewrite in 0.4.10
+ #@TODO: Rewrite in 0.4.10
+ size = self.pyfile.size / 1024
+ self.log_info(_("Filesize: %s KiB") % size,
+ _("Traffic left for user %s: %s KiB") % (self.account.user, traffic))
return size <= traffic
diff --git a/module/plugins/internal/Plugin.py b/module/plugins/internal/Plugin.py
index cc35d919c..9d2aa8b50 100644
--- a/module/plugins/internal/Plugin.py
+++ b/module/plugins/internal/Plugin.py
@@ -109,10 +109,8 @@ def parse_time(string):
time = seconds_to_midnight()
else:
- this = re.compile("this", re.I)
- regex = re.compile(r'(\d+|[\w\-]+)\s*(hr|hour|min|sec|)', re.I)
-
- time = sum(1 if this.match(v) else str2int(v) *
+ regex = re.compile(r'(\d+| (?:this|an?) )\s*(hr|hour|min|sec|)', re.I)
+ time = sum((int(v) if v.strip() not in ("this", "a", "an") else 1) *
{'hr': 3600, 'hour': 3600, 'min': 60, 'sec': 1, '': 1}[u.lower()]
for v, u in regex.findall(string))
@@ -228,7 +226,7 @@ def chunks(iterable, size):
class Plugin(object):
__name__ = "Plugin"
__type__ = "plugin"
- __version__ = "0.46"
+ __version__ = "0.47"
__status__ = "testing"
__pattern__ = r'^unmatchable$'
diff --git a/module/plugins/internal/SimpleCrypter.py b/module/plugins/internal/SimpleCrypter.py
index 30b8ebfb0..d4ecd3117 100644
--- a/module/plugins/internal/SimpleCrypter.py
+++ b/module/plugins/internal/SimpleCrypter.py
@@ -10,7 +10,7 @@ from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo
class SimpleCrypter(Crypter, SimpleHoster):
__name__ = "SimpleCrypter"
__type__ = "crypter"
- __version__ = "0.65"
+ __version__ = "0.66"
__status__ = "testing"
__pattern__ = r'^unmatchable$'
@@ -139,8 +139,6 @@ class SimpleCrypter(Crypter, SimpleHoster):
if self.PAGES_PATTERN:
self.handle_pages(pyfile)
- self.log_debug("Package has %d links" % len(self.links))
-
if self.link:
self.urls.append(self.link)
diff --git a/module/plugins/internal/SimpleHoster.py b/module/plugins/internal/SimpleHoster.py
index 8f1b3ac5d..7e759b593 100644
--- a/module/plugins/internal/SimpleHoster.py
+++ b/module/plugins/internal/SimpleHoster.py
@@ -385,7 +385,7 @@ class SimpleHoster(Hoster):
elif re.search('countdown|expired', errmsg, re.I):
self.retry(10, 60, _("Link expired"))
- elif re.search('maintenance|maintainance|temp', errmsg, re.I):
+ elif re.search('maint(e|ai)nance|temp', errmsg, re.I):
self.temp_offline()
elif re.search('up to|size', errmsg, re.I):
diff --git a/module/plugins/internal/UnRar.py b/module/plugins/internal/UnRar.py
index 908689109..39a919ec6 100644
--- a/module/plugins/internal/UnRar.py
+++ b/module/plugins/internal/UnRar.py
@@ -38,7 +38,7 @@ class UnRar(Extractor):
re_multipart = re.compile(r'\.(part|r)(\d+)(?:\.rar)?(\.rev|\.bad)?', re.I)
re_filefixed = re.compile(r'Building (.+)')
- re_filelist = re.compile(r'^(.)(\s*[\w\.\-]+)\s+(\d+\s+)+(?:\d+\%\s+)?[\d\-]{8}\s+[\d\:]{5}', re.M|re.I)
+ re_filelist = re.compile(r'^(.)(\s*[\w.-]+)\s+(\d+\s+)+(?:\d+\%\s+)?[\d-]{8}\s+[\d\:]{5}', re.M|re.I)
re_wrongpwd = re.compile(r'password', re.I)
re_wrongcrc = re.compile(r'encrypted|damaged|CRC failed|checksum error|corrupt', re.I)