diff options
Diffstat (limited to 'module')
| -rw-r--r-- | module/plugins/hoster/BasePlugin.py | 85 | 
1 files changed, 50 insertions, 35 deletions
| diff --git a/module/plugins/hoster/BasePlugin.py b/module/plugins/hoster/BasePlugin.py index 63714c437..27e8d050a 100644 --- a/module/plugins/hoster/BasePlugin.py +++ b/module/plugins/hoster/BasePlugin.py @@ -6,20 +6,27 @@ from urllib import unquote  from urlparse import urlparse  from module.network.HTTPRequest import BadHeader +from module.plugins.internal.SimpleHoster import create_getInfo  from module.plugins.Hoster import Hoster -from module.utils import html_unescape, remove_chars +from module.utils import remove_chars  class BasePlugin(Hoster):      __name__    = "BasePlugin"      __type__    = "hoster" -    __version__ = "0.20" +    __version__ = "0.21"      __pattern__ = r'^unmatchable$'      __description__ = """Base Plugin when any other didnt fit"""      __license__     = "GPLv3" -    __authors__     = [("RaNaN", "RaNaN@pyload.org")] +    __authors__     = [("RaNaN", "RaNaN@pyload.org"), +                       ("Walter Purcaro", "vuolter@gmail.com")]] + + +    @classmethod +    def getInfo(cls, url="", html=""):  #@TODO: Move to hoster class in 0.4.10 +        return {'name': urlparse(url).path.split('/')[-1] or _("Unknown"), 'size': 0, 'status': 3, 'url': url or ""}      def setup(self): @@ -30,40 +37,42 @@ class BasePlugin(Hoster):      def process(self, pyfile):          """main function""" -        #: debug part, for api exerciser -        if pyfile.url.startswith("DEBUG_API"): -            self.multiDL = False -            return +        self.getInfo(pyfile.url)          if pyfile.url.startswith("http"): +            for _i in xrange(2): +                try: +                    self.downloadFile(pyfile) -            try: -                self.downloadFile(pyfile) -            except BadHeader, e: -                if e.code in (401, 403): -                    self.logDebug("Auth required") +                except BadHeader, e: +                    if e.code is 404: +                        self.offline() -                    account = self.core.accountManager.getAccountPlugin('Http') -                    servers = [x['login'] for x in account.getAllAccounts()] -                    server = urlparse(pyfile.url).netloc +                    elif e.code in (401, 403): +                        self.logDebug("Auth required") -                    if server in servers: -                        self.logDebug("Logging on to %s" % server) -                        self.req.addAuth(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)")) +                        account = self.core.accountManager.getAccountPlugin('Http') +                        servers = [x['login'] for x in account.getAllAccounts()] +                        server  = urlparse(pyfile.url).netloc -                    self.downloadFile(pyfile) +                        if server in servers: +                            self.logDebug("Logging on to %s" % server) +                            self.req.addAuth(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)")) +                    else: +                        self.fail(e)                  else: -                    raise - +                    break +            else: +                self.fail(_("No file downloaded"))  #@TODO: Move to hoster class (check if self.lastDownload) in 0.4.10          else: -            self.fail(_("No Plugin matched and not a downloadable url")) +            self.fail(_("No plugin matched"))      def downloadFile(self, pyfile): @@ -78,31 +87,37 @@ class BasePlugin(Hoster):              if 'location' in header:                  self.logDebug("Location: " + header['location']) +                  base = re.match(r'https?://[^/]+', url).group(0) +                  if header['location'].startswith("http"):                      url = header['location'] +                  elif header['location'].startswith("/"):                      url = base + unquote(header['location']) +                  else:                      url = '%s/%s' % (base, unquote(header['location']))              else:                  break -        name = html_unescape(unquote(urlparse(url).path.split("/")[-1])) -          if 'content-disposition' in header:              self.logDebug("Content-Disposition: " + header['content-disposition']) +              m = re.search("filename(?P<type>=|\*=(?P<enc>.+)'')(?P<name>.*)", header['content-disposition'])              if m:                  disp = m.groupdict() +                  self.logDebug(disp) +                  if not disp['enc']:                      disp['enc'] = 'utf-8' +                  name = remove_chars(disp['name'], "\"';").strip()                  name = unicode(unquote(name), disp['enc']) -        if not name: -            name = url -        pyfile.name = name -        self.logDebug("Filename: %s" % pyfile.name) +                pyfile.name = name + +                self.logDebug("Filename changed to: " + name) +          self.download(url, disposition=True) | 
