diff options
| author | 2012-10-03 01:14:48 +0200 | |
|---|---|---|
| committer | 2012-10-03 01:14:48 +0200 | |
| commit | 5658d5525d5088a6254322210c1641cbdba2eb7d (patch) | |
| tree | f4f256e082d4f906ba11b25ccaedc1e39e652ba3 | |
| parent | little multihoster fix (diff) | |
| download | pyload-5658d5525d5088a6254322210c1641cbdba2eb7d.tar.xz | |
update czshare, little fixes
| -rw-r--r-- | module/plugins/accounts/CzshareCom.py | 6 | ||||
| -rw-r--r-- | module/plugins/hoster/CzshareCom.py | 106 | ||||
| -rw-r--r-- | module/plugins/hoster/LoadTo.py | 7 | ||||
| -rw-r--r-- | module/plugins/hoster/RapidgatorNet.py | 11 | ||||
| -rw-r--r-- | module/plugins/internal/CaptchaService.py | 2 | ||||
| -rw-r--r-- | module/plugins/internal/MultiHoster.py | 47 | 
6 files changed, 76 insertions, 103 deletions
| diff --git a/module/plugins/accounts/CzshareCom.py b/module/plugins/accounts/CzshareCom.py index 695e21b18..e68248aa8 100644 --- a/module/plugins/accounts/CzshareCom.py +++ b/module/plugins/accounts/CzshareCom.py @@ -24,7 +24,7 @@ import re  class CzshareCom(Account):      __name__ = "CzshareCom" -    __version__ = "0.1" +    __version__ = "0.11"      __type__ = "account"      __description__ = """czshare.com account plugin"""      __author_name__ = ("zoidberg") @@ -48,11 +48,11 @@ class CzshareCom(Account):      def login(self, user, data, req): -        html = req.load('http://czshare.com/index.php', post={ +        html = req.load('https://czshare.com/index.php', post={                  "Prihlasit": "Prihlasit",                  "login-password": data["password"],                  "login-name": user                  }) -        if "<p>You input a wrong user name or wrong password</p>" in html: +        if '<div class="login' in html:              self.wrongPassword() diff --git a/module/plugins/hoster/CzshareCom.py b/module/plugins/hoster/CzshareCom.py index 8d035b64c..c8a576b29 100644 --- a/module/plugins/hoster/CzshareCom.py +++ b/module/plugins/hoster/CzshareCom.py @@ -17,42 +17,24 @@  """  import re -from module.plugins.internal.SimpleHoster import SimpleHoster, parseFileInfo, PluginParseError -from module.network.RequestFactory import getURL - -def toInfoPage(url): -    if r"/download.php?" in url: -        try: -            id = re.search(r"id=(\d+)", url).group(1) -            code = re.search(r"code=(\w+)", url).group(1) -        except Exception, e: -            return None -        return "http://czshare.com/%s/%s/" % (id, code) -    return url - -def getInfo(urls): -    result = [] - -    for url in urls: -        info_url = toInfoPage(url) -        if info_url: -            file_info = parseFileInfo(CzshareCom, url, getURL(info_url, decode=True))  -            result.append(file_info) -             -    yield result +from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo +from module.utils import parseFileSize  class CzshareCom(SimpleHoster):      __name__ = "CzshareCom"      __type__ = "hoster"      __pattern__ = r"http://(\w*\.)*czshare\.(com|cz)/(\d+/|download.php\?).*" -    __version__ = "0.90" +    __version__ = "0.91"      __description__ = """CZshare.com"""      __author_name__ = ("zoidberg")      FILE_NAME_PATTERN = r'<div class="tab" id="parameters">\s*<p>\s*Cel. n.zev: <a href=[^>]*>(?P<N>[^<]+)</a>'      FILE_SIZE_PATTERN = r'<div class="tab" id="category">(?:\s*<p>[^\n]*</p>)*\s*Velikost:\s*(?P<S>[0-9., ]+)(?P<U>[kKMG])i?B\s*</div>'      FILE_OFFLINE_PATTERN = r'<div class="header clearfix">\s*<h2 class="red">' +          FILE_SIZE_REPLACEMENTS = [(' ', '')] +    FILE_URL_REPLACEMENTS = [(r'http://[^/]*/download.php\?.*?id=(\w+).*', r'http://czshare.com/\1/x/')] +    SH_CHECK_TRAFFIC = True      FREE_URL_PATTERN = r'<a href="([^"]+)" class="page-download">[^>]*alt="([^"]+)" /></a>'      FREE_FORM_PATTERN = r'<form action="download.php" method="post">\s*<img src="captcha.php" id="captcha" />(.*?)</form>' @@ -65,20 +47,7 @@ class CzshareCom(SimpleHoster):          self.multiDL = self.resumeDownload = True if self.premium else False          self.chunkLimit = 1 -    def process(self, pyfile): -        url = toInfoPage(pyfile.url) -        if not url: -            self.logError(e) -            self.fail("Invalid URL") - -        self.html = self.load(url, cookies=True, decode=True) -        self.getFileInfo() - -        if not self.account or not self.handlePremium(): -            self.handleFree() -        self.checkDownloadedFile() - -    def handlePremium(self): +    def checkTrafficLeft(self):          # check if user logged in          found = re.search(self.USER_CREDIT_PATTERN, self.html)          if not found: @@ -89,17 +58,19 @@ class CzshareCom(SimpleHoster):          # check user credit          try: -            credit = float(found.group(1).replace(',','.').replace(' ','')) -            credit = credit * 1024 ** {'KB': 0, 'MB': 1, 'GB': 2}[found.group(2)] +            credit = parseFileSize(found.group(1).replace(' ',''), found.group(2))              self.logInfo("Premium download for %i KiB of Credit" % (self.pyfile.size / 1024)) -            self.logInfo("User %s has %i KiB left" % (self.user, credit)) -            if credit * 1024 < self.pyfile.size: +            self.logInfo("User %s has %i KiB left" % (self.user, credit / 1024)) +            if credit < self.pyfile.size:                  self.logInfo("Not enough credit to download file %s" % self.pyfile.name) -                self.resetAccount() +                return False          except Exception, e:              # let's continue and see what happens...              self.logError('Parse error (CREDIT): %s' % e) - +         +        return True  +     +    def handlePremium(self):                  # parse download link          try:              form = re.search(self.PREMIUM_FORM_PATTERN, self.html, re.DOTALL).group(1) @@ -110,7 +81,7 @@ class CzshareCom(SimpleHoster):          # download the file, destination is determined by pyLoad          self.download("http://czshare.com/profi_down.php", cookies=True, post=inputs) -        return True +        self.checkDownloadedFile()      def handleFree(self):          # get free url @@ -121,11 +92,9 @@ class CzshareCom(SimpleHoster):          self.logDebug("PARSED_URL:" + parsed_url)          # get download ticket and parse html -        self.html = self.load(parsed_url, cookies=True) - -        #if not re.search(self.FREE_FORM_PATTERN, self.html): +        self.html = self.load(parsed_url, cookies=True, decode=True)          if re.search(self.MULTIDL_PATTERN, self.html): -           self.waitForFreeSlot() +           self.longWait(300, 12)          try:              form = re.search(self.FREE_FORM_PATTERN, self.html, re.DOTALL).group(1) @@ -135,15 +104,20 @@ class CzshareCom(SimpleHoster):              self.logError(e)              raise PluginParseError('Form') -        # get and decrypt captcha +        # get and decrypt captcha                  captcha_url = 'http://czshare.com/captcha.php' -        inputs['captchastring2'] = self.decryptCaptcha(captcha_url) -        self.logDebug('CAPTCHA_URL:' + captcha_url + ' CAPTCHA:' + inputs['captchastring2']) - -        self.html = self.load(parsed_url, cookies=True, post=inputs) -         -        if re.search(self.MULTIDL_PATTERN, self.html): -           self.waitForFreeSlot() +        for i in range(5): +            inputs['captchastring2'] = self.decryptCaptcha(captcha_url) +            self.html = self.load(parsed_url, cookies=True, post=inputs, decode=True) +            if u"<li>Zadaný ověřovací kód nesouhlasí!</li>" in self.html: +                self.invalidCaptcha() +            elif re.search(self.MULTIDL_PATTERN, self.html): +                self.longWait(300, 12) +            else: +                self.correctCaptcha() +                break +        else: +            self.fail("No valid captcha code entered")          found = re.search("countdown_number = (\d+);", self.html)          self.setWait(int(found.group(1)) if found else 50) @@ -158,26 +132,26 @@ class CzshareCom(SimpleHoster):          self.wait()           self.multiDL = True            -        self.download(url)     +        self.download(url) +        self.checkDownloadedFile()      def checkDownloadedFile(self):          # check download          check = self.checkDownload({ -            "tempoffline": re.compile(r"^Soubor je do.asn. nedostupn.$"), +            "tempoffline": re.compile(r"^Soubor je do.*asn.* nedostupn.*$"), +            "credit": re.compile(r"^Nem.*te dostate.*n.* kredit.$"),              "multi_dl": re.compile(self.MULTIDL_PATTERN),              "captcha_err": "<li>Zadaný ověřovací kód nesouhlasí!</li>"              })          if check == "tempoffline":              self.fail("File not available - try later") +        if check == "credit": +            self.resetAccount()          elif check == "multi_dl": -            self.waitForFreeSlot() +            self.longWait(300, 12)          elif check == "captcha_err":              self.invalidCaptcha()              self.retry() - -    def waitForFreeSlot(self, wait_time = 300): -        self.multiDL = False -        self.setWait(wait_time, True) -        self.wait() -        self.retry()
\ No newline at end of file +         +getInfo = create_getInfo(CzshareCom)
\ No newline at end of file diff --git a/module/plugins/hoster/LoadTo.py b/module/plugins/hoster/LoadTo.py index 66bc6f407..babf354a9 100644 --- a/module/plugins/hoster/LoadTo.py +++ b/module/plugins/hoster/LoadTo.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- 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 @@ -43,7 +43,7 @@ class LoadTo(Hoster):      __name__ = "LoadTo"      __type__ = "hoster"      __pattern__ = r"http://(www.*?\.)?load\.to/.{7,10}?/.*"  -    __version__ = "0.1002" +    __version__ = "0.11"      __description__ = """load.to"""      __author_name__ = ("halfman")      __author_mail__ = ("Pulpan3@gmail.com") @@ -79,4 +79,5 @@ class LoadTo(Hoster):              self.setWait(timmy.group(1))              self.wait() -        self.download(download_url) +        self.req.setOption("timeout", 120) +        self.download(download_url)
\ No newline at end of file diff --git a/module/plugins/hoster/RapidgatorNet.py b/module/plugins/hoster/RapidgatorNet.py index 291ba4c4b..6c09eabb9 100644 --- a/module/plugins/hoster/RapidgatorNet.py +++ b/module/plugins/hoster/RapidgatorNet.py @@ -21,7 +21,7 @@ from pycurl import HTTPHEADER  from random import random  from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo -from module.plugins.internal.CaptchaServices import ReCaptcha, SolveMedia, AdsCaptcha +from module.plugins.internal.CaptchaService import ReCaptcha, SolveMedia, AdsCaptcha  from module.common.json_layer import json_loads  class RapidgatorNet(SimpleHoster): @@ -42,14 +42,7 @@ class RapidgatorNet(SimpleHoster):      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 process(self, pyfile): -        self.pyfile = pyfile -        if self.premium: -            self.handlePremium() -        else: -            self.fail("NO FREE") -     +             def getAPIResponse(self, cmd):          json = self.load('%s/%s' % (self.API_URL, cmd),                            get = {'sid': self.account.getAccountData(self.user).get('SID'),  diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index 8be442d37..f2de00732 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -18,7 +18,7 @@  import re -class CaptchaService()     +class CaptchaService():          __version__ = "0.01"      def __init__(self, plugin): diff --git a/module/plugins/internal/MultiHoster.py b/module/plugins/internal/MultiHoster.py index f35f35c5c..a8961aafc 100644 --- a/module/plugins/internal/MultiHoster.py +++ b/module/plugins/internal/MultiHoster.py @@ -11,24 +11,20 @@ class MultiHoster(Hook):      Generic MultiHoster plugin      """ -    __version__ = "0.18" +    __version__ = "0.19"      replacements = [("2shared.com", "twoshared.com"), ("4shared.com", "fourshared.com"), ("cloudnator.com", "shragle.com"),                      ("ifile.it", "filecloud.io"), ("easy-share.com","crocko.com"), ("freakshare.net","freakshare.com"),                      ("hellshare.com", "hellshare.cz"), ("share-rapid.cz","sharerapid.com"), ("sharerapid.cz","sharerapid.com"),                      ("ul.to","uploaded.to"), ("uploaded.net","uploaded.to"), ("1fichier.com", "onefichier.com")]      ignored = [] -    interval = 24 * 60 * 60 +    interval = 24 * 60 * 60 # reload hosters daily      def setup(self):          self.hosters = []          self.supported = []          self.new_supported = [] -        cfg_interval = self.getConfig("interval", None) # reload interval in hours -        if cfg_interval is not None: -            self.interval = cfg_interval * 60 * 60 -              def getConfig(self, option, default = ''):          """getConfig with default value - sublass may not implements all config options"""           try: @@ -63,14 +59,14 @@ class MultiHoster(Hook):          return self.hosters      def toHosterSet(self, hosters): -        hosters = set((x.strip().lower() for x in hosters)) +        hosters = set((str(x).strip().lower() for x in hosters))          for rep in self.replacements:              if rep[0] in hosters:                  hosters.remove(rep[0])                  hosters.add(rep[1]) -        hosters.discard(u'')         +        hosters.discard('')                return hosters      def getHoster(self): @@ -81,14 +77,27 @@ class MultiHoster(Hook):          raise NotImplementedError      def coreReady(self): -        if not self.interval: -            if self.cb: -                self.core.scheduler.removeJob(self.cb) -            self.overridePlugins()  +        if self.cb: +            self.core.scheduler.removeJob(self.cb) +             +        self.setConfig("activated", True) # config not in sync after plugin reload +         +        cfg_interval = self.getConfig("interval", None) # reload interval in hours +        if cfg_interval is not None: +            self.interval = cfg_interval * 60 * 60             +                 +        if self.interval: +            self._periodical() +        else: +            self.periodical() +             +    def initPeriodical(self): +        pass             def periodical(self):          """reload hoster list periodically"""          self.logInfo("Reloading supported hoster list") +                  old_supported = self.supported          self.supported, self.new_supported, self.hosters = [], [], [] @@ -96,9 +105,9 @@ class MultiHoster(Hook):          old_supported = [hoster for hoster in old_supported if hoster not in self.supported]          if old_supported: -            self.logDebug("UNLOAD", old_supported) +            self.logDebug("UNLOAD: %s" % ", ".join(old_supported))              for hoster in old_supported: -                self.unloadHoster(hoster)    +                self.unloadHoster(hoster)      def overridePlugins(self):          pluginMap = {} @@ -160,7 +169,7 @@ class MultiHoster(Hook):              del dict["new_name"]      def unload(self): -        """remove override for all hosters""" +        """Remove override for all hosters. Scheduler job is removed by hookmanager"""          for hoster in self.supported:              self.unloadHoster(hoster) @@ -168,11 +177,7 @@ class MultiHoster(Hook):          klass = getattr(self.core.pluginManager.getPlugin(self.__name__), self.__name__)          dict = self.core.pluginManager.hosterPlugins[self.__name__]          dict["pattern"] = getattr(klass, '__pattern__', r"^unmatchable$")  -        dict["re"] = re.compile(dict["pattern"]) -         -        # remove scheduler job -        if self.cb: -            self.core.scheduler.removeJob(self.cb)       +        dict["re"] = re.compile(dict["pattern"])         def downloadFailed(self, pyfile):          """remove plugin override if download fails but not if file is offline/temp.offline"""   @@ -181,4 +186,4 @@ class MultiHoster(Hook):              if "new_name" in hdict and hdict['new_name'] == self.__name__:                  self.logDebug("Unload MultiHoster", pyfile.pluginname, hdict)                      self.unloadHoster(pyfile.pluginname) -                pyfile.setStatus("queued") +                pyfile.setStatus("queued")
\ No newline at end of file | 
