summaryrefslogtreecommitdiffstats
path: root/module/plugins/internal/UnZip.py
diff options
context:
space:
mode:
Diffstat (limited to 'module/plugins/internal/UnZip.py')
-rw-r--r--module/plugins/internal/UnZip.py64
1 files changed, 49 insertions, 15 deletions
diff --git a/module/plugins/internal/UnZip.py b/module/plugins/internal/UnZip.py
index 81c298784..b3d54cba0 100644
--- a/module/plugins/internal/UnZip.py
+++ b/module/plugins/internal/UnZip.py
@@ -1,19 +1,23 @@
# -*- coding: utf-8 -*-
+from __future__ import with_statement
+
import sys
import zipfile
-from module.plugins.internal.AbstractExtractor import AbtractExtractor, WrongPassword, ArchiveError
+from module.plugins.internal.AbstractExtractor import AbtractExtractor, PasswordError, ArchiveError, CRCError
class UnZip(AbtractExtractor):
__name__ = "UnZip"
- __version__ = "0.12"
+ __version__ = "1.00"
__description__ = """Zip extractor plugin"""
__license__ = "GPLv3"
- __authors__ = [("RaNaN", "RaNaN@pyload.org"),
- ("Walter Purcaro", "vuolter@gmail.com")]
+ __authors__ = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+ EXTENSIONS = ["zip", "zip64"]
@classmethod
@@ -22,31 +26,61 @@ class UnZip(AbtractExtractor):
@classmethod
- def getTargets(cls, files_ids):
- result = []
+ def isArchive(cls, file):
+ return zipfile.is_zipfile(file)
- for file, id in files_ids:
- if file.endswith(".zip"):
- result.append((file, id))
- return result
+ def verify(self):
+ try:
+ with zipfile.ZipFile(self.file, 'r', allowZip64=True) as z:
+ z.setpassword(self.password)
+ badcrc = z.testzip()
+ except (BadZipfile, LargeZipFile), e:
+ raise ArchiveError(e)
- def extract(self, progress, password=""):
+ except RuntimeError, e:
+ if 'encrypted' in e:
+ raise PasswordError
+ else:
+ raise ArchiveError(e)
+
+ else:
+ if badcrc:
+ raise CRCError
+
+ if not self.list():
+ raise ArchiveError("Empty archive")
+
+
+ def list(self):
try:
- z = zipfile.ZipFile(self.file)
- self.files = z.namelist()
- z.extractall(self.out, pwd=password)
+ with zipfile.ZipFile(self.file, 'r', allowZip64=True) as z:
+ z.setpassword(self.password)
+ return z.namelist()
+ except Exception:
+ return list()
+
+
+ def extract(self, progress=lambda x: None):
+ try:
+ with zipfile.ZipFile(self.file, 'r', allowZip64=True) as z:
+ progress(0)
+ z.extractall(self.out, pwd=self.password)
+ progress(100)
except (BadZipfile, LargeZipFile), e:
raise ArchiveError(e)
except RuntimeError, e:
if e is "Bad password for file":
- raise WrongPassword
+ raise PasswordError
else:
raise ArchiveError(e)
+ finally:
+ self.files = self.list()
+
def getDeleteFiles(self):
return [self.file]