2 # -*- coding: utf-8 -*-
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the Revised BSD License.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 Revised BSD License for more details.
13 Copyright 2018-2024 Cool Dude 2k - http://idb.berlios.de/
14 Copyright 2018-2024 Game Maker 2k - http://intdb.sourceforge.net/
15 Copyright 2018-2024 Kazuki Przyborowski - https://github.com/KazukiPrzyborowski
17 $FileInfo: catfile.py - Last Update: 3/29/2024 Ver. 0.7.0 RC 1 - Author: cooldude2k $
20 from __future__
import absolute_import
, division
, print_function
, unicode_literals
;
21 import argparse
, pycatfile
, binascii
;
23 rarfile_support
= pycatfile
.rarfile_support
;
25 __project__
= pycatfile
.__project
__;
26 __program_name__
= pycatfile
.__program
_name
__;
27 __file_format_name__
= pycatfile
.__file
_format
_name
__;
28 __file_format_lower__
= pycatfile
.__file
_format
_lower
__;
29 __file_format_magic__
= pycatfile
.__file
_format
_magic
__;
30 __file_format_len__
= pycatfile
.__file
_format
_len
__;
31 __file_format_hex__
= pycatfile
.__file
_format
_hex
__;
32 __file_format_delimiter__
= pycatfile
.__file
_format
_delimiter
__;
33 __file_format_list__
= pycatfile
.__file
_format
_list
__;
34 __use_new_style__
= pycatfile
.__use
_new
_style
__;
35 __project_url__
= pycatfile
.__project
_url
__;
36 __version_info__
= pycatfile
.__version
_info
__;
37 __version_date_info__
= pycatfile
.__version
_date
_info
__;
38 __version_date__
= pycatfile
.__version
_date
__;
39 __version_date_plusrc__
= pycatfile
.__version
_date
_plusrc
__;
40 __version__
= pycatfile
.__version
__;
42 argparser
= argparse
.ArgumentParser(description
="Manipulate concatenated files.", conflict_handler
="resolve", add_help
=True);
43 argparser
.add_argument("-V", "--version", action
="version", version
=__program_name__
+ " " + __version__
);
44 argparser
.add_argument("-i", "-f", "--input", help="Specify the file(s) to concatenate or the concatenated file to extract.", required
=True);
45 argparser
.add_argument("-d", "-v", "--verbose", action
="store_true", help="Enable verbose mode to display various debugging information.");
46 argparser
.add_argument("-c", "--create", action
="store_true", help="Perform concatenation operation only.");
47 argparser
.add_argument("-I", "-validate", "--validate", action
="store_true", help="Validate CatFile checksums");
48 argparser
.add_argument("-C", "-checksum", "--checksum", default
="crc32", help="Specify the type of checksum to use. Default is crc32.");
49 argparser
.add_argument("-e", "-x", "--extract", action
="store_true", help="Perform extraction operation only.");
50 argparser
.add_argument("-F", "-format", "--format", default
=__file_format_list__
[0], help="Specify the format to use");
51 argparser
.add_argument("-D", "-delimiter", "--delimiter", default
=__file_format_list__
[5], help="Specify the format to use");
52 argparser
.add_argument("-m", "-formatver", "--formatver", default
=__file_format_list__
[6], help="Specify the format version");
53 argparser
.add_argument("-l", "-t", "--list", action
="store_true", help="List files included in the concatenated file.");
54 argparser
.add_argument("-p", "-preserve", "--preserve", action
="store_false", help="Preserve permissions and time of files");
55 argparser
.add_argument("-R", "-repack", "--repack", action
="store_true", help="Re-concatenate files, fixing checksum errors if any.");
56 argparser
.add_argument("-o", "--output", default
=None, help="Specify the name for the extracted concatenated files or the output concatenated file.");
57 argparser
.add_argument("-P", "-compression", "--compression", default
="auto", help="Specify the compression method to use for concatenation.");
58 argparser
.add_argument("-L", "-level", "--level", default
=None, help="Specify the compression level for concatenation.");
59 argparser
.add_argument("-t", "-tar", "--converttar", action
="store_true", help="Convert a tar file to a catfile.");
60 argparser
.add_argument("-z", "-zip", "--convertzip", action
="store_true", help="Convert a zip file to a catfile.");
61 argparser
.add_argument("-r", "-rar", "--convertrar", action
="store_true", help="Convert a rar file to a catfile.");
62 argparser
.add_argument("-T", "--text", action
="store_true", help="Read file locations from a text file.");
63 getargs
= argparser
.parse_args();
65 fname
= getargs
.format
;
66 fnamelower
= fname
.lower();
68 fnamelen
= len(fname
);
69 fnamehex
= binascii
.hexlify(fname
.encode("UTF-8")).decode("UTF-8");
70 fnamever
= getargs
.formatver
;
71 fnamesty
= __use_new_style__
;
72 fnamelist
= [fname
, fnamemagic
, fnamelower
, fnamelen
, fnamehex
, getargs
.delimiter
, fnamever
, fnamesty
];
74 # Determine actions based on user input
75 should_create
= getargs
.create
and not getargs
.extract
and not getargs
.list;
76 should_extract
= getargs
.extract
and not getargs
.create
and not getargs
.list;
77 should_list
= getargs
.list and not getargs
.create
and not getargs
.extract
;
78 should_repack
= getargs
.create
and getargs
.repack
;
79 should_validate
= getargs
.validate
;
81 # Execute the appropriate functions based on determined actions and arguments
83 if getargs
.converttar
:
84 pycatfile
.PackArchiveFileFromTarFile(getargs
.input, getargs
.output
, getargs
.compression
, getargs
.level
, getargs
.checksum
, [], fnamelist
, getargs
.verbose
, False);
85 elif getargs
.convertzip
:
86 pycatfile
.PackArchiveFileFromZipFile(getargs
.input, getargs
.output
, getargs
.compression
, getargs
.level
, getargs
.checksum
, [], fnamelist
, getargs
.verbose
, False);
87 elif rarfile_support
and getargs
.convertrar
:
88 pycatfile
.PackArchiveFileFromRarFile(getargs
.input, getargs
.output
, getargs
.compression
, getargs
.level
, getargs
.checksum
, [], fnamelist
, getargs
.verbose
, False);
90 pycatfile
.PackArchiveFile(getargs
.input, getargs
.output
, getargs
.text
, getargs
.compression
, getargs
.level
, False, getargs
.checksum
, [], fnamelist
, getargs
.verbose
, False);
93 pycatfile
.RePackArchiveFile(getargs
.input, getargs
.output
, getargs
.compression
, getargs
.level
, False, 0, 0, getargs
.checksum
, False, [], fnamelist
, getargs
.verbose
, False);
96 pycatfile
.UnPackArchiveFile(getargs
.input, getargs
.output
, False, 0, 0, False, fnamelist
, getargs
.verbose
, getargs
.preserve
, getargs
.preserve
, False);
99 if getargs
.converttar
:
100 pycatfile
.TarFileListFiles(getargs
.input, getargs
.verbose
, False);
101 elif getargs
.convertzip
:
102 pycatfile
.ZipFileListFiles(getargs
.input, getargs
.verbose
, False);
103 elif rarfile_support
and getargs
.convertrar
:
104 pycatfile
.RarFileListFiles(getargs
.input, getargs
.verbose
, False);
106 pycatfile
.ArchiveFileListFiles(getargs
.input, 0, 0, False, fnamelist
, getargs
.verbose
, False);
108 elif should_validate
:
109 fvalid
= pycatfile
.ArchiveFileValidate(getargs
.input, fnamelist
, getargs
.verbose
, False);
111 pycatfile
.VerbosePrintOut("File is valid: " + str(getargs
.input));
113 pycatfile
.VerbosePrintOut("File is invalid: " + str(getargs
.input));