diff options
author | Walter Purcaro <vuolter@gmail.com> | 2014-03-19 15:00:38 +0100 |
---|---|---|
committer | Stefano <l.stickell@yahoo.it> | 2014-04-21 17:06:21 +0200 |
commit | 2b4d680099fa0575bffb9acd49c9950a73652f1d (patch) | |
tree | e0d8219f0b1d7180963c1dcff2eeb49206752f67 | |
parent | OneFichier: Fixed #536 (diff) | |
download | pyload-2b4d680099fa0575bffb9acd49c9950a73652f1d.tar.xz |
Rapidgator: Pattern updated
-rw-r--r-- | pyload/plugins/hoster/RapidgatorNet.py | 154 |
1 files changed, 80 insertions, 74 deletions
diff --git a/pyload/plugins/hoster/RapidgatorNet.py b/pyload/plugins/hoster/RapidgatorNet.py index 611d2ba5d..4229b2aa1 100644 --- a/pyload/plugins/hoster/RapidgatorNet.py +++ b/pyload/plugins/hoster/RapidgatorNet.py @@ -1,52 +1,58 @@ # -*- coding: utf-8 -*- -""" - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, - or (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. - - @author: zoidberg -""" +############################################################################### +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +# @author: zoidberg +############################################################################### import re from pycurl import HTTPHEADER -from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo -from module.plugins.internal.CaptchaService import ReCaptcha, SolveMedia, AdsCaptcha from module.common.json_layer import json_loads from module.network.HTTPRequest import BadHeader +from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo +from module.plugins.internal.CaptchaService import ReCaptcha, SolveMedia, AdsCaptcha class RapidgatorNet(SimpleHoster): __name__ = "RapidgatorNet" __type__ = "hoster" - __pattern__ = r"http://(?:www\.)?(rapidgator.net)/file/(\w+)" - __version__ = "0.19" - __description__ = """rapidgator.net""" - __author_name__ = ("zoidberg", "chrox", "stickell") + __pattern__ = r"http://(?:www\.)?rapidgator\.net/file/\w+" + __version__ = "0.20" + __description__ = """Rapidgator.net hoster plugin""" + __author_name__ = ("zoidberg", "chrox", "stickell", "Walter Purcaro") + __author_mail__ = ("zoidberg@mujmail.cz", "", "l.stickell@yahoo.it", "vuolter@gmail.com") API_URL = 'http://rapidgator.net/api/file' - FILE_NAME_PATTERN = r'Downloading:(?:\s*<[^>]*>)*\s*(?P<N>.*?)(?:\s*<[^>]*>)' - FILE_SIZE_PATTERN = r'File size:\s*<strong>(?P<S>.*?)</strong>' - FILE_OFFLINE_PATTERN = r'<title>File not found</title>' + FILE_NAME_PATTERN = r'<title>Download file (?P<N>.*)</title>' + FILE_SIZE_PATTERN = r'File size:\s*<strong>(?P<S>[\d\.]+) (?P<U>\w+)</strong>' + FILE_OFFLINE_PATTERN = r'>(File not found|Error 404)' JSVARS_PATTERN = r"\s+var\s*(startTimerUrl|getDownloadUrl|captchaUrl|fid|secs)\s*=\s*'?(.*?)'?;" - DOWNLOAD_LINK_PATTERN = r"return '(http[^']+)';\s*}\s*}\s*}?\);" - RECAPTCHA_KEY_PATTERN = r'"http://api.recaptcha.net/challenge?k=(.*?)"' - ADSCAPTCHA_SRC_PATTERN = r'(http://api.adscaptcha.com/Get.aspx[^"\']*)' - SOLVEMEDIA_PATTERN = r'http:\/\/api\.solvemedia\.com\/papi\/challenge\.script\?k=(.*?)"' + PREMIUM_ONLY_ERROR_PATTERN = r'You can download files up to|This file can be downloaded by premium only<' + DOWNLOAD_LIMIT_ERROR_PATTERN = r'You have reached your (daily|hourly) downloads limit' + WAIT_PATTERN = r'(?:Delay between downloads must be not less than|Try again in)\s*(\d+)\s*(hour|min)' + DOWNLOAD_LINK_PATTERN = r"return '(http://\w+.rapidgator.net/.*)';" + + RECAPTCHA_KEY_PATTERN = r'"http://api\.recaptcha\.net/challenge\?k=(.*?)"' + ADSCAPTCHA_SRC_PATTERN = r'(http://api\.adscaptcha\.com/Get\.aspx[^"\']*)' + SOLVEMEDIA_PATTERN = r'http://api\.solvemedia\.com/papi/challenge\.script\?k=(.*?)"' def setup(self): - self.resumeDownload = self.multiDL = False + self.resumeDownload = self.multiDL = self.premium self.sid = None self.chunkLimit = 1 self.req.setOption("timeout", 120) @@ -60,7 +66,7 @@ class RapidgatorNet(SimpleHoster): else: self.handleFree() - def getAPIResponse(self, cmd): + def api_response(self, cmd): try: json = self.load('%s/%s' % (self.API_URL, cmd), get={'sid': self.sid, @@ -85,23 +91,17 @@ class RapidgatorNet(SimpleHoster): def handlePremium(self): #self.logDebug("ACCOUNT_DATA", self.account.getAccountData(self.user)) - self.api_data = self.getAPIResponse('info') + self.api_data = self.api_response('info') self.api_data['md5'] = self.api_data['hash'] self.pyfile.name = self.api_data['filename'] self.pyfile.size = self.api_data['size'] - url = self.getAPIResponse('download')['url'] - self.multiDL = True + url = self.api_response('download')['url'] self.download(url) def handleFree(self): self.html = self.load(self.pyfile.url, decode=True) - self.getFileInfo() - if ("You can download files up to 500 MB in free mode" in self.html or - "This file can be downloaded by premium only" in self.html): - self.fail("Premium account needed for download") - - self.checkWait() + self.checkFree() jsvars = dict(re.findall(self.JSVARS_PATTERN, self.html)) self.logDebug(jsvars) @@ -113,8 +113,7 @@ class RapidgatorNet(SimpleHoster): jsvars.get('startTimerUrl', '/download/AjaxStartTimer'), jsvars["fid"]) jsvars.update(self.getJsonResponse(url)) - self.setWait(int(jsvars.get('secs', 30)) + 1, False) - self.wait() + self.wait(int(jsvars.get('secs', 45)) + 1, False) url = "http://rapidgator.net%s?sid=%s" % ( jsvars.get('getDownloadUrl', '/download/AjaxGetDownload'), jsvars["sid"]) @@ -125,6 +124,32 @@ class RapidgatorNet(SimpleHoster): url = "http://rapidgator.net%s" % jsvars.get('captchaUrl', '/download/captcha') self.html = self.load(url) + + for _ in xrange(5): + found = re.search(self.DOWNLOAD_LINK_PATTERN, self.html) + if found: + link = found.group(1) + self.logDebug(link) + self.download(link, disposition=True) + break + else: + captcha, captcha_key = self.getCaptcha() + captcha_challenge, captcha_response = captcha.challenge(captcha_key) + + self.html = self.load(url, post={ + "DownloadCaptchaForm[captcha]": "", + "adcopy_challenge": captcha_challenge, + "adcopy_response": captcha_response + }) + + if "The verification code is incorrect" in self.html: + self.invalidCaptcha() + else: + self.correctCaptcha() + else: + self.parseError("Download link") + + def getCaptcha(self): found = re.search(self.ADSCAPTCHA_SRC_PATTERN, self.html) if found: captcha_key = found.group(1) @@ -134,7 +159,6 @@ class RapidgatorNet(SimpleHoster): if found: captcha_key = found.group(1) captcha = ReCaptcha(self) - else: found = re.search(self.SOLVEMEDIA_PATTERN, self.html) if found: @@ -143,47 +167,29 @@ class RapidgatorNet(SimpleHoster): else: self.parseError("Captcha") - for i in range(5): - self.checkWait() - captcha_challenge, captcha_response = captcha.challenge(captcha_key) - - self.html = self.load(url, post={ - "DownloadCaptchaForm[captcha]": "", - "adcopy_challenge": captcha_challenge, - "adcopy_response": captcha_response - }) + return captcha, captcha_key - if 'The verification code is incorrect' in self.html: - self.invalidCaptcha() - else: - self.correctCaptcha() - break + def checkFree(self): + found = re.search(self.PREMIUM_ONLY_ERROR_PATTERN, self.html) + if found: + self.fail("Premium account needed for download") else: - self.fail("No valid captcha solution received") - - found = re.search(self.DOWNLOAD_LINK_PATTERN, self.html) - if not found: - self.parseError("download link") - download_url = found.group(1) - self.logDebug(download_url) - self.download(download_url) - - def checkWait(self): - found = re.search(r"(?:Delay between downloads must be not less than|Try again in)\s*(\d+)\s*(hour|min)", - self.html) + found = re.search(self.WAIT_PATTERN, self.html) + if found: wait_time = int(found.group(1)) * {"hour": 60, "min": 1}[found.group(2)] else: - found = re.search(r"You have reached your (daily|hourly) downloads limit", self.html) - if found: + found = re.search(self.DOWNLOAD_LIMIT_ERROR_PATTERN, self.html) + if not found: + return + elif found.group(1) == "daily": wait_time = 60 else: - return + wait_time = 24 * 60 self.logDebug("Waiting %d minutes" % wait_time) - self.setWait(wait_time * 60, True) - self.wait() - self.retry(max_tries=24) + self.wait(wait_time * 60, True) + self.retry() def getJsonResponse(self, url): response = self.load(url, decode=True) |