diff options
author | RaNaN <Mast3rRaNaN@hotmail.de> | 2010-09-20 15:44:41 +0200 |
---|---|---|
committer | RaNaN <Mast3rRaNaN@hotmail.de> | 2010-09-20 15:44:41 +0200 |
commit | 15442bc95cc0b251284c68b6a7b007d9c4ec10a3 (patch) | |
tree | e31cf9c182f0f9384da8fbe0103906f22015c0f8 | |
parent | rs direct download (diff) | |
download | pyload-15442bc95cc0b251284c68b6a7b007d9c4ec10a3.tar.xz |
unrar without PIPE
-rw-r--r-- | module/pyunrar.py | 72 |
1 files changed, 21 insertions, 51 deletions
diff --git a/module/pyunrar.py b/module/pyunrar.py index 413d8275e..dfd488ce5 100644 --- a/module/pyunrar.py +++ b/module/pyunrar.py @@ -20,6 +20,7 @@ from subprocess import Popen, PIPE import re +import os from time import sleep from tempfile import mkdtemp from shutil import rmtree, move @@ -104,7 +105,7 @@ class Unrar(): else: args.append("-p-") args.append(f) - p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) + p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE, bufsize=-1) ret = p.wait() if ret == 3: self.headerEncrypted = True @@ -200,11 +201,16 @@ class Unrar(): args.append(self.getSmallestFile(password)["name"]) except WrongPasswordError: return False - p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) - (ret, out) = self.processOutput(p, statusFunction) + out = open(os.devnull, "w+") + err = open(os.devnull, "w+") + p = Popen(args, stdin=PIPE, stdout=out, stderr=err, bufsize=-1) + ret = p.wait() + out.close() + err.close() + if ret == 3: raise False - elif ret == 0: + elif ret in (0,1): return True else: raise UnknownError() @@ -237,14 +243,20 @@ class Unrar(): args.extend(["-x%s" % e for e in exclude]) if destination: args.append(destination) - p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) - (ret, out) = self.processOutput(p, statusFunction) + + out = open(os.devnull, "w+") + err = open(os.devnull, "w+") + p = Popen(args, stdin=PIPE, stdout=out, stderr=err, bufsize=-1) + ret = p.wait() + out.close() + err.close() + if ret == 3: raise WrongPasswordError() - elif ret == 0: + elif ret in (0,1): return True else: - raise CommandError(ret=ret, stdout=out, stderr=p.stderr.read()) + raise CommandError(ret=ret) def crackPassword(self, passwords=[], fullPath=True, destination=None, overwrite=False, statusFunction=None, exclude=[]): """ @@ -301,49 +313,6 @@ class Unrar(): except WrongPasswordError: return False - def processOutput(self, p, statusFunction=None): - """ - internal method - parse the progress output of the rar/unrar command - @return int: exitcode - string: command output - """ - ret = None - out = "" - tmp = None - count = 0 - perc = 0 - tperc = "0" - last = None - digits = "1 2 3 4 5 6 7 8 9 0".split(" ") - if not statusFunction: - statusFunction = lambda p: None - statusFunction(0) - while ret is None or tmp: - tmp = p.stdout.read(1) - if tmp: - out += tmp - if tmp == chr(8): - if last == tmp: - count += 1 - tperc = "0" - else: - count = 0 - if perc < int(tperc): - perc = int(tperc) - statusFunction(perc) - elif count >= 3: - if tmp == "\n": - count = 0 - elif tmp in digits: - tperc += tmp - last = tmp - else: - sleep(0.01) - ret = p.poll() - statusFunction(100) - return ret, out - def getPassword(self): """ return the correct password @@ -352,6 +321,7 @@ class Unrar(): """ return self.password + if __name__ == "__main__": from pprint import pprint u = Unrar("archive.part1.rar", multi=True) |