diff options
Diffstat (limited to 'module/plugins')
| -rw-r--r-- | module/plugins/accounts/Ftp.py | 13 | ||||
| -rw-r--r-- | module/plugins/accounts/Http.py | 13 | ||||
| -rw-r--r-- | module/plugins/accounts/UptoboxCom.py | 12 | ||||
| -rw-r--r-- | module/plugins/hooks/AlldebridCom.py | 17 | ||||
| -rw-r--r-- | module/plugins/hooks/Checksum.py | 53 | ||||
| -rw-r--r-- | module/plugins/hooks/EasybytezCom.py | 24 | ||||
| -rw-r--r-- | module/plugins/hooks/MultishareCz.py | 16 | ||||
| -rw-r--r-- | module/plugins/hooks/Premium4Me.py | 15 | ||||
| -rw-r--r-- | module/plugins/hooks/PremiumizeMe.py | 19 | ||||
| -rw-r--r-- | module/plugins/hooks/RealdebridCom.py | 17 | ||||
| -rw-r--r-- | module/plugins/hooks/RehostTo.py | 2 | ||||
| -rw-r--r-- | module/plugins/hooks/ZeveraCom.py | 22 | ||||
| -rw-r--r-- | module/plugins/hoster/BasePlugin.py | 58 | ||||
| -rw-r--r-- | module/plugins/hoster/Ftp.py | 73 | ||||
| -rw-r--r-- | module/plugins/hoster/UptoboxCom.py | 20 | ||||
| -rw-r--r-- | module/plugins/internal/MultiHoster.py | 111 | ||||
| -rw-r--r-- | module/plugins/internal/XFSPAccount.py | 2 | 
17 files changed, 304 insertions, 183 deletions
| diff --git a/module/plugins/accounts/Ftp.py b/module/plugins/accounts/Ftp.py new file mode 100644 index 000000000..9c1081662 --- /dev/null +++ b/module/plugins/accounts/Ftp.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +from module.plugins.Account import Account + +class Ftp(Account): +    __name__ = "Ftp" +    __version__ = "0.01" +    __type__ = "account" +    __description__ = """Ftp dummy account plugin""" +    __author_name__ = ("zoidberg") +    __author_mail__ = ("zoidberg@mujmail.cz") +     +    login_timeout = info_threshold = 1000000
\ No newline at end of file diff --git a/module/plugins/accounts/Http.py b/module/plugins/accounts/Http.py new file mode 100644 index 000000000..805d19900 --- /dev/null +++ b/module/plugins/accounts/Http.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +from module.plugins.Account import Account + +class Http(Account): +    __name__ = "Http" +    __version__ = "0.01" +    __type__ = "account" +    __description__ = """Http dummy account plugin""" +    __author_name__ = ("zoidberg") +    __author_mail__ = ("zoidberg@mujmail.cz") +     +    login_timeout = info_threshold = 1000000
\ No newline at end of file diff --git a/module/plugins/accounts/UptoboxCom.py b/module/plugins/accounts/UptoboxCom.py new file mode 100644 index 000000000..b07991817 --- /dev/null +++ b/module/plugins/accounts/UptoboxCom.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +from module.plugins.internal.XFSPAccount import XFSPAccount + +class UptoboxCom(XFSPAccount): +    __name__ = "UptoboxCom" +    __version__ = "0.01" +    __type__ = "account" +    __description__ = """DDLStorage.com account plugin""" +    __author_name__ = ("zoidberg") +    __author_mail__ = ("zoidberg@mujmail.cz") +     +    MAIN_PAGE = "http://uptobox.com/"
\ No newline at end of file diff --git a/module/plugins/hooks/AlldebridCom.py b/module/plugins/hooks/AlldebridCom.py index f9657ed8c..91a0a6e5b 100644 --- a/module/plugins/hooks/AlldebridCom.py +++ b/module/plugins/hooks/AlldebridCom.py @@ -7,7 +7,7 @@ from module.plugins.internal.MultiHoster import MultiHoster  class AlldebridCom(MultiHoster):      __name__ = "AlldebridCom" -    __version__ = "0.11" +    __version__ = "0.12"      __type__ = "hook"      __config__ = [("activated", "bool", "Activated", "False"), @@ -19,21 +19,8 @@ class AlldebridCom(MultiHoster):      __author_name__ = ("Andy, Voigt")      __author_mail__ = ("spamsales@online.de") -    replacements = [("freakshare.net", "freakshare.com")] -      def getHoster(self):          https = "https" if self.getConfig("https") else "http"          page = getURL(https + "://www.alldebrid.com/api.php?action=get_host").replace("\"","").strip() -        hosters = set([x.strip() for x in page.split(",") if x.strip()]) -         -        configMode = self.getConfig('hosterListMode') -        if configMode in ("listed", "unlisted"): -            configList = set(self.getConfig('hosterList').strip().lower().replace('|',',').replace(';',',').split(',')) -            configList.discard(u'') -            if configMode == "listed": -                hosters &= configList -            else: -                hosters -= configList -         -        return list(hosters) +        return [x.strip() for x in page.split(",") if x.strip()] diff --git a/module/plugins/hooks/Checksum.py b/module/plugins/hooks/Checksum.py index aec4bd0d7..b290838bb 100644 --- a/module/plugins/hooks/Checksum.py +++ b/module/plugins/hooks/Checksum.py @@ -19,7 +19,8 @@  from __future__ import with_statement  import hashlib, zlib  from os import remove -from os.path import getsize, isfile +from os.path import getsize, isfile, splitext +import re  from module.utils import save_join, fs_encode  from module.plugins.Hook import Hook @@ -50,7 +51,7 @@ def computeChecksum(local_file, algorithm):  class Checksum(Hook):      __name__ = "Checksum" -    __version__ = "0.06" +    __version__ = "0.07"      __description__ = "Verify downloaded file size and checksum (enable in general preferences)"      __config__ = [("activated", "bool", "Activated", True),                    ("action", "fail;retry;nothing", "What to do if check fails?", "retry"), @@ -58,12 +59,19 @@ class Checksum(Hook):      __author_name__ = ("zoidberg")      __author_mail__ = ("zoidberg@mujmail.cz") +    methods = { 'sfv':'crc32', 'crc': 'crc32', 'hash': 'md5'} +    regexps = { 'sfv': r'^(?P<name>[^;].+)\s+(?P<hash>[0-9A-Fa-f]{8})$', +                'md5': r'^(?P<name>[0-9A-Fa-f]{32})  (?P<file>.+)$', +                'crc': r'filename=(?P<name>.+)\nsize=(?P<size>\d+)\ncrc32=(?P<hash>[0-9A-Fa-f]{8})$',   +                'default': r'^(?P<hash>[0-9A-Fa-f]+)\s+\*?(?P<name>.+)$' } +          def setup(self):     -        self.algorithms = sorted(getattr(hashlib, "algorithms", ("md5", "sha1", "sha224", "sha256", "sha384", "sha512")), reverse = True) -        self.algorithms.extend(["crc32", "adler32"]) -                  if not self.config['general']['checksum']: -            self.logInfo("Checksum validation is disabled in general configuration")                                   +            self.logInfo("Checksum validation is disabled in general configuration") + +        self.algorithms = sorted(getattr(hashlib, "algorithms", ("md5", "sha1", "sha224", "sha256", "sha384", "sha512")), reverse = True) +        self.algorithms.extend(["crc32", "adler32"])                     +        self.formats = self.algorithms + ['sfv', 'crc', 'hash']                                         def downloadFinished(self, pyfile):          """  @@ -127,4 +135,35 @@ class Checksum(Hook):          elif action == "retry":              if local_file:                  remove(local_file) -            pyfile.plugin.retry(reason = msg, max_tries = self.getConfig("max_tries"))
\ No newline at end of file +            pyfile.plugin.retry(reason = msg, max_tries = self.getConfig("max_tries")) + +            +    def packageFinished(self, pypack): +        download_folder = save_join(self.config['general']['download_folder'], pypack.folder, "") +         +        for link in pypack.getChildren().itervalues(): +            file_type = splitext(link["name"])[1][1:].lower() +            #self.logDebug(link, file_type) +             +            if file_type not in self.formats: +                continue +             +            hash_file = fs_encode(save_join(download_folder, link["name"]))    +            if not isfile(hash_file): +                self.logWarning("File not found: %s" % link["name"]) +                continue +                 +            with open(hash_file) as f: +                text = f.read() +                 +            for m in re.finditer(self.regexps.get(file_type, self.regexps['default']), text): +                data = m.groupdict()  +                self.logDebug(link["name"], data) +                                +                local_file = fs_encode(save_join(download_folder, data["name"])) +                algorithm = self.methods.get(file_type, file_type) +                checksum = computeChecksum(local_file, algorithm) +                if checksum == data["hash"]: +                    self.logInfo('File integrity of "%s" verified by %s checksum (%s).' % (data["name"], algorithm, checksum)) +                else: +                    self.logWarning("%s checksum for file %s does not match (%s != %s)" % (algorithm, data["name"], checksum, data["hash"]))
\ No newline at end of file diff --git a/module/plugins/hooks/EasybytezCom.py b/module/plugins/hooks/EasybytezCom.py index 21a988555..22b9050b4 100644 --- a/module/plugins/hooks/EasybytezCom.py +++ b/module/plugins/hooks/EasybytezCom.py @@ -11,7 +11,7 @@ def getConfigSet(option):  class EasybytezCom(MultiHoster):      __name__ = "EasybytezCom" -    __version__ = "0.02" +    __version__ = "0.03"      __type__ = "hook"      __config__ = [("activated", "bool", "Activated", "False"),                    ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), @@ -21,16 +21,16 @@ class EasybytezCom(MultiHoster):      __author_mail__ = ("zoidberg@mujmail.cz")      def getHoster(self): - -        hoster = set(['2shared.com', 'easy-share.com', 'filefactory.com', 'fileserve.com', 'filesonic.com', 'hotfile.com', 'mediafire.com', 'megaupload.com', 'netload.in', 'rapidshare.com', 'uploading.com', 'wupload.com', 'oron.com', 'uploadstation.com', 'ul.to', 'uploaded.to'])    +        self.account = self.core.accountManager.getAccountPlugin(self.__name__) +        user = self.account.selectAccount()[0] -        configMode = self.getConfig('hosterListMode') -        if configMode in ("listed", "unlisted"): -            configList = set(self.getConfig('hosterList').strip().lower().replace('|',',').replace(';',',').split(',')) -            configList.discard(u'') -            if configMode == "listed": -                hoster &= configList -            else: -                hoster -= configList +        try: +            req = self.account.getAccountRequest(user) +            page = req.load("http://www.easybytez.com") -        return list(hoster)
\ No newline at end of file +            found = re.search(r'</textarea>\s*Supported sites:(.*)', page) +            return found.group(1).split(',') +        except Exception, e: +            self.logDebug(e) +            self.logWarning("Unable to load supported hoster list, using last known") +            return ['bitshare.com', 'crocko.com', 'ddlstorage.com', 'depositfiles.com', 'extabit.com', 'hotfile.com', 'mediafire.com', 'netload.in', 'rapidgator.net', 'rapidshare.com', 'uploading.com', 'uload.to', 'uploaded.to']
\ No newline at end of file diff --git a/module/plugins/hooks/MultishareCz.py b/module/plugins/hooks/MultishareCz.py index a00c6cb2b..f8fa9290a 100644 --- a/module/plugins/hooks/MultishareCz.py +++ b/module/plugins/hooks/MultishareCz.py @@ -11,7 +11,7 @@ def getConfigSet(option):  class MultishareCz(MultiHoster):      __name__ = "MultishareCz" -    __version__ = "0.03" +    __version__ = "0.04"      __type__ = "hook"      __config__ = [("activated", "bool", "Activated", "False"),          ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"), @@ -20,21 +20,9 @@ class MultishareCz(MultiHoster):      __author_name__ = ("zoidberg")      __author_mail__ = ("zoidberg@mujmail.cz") -    replacements = [("share-rapid.cz", "sharerapid.com")]      HOSTER_PATTERN = r'<img class="logo-shareserveru"[^>]*?alt="([^"]+)"></td>\s*<td class="stav">[^>]*?alt="OK"'      def getHoster(self):          page = getURL("http://www.multishare.cz/monitoring/") -        hosters = set(h.lower().strip() for h in re.findall(self.HOSTER_PATTERN, page))  -         -        configMode = self.getConfig('hosterListMode') -        if configMode in ("listed", "unlisted"): -            configList = set(self.getConfig('hosterList').strip().lower().replace('|',',').replace(';',',').split(',')) -            configList.discard(u'') -            if configMode == "listed": -                hosters &= configList -            elif configMode == "unlisted": -                hosters -= configList -         -        return list(hosters)
\ No newline at end of file +        return re.findall(self.HOSTER_PATTERN, page)
\ No newline at end of file diff --git a/module/plugins/hooks/Premium4Me.py b/module/plugins/hooks/Premium4Me.py index fc3ce2343..b49eb41a9 100644 --- a/module/plugins/hooks/Premium4Me.py +++ b/module/plugins/hooks/Premium4Me.py @@ -15,23 +15,10 @@ class Premium4Me(MultiHoster):      __author_name__ = ("RaNaN", "zoidberg")
      __author_mail__ = ("RaNaN@pyload.org", "zoidberg@mujmail.cz")
 -    replacements = [("freakshare.net", "freakshare.com")]
 -
      def getHoster(self):
          page = getURL("http://premium4.me/api/hosters.php?authcode=%s" % self.account.authcode)
 -        hosters = set([x.strip() for x in page.replace("\"", "").split(";")])
 -        
 -        configMode = self.getConfig('hosterListMode')
 -        if configMode in ("listed", "unlisted"):
 -            configList = set(self.getConfig('hosterList').strip().lower().replace(',','|').split('|'))
 -            configList.discard(u'')
 -            if configMode == "listed":
 -                hosters &= configList
 -            elif configMode == "unlisted":
 -                hosters -= configList
 -        
 -        return list(hosters)
 +        return [x.strip() for x in page.replace("\"", "").split(";")]
      def coreReady(self):
 diff --git a/module/plugins/hooks/PremiumizeMe.py b/module/plugins/hooks/PremiumizeMe.py index 3825e9219..37905c23e 100644 --- a/module/plugins/hooks/PremiumizeMe.py +++ b/module/plugins/hooks/PremiumizeMe.py @@ -5,7 +5,7 @@ from module.network.RequestFactory import getURL  class PremiumizeMe(MultiHoster):      __name__ = "PremiumizeMe" -    __version__ = "0.1" +    __version__ = "0.11"      __type__ = "hook"      __description__ = """Premiumize.Me hook plugin""" @@ -16,8 +16,6 @@ class PremiumizeMe(MultiHoster):      __author_name__ = ("Florian Franzen")      __author_mail__ = ("FlorianFranzen@gmail.com") -    replacements = [("freakshare.net", "freakshare.com")] -      interval = 0 # Disable periodic calls, we dont use them anyway      def getHoster(self):      @@ -38,20 +36,7 @@ class PremiumizeMe(MultiHoster):              return []          # Extract hosters from json file  -        hosters = set(data['result']['hosterlist']) -     -                 -        # Read config to check if certain hosters should not be handled -        configMode = self.getConfig('hosterListMode') -        if configMode in ("listed", "unlisted"): -            configList = set(self.getConfig('hosterList').strip().lower().replace('|',',').replace(';',',').split(',')) -            configList.discard(u'') -            if configMode == "listed": -                hosters &= configList -            else: -                hosters -= configList -         -        return list(hosters)       +        return data['result']['hosterlist']       def coreReady(self):          # Get account plugin and check if there is a valid account available diff --git a/module/plugins/hooks/RealdebridCom.py b/module/plugins/hooks/RealdebridCom.py index bd3179673..0f06d14bc 100644 --- a/module/plugins/hooks/RealdebridCom.py +++ b/module/plugins/hooks/RealdebridCom.py @@ -5,7 +5,7 @@ from module.plugins.internal.MultiHoster import MultiHoster  class RealdebridCom(MultiHoster):      __name__ = "RealdebridCom" -    __version__ = "0.41" +    __version__ = "0.42"      __type__ = "hook"      __config__ = [("activated", "bool", "Activated", "False"), @@ -16,21 +16,8 @@ class RealdebridCom(MultiHoster):      __author_name__ = ("Devirex, Hazzard")      __author_mail__ = ("naibaf_11@yahoo.de") -    replacements = [("freakshare.net", "freakshare.com")] -      def getHoster(self):          https = "https" if self.getConfig("https") else "http"          page = getURL(https + "://real-debrid.com/api/hosters.php").replace("\"","").strip() -        hosters = set([x.strip() for x in page.split(",") if x.strip()]) -         -        configMode = self.getConfig('hosterListMode') -        if configMode in ("listed", "unlisted"): -            configList = set(self.getConfig('hosterList').strip().lower().replace('|',',').replace(';',',').split(',')) -            configList.discard(u'') -            if configMode == "listed": -                hosters &= configList -            else: -                hosters -= configList -         -        return list(hosters) +        return [x.strip() for x in page.split(",") if x.strip()] diff --git a/module/plugins/hooks/RehostTo.py b/module/plugins/hooks/RehostTo.py index b16987f5c..8903bd07f 100644 --- a/module/plugins/hooks/RehostTo.py +++ b/module/plugins/hooks/RehostTo.py @@ -14,8 +14,6 @@ class RehostTo(MultiHoster):      __author_name__ = ("RaNaN")      __author_mail__ = ("RaNaN@pyload.org") -    replacements = [("freakshare.net", "freakshare.com")] -      def getHoster(self):          page = getURL("http://rehost.to/api.php?cmd=get_supported_och_dl&long_ses=%s" % self.long_ses) diff --git a/module/plugins/hooks/ZeveraCom.py b/module/plugins/hooks/ZeveraCom.py index 46c752c21..cadf60069 100644 --- a/module/plugins/hooks/ZeveraCom.py +++ b/module/plugins/hooks/ZeveraCom.py @@ -5,29 +5,15 @@ from module.plugins.internal.MultiHoster import MultiHoster  class ZeveraCom(MultiHoster):      __name__ = "ZeveraCom" -    __version__ = "0.01" +    __version__ = "0.02"      __type__ = "hook"      __config__ = [("activated", "bool", "Activated", "False"),                    ("hosterListMode", "all;listed;unlisted", "Use for hosters (if supported)", "all"),                    ("hosterList", "str", "Hoster list (comma separated)", "")]      __description__ = """Real-Debrid.com hook plugin""" -    __author_name__ = ("Devirex, Hazzard") -    __author_mail__ = ("naibaf_11@yahoo.de") - -    replacements = [("freakshare.net", "freakshare.com"), ("2shared.com", "twoshared.com"), ("4shared.com", "fourshared.com"), -                    ("easy-share.com", "crocko.com"), ("hellshare.com", "hellshare.cz")] +    __author_name__ = ("zoidberg") +    __author_mail__ = ("zoidberg@mujmail.cz")      def getHoster(self):          page = getURL("http://www.zevera.com/jDownloader.ashx?cmd=gethosters")         -        hosters = set([x.strip() for x in page.replace("\"", "").split(",")])    -         -        configMode = self.getConfig('hosterListMode') -        if configMode in ("listed", "unlisted"): -            configList = set(self.getConfig('hosterList').strip().lower().replace('|',',').replace(';',',').split(',')) -            configList.discard(u'') -            if configMode == "listed": -                hosters &= configList -            else: -                hosters -= configList -         -        return list(hosters)                                
\ No newline at end of file +        return [x.strip() for x in page.replace("\"", "").split(",")]                           
\ No newline at end of file diff --git a/module/plugins/hoster/BasePlugin.py b/module/plugins/hoster/BasePlugin.py index 1ac33931f..14dfbba62 100644 --- a/module/plugins/hoster/BasePlugin.py +++ b/module/plugins/hoster/BasePlugin.py @@ -12,10 +12,10 @@ class BasePlugin(Hoster):      __name__ = "BasePlugin"      __type__ = "hoster"      __pattern__ = r"^unmatchable$" -    __version__ = "0.151" +    __version__ = "0.16"      __description__ = """Base Plugin when any other didnt fit""" -    __author_name__ = ("RaNaN", 'hagg') -    __author_mail__ = ("RaNaN@pyload.org", '') +    __author_name__ = ("RaNaN") +    __author_mail__ = ("RaNaN@pyload.org")      def setup(self):          self.chunkLimit = -1 @@ -47,15 +47,22 @@ class BasePlugin(Hoster):              except BadHeader, e:                  if e.code in (401, 403):                      self.logDebug("Auth required") - -                    pwd = pyfile.package().password.strip() -                    if ":" not in pwd: -                        self.fail(_("Authorization required (username:password)")) - -                    self.req.addAuth(pwd) +                     +                    servers = [ x['login'] for x in core.accountManager.getAccountPlugin('Http').getAllAccounts() ] +                    server = urlparse(pyfile.url).netloc +                     +                    if server in servers: +                        self.logDebug("Logging on to %s" % server)                 +                        self.req.addAuth(self.account.accounts[server]["password"]) +                    else: +                        for pwd in pyfile.package().password.splitlines()  +                            if ":" in pwd: +                                self.req.addAuth(pwd.strip()) +                                break                             +                        else:         +                            self.fail(_("Authorization required (username:password)")) +                                                self.downloadFile(pyfile) -                elif e.code == 404: -                    self.offline()                  else:                      raise @@ -64,18 +71,21 @@ class BasePlugin(Hoster):      def downloadFile(self, pyfile): -        header = self.load(pyfile.url, just_header = True) -        #self.logDebug(header) - -        # self.load does not raise a BadHeader on 404 responses, do it here -        if header.has_key('code') and header['code'] == 404: -            raise BadHeader(404) - -        if 'location' in header: -            self.logDebug("Location: " + header['location']) -            url = unquote(header['location']) -        else: -            url = pyfile.url +        url = pyfile.url +         +        for i in range(5): +            header = self.load(pyfile.url, just_header = True) +             +            # self.load does not raise a BadHeader on 404 responses, do it here +            if header.has_key('code') and header['code'] == 404: +                raise BadHeader(404) +     +            if 'location' in header: +                self.logDebug("Location: " + header['location']) +                url = unquote(header['location']) +                self.logDebug("URL: %s" % url, html_unescape(unquote(urlparse(url).path.split("/")[-1]))) +            else: +                break                          name = html_unescape(unquote(urlparse(url).path.split("/")[-1])) @@ -92,4 +102,4 @@ class BasePlugin(Hoster):          if not name: name = url          pyfile.name = name          self.logDebug("Filename: %s" % pyfile.name) -        self.download(url, disposition=True) +        self.download(url, disposition=True)
\ No newline at end of file diff --git a/module/plugins/hoster/Ftp.py b/module/plugins/hoster/Ftp.py index 7c2af85ed..3bda3b32e 100644 --- a/module/plugins/hoster/Ftp.py +++ b/module/plugins/hoster/Ftp.py @@ -17,24 +17,75 @@      @author: jeix
      @author: mkaay
  """
 +from urlparse import urlparse, urljoin
 +from urllib import quote, unquote
 +import pycurl, re
  from module.plugins.Hoster import Hoster
 -
 +from module.network.HTTPRequest import BadHeader
  class Ftp(Hoster):
      __name__ = "Ftp"
 -    __version__ = "0.31"
 +    __version__ = "0.41"
      __pattern__ = r'(ftps?|sftp)://(.*?:.*?@)?.*?/.*' # ftp://user:password@ftp.server.org/path/to/file
      __type__ = "hoster"
      __description__ = """A Plugin that allows you to download from an from an ftp directory"""
 -    __author_name__ = ("jeix", "mkaay")
 -    __author_mail__ = ("jeix@hasnomail.com", "mkaay@mkaay.de")
 +    __author_name__ = ("jeix", "mkaay", "zoidberg")
 +    __author_mail__ = ("jeix@hasnomail.com", "mkaay@mkaay.de", "zoidberg@mujmail.cz")
 -    def process(self, pyfile):
 -        pyfile.name = self.pyfile.url.rpartition('/')[2]
 -
 +    def setup(self):
          self.chunkLimit = -1
 -        self.resumeDownload = True
 -
 -        self.download(pyfile.url)
 -
 +        self.resumeDownload = True   
 +    
 +    def process(self, pyfile):
 +        parsed_url = urlparse(pyfile.url)
 +        netloc = parsed_url.netloc
 +        
 +        pyfile.name = parsed_url.path.rpartition('/')[2]
 +        try:
 +            pyfile.name = unquote(str(pyfile.name)).decode('utf8')
 +        except:
 +            pass        
 +        
 +        if not "@" in netloc:
 +            servers = [ x['login'] for x in self.account.getAllAccounts() ] if self.account else []                             
 +                
 +            if netloc in servers:
 +                self.logDebug("Logging on to %s" % netloc)                
 +                self.req.addAuth(self.account.accounts[netloc]["password"])
 +            else:
 +                for pwd in pyfile.package().password.splitlines(): 
 +                    if ":" in pwd:
 +                        self.req.addAuth(pwd.strip())
 +                        break                            
 +        
 +        self.req.http.c.setopt(pycurl.NOBODY, 1)
 +        
 +        try:
 +            response = self.load(pyfile.url)
 +        except pycurl.error, e:
 +            self.fail("Error %d: %s" % e.args)
 +        
 +        self.req.http.c.setopt(pycurl.NOBODY, 0)        
 +        self.logDebug(self.req.http.header)
 +        
 +        found = re.search(r"Content-Length:\s*(\d+)", response)
 +        if found:
 +            pyfile.size = int(found.group(1))                 
 +            self.download(pyfile.url)
 +        else:
 +            #Naive ftp directory listing          
 +            if re.search(r'^25\d.*?"', self.req.http.header, re.M):            
 +                pyfile.url = pyfile.url.rstrip('/')
 +                pkgname = "/".join((pyfile.package().name,urlparse(pyfile.url).path.rpartition('/')[2]))
 +                pyfile.url += '/'
 +                self.req.http.c.setopt(48, 1) # CURLOPT_DIRLISTONLY
 +                response = self.load(pyfile.url, decode = False)
 +                links = [ pyfile.url + quote(x) for x in response.splitlines() ]
 +                self.logDebug("LINKS", links)
 +                self.core.api.addPackage(pkgname, links, 1)
 +                #self.core.files.addLinks(links, pyfile.package().id)
 +            else:
 +                self.fail("Unexpected server response")
 +            
 +        
\ No newline at end of file diff --git a/module/plugins/hoster/UptoboxCom.py b/module/plugins/hoster/UptoboxCom.py new file mode 100644 index 000000000..ae2f14a14 --- /dev/null +++ b/module/plugins/hoster/UptoboxCom.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from module.plugins.hoster.XFileSharingPro import XFileSharingPro, create_getInfo + +class UptoboxCom(XFileSharingPro): +    __name__ = "UptoboxCom" +    __type__ = "hoster" +    __pattern__ = r"http://(?:\w*\.)*?uptobox.com/\w{12}" +    __version__ = "0.06" +    __description__ = """Uptobox.com hoster plugin""" +    __author_name__ = ("zoidberg") +    __author_mail__ = ("zoidberg@mujmail.cz") +     +    FILE_INFO_PATTERN = r'<h2>\s*Download File\s*<span[^>]*>(?P<N>[^>]+)</span></h2>\s*[^\(]*\((?P<S>[^\)]+)\)</h2>' +    HOSTER_NAME = "uptobox.com" +    +    def setup(self): +        self.resumeDownload = self.multiDL = self.premium         +        self.chunkLimit = 1 + +getInfo = create_getInfo(UptoboxCom)
\ No newline at end of file diff --git a/module/plugins/internal/MultiHoster.py b/module/plugins/internal/MultiHoster.py index e9e321c06..0f25eb8d2 100644 --- a/module/plugins/internal/MultiHoster.py +++ b/module/plugins/internal/MultiHoster.py @@ -11,32 +11,54 @@ class MultiHoster(Hook):      Generic MultiHoster plugin      """ -    __version__ = "0.12" +    __version__ = "0.15"      interval = 0      hosters = [] -    replacements = [] +    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"),  +                    ("ul.to","uploaded.to"), ("uploaded.net","uploaded.to")]      supported = []      ignored = [] +    new_supported = []      def getHosterCached(self):          if not self.hosters:              try: -                self.hosters = [x.strip() for x in self.getHoster()] -                self.hosters = filter(lambda x: x and x not in self.ignored, self.hosters) +                hosterSet = self.toHosterSet(self.getHoster()) - set(self.ignored)              except Exception, e:                  self.logError("%s" % str(e))                  return [] - -            for rep in self.replacements: -                if rep[0] in self.hosters: -                    self.hosters.remove(rep[0]) -                    if rep[1] not in self.hosters: -                        self.hosters.append(rep[1]) +                 +            try:  +                configMode = self.getConfig('hosterListMode') +                if configMode in ("listed", "unlisted"): +                    configSet = self.toHosterSet(self.getConfig('hosterList').replace('|',',').replace(';',',').split(',')) +                     +                    if configMode == "listed": +                        hosterSet &= configSet +                    else: +                        hosterSet -= configSet +                                 +            except Exception, e: +                self.logError("%s" % str(e)) +         +            self.hosters = list(hosterSet)          return self.hosters - +         +    def toHosterSet(self, hosters): +        hosters = set((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'')         +        return hosters      def getHoster(self):          """Load list of supported hoster @@ -49,23 +71,29 @@ class MultiHoster(Hook):          pluginMap = {}          for name in self.core.pluginManager.hosterPlugins.keys():              pluginMap[name.lower()] = name - -        new_supported = [] +         +        accountList = [ name.lower() for name, data in self.core.accountManager.accounts.items() if data ] +        excludedList = []          for hoster in self.getHosterCached():              name = remove_chars(hoster.lower(), "-.") -            if name in pluginMap: -                self.supported.append(pluginMap[name]) +            if name in accountList: +                excludedList.append(hoster)                              else: -                new_supported.append(hoster) +                if name in pluginMap: +                    self.supported.append(pluginMap[name]) +                else: +                    self.new_supported.append(hoster) -        if not self.supported and not new_supported: +        if not self.supported and not self.new_supported:              self.logError(_("No Hoster loaded"))              return          module = self.core.pluginManager.getPlugin(self.__name__)          klass = getattr(module, self.__name__) +         +        print module, klass          # inject plugin plugin          self.logDebug("Overwritten Hosters: %s" % ", ".join(sorted(self.supported))) @@ -73,25 +101,42 @@ class MultiHoster(Hook):              dict = self.core.pluginManager.hosterPlugins[hoster]              dict["new_module"] = module              dict["new_name"] = self.__name__ +             +        if excludedList: +            self.logInfo("The following hosters were not overwritten - account exists: %s" % ", ".join(sorted(excludedList))) + +        if self.new_supported: +            self.logDebug("New Hosters: %s" % ", ".join(sorted(self.new_supported))) +     +            # create new regexp +            if not klass.__pattern__: +                regexp = r".*(%s).*" % "|".join([x.replace(".", "\\.") for x in new_supported]) +            else: +                regexp = r"%s|.*(%s).*" % ([klass.__pattern__], "|".join([x.replace(".", "\\.") for x in self.new_supported])) +            self.logDebug("Regexp: %s" % regexp) +     +            dict = self.core.pluginManager.hosterPlugins[self.__name__] +            dict["pattern"] = regexp +            dict["re"] = re.compile(regexp) -        self.logDebug("New Hosters: %s" % ", ".join(sorted(new_supported))) - -        # create new regexp -        if not klass.__pattern__: -            regexp = r".*(%s).*" % "|".join([x.replace(".", "\\.") for x in new_supported]) -        else: -            regexp = r".*(%s).*" % "|".join([klass.__pattern__] + [x.replace(".", "\\.") for x in new_supported]) -        dict = self.core.pluginManager.hosterPlugins[self.__name__] -        dict["pattern"] = regexp -        dict["re"] = re.compile(regexp) +    def unloadHoster(self, hoster): +        dict = self.core.pluginManager.hosterPlugins[hoster] +        self.logDebug(dict) +        if "module" in dict: +            del dict["module"] +        if "new_module" in dict: +            del dict["new_module"] +            del dict["new_name"]      def unload(self):          for hoster in self.supported: -            dict = self.core.pluginManager.hosterPlugins[hoster] -            if "module" in dict: -                del dict["module"] - -            del dict["new_module"] -            del dict["new_name"] +            self.unloadHoster(hoster)     +             +    def downloadFailed(self, pyfile): +        hdict = self.core.pluginManager.hosterPlugins[pyfile.pluginname] +        self.logDebug("Unload MultiHoster", pyfile.pluginname, hdict) +        if "new_name" in hdict and hdict['new_name'] == self.__name__:     +            self.unloadHoster(pyfile.pluginname) +            pyfile.setStatus("queued")
\ No newline at end of file diff --git a/module/plugins/internal/XFSPAccount.py b/module/plugins/internal/XFSPAccount.py index ad25ad2c8..8333c7265 100644 --- a/module/plugins/internal/XFSPAccount.py +++ b/module/plugins/internal/XFSPAccount.py @@ -33,7 +33,7 @@ class XFSPAccount(Account):      MAIN_PAGE = None -    VALID_UNTIL_PATTERN = r'>Premium account expire:</TD><TD><b>([^<]+)</b>' +    VALID_UNTIL_PATTERN = r'>Premium.[Aa]ccount expire:</TD><TD><b>([^<]+)</b>'      TRAFFIC_LEFT_PATTERN = r'>Traffic available today:</TD><TD><b>([^<]+)</b>'      def loadAccountInfo(self, user, req):       | 
