diff options
Diffstat (limited to 'pyload/plugin/hoster/Ftp.py')
-rw-r--r-- | pyload/plugin/hoster/Ftp.py | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/pyload/plugin/hoster/Ftp.py b/pyload/plugin/hoster/Ftp.py new file mode 100644 index 000000000..6924c5910 --- /dev/null +++ b/pyload/plugin/hoster/Ftp.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- + +import pycurl +import re + +from urllib import quote, unquote +from urlparse import urlparse + +from pyload.plugin.Hoster import Hoster + + +class Ftp(Hoster): + __name__ = "Ftp" + __type__ = "hoster" + __version__ = "0.46" + + __pattern__ = r'(?:ftps?|sftp)://([\w.-]+(:[\w.-]+)?@)?[\w.-]+(:\d+)?/.+' + + __description__ = """Download from ftp directory""" + __license__ = "GPLv3" + __authors__ = [("jeix", "jeix@hasnomail.com"), + ("mkaay", "mkaay@mkaay.de"), + ("zoidberg", "zoidberg@mujmail.cz")] + + + def setup(self): + self.chunkLimit = -1 + 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 Exception: + 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.getAccountInfo(netloc)['password']) + else: + pwd = self.getPassword() + if ':' in pwd: + self.req.addAuth(pwd) + + self.req.http.c.setopt(pycurl.NOBODY, 1) + + try: + res = 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) + + m = re.search(r"Content-Length:\s*(\d+)", res) + if m: + pyfile.size = int(m.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 + res = self.load(pyfile.url, decode=False) + links = [pyfile.url + quote(x) for x in res.splitlines()] + self.logDebug("LINKS", links) + self.core.api.addPackage(pkgname, links) + else: + self.fail(_("Unexpected server response")) |