diff options
Diffstat (limited to 'pyload/plugin/hook')
33 files changed, 1896 insertions, 0 deletions
| diff --git a/pyload/plugin/hook/AlldebridCom.py b/pyload/plugin/hook/AlldebridCom.py new file mode 100644 index 000000000..141f86779 --- /dev/null +++ b/pyload/plugin/hook/AlldebridCom.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +from pyload.plugin.internal.MultiHook import MultiHook + + +class AlldebridCom(MultiHook): +    __name    = "AlldebridCom" +    __type    = "hook" +    __version = "0.16" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   ), +                  ("ssl"           , "bool"               , "Use HTTPS"                           , True )] + +    __description = """Alldebrid.com hook plugin""" +    __license     = "GPLv3" +    __authors     = [("Andy Voigt", "spamsales@online.de")] + + +    def getHosters(self): +        https = "https" if self.getConfig('ssl') else "http" +        html = self.getURL(https + "://www.alldebrid.com/api.php", get={'action': "get_host"}).replace("\"", "").strip() + +        return [x.strip() for x in html.split(",") if x.strip()] diff --git a/pyload/plugin/hook/BypassCaptcha.py b/pyload/plugin/hook/BypassCaptcha.py new file mode 100644 index 000000000..8e8a27d8c --- /dev/null +++ b/pyload/plugin/hook/BypassCaptcha.py @@ -0,0 +1,135 @@ +# -*- coding: utf-8 -*- + +import pycurl + +from pyload.network.HTTPRequest import BadHeader +from pyload.network.RequestFactory import getURL, getRequest +from pyload.plugin.Hook import Hook, threaded + + +class BypassCaptchaException(Exception): + +    def __init__(self, err): +        self.err = err + + +    def getCode(self): +        return self.err + + +    def __str__(self): +        return "<BypassCaptchaException %s>" % self.err + + +    def __repr__(self): +        return "<BypassCaptchaException %s>" % self.err + + +class BypassCaptcha(Hook): +    __name    = "BypassCaptcha" +    __type    = "hook" +    __version = "0.06" + +    __config = [("force", "bool", "Force BC even if client is connected", False), +                ("passkey", "password", "Passkey", "")] + +    __description = """Send captchas to BypassCaptcha.com""" +    __license     = "GPLv3" +    __authors     = [("RaNaN"     , "RaNaN@pyload.org"), +                     ("Godofdream", "soilfcition@gmail.com"), +                     ("zoidberg"  , "zoidberg@mujmail.cz")] + + +    PYLOAD_KEY = "4f771155b640970d5607f919a615bdefc67e7d32" + +    SUBMIT_URL = "http://bypasscaptcha.com/upload.php" +    RESPOND_URL = "http://bypasscaptcha.com/check_value.php" +    GETCREDITS_URL = "http://bypasscaptcha.com/ex_left.php" + + +    def getCredits(self): +        res = getURL(self.GETCREDITS_URL, post={"key": self.getConfig('passkey')}) + +        data = dict(x.split(' ', 1) for x in res.splitlines()) +        return int(data['Left']) + + +    def submit(self, captcha, captchaType="file", match=None): +        req = getRequest() + +        # raise timeout threshold +        req.c.setopt(pycurl.LOW_SPEED_TIME, 80) + +        try: +            res = req.load(self.SUBMIT_URL, +                           post={'vendor_key': self.PYLOAD_KEY, +                                 'key': self.getConfig('passkey'), +                                 'gen_task_id': "1", +                                 'file': (pycurl.FORM_FILE, captcha)}, +                           multipart=True) +        finally: +            req.close() + +        data = dict(x.split(' ', 1) for x in res.splitlines()) +        if not data or "Value" not in data: +            raise BypassCaptchaException(res) + +        result = data['Value'] +        ticket = data['TaskId'] +        self.logDebug("Result %s : %s" % (ticket, result)) + +        return ticket, result + + +    def respond(self, ticket, success): +        try: +            res = getURL(self.RESPOND_URL, post={"task_id": ticket, "key": self.getConfig('passkey'), +                                                 "cv": 1 if success else 0}) +        except BadHeader, e: +            self.logError(_("Could not send response"), e) + + +    def captchaTask(self, task): +        if "service" in task.data: +            return False + +        if not task.isTextual(): +            return False + +        if not self.getConfig('passkey'): +            return False + +        if self.core.isClientConnected() and not self.getConfig('force'): +            return False + +        if self.getCredits() > 0: +            task.handler.append(self) +            task.data['service'] = self.getClassName() +            task.setWaiting(100) +            self._processCaptcha(task) + +        else: +            self.logInfo(_("Your %s account has not enough credits") % self.getClassName()) + + +    def captchaCorrect(self, task): +        if task.data['service'] == self.getClassName() and "ticket" in task.data: +            self.respond(task.data['ticket'], True) + + +    def captchaInvalid(self, task): +        if task.data['service'] == self.getClassName() and "ticket" in task.data: +            self.respond(task.data['ticket'], False) + + +    @threaded +    def _processCaptcha(self, task): +        c = task.captchaFile +        try: +            ticket, result = self.submit(c) +        except BypassCaptchaException, e: +            task.error = e.getCode() +            return + +        task.data['ticket'] = ticket +        task.setResult(result) diff --git a/pyload/plugin/hook/Captcha9Kw.py b/pyload/plugin/hook/Captcha9Kw.py new file mode 100644 index 000000000..9ceab4b2b --- /dev/null +++ b/pyload/plugin/hook/Captcha9Kw.py @@ -0,0 +1,251 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +import re +import time + +from base64 import b64encode + +from pyload.network.HTTPRequest import BadHeader +from pyload.network.RequestFactory import getURL + +from pyload.plugin.Hook import Hook, threaded + + +class Captcha9Kw(Hook): +    __name    = "Captcha9Kw" +    __type    = "hook" +    __version = "0.28" + +    __config = [("ssl"           , "bool"    , "Use HTTPS"                                                                       , True), +                ("force"         , "bool"    , "Force captcha resolving even if client is connected"                             , True), +                ("confirm"       , "bool"    , "Confirm Captcha (cost +6 credits)"                                               , False), +                ("captchaperhour", "int"     , "Captcha per hour"                                                                , "9999"), +                ("captchapermin" , "int"     , "Captcha per minute"                                                              , "9999"), +                ("prio"          , "int"     , "Priority (max 10)(cost +0 -> +10 credits)"                                       , "0"), +                ("queue"         , "int"     , "Max. Queue (max 999)"                                                            , "50"), +                ("hoster_options", "string"  , "Hoster options (format: pluginname:prio=1:selfsolfe=1:confirm=1:timeout=900|...)", "ShareonlineBiz:prio=0:timeout=999 | UploadedTo:prio=0:timeout=999"), +                ("selfsolve"     , "bool"    , "Selfsolve (manually solve your captcha in your 9kw client if active)"            , "0"), +                ("passkey"       , "password", "API key"                                                                         , ""), +                ("timeout"       , "int"     , "Timeout in seconds (min 60, max 3999)"                                           , "900")] + +    __description = """Send captchas to 9kw.eu""" +    __license     = "GPLv3" +    __authors     = [("RaNaN"         , "RaNaN@pyload.org"), +                     ("Walter Purcaro", "vuolter@gmail.com")] + + +    API_URL = "http://www.9kw.eu/index.cgi" + + +    def activate(self): +        if self.getConfig('ssl'): +            self.API_URL = self.API_URL.replace("http://", "https://") + + +    def getCredits(self): +        res = getURL(self.API_URL, +                     get={'apikey': self.getConfig('passkey'), +                          'pyload': "1", +                          'source': "pyload", +                          'action': "usercaptchaguthaben"}) + +        if res.isdigit(): +            self.logInfo(_("%s credits left") % res) +            credits = self.info['credits'] = int(res) +            return credits +        else: +            self.logError(res) +            return 0 + + +    @threaded +    def _processCaptcha(self, task): +        try: +            with open(task.captchaFile, 'rb') as f: +                data = f.read() + +        except IOError, e: +            self.logError(e) +            return + +        pluginname = re.search(r'_([^_]*)_\d+.\w+', task.captchaFile).group(1) +        option     = {'min'           : 2, +                      'max'           : 50, +                      'phrase'        : 0, +                      'numeric'       : 0, +                      'case_sensitive': 0, +                      'math'          : 0, +                      'prio'          : min(max(self.getConfig('prio'), 0), 10), +                      'confirm'       : self.getConfig('confirm'), +                      'timeout'       : min(max(self.getConfig('timeout'), 300), 3999), +                      'selfsolve'     : self.getConfig('selfsolve'), +                      'cph'           : self.getConfig('captchaperhour'), +                      'cpm'           : self.getConfig('captchapermin')} + +        for opt in str(self.getConfig('hoster_options').split('|')): + +            details = map(str.strip, opt.split(':')) + +            if not details or details[0].lower() != pluginname.lower(): +                continue + +            for d in details: +                hosteroption = d.split("=") + +                if len(hosteroption) < 2 or not hosteroption[1].isdigit(): +                    continue + +                o = hosteroption[0].lower() +                if o in option: +                    option[o] = hosteroption[1] + +            break + +        post_data = {'apikey'        : self.getConfig('passkey'), +                     'prio'          : option['prio'], +                     'confirm'       : option['confirm'], +                     'maxtimeout'    : option['timeout'], +                     'selfsolve'     : option['selfsolve'], +                     'captchaperhour': option['cph'], +                     'captchapermin' : option['cpm'], +                     'case-sensitive': option['case_sensitive'], +                     'min_len'       : option['min'], +                     'max_len'       : option['max'], +                     'phrase'        : option['phrase'], +                     'numeric'       : option['numeric'], +                     'math'          : option['math'], +                     'oldsource'     : pluginname, +                     'pyload'        : "1", +                     'source'        : "pyload", +                     'base64'        : "1", +                     'mouse'         : 1 if task.isPositional() else 0, +                     'file-upload-01': b64encode(data), +                     'action'        : "usercaptchaupload"} + +        for _i in xrange(5): +            try: +                res = getURL(self.API_URL, post=post_data) +            except BadHeader, e: +                time.sleep(3) +            else: +                if res and res.isdigit(): +                    break +        else: +            self.logError(_("Bad upload: %s") % res) +            return + +        self.logDebug(_("NewCaptchaID ticket: %s") % res, task.captchaFile) + +        task.data['ticket'] = res + +        for _i in xrange(int(self.getConfig('timeout') / 5)): +            result = getURL(self.API_URL, +                            get={'apikey': self.getConfig('passkey'), +                                 'id'    : res, +                                 'pyload': "1", +                                 'info'  : "1", +                                 'source': "pyload", +                                 'action': "usercaptchacorrectdata"}) + +            if not result or result == "NO DATA": +                time.sleep(5) +            else: +                break +        else: +            self.logDebug("Could not send request: %s" % res) +            result = None + +        self.logInfo(_("Captcha result for ticket %s: %s") % (res, result)) + +        task.setResult(result) + + +    def captchaTask(self, task): +        if not task.isTextual() and not task.isPositional(): +            return + +        if not self.getConfig('passkey'): +            return + +        if self.core.isClientConnected() and not self.getConfig('force'): +            return + +        credits = self.getCredits() + +        if not credits: +            self.logError(_("Your captcha 9kw.eu account has not enough credits")) +            return + +        queue = min(self.getConfig('queue'), 999) +        timeout = min(max(self.getConfig('timeout'), 300), 3999) +        pluginname = re.search(r'_([^_]*)_\d+.\w+', task.captchaFile).group(1) + +        for _i in xrange(5): +            servercheck = getURL("http://www.9kw.eu/grafik/servercheck.txt") +            if queue < re.search(r'queue=(\d+)', servercheck).group(1): +                break + +            time.sleep(10) +        else: +            self.fail(_("Too many captchas in queue")) + +        for opt in str(self.getConfig('hoster_options').split('|')): +            details = map(str.strip, opt.split(':')) + +            if not details or details[0].lower() != pluginname.lower(): +                continue + +            for d in details: +                hosteroption = d.split("=") + +                if len(hosteroption) > 1 \ +                   and hosteroption[0].lower() == 'timeout' \ +                   and hosteroption[1].isdigit(): +                    timeout = int(hosteroption[1]) + +            break + +        task.handler.append(self) + +        task.setWaiting(timeout) + +        self._processCaptcha(task) + + +    def _captchaResponse(self, task, correct): +        type = "correct" if correct else "refund" + +        if 'ticket' not in task.data: +            self.logDebug("No CaptchaID for %s request (task: %s)" % (type, task)) +            return + +        passkey = self.getConfig('passkey') + +        for _i in xrange(3): +            res = getURL(self.API_URL, +                         get={'action' : "usercaptchacorrectback", +                              'apikey' : passkey, +                              'api_key': passkey, +                              'correct': "1" if correct else "2", +                              'pyload' : "1", +                              'source' : "pyload", +                              'id'     : task.data['ticket']}) + +            self.logDebug("Request %s: %s" % (type, res)) + +            if res == "OK": +                break + +            time.sleep(5) +        else: +            self.logDebug("Could not send %s request: %s" % (type, res)) + + +    def captchaCorrect(self, task): +        self._captchaResponse(task, True) + + +    def captchaInvalid(self, task): +        self._captchaResponse(task, False) diff --git a/pyload/plugin/hook/CaptchaBrotherhood.py b/pyload/plugin/hook/CaptchaBrotherhood.py new file mode 100644 index 000000000..75c7d55b7 --- /dev/null +++ b/pyload/plugin/hook/CaptchaBrotherhood.py @@ -0,0 +1,171 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +import StringIO +import pycurl +import time +import urllib + +try: +    from PIL import Image +except ImportError: +    import Image + +from pyload.network.RequestFactory import getURL, getRequest +from pyload.plugin.Hook import Hook, threaded + + +class CaptchaBrotherhoodException(Exception): + +    def __init__(self, err): +        self.err = err + + +    def getCode(self): +        return self.err + + +    def __str__(self): +        return "<CaptchaBrotherhoodException %s>" % self.err + + +    def __repr__(self): +        return "<CaptchaBrotherhoodException %s>" % self.err + + +class CaptchaBrotherhood(Hook): +    __name    = "CaptchaBrotherhood" +    __type    = "hook" +    __version = "0.08" + +    __config = [("username", "str", "Username", ""), +                ("force", "bool", "Force CT even if client is connected", False), +                ("passkey", "password", "Password", "")] + +    __description = """Send captchas to CaptchaBrotherhood.com""" +    __license     = "GPLv3" +    __authors     = [("RaNaN"   , "RaNaN@pyload.org"), +                     ("zoidberg", "zoidberg@mujmail.cz")] + + +    API_URL = "http://www.captchabrotherhood.com/" + + +    def activate(self): +        if self.getConfig('ssl'): +            self.API_URL = self.API_URL.replace("http://", "https://") + + +    def getCredits(self): +        res = getURL(self.API_URL + "askCredits.aspx", +                     get={"username": self.getConfig('username'), "password": self.getConfig('passkey')}) +        if not res.startswith("OK"): +            raise CaptchaBrotherhoodException(res) +        else: +            credits = int(res[3:]) +            self.logInfo(_("%d credits left") % credits) +            self.info['credits'] = credits +            return credits + + +    def submit(self, captcha, captchaType="file", match=None): +        try: +            img = Image.open(captcha) +            output = StringIO.StringIO() +            self.logDebug("CAPTCHA IMAGE", img, img.format, img.mode) +            if img.format in ("GIF", "JPEG"): +                img.save(output, img.format) +            else: +                if img.mode != "RGB": +                    img = img.convert("RGB") +                img.save(output, "JPEG") +            data = output.getvalue() +            output.close() +        except Exception, e: +            raise CaptchaBrotherhoodException("Reading or converting captcha image failed: %s" % e) + +        req = getRequest() + +        url = "%ssendNewCaptcha.aspx?%s" % (self.API_URL, +                                            urllib.urlencode({'username'     : self.getConfig('username'), +                                                              'password'     : self.getConfig('passkey'), +                                                              'captchaSource': "pyLoad", +                                                              'timeout'      : "80"})) + +        req.c.setopt(pycurl.URL, url) +        req.c.setopt(pycurl.POST, 1) +        req.c.setopt(pycurl.POSTFIELDS, data) +        req.c.setopt(pycurl.HTTPHEADER, ["Content-Type: text/html"]) + +        try: +            req.c.perform() +            res = req.getResponse() +        except Exception, e: +            raise CaptchaBrotherhoodException("Submit captcha image failed") + +        req.close() + +        if not res.startswith("OK"): +            raise CaptchaBrotherhoodException(res[1]) + +        ticket = res[3:] + +        for _i in xrange(15): +            time.sleep(5) +            res = self.api_response("askCaptchaResult", ticket) +            if res.startswith("OK-answered"): +                return ticket, res[12:] + +        raise CaptchaBrotherhoodException("No solution received in time") + + +    def api_response(self, api, ticket): +        res = getURL("%s%s.aspx" % (self.API_URL, api), +                     get={"username": self.getConfig('username'), +                          "password": self.getConfig('passkey'), +                          "captchaID": ticket}) +        if not res.startswith("OK"): +            raise CaptchaBrotherhoodException("Unknown response: %s" % res) + +        return res + + +    def captchaTask(self, task): +        if "service" in task.data: +            return False + +        if not task.isTextual(): +            return False + +        if not self.getConfig('username') or not self.getConfig('passkey'): +            return False + +        if self.core.isClientConnected() and not self.getConfig('force'): +            return False + +        if self.getCredits() > 10: +            task.handler.append(self) +            task.data['service'] = self.getClassName() +            task.setWaiting(100) +            self._processCaptcha(task) +        else: +            self.logInfo(_("Your CaptchaBrotherhood Account has not enough credits")) + + +    def captchaInvalid(self, task): +        if task.data['service'] == self.getClassName() and "ticket" in task.data: +            res = self.api_response("complainCaptcha", task.data['ticket']) + + +    @threaded +    def _processCaptcha(self, task): +        c = task.captchaFile +        try: +            ticket, result = self.submit(c) +        except CaptchaBrotherhoodException, e: +            task.error = e.getCode() +            return + +        task.data['ticket'] = ticket +        task.setResult(result) diff --git a/pyload/plugin/hook/DeathByCaptcha.py b/pyload/plugin/hook/DeathByCaptcha.py new file mode 100644 index 000000000..670807bf5 --- /dev/null +++ b/pyload/plugin/hook/DeathByCaptcha.py @@ -0,0 +1,219 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +import pycurl +import re +import time + +from base64 import b64encode + +from pyload.utils import json_loads +from pyload.network.HTTPRequest import BadHeader +from pyload.network.RequestFactory import getRequest +from pyload.plugin.Hook import Hook, threaded + + +class DeathByCaptchaException(Exception): +    DBC_ERRORS = {'not-logged-in': 'Access denied, check your credentials', +                  'invalid-credentials': 'Access denied, check your credentials', +                  'banned': 'Access denied, account is suspended', +                  'insufficient-funds': 'Insufficient account balance to decrypt CAPTCHA', +                  'invalid-captcha': 'CAPTCHA is not a valid image', +                  'service-overload': 'CAPTCHA was rejected due to service overload, try again later', +                  'invalid-request': 'Invalid request', +                  'timed-out': 'No CAPTCHA solution received in time'} + + +    def __init__(self, err): +        self.err = err + + +    def getCode(self): +        return self.err + + +    def getDesc(self): +        if self.err in self.DBC_ERRORS.keys(): +            return self.DBC_ERRORS[self.err] +        else: +            return self.err + + +    def __str__(self): +        return "<DeathByCaptchaException %s>" % self.err + + +    def __repr__(self): +        return "<DeathByCaptchaException %s>" % self.err + + +class DeathByCaptcha(Hook): +    __name    = "DeathByCaptcha" +    __type    = "hook" +    __version = "0.06" + +    __config = [("username", "str", "Username", ""), +                ("passkey", "password", "Password", ""), +                ("force", "bool", "Force DBC even if client is connected", False)] + +    __description = """Send captchas to DeathByCaptcha.com""" +    __license     = "GPLv3" +    __authors     = [("RaNaN"   , "RaNaN@pyload.org"), +                     ("zoidberg", "zoidberg@mujmail.cz")] + + +    API_URL = "http://api.dbcapi.me/api/" + + +    def activate(self): +        if self.getConfig('ssl'): +            self.API_URL = self.API_URL.replace("http://", "https://") + + +    def api_response(self, api="captcha", post=False, multipart=False): +        req = getRequest() +        req.c.setopt(pycurl.HTTPHEADER, ["Accept: application/json", "User-Agent: pyLoad %s" % self.core.version]) + +        if post: +            if not isinstance(post, dict): +                post = {} +            post.update({"username": self.getConfig('username'), +                         "password": self.getConfig('passkey')}) + +        res = None +        try: +            json = req.load("%s%s" % (self.API_URL, api), +                            post=post, +                            multipart=multipart) +            self.logDebug(json) +            res = json_loads(json) + +            if "error" in res: +                raise DeathByCaptchaException(res['error']) +            elif "status" not in res: +                raise DeathByCaptchaException(str(res)) + +        except BadHeader, e: +            if 403 == e.code: +                raise DeathByCaptchaException('not-logged-in') +            elif 413 == e.code: +                raise DeathByCaptchaException('invalid-captcha') +            elif 503 == e.code: +                raise DeathByCaptchaException('service-overload') +            elif e.code in (400, 405): +                raise DeathByCaptchaException('invalid-request') +            else: +                raise + +        finally: +            req.close() + +        return res + + +    def getCredits(self): +        res = self.api_response("user", True) + +        if 'is_banned' in res and res['is_banned']: +            raise DeathByCaptchaException('banned') +        elif 'balance' in res and 'rate' in res: +            self.info.update(res) +        else: +            raise DeathByCaptchaException(res) + + +    def getStatus(self): +        res = self.api_response("status", False) + +        if 'is_service_overloaded' in res and res['is_service_overloaded']: +            raise DeathByCaptchaException('service-overload') + + +    def submit(self, captcha, captchaType="file", match=None): +        #@NOTE: Workaround multipart-post bug in HTTPRequest.py +        if re.match("^\w*$", self.getConfig('passkey')): +            multipart = True +            data = (pycurl.FORM_FILE, captcha) +        else: +            multipart = False +            with open(captcha, 'rb') as f: +                data = f.read() +            data = "base64:" + b64encode(data) + +        res = self.api_response("captcha", {"captchafile": data}, multipart) + +        if "captcha" not in res: +            raise DeathByCaptchaException(res) +        ticket = res['captcha'] + +        for _i in xrange(24): +            time.sleep(5) +            res = self.api_response("captcha/%d" % ticket, False) +            if res['text'] and res['is_correct']: +                break +        else: +            raise DeathByCaptchaException('timed-out') + +        result = res['text'] +        self.logDebug("Result %s : %s" % (ticket, result)) + +        return ticket, result + + +    def captchaTask(self, task): +        if "service" in task.data: +            return False + +        if not task.isTextual(): +            return False + +        if not self.getConfig('username') or not self.getConfig('passkey'): +            return False + +        if self.core.isClientConnected() and not self.getConfig('force'): +            return False + +        try: +            self.getStatus() +            self.getCredits() +        except DeathByCaptchaException, e: +            self.logError(e.getDesc()) +            return False + +        balance, rate = self.info['balance'], self.info['rate'] +        self.logInfo(_("Account balance"), +                     _("US$%.3f (%d captchas left at %.2f cents each)") % (balance / 100, +                                                                           balance // rate, rate)) + +        if balance > rate: +            task.handler.append(self) +            task.data['service'] = self.getClassName() +            task.setWaiting(180) +            self._processCaptcha(task) + + +    def captchaInvalid(self, task): +        if task.data['service'] == self.getClassName() and "ticket" in task.data: +            try: +                res = self.api_response("captcha/%d/report" % task.data['ticket'], True) + +            except DeathByCaptchaException, e: +                self.logError(e.getDesc()) + +            except Exception, e: +                self.logError(e) + + +    @threaded +    def _processCaptcha(self, task): +        c = task.captchaFile +        try: +            ticket, result = self.submit(c) +        except DeathByCaptchaException, e: +            task.error = e.getCode() +            self.logError(e.getDesc()) +            return + +        task.data['ticket'] = ticket +        task.setResult(result) diff --git a/pyload/plugin/hook/DebridItaliaCom.py b/pyload/plugin/hook/DebridItaliaCom.py new file mode 100644 index 000000000..e15f7d6ec --- /dev/null +++ b/pyload/plugin/hook/DebridItaliaCom.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugin.internal.MultiHook import MultiHook + + +class DebridItaliaCom(MultiHook): +    __name    = "DebridItaliaCom" +    __type    = "hook" +    __version = "0.12" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """Debriditalia.com hook plugin""" +    __license     = "GPLv3" +    __authors     = [("stickell"      , "l.stickell@yahoo.it"), +                       ("Walter Purcaro", "vuolter@gmail.com"  )] + + +    def getHosters(self): +        return self.getURL("http://debriditalia.com/api.php", get={'hosts': ""}).replace('"', '').split(',') diff --git a/pyload/plugin/hook/EasybytezCom.py b/pyload/plugin/hook/EasybytezCom.py new file mode 100644 index 000000000..68b4d96d2 --- /dev/null +++ b/pyload/plugin/hook/EasybytezCom.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugin.internal.MultiHook import MultiHook + + +class EasybytezCom(MultiHook): +    __name    = "EasybytezCom" +    __type    = "hook" +    __version = "0.07" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """EasyBytez.com hook plugin""" +    __license     = "GPLv3" +    __authors     = [("zoidberg", "zoidberg@mujmail.cz")] + + +    def getHosters(self): +        user, data = self.account.selectAccount() + +        req  = self.account.getAccountRequest(user) +        html = req.load("http://www.easybytez.com") + +        return re.search(r'</textarea>\s*Supported sites:(.*)', html).group(1).split(',') diff --git a/pyload/plugin/hook/ExpertDecoders.py b/pyload/plugin/hook/ExpertDecoders.py new file mode 100644 index 000000000..0727c0407 --- /dev/null +++ b/pyload/plugin/hook/ExpertDecoders.py @@ -0,0 +1,102 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +import pycurl +import uuid + +from base64 import b64encode + +from pyload.network.HTTPRequest import BadHeader +from pyload.network.RequestFactory import getURL, getRequest +from pyload.plugin.Hook import Hook, threaded + + +class ExpertDecoders(Hook): +    __name    = "ExpertDecoders" +    __type    = "hook" +    __version = "0.04" + +    __config = [("force", "bool", "Force CT even if client is connected", False), +                ("passkey", "password", "Access key", "")] + +    __description = """Send captchas to expertdecoders.com""" +    __license     = "GPLv3" +    __authors     = [("RaNaN"   , "RaNaN@pyload.org"   ), +                       ("zoidberg", "zoidberg@mujmail.cz")] + + +    API_URL = "http://www.fasttypers.org/imagepost.ashx" + + +    def activate(self): +        if self.getConfig('ssl'): +            self.API_URL = self.API_URL.replace("http://", "https://") + + +    def getCredits(self): +        res = getURL(self.API_URL, post={"key": self.getConfig('passkey'), "action": "balance"}) + +        if res.isdigit(): +            self.logInfo(_("%s credits left") % res) +            self.info['credits'] = credits = int(res) +            return credits +        else: +            self.logError(res) +            return 0 + + +    @threaded +    def _processCaptcha(self, task): +        task.data['ticket'] = ticket = uuid.uuid4() +        result = None + +        with open(task.captchaFile, 'rb') as f: +            data = f.read() + +        req = getRequest() +        # raise timeout threshold +        req.c.setopt(pycurl.LOW_SPEED_TIME, 80) + +        try: +            result = req.load(self.API_URL, +                              post={'action'     : "upload", +                                    'key'        : self.getConfig('passkey'), +                                    'file'       : b64encode(data), +                                    'gen_task_id': ticket}) +        finally: +            req.close() + +        self.logDebug("Result %s : %s" % (ticket, result)) +        task.setResult(result) + + +    def captchaTask(self, task): +        if not task.isTextual(): +            return False + +        if not self.getConfig('passkey'): +            return False + +        if self.core.isClientConnected() and not self.getConfig('force'): +            return False + +        if self.getCredits() > 0: +            task.handler.append(self) +            task.setWaiting(100) +            self._processCaptcha(task) + +        else: +            self.logInfo(_("Your ExpertDecoders Account has not enough credits")) + + +    def captchaInvalid(self, task): +        if "ticket" in task.data: + +            try: +                res = getURL(self.API_URL, +                             post={'action': "refund", 'key': self.getConfig('passkey'), 'gen_task_id': task.data['ticket']}) +                self.logInfo(_("Request refund"), res) + +            except BadHeader, e: +                self.logError(_("Could not send refund request"), e) diff --git a/pyload/plugin/hook/FastixRu.py b/pyload/plugin/hook/FastixRu.py new file mode 100644 index 000000000..6c71384c8 --- /dev/null +++ b/pyload/plugin/hook/FastixRu.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- + +from pyload.utils import json_loads +from pyload.plugin.internal.MultiHook import MultiHook + + +class FastixRu(MultiHook): +    __name    = "FastixRu" +    __type    = "hook" +    __version = "0.05" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """Fastix.ru hook plugin""" +    __license     = "GPLv3" +    __authors     = [("Massimo Rosamilia", "max@spiritix.eu")] + + +    def getHosters(self): +        html = self.getURL("http://fastix.ru/api_v2", +                      get={'apikey': "5182964c3f8f9a7f0b00000a_kelmFB4n1IrnCDYuIFn2y", +                           'sub'   : "allowed_sources"}) +        host_list = json_loads(html) +        host_list = host_list['allow'] +        return host_list diff --git a/pyload/plugin/hook/FreeWayMe.py b/pyload/plugin/hook/FreeWayMe.py new file mode 100644 index 000000000..fd1017ba9 --- /dev/null +++ b/pyload/plugin/hook/FreeWayMe.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- + +from pyload.plugin.internal.MultiHook import MultiHook + + +class FreeWayMe(MultiHook): +    __name    = "FreeWayMe" +    __type    = "hook" +    __version = "0.15" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """FreeWay.me hook plugin""" +    __license     = "GPLv3" +    __authors     = [("Nicolas Giese", "james@free-way.me")] + + +    def getHosters(self): +        # Get account data +        if not self.account or not self.account.canUse(): +           hostis = self.getURL("https://www.free-way.me/ajax/jd.php", get={"id": 3}).replace("\"", "").strip() +        else: +           self.logDebug("AccountInfo available - Get HosterList with User Pass") +           (user, data) = self.account.selectAccount() +           hostis = self.getURL("https://www.free-way.me/ajax/jd.php", get={"id": 3, "user": user, "pass": data['password']}).replace("\"", "").strip() + +        self.logDebug("hosters: %s" % hostis) +        return [x.strip() for x in hostis.split(",") if x.strip()] diff --git a/pyload/plugin/hook/ImageTyperz.py b/pyload/plugin/hook/ImageTyperz.py new file mode 100644 index 000000000..3f0147776 --- /dev/null +++ b/pyload/plugin/hook/ImageTyperz.py @@ -0,0 +1,153 @@ +# -*- coding: utf-8 -*- + +from __future__ import with_statement + +import pycurl +import re + +from base64 import b64encode + +from pyload.network.RequestFactory import getURL, getRequest +from pyload.plugin.Hook import Hook, threaded + + +class ImageTyperzException(Exception): + +    def __init__(self, err): +        self.err = err + + +    def getCode(self): +        return self.err + + +    def __str__(self): +        return "<ImageTyperzException %s>" % self.err + + +    def __repr__(self): +        return "<ImageTyperzException %s>" % self.err + + +class ImageTyperz(Hook): +    __name    = "ImageTyperz" +    __type    = "hook" +    __version = "0.06" + +    __config = [("username", "str", "Username", ""), +                ("passkey", "password", "Password", ""), +                ("force", "bool", "Force IT even if client is connected", False)] + +    __description = """Send captchas to ImageTyperz.com""" +    __license     = "GPLv3" +    __authors     = [("RaNaN"   , "RaNaN@pyload.org"), +                     ("zoidberg", "zoidberg@mujmail.cz")] + + +    SUBMIT_URL = "http://captchatypers.com/Forms/UploadFileAndGetTextNEW.ashx" +    RESPOND_URL = "http://captchatypers.com/Forms/SetBadImage.ashx" +    GETCREDITS_URL = "http://captchatypers.com/Forms/RequestBalance.ashx" + + +    def getCredits(self): +        res = getURL(self.GETCREDITS_URL, +                     post={'action': "REQUESTBALANCE", +                           'username': self.getConfig('username'), +                           'password': self.getConfig('passkey')}) + +        if res.startswith('ERROR'): +            raise ImageTyperzException(res) + +        try: +            balance = float(res) +        except Exception: +            raise ImageTyperzException("Invalid response") + +        self.logInfo(_("Account balance: $%s left") % res) +        return balance + + +    def submit(self, captcha, captchaType="file", match=None): +        req = getRequest() +        # raise timeout threshold +        req.c.setopt(pycurl.LOW_SPEED_TIME, 80) + +        try: +            #@NOTE: Workaround multipart-post bug in HTTPRequest.py +            if re.match("^\w*$", self.getConfig('passkey')): +                multipart = True +                data = (pycurl.FORM_FILE, captcha) +            else: +                multipart = False +                with open(captcha, 'rb') as f: +                    data = f.read() +                data = b64encode(data) + +            res = req.load(self.SUBMIT_URL, +                           post={'action': "UPLOADCAPTCHA", +                                 'username': self.getConfig('username'), +                                 'password': self.getConfig('passkey'), "file": data}, +                           multipart=multipart) +        finally: +            req.close() + +        if res.startswith("ERROR"): +            raise ImageTyperzException(res) +        else: +            data = res.split('|') +            if len(data) == 2: +                ticket, result = data +            else: +                raise ImageTyperzException("Unknown response: %s" % res) + +        return ticket, result + + +    def captchaTask(self, task): +        if "service" in task.data: +            return False + +        if not task.isTextual(): +            return False + +        if not self.getConfig('username') or not self.getConfig('passkey'): +            return False + +        if self.core.isClientConnected() and not self.getConfig('force'): +            return False + +        if self.getCredits() > 0: +            task.handler.append(self) +            task.data['service'] = self.getClassName() +            task.setWaiting(100) +            self._processCaptcha(task) + +        else: +            self.logInfo(_("Your %s account has not enough credits") % self.getClassName()) + + +    def captchaInvalid(self, task): +        if task.data['service'] == self.getClassName() and "ticket" in task.data: +            res = getURL(self.RESPOND_URL, +                         post={'action': "SETBADIMAGE", +                               'username': self.getConfig('username'), +                               'password': self.getConfig('passkey'), +                               'imageid': task.data['ticket']}) + +            if res == "SUCCESS": +                self.logInfo(_("Bad captcha solution received, requested refund")) +            else: +                self.logError(_("Bad captcha solution received, refund request failed"), res) + + +    @threaded +    def _processCaptcha(self, task): +        c = task.captchaFile +        try: +            ticket, result = self.submit(c) +        except ImageTyperzException, e: +            task.error = e.getCode() +            return + +        task.data['ticket'] = ticket +        task.setResult(result) diff --git a/pyload/plugin/hook/LinkdecrypterCom.py b/pyload/plugin/hook/LinkdecrypterCom.py new file mode 100644 index 000000000..a4a125236 --- /dev/null +++ b/pyload/plugin/hook/LinkdecrypterCom.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugin.internal.MultiHook import MultiHook + + +class LinkdecrypterCom(MultiHook): +    __name    = "LinkdecrypterCom" +    __type    = "hook" +    __version = "1.06" + +    __config = [("activated"     , "bool"               , "Activated"                    , True ), +                  ("pluginmode"    , "all;listed;unlisted", "Use for plugins"              , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)", ""   ), +                  ("reload"        , "bool"               , "Reload plugin list"           , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"     , 12   )] + +    __description = """Linkdecrypter.com hook plugin""" +    __license     = "GPLv3" +    __authors     = [("Walter Purcaro", "vuolter@gmail.com")] + + +    def getHosters(self): +        list = re.search(r'>Supported\(\d+\)</b>: <i>(.[\w.\-, ]+)', +                         self.getURL("http://linkdecrypter.com/", decode=True).replace("(g)", "")).group(1).split(', ') +        try: +            list.remove("download.serienjunkies.org") +        except ValueError: +            pass + +        return list diff --git a/pyload/plugin/hook/LinksnappyCom.py b/pyload/plugin/hook/LinksnappyCom.py new file mode 100644 index 000000000..e09021d6d --- /dev/null +++ b/pyload/plugin/hook/LinksnappyCom.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +from pyload.utils import json_loads +from pyload.plugin.internal.MultiHook import MultiHook + + +class LinksnappyCom(MultiHook): +    __name    = "LinksnappyCom" +    __type    = "hook" +    __version = "0.04" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """Linksnappy.com hook plugin""" +    __license     = "GPLv3" +    __authors     = [("stickell", "l.stickell@yahoo.it")] + + +    def getHosters(self): +        json_data = self.getURL("http://gen.linksnappy.com/lseAPI.php", get={'act': "FILEHOSTS"}) +        json_data = json_loads(json_data) + +        return json_data['return'].keys() diff --git a/pyload/plugin/hook/MegaDebridEu.py b/pyload/plugin/hook/MegaDebridEu.py new file mode 100644 index 000000000..41abce37b --- /dev/null +++ b/pyload/plugin/hook/MegaDebridEu.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- + +from pyload.utils import json_loads +from pyload.plugin.internal.MultiHook import MultiHook + + +class MegaDebridEu(MultiHook): +    __name    = "MegaDebridEu" +    __type    = "hook" +    __version = "0.05" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """Mega-debrid.eu hook plugin""" +    __license     = "GPLv3" +    __authors     = [("D.Ducatel", "dducatel@je-geek.fr")] + + +    def getHosters(self): +        reponse   = self.getURL("http://www.mega-debrid.eu/api.php", get={'action': "getHosters"}) +        json_data = json_loads(reponse) + +        if json_data['response_code'] == "ok": +            host_list = [element[0] for element in json_data['hosters']] +        else: +            self.logError(_("Unable to retrieve hoster list")) +            host_list = [] + +        return host_list diff --git a/pyload/plugin/hook/MegaRapidoNet.py b/pyload/plugin/hook/MegaRapidoNet.py new file mode 100644 index 000000000..4650d8b6d --- /dev/null +++ b/pyload/plugin/hook/MegaRapidoNet.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugin.internal.MultiHook import MultiHook + + +class MegaRapidoNet(MultiHook): +    __name    = "MegaRapidoNet" +    __type    = "hook" +    __version = "0.02" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"              , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)", ""   ), +                  ("reload"        , "bool"               , "Reload plugin list"           , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"     , 12   )] + +    __description = """MegaRapido.net hook plugin""" +    __license     = "GPLv3" +    __authors     = [("Kagenoshin", "kagenoshin@gmx.ch")] + + +    def getHosters(self): +        hosters = {'1fichier'    : [],#leave it there are so many possible addresses? +                   '1st-files'   : ['1st-files.com'], +                   '2shared'     : ['2shared.com'], +                   '4shared'     : ['4shared.com', '4shared-china.com'], +                   'asfile'      : ['http://asfile.com/'], +                   'bitshare'    : ['bitshare.com'], +                   'brupload'    : ['brupload.net'], +                   'crocko'      : ['crocko.com','easy-share.com'], +                   'dailymotion' : ['dailymotion.com'], +                   'depfile'     : ['depfile.com'], +                   'depositfiles': ['depositfiles.com', 'dfiles.eu'], +                   'dizzcloud'   : ['dizzcloud.com'], +                   'dl.dropbox'  : [], +                   'extabit'     : ['extabit.com'], +                   'extmatrix'   : ['extmatrix.com'], +                   'facebook'    : [], +                   'file4go'     : ['file4go.com'], +                   'filecloud'   : ['filecloud.io','ifile.it','mihd.net'], +                   'filefactory' : ['filefactory.com'], +                   'fileom'      : ['fileom.com'], +                   'fileparadox' : ['fileparadox.in'], +                   'filepost'    : ['filepost.com', 'fp.io'], +                   'filerio'     : ['filerio.in','filerio.com','filekeen.com'], +                   'filesflash'  : ['filesflash.com'], +                   'firedrive'   : ['firedrive.com', 'putlocker.com'], +                   'flashx'      : [], +                   'freakshare'  : ['freakshare.net', 'freakshare.com'], +                   'gigasize'    : ['gigasize.com'], +                   'hipfile'     : ['hipfile.com'], +                   'junocloud'   : ['junocloud.me'], +                   'letitbit'    : ['letitbit.net','shareflare.net'], +                   'mediafire'   : ['mediafire.com'], +                   'mega'        : ['mega.co.nz'], +                   'megashares'  : ['megashares.com'], +                   'metacafe'    : ['metacafe.com'], +                   'netload'     : ['netload.in'], +                   'oboom'       : ['oboom.com'], +                   'rapidgator'  : ['rapidgator.net'], +                   'rapidshare'  : ['rapidshare.com'], +                   'rarefile'    : ['rarefile.net'], +                   'ryushare'    : ['ryushare.com'], +                   'sendspace'   : ['sendspace.com'], +                   'turbobit'    : ['turbobit.net', 'unextfiles.com'], +                   'uploadable'  : ['uploadable.ch'], +                   'uploadbaz'   : ['uploadbaz.com'], +                   'uploaded'    : ['uploaded.to', 'uploaded.net', 'ul.to'], +                   'uploadhero'  : ['uploadhero.com'], +                   'uploading'   : ['uploading.com'], +                   'uptobox'     : ['uptobox.com'], +                   'xvideos'     : ['xvideos.com'], +                   'youtube'     : ['youtube.com']} + +        hoster_list = [] + +        for item in hosters.itervalues(): +            hoster_list.extend(item) + +        return hoster_list diff --git a/pyload/plugin/hook/MultihostersCom.py b/pyload/plugin/hook/MultihostersCom.py new file mode 100644 index 000000000..5cb2396ee --- /dev/null +++ b/pyload/plugin/hook/MultihostersCom.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugin.hook.ZeveraCom import ZeveraCom + + +class MultihostersCom(ZeveraCom): +    __name    = "MultihostersCom" +    __type    = "hook" +    __version = "0.02" + +    __config = [("mode"        , "all;listed;unlisted", "Use for plugins (if supported)"               , "all"), +                  ("pluginlist"  , "str"                , "Plugin list (comma separated)"                , ""   ), +                  ("revertfailed", "bool"               , "Revert to standard download if download fails", False), +                  ("interval"    , "int"                , "Reload interval in hours (0 to disable)"      , 12   )] + +    __description = """Multihosters.com hook plugin""" +    __license     = "GPLv3" +    __authors     = [("tjeh", "tjeh@gmx.net")] diff --git a/pyload/plugin/hook/MultishareCz.py b/pyload/plugin/hook/MultishareCz.py new file mode 100644 index 000000000..39817d7ce --- /dev/null +++ b/pyload/plugin/hook/MultishareCz.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugin.internal.MultiHook import MultiHook + + +class MultishareCz(MultiHook): +    __name    = "MultishareCz" +    __type    = "hook" +    __version = "0.07" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """MultiShare.cz hook plugin""" +    __license     = "GPLv3" +    __authors     = [("zoidberg", "zoidberg@mujmail.cz")] + + +    HOSTER_PATTERN = r'<img class="logo-shareserveru"[^>]*?alt="(.+?)"></td>\s*<td class="stav">[^>]*?alt="OK"' + + +    def getHosters(self): +        html = self.getURL("http://www.multishare.cz/monitoring/") +        return re.findall(self.HOSTER_PATTERN, html) diff --git a/pyload/plugin/hook/MyfastfileCom.py b/pyload/plugin/hook/MyfastfileCom.py new file mode 100644 index 000000000..b6573e56d --- /dev/null +++ b/pyload/plugin/hook/MyfastfileCom.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- + +from pyload.plugin.internal.MultiHook import MultiHook +from pyload.utils import json_loads + + +class MyfastfileCom(MultiHook): +    __name    = "MyfastfileCom" +    __type    = "hook" +    __version = "0.05" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """Myfastfile.com hook plugin""" +    __license     = "GPLv3" +    __authors     = [("stickell", "l.stickell@yahoo.it")] + + +    def getHosters(self): +        json_data = self.getURL("http://myfastfile.com/api.php", get={'hosts': ""}, decode=True) +        self.logDebug("JSON data", json_data) +        json_data = json_loads(json_data) + +        return json_data['hosts'] diff --git a/pyload/plugin/hook/NoPremiumPl.py b/pyload/plugin/hook/NoPremiumPl.py new file mode 100644 index 000000000..527413a88 --- /dev/null +++ b/pyload/plugin/hook/NoPremiumPl.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- + +from pyload.utils import json_loads +from pyload.plugin.internal.MultiHook import MultiHook + + +class NoPremiumPl(MultiHook): +    __name    = "NoPremiumPl" +    __type    = "hook" +    __version = "0.03" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """NoPremium.pl hook plugin""" +    __license     = "GPLv3" +    __authors     = [("goddie", "dev@nopremium.pl")] + + +    def getHosters(self): +        hostings         = json_loads(self.getURL("https://www.nopremium.pl/clipboard.php?json=3").strip()) +        hostings_domains = [domain for row in hostings for domain in row['domains'] if row['sdownload'] == "0"] + +        self.logDebug(hostings_domains) + +        return hostings_domains diff --git a/pyload/plugin/hook/OverLoadMe.py b/pyload/plugin/hook/OverLoadMe.py new file mode 100644 index 000000000..5fc04e6f4 --- /dev/null +++ b/pyload/plugin/hook/OverLoadMe.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- + +from pyload.plugin.internal.MultiHook import MultiHook + + +class OverLoadMe(MultiHook): +    __name    = "OverLoadMe" +    __type    = "hook" +    __version = "0.04" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   ), +                  ("ssl"           , "bool"               , "Use HTTPS"                           , True )] + +    __description = """Over-Load.me hook plugin""" +    __license     = "GPLv3" +    __authors     = [("marley", "marley@over-load.me")] + + +    def getHosters(self): +        https = "https" if self.getConfig('ssl') else "http" +        html = self.getURL(https + "://api.over-load.me/hoster.php", +                      get={'auth': "0001-cb1f24dadb3aa487bda5afd3b76298935329be7700cd7-5329be77-00cf-1ca0135f"}).replace("\"", "").strip() +        self.logDebug("Hosterlist", html) + +        return [x.strip() for x in html.split(",") if x.strip()] diff --git a/pyload/plugin/hook/PremiumTo.py b/pyload/plugin/hook/PremiumTo.py new file mode 100644 index 000000000..361f072a3 --- /dev/null +++ b/pyload/plugin/hook/PremiumTo.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +from pyload.plugin.internal.MultiHook import MultiHook + + +class PremiumTo(MultiHook): +    __name    = "PremiumTo" +    __type    = "hook" +    __version = "0.08" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """Premium.to hook plugin""" +    __license     = "GPLv3" +    __authors     = [("RaNaN"   , "RaNaN@pyload.org"   ), +                       ("zoidberg", "zoidberg@mujmail.cz"), +                       ("stickell", "l.stickell@yahoo.it")] + + +    def getHosters(self): +        html = self.getURL("http://premium.to/api/hosters.php", +                      get={'username': self.account.username, 'password': self.account.password}) +        return [x.strip() for x in html.replace("\"", "").split(";")] diff --git a/pyload/plugin/hook/PremiumizeMe.py b/pyload/plugin/hook/PremiumizeMe.py new file mode 100644 index 000000000..1e4a58592 --- /dev/null +++ b/pyload/plugin/hook/PremiumizeMe.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- + +from pyload.utils import json_loads +from pyload.plugin.internal.MultiHook import MultiHook + + +class PremiumizeMe(MultiHook): +    __name    = "PremiumizeMe" +    __type    = "hook" +    __version = "0.17" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """Premiumize.me hook plugin""" +    __license     = "GPLv3" +    __authors     = [("Florian Franzen", "FlorianFranzen@gmail.com")] + + +    def getHosters(self): +        # Get account data +        user, data = self.account.selectAccount() + +        # Get supported hosters list from premiumize.me using the +        # json API v1 (see https://secure.premiumize.me/?show=api) +        answer = self.getURL("https://api.premiumize.me/pm-api/v1.php", +                        get={'method': "hosterlist", 'params[login]': user, 'params[pass]': data['password']}) +        data = json_loads(answer) + +        # If account is not valid thera are no hosters available +        if data['status'] != 200: +            return [] + +        # Extract hosters from json file +        return data['result']['hosterlist'] diff --git a/pyload/plugin/hook/PutdriveCom.py b/pyload/plugin/hook/PutdriveCom.py new file mode 100644 index 000000000..126eb86e8 --- /dev/null +++ b/pyload/plugin/hook/PutdriveCom.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pyload.plugin.hook.ZeveraCom import ZeveraCom + + +class PutdriveCom(ZeveraCom): +    __name    = "PutdriveCom" +    __type    = "hook" +    __version = "0.01" + +    __config = [("mode"        , "all;listed;unlisted", "Use for plugins (if supported)"               , "all"), +                  ("pluginlist"  , "str"                , "Plugin list (comma separated)"                , ""   ), +                  ("revertfailed", "bool"               , "Revert to standard download if download fails", False), +                  ("interval"    , "int"                , "Reload interval in hours (0 to disable)"      , 12   )] + +    __description = """Putdrive.com hook plugin""" +    __license     = "GPLv3" +    __authors     = [("Walter Purcaro", "vuolter@gmail.com")] diff --git a/pyload/plugin/hook/RPNetBiz.py b/pyload/plugin/hook/RPNetBiz.py new file mode 100644 index 000000000..d9d3e6177 --- /dev/null +++ b/pyload/plugin/hook/RPNetBiz.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- + +from pyload.utils import json_loads +from pyload.plugin.internal.MultiHook import MultiHook + + +class RPNetBiz(MultiHook): +    __name    = "RPNetBiz" +    __type    = "hook" +    __version = "0.14" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """RPNet.biz hook plugin""" +    __license     = "GPLv3" +    __authors     = [("Dman", "dmanugm@gmail.com")] + + +    def getHosters(self): +        # Get account data +        user, data = self.account.selectAccount() + +        res = self.getURL("https://premium.rpnet.biz/client_api.php", +                     get={'username': user, 'password': data['password'], 'action': "showHosterList"}) +        hoster_list = json_loads(res) + +        # If account is not valid thera are no hosters available +        if 'error' in hoster_list: +            return [] + +        # Extract hosters from json file +        return hoster_list['hosters'] diff --git a/pyload/plugin/hook/RapideoPl.py b/pyload/plugin/hook/RapideoPl.py new file mode 100644 index 000000000..1761659db --- /dev/null +++ b/pyload/plugin/hook/RapideoPl.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- + +from pyload.utils import json_loads +from pyload.plugin.internal.MultiHook import MultiHook + + +class RapideoPl(MultiHook): +    __name    = "RapideoPl" +    __type    = "hook" +    __version = "0.03" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """Rapideo.pl hook plugin""" +    __license     = "GPLv3" +    __authors     = [("goddie", "dev@rapideo.pl")] + + +    def getHosters(self): +        hostings         = json_loads(self.getURL("https://www.rapideo.pl/clipboard.php?json=3").strip()) +        hostings_domains = [domain for row in hostings for domain in row['domains'] if row['sdownload'] == "0"] + +        self.logDebug(hostings_domains) + +        return hostings_domains diff --git a/pyload/plugin/hook/RealdebridCom.py b/pyload/plugin/hook/RealdebridCom.py new file mode 100644 index 000000000..916737cd8 --- /dev/null +++ b/pyload/plugin/hook/RealdebridCom.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +from pyload.plugin.internal.MultiHook import MultiHook + + +class RealdebridCom(MultiHook): +    __name    = "RealdebridCom" +    __type    = "hook" +    __version = "0.46" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   ), +                  ("ssl"           , "bool"               , "Use HTTPS"                           , True )] + +    __description = """Real-Debrid.com hook plugin""" +    __license     = "GPLv3" +    __authors     = [("Devirex Hazzard", "naibaf_11@yahoo.de")] + + +    def getHosters(self): +        https = "https" if self.getConfig('ssl') else "http" +        html = self.getURL(https + "://real-debrid.com/api/hosters.php").replace("\"", "").strip() + +        return [x.strip() for x in html.split(",") if x.strip()] diff --git a/pyload/plugin/hook/RehostTo.py b/pyload/plugin/hook/RehostTo.py new file mode 100644 index 000000000..087701c5b --- /dev/null +++ b/pyload/plugin/hook/RehostTo.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +from pyload.plugin.internal.MultiHook import MultiHook + + +class RehostTo(MultiHook): +    __name    = "RehostTo" +    __type    = "hook" +    __version = "0.50" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """Rehost.to hook plugin""" +    __license     = "GPLv3" +    __authors     = [("RaNaN", "RaNaN@pyload.org")] + + +    def getHosters(self): +        user, data = self.account.selectAccount() +        html = self.getURL("http://rehost.to/api.php", +                           get={'cmd'     : "get_supported_och_dl", +                                'long_ses': self.account.getAccountInfo(user)['session']}) +        return [x.strip() for x in html.replace("\"", "").split(",")] diff --git a/pyload/plugin/hook/SimplyPremiumCom.py b/pyload/plugin/hook/SimplyPremiumCom.py new file mode 100644 index 000000000..f095cd7e6 --- /dev/null +++ b/pyload/plugin/hook/SimplyPremiumCom.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- + +from pyload.utils import json_loads +from pyload.plugin.internal.MultiHook import MultiHook + + +class SimplyPremiumCom(MultiHook): +    __name    = "SimplyPremiumCom" +    __type    = "hook" +    __version = "0.05" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """Simply-Premium.com hook plugin""" +    __license     = "GPLv3" +    __authors     = [("EvolutionClip", "evolutionclip@live.de")] + + +    def getHosters(self): +        json_data = self.getURL("http://www.simply-premium.com/api/hosts.php", get={'format': "json", 'online': 1}) +        json_data = json_loads(json_data) + +        host_list = [element['regex'] for element in json_data['result']] + +        return host_list diff --git a/pyload/plugin/hook/SimplydebridCom.py b/pyload/plugin/hook/SimplydebridCom.py new file mode 100644 index 000000000..d831bf532 --- /dev/null +++ b/pyload/plugin/hook/SimplydebridCom.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +from pyload.plugin.internal.MultiHook import MultiHook + + +class SimplydebridCom(MultiHook): +    __name    = "SimplydebridCom" +    __type    = "hook" +    __version = "0.04" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """Simply-Debrid.com hook plugin""" +    __license     = "GPLv3" +    __authors     = [("Kagenoshin", "kagenoshin@gmx.ch")] + + +    def getHosters(self): +        html = self.getURL("http://simply-debrid.com/api.php", get={'list': 1}) +        return [x.strip() for x in html.rstrip(';').replace("\"", "").split(";")] diff --git a/pyload/plugin/hook/SmoozedCom.py b/pyload/plugin/hook/SmoozedCom.py new file mode 100644 index 000000000..caecb8bc2 --- /dev/null +++ b/pyload/plugin/hook/SmoozedCom.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +from pyload.plugin.internal.MultiHook import MultiHook + + +class SmoozedCom(MultiHook): +    __name    = "SmoozedCom" +    __type    = "hook" +    __version = "0.03" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """Smoozed.com hook plugin""" +    __license     = "GPLv3" +    __authors     = [("", "")] + + +    def getHosters(self): +        user, data = self.account.selectAccount() +        return self.account.getAccountInfo(user)["hosters"] diff --git a/pyload/plugin/hook/XFileSharingPro.py b/pyload/plugin/hook/XFileSharingPro.py new file mode 100644 index 000000000..3c305c74b --- /dev/null +++ b/pyload/plugin/hook/XFileSharingPro.py @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- + +import re + +from pyload.plugin.Hook import Hook + + +class XFileSharingPro(Hook): +    __name    = "XFileSharingPro" +    __type    = "hook" +    __version = "0.37" + +    __config = [("activated"       , "bool", "Activated"                     , True ), +                  ("use_hoster_list" , "bool", "Load listed hosters only"      , False), +                  ("use_crypter_list", "bool", "Load listed crypters only"     , False), +                  ("use_builtin_list", "bool", "Load built-in plugin list"     , True ), +                  ("hoster_list"     , "str" , "Hoster list (comma separated)" , ""   ), +                  ("crypter_list"    , "str" , "Crypter list (comma separated)", ""   )] + +    __description = """Load XFileSharingPro based hosters and crypter which don't need a own plugin to run""" +    __license     = "GPLv3" +    __authors     = [("Walter Purcaro", "vuolter@gmail.com")] + + +    # event_list = ["pluginConfigChanged"] +    regexp     = {'hoster' : (r'https?://(?:www\.)?(?P<DOMAIN>[\w\-.^_]{3,63}(?:\.[a-zA-Z]{2,})(?:\:\d+)?)/(?:embed-)?\w{12}(?:\W|$)', +                              r'https?://(?:[^/]+\.)?(?P<DOMAIN>%s)/(?:embed-)?\w+'), +                  'crypter': (r'https?://(?:www\.)?(?P<DOMAIN>[\w\-.^_]{3,63}(?:\.[a-zA-Z]{2,})(?:\:\d+)?)/(?:user|folder)s?/\w+', +                              r'https?://(?:[^/]+\.)?(?P<DOMAIN>%s)/(?:user|folder)s?/\w+')} + +    HOSTER_BUILTIN  = [#WORKING HOSTERS: +                       "backin.net", "eyesfile.ca", "file4safe.com", "fileband.com", "filedwon.com", "fileparadox.in", +                       "filevice.com", "hostingbulk.com", "junkyvideo.com", "linestorage.com", "ravishare.com", "ryushare.com", +                       "salefiles.com", "sendmyway.com", "sharesix.com", "thefile.me", "verzend.be", "xvidstage.com", +                       # NOT TESTED: +                       "101shared.com", "4upfiles.com", "filemaze.ws", "filenuke.com", "linkzhost.com", "mightyupload.com", +                       "rockdizfile.com", "sharebeast.com", "sharerepo.com", "shareswift.com", "uploadbaz.com", "uploadc.com", +                       "vidbull.com", "worldbytez.com", "zalaa.com", "zomgupload.com", +                       # NOT WORKING: +                       "amonshare.com", "banicrazy.info", "boosterking.com", "host4desi.com", "laoupload.com", "rd-fs.com"] +    CRYPTER_BUILTIN = ["junocloud.me", "rapidfileshare.net"] + + +    # def pluginConfigChanged(self, plugin, name, value): +        # self.loadPattern() + + +    def activate(self): +        self.loadPattern() + + +    def loadPattern(self): +        use_builtin_list = self.getConfig("use_builtin_list") + +        for type in ("hoster", "crypter"): +            every_plugin = not self.getConfig('use_%s_list' % type) + +            if every_plugin: +                self.logInfo(_("Handling any %s I can!") % type) +                pattern = self.regexp[type][0] +            else: +                plugins    = self.getConfig('%s_list' % type) +                plugin_set = set(plugins.replace(' ', '').replace('\\', '').replace('|', ',').replace(';', ',').lower().split(',')) + +                if use_builtin_list: +                    plugin_set |= set(x.lower() for x in getattr(self, "%s_BUILTIN" % type.upper())) + +                plugin_set -= set(('', u'')) + +                if not plugin_set: +                    self.logInfo(_("No %s to handle") % type) +                    self._unload(type) +                    return + +                match_list = '|'.join(sorted(plugin_set)) + +                len_match_list = len(plugin_set) +                self.logInfo(_("Handling %d %s%s: %s") % (len_match_list, +                                                          type, +                                                          "" if len_match_list == 1 else "s", +                                                          match_list.replace('|', ', '))) + +                pattern = self.regexp[type][1] % match_list.replace('.', '\.') + +            dict = self.core.pluginManager.plugins[type]['XFileSharingPro'] +            dict['pattern'] = pattern +            dict['re'] = re.compile(pattern) + +            self.logDebug("Loaded %s pattern: %s" % (type, pattern)) + + +    def _unload(self, type): +        dict = self.core.pluginManager.plugins[type]['XFileSharingPro'] +        dict['pattern'] = r'^unmatchable$' +        dict['re'] = re.compile(dict['pattern']) + + +    def deactivate(self): +        # self.unloadHoster("BasePlugin") +        for type in ("hoster", "crypter"): +            self._unload(type, "XFileSharingPro") + + +    # def downloadFailed(self, pyfile): +        # if pyfile.pluginname == "BasePlugin" \ +           # and pyfile.hasStatus("failed") \ +           # and not self.getConfig('use_hoster_list') \ +           # and self.unloadHoster("BasePlugin"): +            # self.logDebug("Unloaded XFileSharingPro from BasePlugin") +            # pyfile.setStatus("queued") diff --git a/pyload/plugin/hook/ZeveraCom.py b/pyload/plugin/hook/ZeveraCom.py new file mode 100644 index 000000000..e52ec8eed --- /dev/null +++ b/pyload/plugin/hook/ZeveraCom.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +from pyload.plugin.internal.MultiHook import MultiHook + + +class ZeveraCom(MultiHook): +    __name    = "ZeveraCom" +    __type    = "hook" +    __version = "0.05" + +    __config = [("pluginmode"    , "all;listed;unlisted", "Use for plugins"                     , "all"), +                  ("pluginlist"    , "str"                , "Plugin list (comma separated)"       , ""   ), +                  ("revertfailed"  , "bool"               , "Revert to standard download if fails", True ), +                  ("reload"        , "bool"               , "Reload plugin list"                  , True ), +                  ("reloadinterval", "int"                , "Reload interval in hours"            , 12   )] + +    __description = """Zevera.com hook plugin""" +    __license     = "GPLv3" +    __authors     = [("zoidberg"      , "zoidberg@mujmail.cz"), +                       ("Walter Purcaro", "vuolter@gmail.com"  )] + + +    def getHosters(self): +        html = self.account.api_response(pyreq.getHTTPRequest(timeout=120), cmd="gethosters") +        return [x.strip() for x in html.split(",")] diff --git a/pyload/plugin/hook/__init__.py b/pyload/plugin/hook/__init__.py new file mode 100644 index 000000000..40a96afc6 --- /dev/null +++ b/pyload/plugin/hook/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- | 
