imseldrith commited on
Commit
39f5ef5
·
1 Parent(s): bde49e1

Upload 2 files

Browse files
unzipper/lib/extractor/__init__.py ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ===================================================================== #
2
+ # Copyright (c) 2022 Itz-fork #
3
+ # #
4
+ # This program is distributed in the hope that it will be useful, #
5
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of #
6
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. #
7
+ # See the GNU General Public License for more details. #
8
+ # #
9
+ # You should have received a copy of the GNU General Public License #
10
+ # along with this program. If not, see <http://www.gnu.org/licenses/> #
11
+ # ===================================================================== #
12
+
13
+ from os import path, mkdir
14
+ from .errors import ExtractionFailed
15
+ from unzipper.helpers_nexa.utils import run_shell_cmds, run_cmds_on_cr
16
+
17
+
18
+ class Extractor:
19
+ """
20
+ Unzip archives using 7z and zstd
21
+ """
22
+
23
+ def __init__(self) -> None:
24
+ pass
25
+
26
+ async def extract(self, arc_path: str, out: str, password: str = "", splitted: bool = False):
27
+ """
28
+ Extract archive using either 7z or zstd
29
+
30
+ Parameters:
31
+
32
+ - `arc_path` - Archive path
33
+ - `out` - Output path
34
+ - `password` - Password to use incase if the archive is password protected
35
+ - `splitted` - Pass True if the archive is a splitted archive which usually ends with .001 (+) extensions
36
+ """
37
+ if path.splitext(arc_path)[1] == ".zst":
38
+ mkdir(out)
39
+ ex = await self._ext_zstd(out, arc_path)
40
+ await self.__check_output(ex)
41
+ return ex
42
+ else:
43
+ ex = await self._ext_7z(out, arc_path, password, splitted)
44
+ await self.__check_output(ex)
45
+ return ex
46
+
47
+ async def _ext_7z(self, out: str, arc_path: str, password: str = "", splitted: bool = False):
48
+ if password:
49
+ command = f"7z x -o\"{out}\" -p\"{password}\" \"{arc_path}\" -y"
50
+ else:
51
+ command = f"7z x -o\"{out}\" \"{arc_path}\" -y"
52
+ command += " -tsplit" if splitted else ""
53
+ return await run_cmds_on_cr(run_shell_cmds, command)
54
+
55
+ async def _ext_zstd(self, out: str, arc_path: str):
56
+ command = f"zstd -f --output-dir-flat \"{out}\" -d \"{arc_path}\""
57
+ return await run_cmds_on_cr(run_shell_cmds, command)
58
+
59
+ async def __check_output(self, out: str):
60
+ if any(e in out for e in ["Error", "Can't open as archive"]):
61
+ raise ExtractionFailed
unzipper/lib/extractor/errors.py ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ # Exceptions raised by the Extractor class
2
+
3
+ class ExtractionFailed(Exception):
4
+ def __init__(self) -> None:
5
+ super().__init__("Extraction failed due to an unknown error! Please make sure that your archive isn't corrupted")