diff options
| -rw-r--r-- | module/plugins/hoster/RapidgatorNet.py | 154 | 
1 files changed, 80 insertions, 74 deletions
| diff --git a/module/plugins/hoster/RapidgatorNet.py b/module/plugins/hoster/RapidgatorNet.py index 611d2ba5d..4229b2aa1 100644 --- a/module/plugins/hoster/RapidgatorNet.py +++ b/module/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) | 
