diff options
Diffstat (limited to 'module')
| -rw-r--r-- | module/plugins/hoster/LetitbitNet.py | 64 | ||||
| -rw-r--r-- | module/plugins/internal/SimpleHoster.py | 30 | 
2 files changed, 55 insertions, 39 deletions
| diff --git a/module/plugins/hoster/LetitbitNet.py b/module/plugins/hoster/LetitbitNet.py index 8ac4b8f7f..4ff2b9750 100644 --- a/module/plugins/hoster/LetitbitNet.py +++ b/module/plugins/hoster/LetitbitNet.py @@ -17,56 +17,41 @@  """  import re +from random import random  from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo  class LetitbitNet(SimpleHoster):      __name__ = "LetitbitNet"      __type__ = "hoster"      __pattern__ = r"http://(?:\w*\.)*letitbit.net/download/.*" -    __version__ = "0.12" +    __version__ = "0.13"      __description__ = """letitbit.net"""      __author_name__ = ("zoidberg")      __author_mail__ = ("zoidberg@mujmail.cz") -    FORM_PATTERN = r'<form%s action="([^"]+)" method="post"%s>(.*?)</form>' -    FORM_INPUT_PATTERN = r'<input[^>]* name="([^"]+)" value="([^"]+)" />' -    CHECK_URL_PATTERN = r"ajax_check_url\s*=\s*'([^']+)';" +    CHECK_URL_PATTERN = r"ajax_check_url\s*=\s*'((http://[^/]+)[^']+)';"      SECONDS_PATTERN = r"seconds\s*=\s*(\d+);" -    FILE_INFO_PATTERN = r'<h1[^>]*>File: <a[^>]*><span>(?P<N>[^<]+)</span></a> [<span>(?P<S>[0-9.]+)\s*(?P<U>[kKMG])i?[Bb]</span>]</h1>' +    FILE_INFO_PATTERN = r'<h1[^>]*>File: <a[^>]*><span>(?P<N>[^<]+)</span></a>\s*\[<span>(?P<S>[^<]+)</span>]</h1>'      FILE_OFFLINE_PATTERN = r'<div id="download_content" class="hide-block">[^<]*<br>File not found<br /></div>' -    def setup(self): -        self.resumeDownload = self.multiDL = True if self.account else False -        self.chunkLimit = 1 +    def handleFree(self): +        action, inputs = self.parseHtmlForm('id="ifree_form"') +        if not action: self.parseError("page 1 / ifree_form") +        self.pyfile.size = float(inputs['sssize']) +        #self.logDebug(action, inputs) +        inputs['desc'] = "" -    def process(self, pyfile): -        self.html = self.load(pyfile.url, decode=True) -        if re.search(self.FILE_OFFLINE_PATTERN, self.html): self.offline() +        self.html = self.load("http://letitbit.net" + action, post = inputs, cookies = True) -        try: -            action, form = re.search(self.FORM_PATTERN % (' id="ifree_form"', ''), self.html, re.DOTALL).groups() -            inputs = dict(re.findall(self.FORM_INPUT_PATTERN, form)) -            pyfile.name = inputs['name'] -            pyfile.size = float(inputs['sssize'])/1024 -        except Exception, e: -            self.logError(e) -            self.parseError("page 1 / ifree_form") +        action, inputs = self.parseHtmlForm('id="d3_form"') +        if not action: self.parseError("page 2 / d3_form") +        #self.logDebug(action, inputs) -        #self.logDebug(inputs) -        inputs['desc'] = "" -        self.html = self.load("http://letitbit.net" + action, post = inputs) - -        try: -            action, form = re.search(self.FORM_PATTERN % ('', ' id="d3_form"'), self.html, re.DOTALL).groups() -            inputs = dict(re.findall(self.FORM_INPUT_PATTERN, form)) -        except Exception, e: -            self.logError(e) -            self.parseError("page 2 / d3_form") +        self.html = self.load(action, post = inputs, cookies = True) -        self.html = self.load(action, post = inputs)          try: -            ajax_check_url = re.search(self.CHECK_URL_PATTERN, self.html).group(1) +            ajax_check_url, captcha_url = re.search(self.CHECK_URL_PATTERN, self.html).groups()              found = re.search(self.SECONDS_PATTERN, self.html)              seconds = int(found.group(1)) if found else 60              self.setWait(seconds+1) @@ -75,7 +60,22 @@ class LetitbitNet(SimpleHoster):              self.logError(e)              self.parseError("page 3 / js") -        download_url = self.load(ajax_check_url, post = inputs) +        response = self.load(ajax_check_url, post = inputs, cookies = True) +        if response != '1': self.fail('Unknown response (ajax_check_url)') +         +        for i in range(5): +            captcha = self.decryptCaptcha('%s/captcha_new.php?rand=%d' % (captcha_url, random() * 100000), cookies = True) +            response = self.load(captcha_url + '/ajax/check_captcha.php', post = {"code": captcha}, cookies = True) +            self.logDebug(response) +            if response.startswith('http://'): +                download_url = response +                self.correctCaptcha() +                break +            else: +                self.invalidCaptcha() +        else: +            self.fail("No valid captcha solution received") +                  self.download(download_url)  getInfo = create_getInfo(LetitbitNet)
\ No newline at end of file diff --git a/module/plugins/internal/SimpleHoster.py b/module/plugins/internal/SimpleHoster.py index aae76e781..d4d74057e 100644 --- a/module/plugins/internal/SimpleHoster.py +++ b/module/plugins/internal/SimpleHoster.py @@ -17,7 +17,7 @@      @author: zoidberg  """  from urlparse import urlparse -from re import search, sub +import re  from module.plugins.Hoster import Hoster  from module.utils import html_unescape, parseFileSize @@ -26,21 +26,25 @@ from module.network.RequestFactory import getURL  def reSub(string, ruleslist):      for r in ruleslist:          rf, rt = r -        string = sub(rf, rt, string) +        string = re.sub(rf, rt, string)      return string +     +def parseHtmlTagAttrValue(attr_name, tag): +        m = re.search(r"%s\s*=\s*([\"']?)((?<=\")[^\"]+|(?<=')[^']+|[^\s\"'][^>\s]+)\1" % attr_name, tag)    +        return m.group(2) if m else ''  def parseFileInfo(self, url = '', html = '', infomode = False):      if not html and hasattr(self, "html"): html = self.html      info = {"name" : url, "size" : 0, "status" : 3}      online = False -    if hasattr(self, "FILE_OFFLINE_PATTERN") and search(self.FILE_OFFLINE_PATTERN, html): +    if hasattr(self, "FILE_OFFLINE_PATTERN") and re.search(self.FILE_OFFLINE_PATTERN, html):          # File offline          info['status'] = 1      else:          for pattern in ("FILE_INFO_PATTERN", "FILE_NAME_PATTERN", "FILE_SIZE_PATTERN"):              try: -                info = dict(info, **search(getattr(self, pattern), html).groupdict()) +                info = dict(info, **re.search(getattr(self, pattern), html).groupdict())                  online = True              except AttributeError:                  continue @@ -77,7 +81,7 @@ class PluginParseError(Exception):  class SimpleHoster(Hoster):      __name__ = "SimpleHoster" -    __version__ = "0.14" +    __version__ = "0.15"      __pattern__ = None      __type__ = "hoster"      __description__ = """Base hoster plugin""" @@ -110,7 +114,7 @@ class SimpleHoster(Hoster):      def getFileInfo(self):          self.logDebug("URL: %s" % self.pyfile.url) -        if hasattr(self, "TEMP_OFFLINE_PATTERN") and search(self.TEMP_OFFLINE_PATTERN, self.html): +        if hasattr(self, "TEMP_OFFLINE_PATTERN") and re.search(self.TEMP_OFFLINE_PATTERN, self.html):              self.tempOffline()          file_info = parseFileInfo(self, infomode = True) @@ -140,4 +144,16 @@ class SimpleHoster(Hoster):          self.fail("Premium download not implemented")      def parseError(self, msg): -        raise PluginParseError(msg)
\ No newline at end of file +        raise PluginParseError(msg)    + +    def parseHtmlForm(self, attr_str): +        inputs = {} +        action = None  +        form = re.search(r"(?P<tag><form[^>]*%s[^>]*>)(?P<content>.*?)</form[^>]*>" % attr_str, self.html, re.S) +        if form: +            action = parseHtmlTagAttrValue("action", form.group('tag')) +            for input in re.finditer(r'(<(?:input|textarea)[^>]*>)', form.group('content')): +                name = parseHtmlTagAttrValue("name", input.group(1)) +                if name: +                    inputs[name] = parseHtmlTagAttrValue("value", input.group(1))  +        return action, inputs
\ No newline at end of file | 
