diff options
author | Walter Purcaro <vuolter@gmail.com> | 2014-11-09 21:48:16 +0100 |
---|---|---|
committer | Walter Purcaro <vuolter@gmail.com> | 2014-11-09 21:48:16 +0100 |
commit | 344f22f9ba8b3aa4e7d8049084db473b76cfb4e3 (patch) | |
tree | 537ffb3cc258d5ba0839b44f702c003c154a0396 /module/plugins | |
parent | New crypter LinkCryptWs (diff) | |
download | pyload-344f22f9ba8b3aa4e7d8049084db473b76cfb4e3.tar.xz |
[Plugin] Update and bugfix
Diffstat (limited to 'module/plugins')
-rw-r--r-- | module/plugins/Plugin.py | 133 | ||||
-rw-r--r-- | module/plugins/hoster/OneFichierCom.py | 6 |
2 files changed, 90 insertions, 49 deletions
diff --git a/module/plugins/Plugin.py b/module/plugins/Plugin.py index 426a406a9..a8eca5003 100644 --- a/module/plugins/Plugin.py +++ b/module/plugins/Plugin.py @@ -14,8 +14,9 @@ if os.name != "nt": from itertools import islice from traceback import print_exc +from urlparse import urlparse -from module.utils import save_join, save_path, fs_encode, fs_decode +from module.utils import fs_decode, fs_encode, html_unescape, save_join, save_path def chunks(iterable, size): @@ -67,7 +68,8 @@ class Base(object): def logDebug(self, *args): - return self._log("debug", args) + if self.core.debug: + return self._log("debug", args) def logInfo(self, *args): @@ -149,7 +151,7 @@ class Plugin(Base): """ __name__ = "Plugin" __type__ = "hoster" - __version__ = "0.05" + __version__ = "0.06" __pattern__ = None __config__ = [] #: [("name", "type", "desc", "default")] @@ -216,6 +218,7 @@ class Plugin(Base): self.js = self.core.js self.cTask = None #captcha task + self.html = None #@TODO: Move to hoster class self.retries = 0 # amount of retries already made self.init() @@ -289,33 +292,56 @@ class Plugin(Base): :param seconds: wait time in seconds :param reconnect: True if a reconnect would avoid wait time """ + wait_time = int(seconds) + 1 + wait_until = time() + wait_time + + self.logDebug("Set waitUntil to: %f (previous: %f)" % (wait_until, self.self.pyfile.waitUntil), + "Wait: %d seconds" % wait_time) + + self.pyfile.waitUntil = wait_until + if reconnect is not None: - self.wantReconnect = reconnect and not self.account - self.pyfile.waitUntil = time() + int(seconds) + 1 + self.logDebug("Set wantReconnect to: %s (previous: %s)" % (reconnect, self.wantReconnect)) + self.wantReconnect = reconnect def wait(self, seconds=0, reconnect=None): """ waits the time previously set """ - if seconds: - self.setWait(seconds, reconnect) + pyfile = self.pyfile + + self.setWait(seconds, reconnect) self.waiting = True - self.pyfile.setStatus("waiting") - while self.pyfile.waitUntil > time(): - self.thread.m.reconnecting.wait(2) + status = pyfile.status + pyfile.setStatus("waiting") - if self.pyfile.abort: - raise Abort + self.logDebug("WAIT: %d seconds" % wait_time, + "WAITUNTIL: %f" % pyfile.waitUntil, + "RECONNECT: %s" % self.wantReconnect) + + if not account: + self.logDebug("Ignore reconnection due account logged") - if self.thread.m.reconnecting.isSet(): - self.waiting = False - self.wantReconnect = False - raise Reconnect + while pyfile.waitUntil > time(): + self.thread.m.reconnecting.wait(2) + + if pyfile.abort: + self.abort() + + if self.thread.m.reconnecting.isSet(): + self.waiting = False + self.wantReconnect = False + raise Reconnect + else: + while pyfile.waitUntil > time(): + if pyfile.abort: + self.abort() self.waiting = False - self.pyfile.setStatus("starting") + + pyfile.status = status def fail(self, reason): @@ -323,6 +349,11 @@ class Plugin(Base): raise Fail(reason) + def abort(self, reason=""): + """ abort and give reason """ + raise Abort + + def error(self, reason="", type=""): if not reason and not type: type = "unknown" @@ -392,9 +423,9 @@ class Plugin(Base): img = self.load(url, get=get, post=post, cookies=cookies) id = ("%.2f" % time())[-6:].replace(".", "") - tmpCaptcha = open(join("tmp", "tmpCaptcha_%s_%s.%s" % (self.__name__, id, imgtype)), "wb") - tmpCaptcha.write(img) - tmpCaptcha.close() + + with open(join("tmp", "tmpCaptcha_%s_%s.%s" % (self.__name__, id, imgtype)), "wb") as tmpCaptcha: + tmpCaptcha.write(img) has_plugin = self.__name__ in self.core.pluginManager.captchaPlugins @@ -406,7 +437,7 @@ class Plugin(Base): if Ocr and not forceUser: sleep(randint(3000, 5000) / 1000.0) if self.pyfile.abort: - raise Abort + self.abort() ocr = Ocr() result = ocr.get_captcha(tmpCaptcha.name) @@ -419,7 +450,7 @@ class Plugin(Base): while task.isWaiting(): if self.pyfile.abort: captchaManager.removeTask(task) - raise Abort + self.abort() sleep(1) captchaManager.removeTask(task) @@ -443,7 +474,7 @@ class Plugin(Base): return result - def load(self, url, get={}, post={}, ref=True, cookies=True, just_header=False, decode=False): + def load(self, url, get={}, post={}, ref=True, cookies=True, just_header=False, decode=False, follow_location=True, save_cookies=True): """Load content at url and returns it :param url: @@ -451,22 +482,27 @@ class Plugin(Base): :param post: :param ref: :param cookies: - :param just_header: if True only the header will be retrieved and returned as dict + :param just_header: If True only the header will be retrieved and returned as dict :param decode: Wether to decode the output according to http header, should be True in most cases + :param follow_location: If True follow location else not + :param save_cookies: If True saves received cookies else discard them :return: Loaded content """ if self.pyfile.abort: - raise Abort + self.abort() - url = url.strip() + if not url: + self.fail(_"No url given")) if type(url) == unicode: # utf8 vs decode -> please use decode attribute in all future plugins url = str(url) #: encode('utf8') + url = url.strip() + if self.core.debug: self.logDebug("Load url: " + url, *["%s=%s" % (key, val) for key, val in locals().iteritems() if key not in ("self", "url")]) - res = self.req.load(url, get, post, ref, cookies, just_header, decode=decode) + res = self.req.load(url, get, post, ref, cookies, just_header, decode=decode, follow_location=follow_location, save_cookies=save_cookies) if self.core.debug: from inspect import currentframe @@ -475,18 +511,13 @@ class Plugin(Base): if not exists(join("tmp", self.__name__)): makedirs(join("tmp", self.__name__)) - f = open( - join("tmp", self.__name__, "%s_line%s.dump.html" % (frame.f_back.f_code.co_name, frame.f_back.f_lineno)) - , "wb") - del frame # delete the frame or it wont be cleaned - + framefile = save_join("tmp", self.__name__, "%s_line%s.dump.html" % (frame.f_back.f_code.co_name, frame.f_back.f_lineno)) try: - tmp = res.encode("utf8") - except: - tmp = res - - f.write(tmp) - f.close() + with open(framefile, "wb") as f: + del frame #: delete the frame or it wont be cleaned + f.write(fs_encode(res)) + except IOError, e: + self.logError(str(e)) if just_header: #parse header @@ -524,7 +555,13 @@ class Plugin(Base): :return: The location where the file was saved """ if self.pyfile.abort: - raise Abort + self.abort() + + if not url: + self.fail(_"No url given")) + + if type(url) == unicode: + url = str(url) url = url.strip() @@ -563,6 +600,7 @@ class Plugin(Base): newname = self.req.httpDownload(url, filename, get=get, post=post, ref=ref, cookies=cookies, chunks=self.getChunkCount(), resume=self.resumeDownload, progressNotify=self.pyfile.setProgress, disposition=disposition) + newname = urlparse(html_unescape(newname)).path.split("/")[-1] finally: self.pyfile.size = self.req.size @@ -600,7 +638,8 @@ class Plugin(Base): :return: dictionary key of the first rule that matched """ lastDownload = fs_encode(self.lastDownload) - if not exists(lastDownload): return None + if not exists(lastDownload): + return None size = stat(lastDownload) size = size.st_size @@ -608,9 +647,10 @@ class Plugin(Base): if api_size and api_size <= size: return None elif size > max_size and not read_size: return None self.logDebug("Download Check triggered") - f = open(lastDownload, "rb") - content = f.read(read_size if read_size else -1) - f.close() + + with open(lastDownload, "rb") as f: + content = f.read(read_size if read_size else -1) + #produces encoding errors, better log to other file in the future? #self.logDebug("Content: %s" % content) for name, rule in rules.iteritems(): @@ -672,10 +712,13 @@ class Plugin(Base): """ clean everything and remove references """ if hasattr(self, "pyfile"): del self.pyfile + if hasattr(self, "req"): self.req.close() del self.req + if hasattr(self, "thread"): del self.thread - # if hasattr(self, "html"): - # del self.html + + if hasattr(self, "html"): + del self.html diff --git a/module/plugins/hoster/OneFichierCom.py b/module/plugins/hoster/OneFichierCom.py index 190a9175e..820a4609f 100644 --- a/module/plugins/hoster/OneFichierCom.py +++ b/module/plugins/hoster/OneFichierCom.py @@ -41,11 +41,9 @@ class OneFichierCom(SimpleHoster): def handle(self, reconnect): m = re.search(self.WAIT_PATTERN, self.html) if m: - wait_time = int(m.group(1)) + wait_time = int(m.group(1)) * 60 - self.logDebug(_("Wait %d minutes") % wait_time) - - self.wait(wait_time * 60, reconnect) + self.wait(wait_time, reconnect) self.retry(reason="You have to wait been each free download") id = self.info['ID1'] or self.info['ID2'] |