From 502517f37c7540b0bddb092e69386d9d6f08800c Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sun, 19 Jul 2015 09:42:34 +0200 Subject: Fix addons --- module/plugins/internal/Addon.py | 242 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 module/plugins/internal/Addon.py (limited to 'module/plugins/internal/Addon.py') diff --git a/module/plugins/internal/Addon.py b/module/plugins/internal/Addon.py new file mode 100644 index 000000000..f3da5272f --- /dev/null +++ b/module/plugins/internal/Addon.py @@ -0,0 +1,242 @@ +# -*- coding: utf-8 -*- + +import traceback + +from module.plugins.internal.Plugin import Plugin + + +class Expose(object): + """ + Used for decoration to declare rpc services + """ + def __new__(cls, f, *args, **kwargs): + hookManager.addRPC(f.__module__, f.func_name, f.func_doc) + return f + + +def threaded(fn): + + def run(*args, **kwargs): + hookManager.startThread(fn, *args, **kwargs) + + return run + + +class Addon(Plugin): + __name__ = "Addon" + __type__ = "hook" #@TODO: Change to `addon` in 0.4.10 + __version__ = "0.01" + + __config__ = [] #: [("name", "type", "desc", "default")] + __threaded__ = [] #@TODO: Remove in 0.4.10 + + __description__ = """Base addon plugin""" + __license__ = "GPLv3" + __authors__ = [("Walter Purcaro", "vuolter@gmail.com")] + + + def __init__(self, core, manager): + super(Addon, self).__init__(core) + + #: `HookManager` + self.manager = manager + + #: Automatically register event listeners for functions, attribute will be deleted dont use it yourself + self.event_map = {} + + #: Deprecated alternative to event_map + #: List of events the plugin can handle, name the functions exactly like eventname. + self.event_list = [] #@NOTE: dont make duplicate entries in event_map + + #: Callback of periodical job task, used by HookManager + self.cb = None + self.interval = 60 + + self.init() + self.init_events() + + + def init_events(self): + if self.event_map: + for event, funcs in self.event_map.iteritems(): + if type(funcs) in (list, tuple): + for f in funcs: + self.manager.addEvent(event, getattr(self, f)) + else: + self.manager.addEvent(event, getattr(self, funcs)) + + #: Delete for various reasons + self.event_map = None + + if self.event_list: + self.log_debug("Deprecated method `event_list`, use `event_map` instead") + + for f in self.event_list: + self.manager.addEvent(f, getattr(self, f)) + + self.event_list = None + + + def init_periodical(self, delay=0, threaded=False): + self.cb = self.core.scheduler.addJob(max(0, delay), self._periodical, [threaded], threaded=threaded) + + + #: Deprecated method, use `init_periodical` instead + def initPeriodical(self, *args, **kwargs): + return self.init_periodical(*args, **kwargs) + + + def _periodical(self, threaded): + if self.interval < 0: + self.cb = None + return + + try: + self.periodical() + + except Exception, e: + self.log_error(_("Error executing addon: %s") % e) + if self.core.debug: + traceback.print_exc() + + self.cb = self.core.scheduler.addJob(self.interval, self._periodical, [threaded], threaded=threaded) + + + def periodical(self): + pass + + + def __repr__(self): + return "" % self.__name__ + + + def is_activated(self): + """ + Checks if addon is activated + """ + return self.get_config("activated") + + + #: Deprecated method, use `is_activated` instead + def isActivated(self, *args, **kwargs): + return self.is_activated(*args, **kwargs) + + + def deactivate(self): + """ + Called when addon was deactivated + """ + pass + + + #: Deprecated method, use `deactivate` instead + def unload(self, *args, **kwargs): + return self.deactivate(*args, **kwargs) + + + def activate(self): + """ + Called when addon was activated + """ + pass + + + #: Deprecated method, use `activate` instead + def coreReady(self, *args, **kwargs): + return self.activate(*args, **kwargs) + + + def exit(self): + """ + Called by core.shutdown just before pyLoad exit + """ + pass + + + #: Deprecated method, use `exit` instead + def coreExiting(self, *args, **kwargs): + return self.exit(*args, **kwargs) + + + def download_preparing(self, pyfile): + pass + + + #: Deprecated method, use `download_preparing` instead + def downloadPreparing(self, *args, **kwargs): + return self.download_preparing(*args, **kwargs) + + + def download_finished(self, pyfile): + pass + + + #: Deprecated method, use `download_finished` instead + def downloadFinished(self, *args, **kwargs): + return self.download_finished(*args, **kwargs) + + + def download_failed(self, pyfile): + pass + + + #: Deprecated method, use `download_failed` instead + def downloadFailed(self, *args, **kwargs): + return self.download_failed(*args, **kwargs) + + + def package_finished(self, pypack): + pass + + + #: Deprecated method, use `package_finished` instead + def packageFinished(self, *args, **kwargs): + return self.package_finished(*args, **kwargs) + + + def before_reconnect(self, ip): + pass + + + #: Deprecated method, use `before_reconnect` instead + def beforeReconnecting(self, *args, **kwargs): + return self.before_reconnect(*args, **kwargs) + + + def after_reconnect(self, ip, oldip): + pass + + + #: Deprecated method, use `after_reconnect` instead + def afterReconnecting(self, ip): + return self.after_reconnect(ip, None) + + + def captcha_task(self, task): + """ + New captcha task for the plugin, it MUST set the handler and timeout or will be ignored + """ + pass + + + #: Deprecated method, use `captcha_task` instead + def newCaptchaTask(self, *args, **kwargs): + return self.captcha_task(*args, **kwargs) + + + def captcha_correct(self, task): + pass + + + #: Deprecated method, use `captcha_correct` instead + def captchaCorrect(self, *args, **kwargs): + return self.captcha_correct(*args, **kwargs) + + + def captcha_invalid(self, task): + pass + + + #: Deprecated method, use `captcha_invalid` instead + def captchaInvalid(self, *args, **kwargs): + return self.captcha_invalid(*args, **kwargs) -- cgit v1.2.3 From 56389e28ba5d2f5658278bc7f486d73be747f135 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sun, 19 Jul 2015 11:44:49 +0200 Subject: Rename self.core to self.pyload (plugins only) --- module/plugins/internal/Addon.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'module/plugins/internal/Addon.py') diff --git a/module/plugins/internal/Addon.py b/module/plugins/internal/Addon.py index f3da5272f..a6bf685b5 100644 --- a/module/plugins/internal/Addon.py +++ b/module/plugins/internal/Addon.py @@ -36,7 +36,8 @@ class Addon(Plugin): def __init__(self, core, manager): - super(Addon, self).__init__(core) + self.pyload = core + self.info = {} #: Provide information in dict here #: `HookManager` self.manager = manager @@ -78,7 +79,7 @@ class Addon(Plugin): def init_periodical(self, delay=0, threaded=False): - self.cb = self.core.scheduler.addJob(max(0, delay), self._periodical, [threaded], threaded=threaded) + self.cb = self.pyload.scheduler.addJob(max(0, delay), self._periodical, [threaded], threaded=threaded) #: Deprecated method, use `init_periodical` instead @@ -96,10 +97,10 @@ class Addon(Plugin): except Exception, e: self.log_error(_("Error executing addon: %s") % e) - if self.core.debug: + if self.pyload.debug: traceback.print_exc() - self.cb = self.core.scheduler.addJob(self.interval, self._periodical, [threaded], threaded=threaded) + self.cb = self.pyload.scheduler.addJob(self.interval, self._periodical, [threaded], threaded=threaded) def periodical(self): -- cgit v1.2.3 From d38e830b7c0b3c6561a0072c74bbccb5fcdf4a61 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sun, 19 Jul 2015 14:43:42 +0200 Subject: New __status__ magic key --- module/plugins/internal/Addon.py | 1 + 1 file changed, 1 insertion(+) (limited to 'module/plugins/internal/Addon.py') diff --git a/module/plugins/internal/Addon.py b/module/plugins/internal/Addon.py index a6bf685b5..b29aa0936 100644 --- a/module/plugins/internal/Addon.py +++ b/module/plugins/internal/Addon.py @@ -26,6 +26,7 @@ class Addon(Plugin): __name__ = "Addon" __type__ = "hook" #@TODO: Change to `addon` in 0.4.10 __version__ = "0.01" + __status__ = "stable" __config__ = [] #: [("name", "type", "desc", "default")] __threaded__ = [] #@TODO: Remove in 0.4.10 -- cgit v1.2.3 From 94d017cd2a5c1f194960827a8c7e46afc3682008 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Fri, 24 Jul 2015 06:55:49 +0200 Subject: Hotfixes (2) --- module/plugins/internal/Addon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/internal/Addon.py') diff --git a/module/plugins/internal/Addon.py b/module/plugins/internal/Addon.py index b29aa0936..23512d7c4 100644 --- a/module/plugins/internal/Addon.py +++ b/module/plugins/internal/Addon.py @@ -26,7 +26,7 @@ class Addon(Plugin): __name__ = "Addon" __type__ = "hook" #@TODO: Change to `addon` in 0.4.10 __version__ = "0.01" - __status__ = "stable" + __status__ = "testing" __config__ = [] #: [("name", "type", "desc", "default")] __threaded__ = [] #@TODO: Remove in 0.4.10 -- cgit v1.2.3 From 8f17f875f6e28f73ddb10da59c6464bd04922222 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sat, 25 Jul 2015 04:59:27 +0200 Subject: Account rewritten --- module/plugins/internal/Addon.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'module/plugins/internal/Addon.py') diff --git a/module/plugins/internal/Addon.py b/module/plugins/internal/Addon.py index 23512d7c4..16aab6188 100644 --- a/module/plugins/internal/Addon.py +++ b/module/plugins/internal/Addon.py @@ -71,7 +71,7 @@ class Addon(Plugin): self.event_map = None if self.event_list: - self.log_debug("Deprecated method `event_list`, use `event_map` instead") + self.log_debug("Deprecated method `event_list`, use `event_map` instead") (Remove in 0.4.10) for f in self.event_list: self.manager.addEvent(f, getattr(self, f)) @@ -83,7 +83,7 @@ class Addon(Plugin): self.cb = self.pyload.scheduler.addJob(max(0, delay), self._periodical, [threaded], threaded=threaded) - #: Deprecated method, use `init_periodical` instead + #: Deprecated method, use `init_periodical` instead (Remove in 0.4.10) def initPeriodical(self, *args, **kwargs): return self.init_periodical(*args, **kwargs) @@ -119,7 +119,7 @@ class Addon(Plugin): return self.get_config("activated") - #: Deprecated method, use `is_activated` instead + #: Deprecated method, use `is_activated` instead (Remove in 0.4.10) def isActivated(self, *args, **kwargs): return self.is_activated(*args, **kwargs) @@ -131,7 +131,7 @@ class Addon(Plugin): pass - #: Deprecated method, use `deactivate` instead + #: Deprecated method, use `deactivate` instead (Remove in 0.4.10) def unload(self, *args, **kwargs): return self.deactivate(*args, **kwargs) @@ -143,7 +143,7 @@ class Addon(Plugin): pass - #: Deprecated method, use `activate` instead + #: Deprecated method, use `activate` instead (Remove in 0.4.10) def coreReady(self, *args, **kwargs): return self.activate(*args, **kwargs) @@ -155,7 +155,7 @@ class Addon(Plugin): pass - #: Deprecated method, use `exit` instead + #: Deprecated method, use `exit` instead (Remove in 0.4.10) def coreExiting(self, *args, **kwargs): return self.exit(*args, **kwargs) @@ -164,7 +164,7 @@ class Addon(Plugin): pass - #: Deprecated method, use `download_preparing` instead + #: Deprecated method, use `download_preparing` instead (Remove in 0.4.10) def downloadPreparing(self, *args, **kwargs): return self.download_preparing(*args, **kwargs) @@ -173,7 +173,7 @@ class Addon(Plugin): pass - #: Deprecated method, use `download_finished` instead + #: Deprecated method, use `download_finished` instead (Remove in 0.4.10) def downloadFinished(self, *args, **kwargs): return self.download_finished(*args, **kwargs) @@ -182,7 +182,7 @@ class Addon(Plugin): pass - #: Deprecated method, use `download_failed` instead + #: Deprecated method, use `download_failed` instead (Remove in 0.4.10) def downloadFailed(self, *args, **kwargs): return self.download_failed(*args, **kwargs) @@ -191,7 +191,7 @@ class Addon(Plugin): pass - #: Deprecated method, use `package_finished` instead + #: Deprecated method, use `package_finished` instead (Remove in 0.4.10) def packageFinished(self, *args, **kwargs): return self.package_finished(*args, **kwargs) @@ -200,7 +200,7 @@ class Addon(Plugin): pass - #: Deprecated method, use `before_reconnect` instead + #: Deprecated method, use `before_reconnect` instead (Remove in 0.4.10) def beforeReconnecting(self, *args, **kwargs): return self.before_reconnect(*args, **kwargs) @@ -209,7 +209,7 @@ class Addon(Plugin): pass - #: Deprecated method, use `after_reconnect` instead + #: Deprecated method, use `after_reconnect` instead (Remove in 0.4.10) def afterReconnecting(self, ip): return self.after_reconnect(ip, None) @@ -221,7 +221,7 @@ class Addon(Plugin): pass - #: Deprecated method, use `captcha_task` instead + #: Deprecated method, use `captcha_task` instead (Remove in 0.4.10) def newCaptchaTask(self, *args, **kwargs): return self.captcha_task(*args, **kwargs) @@ -230,7 +230,7 @@ class Addon(Plugin): pass - #: Deprecated method, use `captcha_correct` instead + #: Deprecated method, use `captcha_correct` instead (Remove in 0.4.10) def captchaCorrect(self, *args, **kwargs): return self.captcha_correct(*args, **kwargs) @@ -239,6 +239,6 @@ class Addon(Plugin): pass - #: Deprecated method, use `captcha_invalid` instead + #: Deprecated method, use `captcha_invalid` instead (Remove in 0.4.10) def captchaInvalid(self, *args, **kwargs): return self.captcha_invalid(*args, **kwargs) -- cgit v1.2.3 From a95c217627a1cb651b24e69f20640df40797aff9 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sat, 25 Jul 2015 09:34:18 +0200 Subject: Account rewritten (2) --- module/plugins/internal/Addon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/internal/Addon.py') diff --git a/module/plugins/internal/Addon.py b/module/plugins/internal/Addon.py index 16aab6188..248518128 100644 --- a/module/plugins/internal/Addon.py +++ b/module/plugins/internal/Addon.py @@ -71,7 +71,7 @@ class Addon(Plugin): self.event_map = None if self.event_list: - self.log_debug("Deprecated method `event_list`, use `event_map` instead") (Remove in 0.4.10) + self.log_debug("Deprecated method `event_list`, use `event_map` instead") for f in self.event_list: self.manager.addEvent(f, getattr(self, f)) -- cgit v1.2.3 From 952001324e1faf584b1adcb01c4a0406a3722932 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sat, 25 Jul 2015 09:42:49 +0200 Subject: =?UTF-8?q?Don't=20user=20dictionary=E2=80=99s=20iterator=20method?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/plugins/internal/Addon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/internal/Addon.py') diff --git a/module/plugins/internal/Addon.py b/module/plugins/internal/Addon.py index 248518128..3c617f730 100644 --- a/module/plugins/internal/Addon.py +++ b/module/plugins/internal/Addon.py @@ -60,7 +60,7 @@ class Addon(Plugin): def init_events(self): if self.event_map: - for event, funcs in self.event_map.iteritems(): + for event, funcs in self.event_map.items(): if type(funcs) in (list, tuple): for f in funcs: self.manager.addEvent(event, getattr(self, f)) -- cgit v1.2.3 From faf4627b29619730a0c4e32d9c36932d2ba944c9 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Fri, 31 Jul 2015 02:23:39 +0200 Subject: [Addon] Fix unload method not called on exit --- module/plugins/internal/Addon.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'module/plugins/internal/Addon.py') diff --git a/module/plugins/internal/Addon.py b/module/plugins/internal/Addon.py index 3c617f730..ef2932b11 100644 --- a/module/plugins/internal/Addon.py +++ b/module/plugins/internal/Addon.py @@ -25,7 +25,7 @@ def threaded(fn): class Addon(Plugin): __name__ = "Addon" __type__ = "hook" #@TODO: Change to `addon` in 0.4.10 - __version__ = "0.01" + __version__ = "0.02" __status__ = "testing" __config__ = [] #: [("name", "type", "desc", "default")] @@ -157,6 +157,7 @@ class Addon(Plugin): #: Deprecated method, use `exit` instead (Remove in 0.4.10) def coreExiting(self, *args, **kwargs): + self.unload(*args, **kwargs) #@TODO: Fix in 0.4.10 return self.exit(*args, **kwargs) -- cgit v1.2.3 From b0d9532f675854a6a32d22f7b6b7b4cd32683443 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sun, 2 Aug 2015 07:10:51 +0200 Subject: Fix https://github.com/pyload/pyload/issues/1640 --- module/plugins/internal/Addon.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'module/plugins/internal/Addon.py') diff --git a/module/plugins/internal/Addon.py b/module/plugins/internal/Addon.py index ef2932b11..649eccbc1 100644 --- a/module/plugins/internal/Addon.py +++ b/module/plugins/internal/Addon.py @@ -25,7 +25,7 @@ def threaded(fn): class Addon(Plugin): __name__ = "Addon" __type__ = "hook" #@TODO: Change to `addon` in 0.4.10 - __version__ = "0.02" + __version__ = "0.03" __status__ = "testing" __config__ = [] #: [("name", "type", "desc", "default")] @@ -166,8 +166,9 @@ class Addon(Plugin): #: Deprecated method, use `download_preparing` instead (Remove in 0.4.10) - def downloadPreparing(self, *args, **kwargs): - return self.download_preparing(*args, **kwargs) + def downloadPreparing(self, pyfile): + if pyfile.plugin.req is not None: #@TODO: Remove in 0.4.10 + return self.download_preparing(pyfile) def download_finished(self, pyfile): -- cgit v1.2.3 From 84f2193d76f7c6f47c834dc8902d8ead8e45a11a Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sun, 2 Aug 2015 07:44:07 +0200 Subject: Fix https://github.com/pyload/pyload/issues/1640 (2) --- module/plugins/internal/Addon.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'module/plugins/internal/Addon.py') diff --git a/module/plugins/internal/Addon.py b/module/plugins/internal/Addon.py index 649eccbc1..a2d51aa50 100644 --- a/module/plugins/internal/Addon.py +++ b/module/plugins/internal/Addon.py @@ -25,7 +25,7 @@ def threaded(fn): class Addon(Plugin): __name__ = "Addon" __type__ = "hook" #@TODO: Change to `addon` in 0.4.10 - __version__ = "0.03" + __version__ = "0.04" __status__ = "testing" __config__ = [] #: [("name", "type", "desc", "default")] @@ -37,8 +37,7 @@ class Addon(Plugin): def __init__(self, core, manager): - self.pyload = core - self.info = {} #: Provide information in dict here + self._init(core) #: `HookManager` self.manager = manager -- cgit v1.2.3 From 5e15580202c44628f2fbfabad0c3f693975fb3c9 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sun, 2 Aug 2015 17:13:17 +0200 Subject: Fix https://github.com/pyload/pyload/issues/1663 --- module/plugins/internal/Addon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module/plugins/internal/Addon.py') diff --git a/module/plugins/internal/Addon.py b/module/plugins/internal/Addon.py index a2d51aa50..45ca98eac 100644 --- a/module/plugins/internal/Addon.py +++ b/module/plugins/internal/Addon.py @@ -96,7 +96,7 @@ class Addon(Plugin): self.periodical() except Exception, e: - self.log_error(_("Error executing addon: %s") % e) + self.log_error(_("Error executing periodical task: %s") % e) if self.pyload.debug: traceback.print_exc() -- cgit v1.2.3