From ada420db11c99d1b0758bc8ef9b14b25ff0e16e1 Mon Sep 17 00:00:00 2001 From: RaNaN Date: Tue, 24 May 2011 19:48:33 +0200 Subject: RealdebridCom plugin --- module/HookManager.py | 21 +++++++++- module/PluginThread.py | 2 +- module/PyFile.py | 2 +- module/plugins/Plugin.py | 4 +- module/plugins/PluginManager.py | 24 ++++++++++- module/plugins/accounts/RealdebridCom.py | 25 +++++++++++ module/plugins/hooks/HotFolder.py | 2 +- module/plugins/hooks/RealdebridCom.py | 72 ++++++++++++++++++++++++++++++++ module/plugins/hoster/FileserveCom.py | 2 - module/plugins/hoster/RealdebridCom.py | 72 ++++++++++++++++++++++++++++++++ 10 files changed, 217 insertions(+), 9 deletions(-) create mode 100644 module/plugins/accounts/RealdebridCom.py create mode 100644 module/plugins/hooks/RealdebridCom.py create mode 100644 module/plugins/hoster/RealdebridCom.py (limited to 'module') diff --git a/module/HookManager.py b/module/HookManager.py index 1138a4c29..9688d8c60 100644 --- a/module/HookManager.py +++ b/module/HookManager.py @@ -82,6 +82,11 @@ class HookManager: def createIndex(self): plugins = [] + + active = [] + deactive = [] + unloaded = [] + for pluginClass in self.core.pluginManager.getHookPlugins(): try: #hookClass = getattr(plugin, plugin.__name__) @@ -90,12 +95,24 @@ class HookManager: plugin = pluginClass(self.core) plugins.append(plugin) self.pluginMap[pluginClass.__name__] = plugin - self.log.info(_("%(name)s loaded, activated %(value)s") % {"name": pluginClass.__name__, "value": plugin.isActivated() }) + if plugin.isActivated(): + active.append(pluginClass.__name__) + else: + deactive.append(pluginClass.__name__) + + #self.log.info(_("%(name)s loaded, activated %(value)s") % {"name": pluginClass.__name__, "value": plugin.isActivated() }) + else: + #never reached, see plugin manager + unloaded.append(pluginClass.__name__) except: self.log.warning(_("Failed activating %(name)s") % {"name":pluginClass.__name__}) if self.core.debug: traceback.print_exc() + self.log.info(_("Activated plugins: %s") % ", ".join(active)) + self.log.info(_("Deactivate plugins: %s") % ", ".join(deactive)) + #self.log.info(_("Not loaded plugins: %s") % ", ".join(unloaded)) + self.plugins = plugins @@ -112,7 +129,7 @@ class HookManager: self.core.scheduler.addJob(plugin.interval, wrapPeriodical, args=[plugin], threaded=False) for plugin in self.plugins: - if plugin.isActivated(): + if plugin.isActivated() and plugin.interval >= 1: self.core.scheduler.addJob(0, wrapPeriodical, args=[plugin], threaded=False) diff --git a/module/PluginThread.py b/module/PluginThread.py index 3a6483f95..7f967f989 100644 --- a/module/PluginThread.py +++ b/module/PluginThread.py @@ -433,7 +433,7 @@ class InfoThread(PluginThread): plugins[plugin] = [url] for pluginname, urls in plugins.iteritems(): - plugin = self.m.core.pluginManager.getPlugin(pluginname) + plugin = self.m.core.pluginManager.getPlugin(pluginname, True) if hasattr(plugin, "getInfo"): try: self.m.core.log.debug("Run Info Fetching for %s" % pluginname) diff --git a/module/PyFile.py b/module/PyFile.py index 931975305..0b5dc48be 100644 --- a/module/PyFile.py +++ b/module/PyFile.py @@ -89,7 +89,7 @@ class PyFile(object): """ inits plugin instance """ if not self.plugin: self.pluginmodule = self.m.core.pluginManager.getPlugin(self.pluginname) - self.pluginclass = getattr(self.pluginmodule, self.pluginname) + self.pluginclass = getattr(self.pluginmodule, self.m.core.pluginManager.getPluginName(self.pluginname)) self.plugin = self.pluginclass(self) diff --git a/module/plugins/Plugin.py b/module/plugins/Plugin.py index dcf141dd4..c2e1c3044 100644 --- a/module/plugins/Plugin.py +++ b/module/plugins/Plugin.py @@ -436,7 +436,9 @@ class Plugin(object): def getPassword(self): - return self.pyfile.package().password + password = self.pyfile.package().password + if not password: return "" + return password def checkForSameFiles(self): diff --git a/module/plugins/PluginManager.py b/module/plugins/PluginManager.py index 0ca060152..9f59cb1de 100644 --- a/module/plugins/PluginManager.py +++ b/module/plugins/PluginManager.py @@ -213,7 +213,7 @@ class PluginManager(): return res - def getPlugin(self, name): + def getPlugin(self, name, original=False): """return plugin module from hoster|decrypter|container""" plugin = None @@ -224,6 +224,9 @@ class PluginManager(): if self.hosterPlugins.has_key(name): plugin = self.hosterPlugins[name] + if plugin.has_key("new_module") and not original: + return plugin["new_module"] + if plugin.has_key("module"): return plugin["module"] @@ -231,6 +234,22 @@ class PluginManager(): return plugin["module"] + def getPluginName(self, name): + """ used to obtain new name if other plugin was injected""" + plugin = None + if self.containerPlugins.has_key(name): + plugin = self.containerPlugins[name] + if self.crypterPlugins.has_key(name): + plugin = self.crypterPlugins[name] + if self.hosterPlugins.has_key(name): + plugin = self.hosterPlugins[name] + + if plugin.has_key("new_name"): + return plugin["new_name"] + + return plugin["name"] + + def getCaptchaPlugin(self, name): """return captcha modul if existent""" @@ -285,6 +304,9 @@ class PluginManager(): if not self.core.config.getPlugin(name, "load"): continue except: + if self.core.debug: + print_exc() + self.log.debug("Failed to load %s" % name) continue diff --git a/module/plugins/accounts/RealdebridCom.py b/module/plugins/accounts/RealdebridCom.py new file mode 100644 index 000000000..3137987a9 --- /dev/null +++ b/module/plugins/accounts/RealdebridCom.py @@ -0,0 +1,25 @@ +from module.plugins.Account import Account +import xml.dom.minidom as dom + +class RealdebridCom(Account): + __name__ = "RealdebridCom" + __version__ = "0.4" + __type__ = "account" + __description__ = """Real-Debrid.com account plugin""" + __author_name__ = ("Devirex, Hazzard") + __author_mail__ = ("naibaf_11@yahoo.de") + + def loadAccountInfo(self, user, req): + page = req.load("http://real-debrid.com/api/account.php") + xml = dom.parseString(page) + account_info = {"validuntil": int(xml.getElementsByTagName("expiration")[0].childNodes[0].nodeValue), + "trafficleft": -1} + + return account_info + + def login(self, user, data, req): + page = req.load("https://real-debrid.com/ajax/login.php?user=%s&pass=%s" % (user, data["password"])) + #page = req.load("https://real-debrid.com/login.html", post={"user": user, "pass": data["password"]}, cookies=True) + + if "Your login informations are incorrect" in page: + self.wrongPassword() diff --git a/module/plugins/hooks/HotFolder.py b/module/plugins/hooks/HotFolder.py index e652179ce..1e320b87c 100644 --- a/module/plugins/hooks/HotFolder.py +++ b/module/plugins/hooks/HotFolder.py @@ -73,7 +73,7 @@ class HotFolder(Hook): for f in listdir(self.getConfig("folder")): path = join(self.getConfig("folder"), f) - if not isfile(path) or f.endswith("~") or f.startswith("#"): + if not isfile(path) or f.endswith("~") or f.startswith("#") or f.startswith("."): continue newpath = join(self.getConfig("folder"), "finished", f if self.getConfig("keep") else "tmp_"+f) diff --git a/module/plugins/hooks/RealdebridCom.py b/module/plugins/hooks/RealdebridCom.py new file mode 100644 index 000000000..e42ab42af --- /dev/null +++ b/module/plugins/hooks/RealdebridCom.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +import re + +from module.network.RequestFactory import getURL +from module.plugins.Hook import Hook + +from module.utils import removeChars + +class RealdebridCom(Hook): + __name__ = "RealdebridCom" + __version__ = "0.4" + __type__ = "hook" + + __config__ = [("activated", "bool", "Activated", "False"), + ("https", "bool", "Enable HTTPS", "False")] + + __description__ = """Real-Debrid.com hook plugin""" + __author_name__ = ("Devirex, Hazzard") + __author_mail__ = ("naibaf_11@yahoo.de") + + interval = 0 + hosters = [] + + replacements = [("freakshare.net", "freakshare.com")] + + def getHostersCached(self): + if not self.hosters: + https = "https" if self.getConfig("https") else "http" + page = getURL(https + "://real-debrid.com/api/hosters.php") + + self.hosters = [x.strip() for x in page.replace("\"", "").split(",")] + + for rep in self.replacements: + if rep[0] in self.hosters: + self.hosters.remove(rep[0]) + self.hosters.append(rep[1]) + + return self.hosters + + def coreReady(self): + pluginMap = {} + for name in self.core.pluginManager.hosterPlugins.keys(): + pluginMap[name.lower()] = name + + supported = [] + new_supported = [] + + for hoster in self.getHostersCached(): + name = removeChars(hoster.lower(), "-.") + + if pluginMap.has_key(name): + supported.append(pluginMap[name]) + else: + new_supported.append(hoster) + + module = self.core.pluginManager.getPlugin("RealdebridCom") + klass = getattr(module, "RealdebridCom") + #inject real debrid plugin + self.core.log.debug("Real-Debrid: Supported Hosters: %s" % ", ".join(sorted(supported))) + for hoster in supported: + dict = self.core.pluginManager.hosterPlugins[hoster] + dict["new_module"] = module + dict["new_name"] = "RealdebridCom" + + self.core.log.debug("Real-Debrid: New Hosters: %s" % ", ".join(sorted(new_supported))) + + #create new regexp + regexp = r".*(%s).*" % "|".join([klass.__pattern__] + [x.replace(".", "\\.") for x in new_supported]) + + dict = self.core.pluginManager.hosterPlugins["RealdebridCom"] + dict["pattern"] = regexp + dict["re"] = re.compile(regexp) diff --git a/module/plugins/hoster/FileserveCom.py b/module/plugins/hoster/FileserveCom.py index 0ab97a4c7..075d48eaf 100644 --- a/module/plugins/hoster/FileserveCom.py +++ b/module/plugins/hoster/FileserveCom.py @@ -3,8 +3,6 @@ from __future__ import with_statement import re -from os import remove - from module.plugins.Hoster import Hoster from module.plugins.ReCaptcha import ReCaptcha diff --git a/module/plugins/hoster/RealdebridCom.py b/module/plugins/hoster/RealdebridCom.py new file mode 100644 index 000000000..dc5b9098b --- /dev/null +++ b/module/plugins/hoster/RealdebridCom.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import re +from urllib import quote, unquote +from module.plugins.Hoster import Hoster + +class RealdebridCom(Hoster): + __name__ = "RealdebridCom" + __version__ = "0.4" + __type__ = "hoster" + + __pattern__ = r"https?://.*real-debrid\..*" + __description__ = """Real-Debrid.com hoster plugin""" + __author_name__ = ("Devirex, Hazzard") + __author_mail__ = ("naibaf_11@yahoo.de") + + def getFilename(self, url): + return unquote(url.rsplit("/", 1)[1]) + + def setup(self): + self.chunkLimit = 3 + self.resumeDownload = True + + def process(self, pyfile): + if not self.account: + self.log.error(_("Please enter your Real-debrid account")) + self.fail("No Real-debrid account provided") + + self.log.debug("Real-Debrid: Old URL: %s" % pyfile.url) + if re.match(self.__pattern__, pyfile.url): + new_url = pyfile.url + else: + password = self.getPassword().splitlines() + if not password: password = "" + else: password = password[0] + + url = "http://real-debrid.com/ajax/deb.php?lang=en&sl=1&link=%s&passwort=%s" % (quote(pyfile.url, ""), password) + page = self.load(url) + + error = re.search(r'(.*)', page) + + if error: + msg = error.group(1).strip() + self.log.debug(page) + if msg == "Your file is unavailable on the hoster.": + self.offline() + else: + self.fail(msg) + else: + new_url = page + + if self.getConfig("https"): + new_url = new_url.replace("http://", "https://") + else: + new_url = new_url.replace("https://", "http://") + + self.log.debug("Real-Debrid: New URL: %s" % new_url) + + try: + pyfile.name = self.getFilename(new_url) + except IndexError: + pyfile.name = "Unknown_Filename.ext" + + self.download(new_url, disposition=True) + + check = self.checkDownload( + {"error": "An error occured while processing your request"}) + + if check == "error": + self.fail("Error occured.") + -- cgit v1.2.3