diff options
| author | 2014-12-07 15:34:19 +0100 | |
|---|---|---|
| committer | 2014-12-07 15:34:19 +0100 | |
| commit | d8771b13f1c658ac726ac93195a48ad87169eccd (patch) | |
| tree | a81899c2905d59ff20341ffcad35c949d880a0b4 /module/plugins | |
| parent | Tiny code cosmetics (diff) | |
| parent | [SkipRev] Tiny fixup (diff) | |
| download | pyload-d8771b13f1c658ac726ac93195a48ad87169eccd.tar.xz | |
Merge branch 'stable' into 0.4.10
Conflicts:
	module/plugins/hoster/NowDownloadEu.py
	module/plugins/hoster/NowDownloadSx.py
	module/plugins/hoster/NowVideoAt.py
	module/plugins/hoster/NowVideoSx.py
	pyload/plugins/account/RapidshareCom.py
	pyload/plugins/addon/ExtractArchive.py
	pyload/plugins/addon/HotFolder.py
	pyload/plugins/addon/UpdateManager.py
	pyload/plugins/hook/Captcha9kw.py
	pyload/plugins/hook/DebridItaliaCom.py
	pyload/plugins/hoster/DebridItaliaCom.py
	pyload/plugins/hoster/Keep2shareCc.py
	pyload/plugins/hoster/NetloadIn.py
	pyload/plugins/hoster/NowDownloadEu.py
	pyload/plugins/hoster/NowVideoAt.py
	pyload/plugins/hoster/RapidshareCom.py
	pyload/plugins/hoster/ShareonlineBiz.py
	pyload/plugins/internal/MultiHoster.py
	pyload/plugins/internal/SimpleHoster.py
Diffstat (limited to 'module/plugins')
| -rw-r--r-- | module/plugins/accounts/RapiduNet.py | 45 | ||||
| -rw-r--r-- | module/plugins/accounts/SafesharingEu.py | 16 | ||||
| -rw-r--r-- | module/plugins/crypter/Go4UpCom.py | 49 | ||||
| -rw-r--r-- | module/plugins/hooks/SkipRev.py | 81 | ||||
| -rw-r--r-- | module/plugins/hoster/DodanePl.py | 18 | ||||
| -rw-r--r-- | module/plugins/hoster/NowDownloadSx.py | 64 | ||||
| -rw-r--r-- | module/plugins/hoster/NowVideoSx.py | 44 | ||||
| -rw-r--r-- | module/plugins/hoster/RapiduNet.py | 82 | ||||
| -rw-r--r-- | module/plugins/hoster/SafesharingEu.py | 25 | ||||
| -rw-r--r-- | module/plugins/hoster/UploadableCh.py | 90 | 
10 files changed, 514 insertions, 0 deletions
| diff --git a/module/plugins/accounts/RapiduNet.py b/module/plugins/accounts/RapiduNet.py new file mode 100644 index 000000000..2fabb6120 --- /dev/null +++ b/module/plugins/accounts/RapiduNet.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- + +import re +from module.plugins.Account import Account +from module.common.json_layer import json_loads + + +class RapiduNet(Account): +    __name__ = "RapiduNet" +    __type__ = "account" +    __version__ = "0.01" + +    __description__ = """Rapidu.net account plugin""" +    __license__ = "GPLv3" +    __authors__ = [("prOq", None)] + + +    ACCOUNT_INFO_PATTERN = '<a href="premium/" style="padding-left: 0px;">Account: <b>(.*?)</b></a>' + + +    def loadAccountInfo(self, user, req): +	premium = False + +        req.load('https://rapidu.net/ajax.php?a=getChangeLang', post={"_go": "", "lang": "en"}) +	self.html = req.load('https://rapidu.net/', decode=True) + +	m = re.search(self.ACCOUNT_INFO_PATTERN, self.html) +	if m: +	    if m.group(1) == "Premium": +		premium = True + +        return {"validuntil": None, "trafficleft": None, "premium": premium} + + +    def login(self, user, data, req): +        try: +            json = req.load('https://rapidu.net/ajax.php?a=getUserLogin', post={"_go": "", "login": user, "pass": data['password'], "member": "1"}) +            json = json_loads(json) +            self.logDebug(json) + +            if not json['message'] == "success": +		self.wrongPassword() +        except Exception, e: +            self.logError(e) + diff --git a/module/plugins/accounts/SafesharingEu.py b/module/plugins/accounts/SafesharingEu.py new file mode 100644 index 000000000..2e58d33b3 --- /dev/null +++ b/module/plugins/accounts/SafesharingEu.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +from module.plugins.internal.XFSAccount import XFSAccount + + +class SafesharingEu(XFSAccount): +    __name__    = "SafesharingEu" +    __type__    = "account" +    __version__ = "0.02" + +    __description__ = """Safesharing.eu account plugin""" +    __license__     = "GPLv3" +    __authors__     = [("guidobelix", "guidobelix@hotmail.it")] + + +    HOSTER_DOMAIN = "safesharing.eu" diff --git a/module/plugins/crypter/Go4UpCom.py b/module/plugins/crypter/Go4UpCom.py new file mode 100644 index 000000000..102bc32b5 --- /dev/null +++ b/module/plugins/crypter/Go4UpCom.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- + +import re + +from urlparse import urljoin + +from module.plugins.internal.SimpleCrypter import SimpleCrypter, create_getInfo + + +class Go4UpCom(SimpleCrypter): +    __name__    = "Go4UpCom" +    __type__    = "crypter" +    __version__ = "0.11" + +    __pattern__ = r'http://go4up\.com/(dl/\w{12}|rd/\w{12}/\d+)' + +    __description__ = """Go4Up.com decrypter plugin""" +    __license__     = "GPLv3" +    __authors__     = [("rlindner81", "rlindner81@gmail.com"), +                       ("Walter Purcaro", "vuolter@gmail.com")] + + +    LINK_PATTERN = r'(http://go4up\.com/rd/.+?)<' + +    NAME_PATTERN = r'<title>Download (.+?)<' + +    OFFLINE_PATTERN = r'>\s*(404 Page Not Found|File not Found|Mirror does not exist)' + + +    def getLinks(self +        links = [] + +        m = re.search(r'(/download/gethosts/.+?)"') +        if m: +            self.html = self.load(urljoin("http://go4up.com/", m.group(1))) +            pages = [self.load(url) for url in re.findall(self.LINK_PATTERN, self.html)] +        else: +            pages = [self.html] + +        for html in pages: +            try: +                links.append(re.search(r'<b><a href="(.+?)"', html).group(1)) +            except: +                continue + +        return links + + +getInfo = create_getInfo(Go4UpCom) diff --git a/module/plugins/hooks/SkipRev.py b/module/plugins/hooks/SkipRev.py new file mode 100644 index 000000000..76a48a255 --- /dev/null +++ b/module/plugins/hooks/SkipRev.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- + +import re + +from urllib import unquote +from urlparse import urljoin, urlparse + +from module.plugins.Hook import Hook +from module.plugins.Plugin import SkipDownload + + +class SkipRev(Hook): +    __name__    = "SkipRev" +    __type__    = "hook" +    __version__ = "0.13" + +    __config__ = [("auto",   "bool", "Automatically keep all rev files needed by package", True), +                  ("tokeep", "int" , "Min number of rev files to keep for package"       ,    1), +                  ("unskip", "bool", "Restart a skipped rev when download fails"         , True)] + +    __description__ = """Skip files ending with extension rev""" +    __license__     = "GPLv3" +    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] + + +    def _setup(self): +        super(self.pyfile.plugin, self).setup() +        if self.pyfile.hasStatus("skipped"): +            raise SkipDownload(self.pyfile.getStatusName() or self.pyfile.pluginname) + + +    def pyname(self, pyfile): +        url    = pyfile.url +        plugin = pyfile.plugin + +        if hasattr(plugin, "info") and 'name' in plugin.info and plugin.info['name']: +            name = plugin.info['name'] + +        elif hasattr(plugin, "parseInfo"): +            name = next(plugin.parseInfo([url]))['name'] + +        elif hasattr(plugin, "getInfo"):  #@NOTE: if parseInfo was not found, getInfo should be missing too +            name = plugin.getInfo(url)['name'] + +        else: +            self.logWarning("Unable to grab file name") +            name = urlparse(unquote(url)).path.split('/')[-1]) + +        return name + + +    def downloadPreparing(self, pyfile): +        if pyfile.getStatusName() is "unskipped" or not pyname(pyfile).endswith(".rev"): +            return + +        tokeep = self.getConfig("tokeep") + +        if tokeep > 0: +            saved = [True for link in pyfile.package().getChildren() \ +                     if link.name.endswith(".rev") and (link.hasStatus("finished") or link.hasStatus("downloading"))].count(True) + +            if saved < tokeep: +                return + +        pyfile.setCustomStatus("SkipRev", "skipped") +        pyfile.plugin.setup = _setup  #: work-around: inject status checker inside the preprocessing routine of the plugin + + +    def downloadFailed(self, pyfile): +        if self.getConfig("auto") is False: + +            if self.getConfig("unskip") is False: +                return + +            if not pyfile.name.endswith(".rev"): +                return + +        for link in pyfile.package().getChildren(): +            if link.hasStatus("skipped") and link.name.endswith(".rev"): +                link.setCustomStatus("unskipped", "queued") +                return diff --git a/module/plugins/hoster/DodanePl.py b/module/plugins/hoster/DodanePl.py new file mode 100644 index 000000000..58f1c02d8 --- /dev/null +++ b/module/plugins/hoster/DodanePl.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from module.plugins.internal.DeadHoster import DeadHoster, parseFileInfo + + +class DodanePl(DeadHoster): +    __name__    = "DodanePl" +    __type__    = "hoster" +    __version__ = "0.03" + +    __pattern__ = r'http://(?:www\.)?dodane\.pl/file/\d+' + +    __description__ = """Dodane.pl hoster plugin""" +    __license__     = "GPLv3" +    __authors__     = [("z00nx", "z00nx0@gmail.com")] + + +getInfo = create_getInfo(DodanePl) diff --git a/module/plugins/hoster/NowDownloadSx.py b/module/plugins/hoster/NowDownloadSx.py new file mode 100644 index 000000000..d2ae08954 --- /dev/null +++ b/module/plugins/hoster/NowDownloadSx.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- + +import re + +from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo +from module.utils import fixup + + +class NowDownloadSx(SimpleHoster): +    __name__    = "NowDownloadSx" +    __type__    = "hoster" +    __version__ = "0.05" + +    __pattern__ = r'http://(?:www\.)?nowdownload\.(at|ch|co|eu|sx)/(dl/|download\.php\?id=)\w+' + +    __description__ = """NowDownload.sx hoster plugin""" +    __license__     = "GPLv3" +    __authors__     = [("godofdream", "soilfiction@gmail.com"), +                       ("Walter Purcaro", "vuolter@gmail.com")] + + +    INFO_PATTERN = r'Downloading</span> <br> (?P<N>.*) (?P<S>[\d.,]+) (?P<U>[\w^_]+) </h4>' +    OFFLINE_PATTERN = r'>This file does not exist' + +    TOKEN_PATTERN = r'"(/api/token\.php\?token=\w+)"' +    CONTINUE_PATTERN = r'"(/dl2/\w+/\w+)"' +    WAIT_PATTERN = r'\.countdown\(\{until: \+(\d+),' +    LINK_PATTERN = r'(http://s\d+\.coolcdn\.info/nowdownload/.+?)["\']' + +    NAME_REPLACEMENTS = [("&#?\w+;", fixup), (r'<[^>]*>', '')] + + +    def setup(self): +        self.resumeDownload = True +        self.multiDL        = True +        self.chunkLimit     = -1 + + +    def handleFree(self): +        tokenlink = re.search(self.TOKEN_PATTERN, self.html) +        continuelink = re.search(self.CONTINUE_PATTERN, self.html) +        if tokenlink is None or continuelink is None: +            self.error() + +        m = re.search(self.WAIT_PATTERN, self.html) +        if m: +            wait = int(m.group(1)) +        else: +            wait = 60 + +        baseurl = "http://www.nowdownload.at" +        self.html = self.load(baseurl + str(tokenlink.group(1))) +        self.wait(wait) + +        self.html = self.load(baseurl + str(continuelink.group(1))) + +        url = re.search(self.LINK_PATTERN, self.html) +        if url is None: +            self.error(_("Download link not found")) + +        self.download(str(url.group(1))) + + +getInfo = create_getInfo(NowDownloadSx) diff --git a/module/plugins/hoster/NowVideoSx.py b/module/plugins/hoster/NowVideoSx.py new file mode 100644 index 000000000..b59bd79da --- /dev/null +++ b/module/plugins/hoster/NowVideoSx.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +import re + +from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class NowVideoSx(SimpleHoster): +    __name__    = "NowVideoSx" +    __type__    = "hoster" +    __version__ = "0.07" + +    __pattern__ = r'http://(?:www\.)?nowvideo\.(at|ch|co|eu|sx)/(video|mobile/#/videos)/(?P<ID>\w+)' + +    __description__ = """NowVideo.sx hoster plugin""" +    __license__     = "GPLv3" +    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] + + +    URL_REPLACEMENTS = [(__pattern__ + ".*", r'http://www.nowvideo.at/video/\g<ID>')] + +    NAME_PATTERN = r'<h4>(?P<N>.+?)<' +    OFFLINE_PATTERN = r'>This file no longer exists' + +    LINK_FREE_PATTERN = r'<source src="(.+?)"' +    LINK_PREMIUM_PATTERN = r'<div id="content_player" >\s*<a href="(.+?)"' + + +    def setup(self): +        self.resumeDownload = True +        self.multiDL        = True + + +    def handleFree(self): +        self.html = self.load("http://www.nowvideo.at/mobile/video.php", get={'id': self.info['pattern']['ID']}) + +        m = re.search(self.LINK_FREE_PATTERN, self.html) +        if m is None: +            self.error(_("Free download link not found")) + +        self.download(m.group(1)) + + +getInfo = create_getInfo(NowVideoSx) diff --git a/module/plugins/hoster/RapiduNet.py b/module/plugins/hoster/RapiduNet.py new file mode 100644 index 000000000..e14b18a4f --- /dev/null +++ b/module/plugins/hoster/RapiduNet.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- + +import re + +from pycurl import HTTPHEADER +from time import time, altzone + +from module.common.json_layer import json_loads +from module.plugins.internal.CaptchaService import ReCaptcha +from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class RapiduNet(SimpleHoster): +    __name__    = "RapiduNet" +    __type__    = "hoster" +    __version__ = "0.02" + +    __pattern__ = r'https?://(?:www\.)?rapidu\.net/(?P<ID>\d{10})' + +    __description__ = """Rapidu.net hoster plugin""" +    __license__     = "GPLv3" +    __authors__     = [("prOq", None)] + + +    COOKIES = [("rapidu.net", "rapidu_lang", "en")] + +    FILE_INFO_PATTERN = r'<h1 title="(?P<N>.*)">.*</h1>\s*<small>(?P<S>\d+(\.\d+)?)\s(?P<U>\w+)</small>' +    OFFLINE_PATTERN   = r'404 - File not found' + +    ERROR_PATTERN = r'<div class="error">' + +    RECAPTCHA_KEY = r'6Ld12ewSAAAAAHoE6WVP_pSfCdJcBQScVweQh8Io' + + +    def setup(self): +        self.resumeDownload = True +        self.multiDL        = True +        self.limitDL        = 0 if self.premium else 2 + + +    def handleFree(self): +        self.req.http.lastURL = self.pyfile.url +        self.req.http.c.setopt(HTTPHEADER, ["X-Requested-With: XMLHttpRequest"]) + +        jsvars = self.getJsonResponse("https://rapidu.net/ajax.php?a=getLoadTimeToDownload", {'_go': None}) + +        if str(jsvars['timeToDownload']) is "stop": +            t = (24 * 60 * 60) - (int(time()) % (24 *60 * 60)) + altzone + +            self.logInfo("You've reach your daily download transfer") + +            self.retry(10,  10 if t < 1 else None, "Try tomorrow again")  #@NOTE: check t in case of not synchronised clock + +        else: +            self.wait(int(jsvars['timeToDownload']) - int(time())) + +        recaptcha = ReCaptcha(self) + +        for _i in xrange(10): +            challenge, code = recaptcha.challenge(self.RECAPTCHA_KEY) + +            jsvars = self.getJsonResponse("https://rapidu.net/ajax.php?a=getCheckCaptcha", +                                          {'_go'     : None, +                                           'captcha1': challenge, +                                           'captcha2': code, +                                           'fileId'  : self.info['ID']}) +            if jsvars['message'] == 'success': +                self.download(jsvars['url']) +                break + + +    def getJsonResponse(self, url, post_data): +        response = self.load(url, post=post_data, decode=True) +        if not response.startswith('{'): +            self.retry() + +        self.logDebug(url, response) + +        return json_loads(response) + + +getInfo = create_getInfo(RapiduNet) diff --git a/module/plugins/hoster/SafesharingEu.py b/module/plugins/hoster/SafesharingEu.py new file mode 100644 index 000000000..f0936b9e8 --- /dev/null +++ b/module/plugins/hoster/SafesharingEu.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +from module.plugins.internal.XFSHoster import XFSHoster, create_getInfo + + +class SafesharingEu(XFSHoster): +    __name__    = "SafesharingEu" +    __type__    = "hoster" +    __version__ = "0.05" + +    __pattern__ = r'https?://(?:www\.)?safesharing\.eu/\w{12}' + +    __description__ = """Safesharing.eu hoster plugin""" +    __license__     = "GPLv3" +    __authors__     = [("zapp-brannigan", "fuerst.reinje@web.de")] + + +    HOSTER_DOMAIN = "safesharing.eu" + +    WAIT_PATTERN = r'You have to wait (\d+) minutes' + +    ERROR_PATTERN = r'(?:<div class="alert alert-danger">)(.+?)(?:</div>)' + + +getInfo = create_getInfo(SafesharingEu) diff --git a/module/plugins/hoster/UploadableCh.py b/module/plugins/hoster/UploadableCh.py new file mode 100644 index 000000000..77b3d7d8a --- /dev/null +++ b/module/plugins/hoster/UploadableCh.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- + +import re + +from time import sleep + +from module.plugins.internal.CaptchaService import ReCaptcha +from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo + + +class UploadableCh(SimpleHoster): +    __name__    = "UploadableCh" +    __type__    = "hoster" +    __version__ = "0.02" + +    __pattern__ = r'http://(?:www\.)?uploadable\.ch/file/(?P<ID>\w+)' + +    __description__ = """Uploadable.ch hoster plugin""" +    __license__     = "GPLv3" +    __authors__     = [("zapp-brannigan", "fuerst.reinje@web.de"), +                       ("Walter Purcaro", "vuolter@gmail.com")] + + +    FILE_INFO_PATTERN = r'div id=\"file_name\" title=.*>(?P<N>.+)<span class=\"filename_normal\">\((?P<S>[\d.]+) (?P<U>\w+)\)</span><' + +    OFFLINE_PATTERN      = r'>(File not available|This file is no longer available)' +    TEMP_OFFLINE_PATTERN = r'<div class="icon_err">' + +    WAIT_PATTERN = r'data-time="(\d+)" data-format' + +    FILE_URL_REPLACEMENTS = [(__pattern__ + ".*", r'http://www.uploadable.ch/file/\g<ID>')] + + +    def setup(self): +        self.multiDL    = False +        self.chunkLimit = 1 + + +    def handleFree(self): +        # Click the "free user" button and wait +        a = self.load(self.pyfile.url, cookies=True, post={'downloadLink': "wait"}, decode=True) +        self.logDebug(a) + +        m = re.search(self.WAIT_PATTERN, a) +        if m is not None: +            self.wait(int(m.group(1)))  #: Expected output: {"waitTime":30} +        else: +            self.error("WAIT_PATTERN") + +        # Make the recaptcha appear and show it the pyload interface +        b = self.load(self.pyfile.url, cookies=True, post={'checkDownload': "check"}, decode=True) +        self.logDebug(b)  #: Expected output: {"success":"showCaptcha"} + +        recaptcha = ReCaptcha(self) + +        challenge, captcha = recaptcha.challenge(self.RECAPTCHA_KEY) + +        # Submit the captcha solution +        self.load("http://www.uploadable.ch/checkReCaptcha.php", +                  cookies=True, +                  post={'recaptcha_challenge_field'  : challenge, +                        'recaptcha_response_field'   : captcha, +                        'recaptcha_shortencode_field': self.info['ID']}, +                  decode=True) + +        self.wait(3) + +        # Get ready for downloading +        self.load(self.pyfile.url, cookies=True, post={'downloadLink': "show"}, decode=True) + +        self.wait(3) + +        # Download the file +        self.download(self.pyfile.url, cookies=True, post={'download': "normal"}, disposition=True) + + +    def checkFile(self): +        check = self.checkDownload({'wait_or_reconnect': re.compile("Please wait for"), +                                    'is_html'          : re.compile("<head>")}) + +        if check == "wait_or_reconnect": +            self.logInfo("Downloadlimit reached, please wait or reconnect") +            self.wait(60 * 60, True) +            self.retry() + +        elif check == "is_html": +            self.error("Downloaded file is an html file") + + +getInfo = create_getInfo(UploadableCh) | 
