Skip to content

Commit

Permalink
Minor improvements utilizing pathlib module, shortened modes added, a…
Browse files Browse the repository at this point in the history
…dded checks for threads if specified threads are lesser than 1 (minimum 1 threads needed)
  • Loading branch information
rifsxd committed Mar 14, 2024
1 parent 6e2e4f8 commit 0955c30
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 46 deletions.
17 changes: 11 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

Usage :

pydvpl [--mode] [--keep-originals] [--path] [--verbose] [--ignore]
$ pydvpl [--mode] [--keep-originals] [--path] [--verbose] [--ignore] [--threads]

• flags can be one of the following:

Expand All @@ -12,13 +12,14 @@ Usage :
-p, --path: specifies the directory/files path to process. Default is the current directory.
-i, --ignore: specifies comma-separated file extensions to ignore during compression.
-v, --verbose: shows verbose information for all processed files.
-t, --threads: specifies the number of threads to use for processing. Default is 1.

• mode can be one of the following:

compress: compresses files into dvpl.
decompress: decompresses dvpl files into standard files.
verify: verify compressed dvpl files to determine valid compression.
help: show this help message.
c, compress: compresses files into dvpl.
d, decompress: decompresses dvpl files into standard files.
v, verify: verify compressed dvpl files to determine valid compression.
h, help: show this help message.

• usage can be one of the following examples:

Expand All @@ -45,10 +46,14 @@ Usage :
$ pydvpl --mode compress --path /path/to/decompress --ignore exe,dll

$ pydvpl --mode compress --path /path/to/decompress --ignore test.exe,test.txt

$ pydvpl --mode verify -path /path/to/verify

$ pydvpl --mode verify -path /path/to/verify/verify.yaml.dvpl
$ pydvpl --mode decompress --path /path/to/decompress/compress.yaml.dvpl --threads 10

$ pydvpl --mode compress --path /path/to/decompress/compress.yaml --threads 10

Running :

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name = "pydvpl"
description = "A CLI Tool Coded In Python3 To Convert WoTB ( Dava ) SmartDLC DVPL File Based On LZ4 High Compression."
readme = "README.md"
version = "0.3.0"
version = "0.4.0"
authors = [{ name = "RifsxD", email = "support@rxd-mods.xyz" }]
license = { text = "MIT License" }
requires-python = ">=3.10"
Expand Down
15 changes: 13 additions & 2 deletions src/pydvpl/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,17 @@
createDVPLFooter
)

__all__ = ['CompressDVPL', 'DecompressDVPL','ConvertDVPLFiles', 'VerifyDVPLFiles', 'readDVPLFooter', 'createDVPLFooter']
from .__version__ import (
__description__,
__title__,
__version__,
__date__,
__repo__,
__author__
)

__all__ = ['CompressDVPL', 'DecompressDVPL', 'ConvertDVPLFiles',
'VerifyDVPLFiles', 'readDVPLFooter', 'createDVPLFooter',
'__description__', '__title__', '__version__',
'__author__', '__date__', '__repo__']

__version__ = '0.3.0'
6 changes: 6 additions & 0 deletions src/pydvpl/__version__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
__title__ = "PyDVPL"
__description__ = "A CLI Tool Coded In Python3 To Convert WoTB ( Dava ) SmartDLC DVPL File Based On LZ4 High Compression."
__version__ = "0.4.0"
__date__ = "2024-03-14"
__author__ = "RifsxD"
__repo__ = "https://github.com/rifsxd/pydvpl"
93 changes: 56 additions & 37 deletions src/pydvpl/converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import multiprocessing
import queue
from functools import partial
from .__version__ import __version__, __description__, __title__, __date__, __repo__, __author__



class Color:
Expand All @@ -19,12 +21,12 @@ class Color:


class Meta:
NAME = 'PyDVPL'
VERSION = '0.3.0'
DATE = '14/03/2024'
DEV = 'RifsxD'
REPO = 'https://github.com/rifsxd/pydvpl'
INFO = 'A CLI Tool Coded In Python3 To Convert WoTB ( Dava ) SmartDLC DVPL File Based On LZ4 High Compression.'
NAME = __title__
VERSION = __version__
DATE = __date__
DEV = __author__
REPO = __repo__
INFO = __description__


output_lock = threading.Lock()
Expand Down Expand Up @@ -113,13 +115,15 @@ def print_progress_bar(processed_files, total_files):
sys.stdout.flush()


from pathlib import Path

def count_total_files(directory):
total_files = 0
for root, dirs, files in os.walk(directory):
total_files += len(files)
for path in Path(directory).rglob('*'):
if path.is_file():
total_files += 1
return total_files


def ConvertDVPLFiles(directory_or_file, config, total_files=None, processed_files=None):
if total_files is None:
total_files = count_total_files(directory_or_file)
Expand All @@ -130,16 +134,16 @@ def ConvertDVPLFiles(directory_or_file, config, total_files=None, processed_file
failure_count = 0
ignored_count = 0

if os.path.isdir(directory_or_file):
dir_list = os.listdir(directory_or_file)
for dir_item in dir_list:
succ, fail, ignored = ConvertDVPLFiles(os.path.join(directory_or_file, dir_item), config, total_files, processed_files)
success_count += succ
failure_count += fail
ignored_count += ignored
with processed_files.get_lock():
processed_files.value += 1
print_progress_bar(processed_files, total_files)
if Path(directory_or_file).is_dir():
for file_path in Path(directory_or_file).rglob('*'):
if file_path.is_file():
succ, fail, ignored = ConvertDVPLFiles(str(file_path), config, total_files, processed_files)
success_count += succ
failure_count += fail
ignored_count += ignored
with processed_files.get_lock():
processed_files.value += 1
print_progress_bar(processed_files, total_files)
else:
is_decompression = config.mode == "decompress" and directory_or_file.endswith(".dvpl")
is_compression = config.mode == "compress" and not directory_or_file.endswith(".dvpl")
Expand Down Expand Up @@ -183,7 +187,6 @@ def ConvertDVPLFiles(directory_or_file, config, total_files=None, processed_file

return success_count, failure_count, ignored_count


def VerifyDVPLFiles(directory_or_file, config, total_files=None, processed_files=None):
if total_files is None:
total_files = count_total_files(directory_or_file)
Expand All @@ -194,16 +197,16 @@ def VerifyDVPLFiles(directory_or_file, config, total_files=None, processed_files
failure_count = 0
ignored_count = 0

if os.path.isdir(directory_or_file):
dir_list = os.listdir(directory_or_file)
for dir_item in dir_list:
succ, fail, ignored = VerifyDVPLFiles(os.path.join(directory_or_file, dir_item), config, total_files, processed_files)
success_count += succ
failure_count += fail
ignored_count += ignored
with processed_files.get_lock():
processed_files.value += 1
print_progress_bar(processed_files, total_files)
if Path(directory_or_file).is_dir():
for file_path in Path(directory_or_file).rglob('*'):
if file_path.is_file() and file_path.suffix == '.dvpl':
succ, fail, ignored = VerifyDVPLFiles(str(file_path), config, total_files, processed_files)
success_count += succ
failure_count += fail
ignored_count += ignored
with processed_files.get_lock():
processed_files.value += 1
print_progress_bar(processed_files, total_files)
else:
is_dvpl_file = directory_or_file.endswith(".dvpl")

Expand Down Expand Up @@ -271,7 +274,7 @@ def process_func(directory_or_file, config, total_files, processed_files):
def ParseCommandLineArgs():
parser = argparse.ArgumentParser()
parser.add_argument("-m", "--mode",
help="mode can be 'compress' / 'decompress' / 'verify' / 'help' (for an extended help guide).")
help="mode can be 'c' or 'compress' / 'd' or 'decompress' / 'v' or 'verify' / 'h' or 'help' (for an extended help guide).")
parser.add_argument("-k", "--keep-originals", action="store_true",
help="keep original files after compression/decompression.")
parser.add_argument("-v", "--verbose", action="store_true",
Expand All @@ -289,11 +292,23 @@ def ParseCommandLineArgs():
if not args.path:
args.path = os.getcwd()

# Map short forms to full mode names
mode_mapping = {
'c': 'compress',
'd': 'decompress',
'v': 'verify',
'h': 'help'
}

# If mode argument is provided and it matches a short form, replace it with the full mode name
if args.mode in mode_mapping:
args.mode = mode_mapping[args.mode]

return args


def PrintHelpMessage():
print('''$ pydvpl [--mode] [--keep-originals] [--path] [--threads]
print('''$ pydvpl [--mode] [--keep-originals] [--path] [--verbose] [--ignore] [--threads]
• flags can be one of the following:
Expand All @@ -306,10 +321,10 @@ def PrintHelpMessage():
• mode can be one of the following:
compress: compresses files into dvpl.
decompress: decompresses dvpl files into standard files.
verify: verify compressed dvpl files to determine valid compression.
help: show this help message.
c, compress: compresses files into dvpl.
d, decompress: decompresses dvpl files into standard files.
v, verify: verify compressed dvpl files to determine valid compression.
h, help: show this help message.
• usage can be one of the following examples:
Expand Down Expand Up @@ -367,6 +382,10 @@ def main():
start_time = time.time()
config = ParseCommandLineArgs()

if config.threads <= 0:
print(f"\n{Color.YELLOW}No threads specified.{Color.RESET} No processing will be done.\n")
return

total_files = count_total_files(config.path)
manager = multiprocessing.Manager()
processed_files = manager.Value('i', 0) # Define processed_files using a Manager
Expand Down Expand Up @@ -399,4 +418,4 @@ def main():


if __name__ == "__main__":
main()
main()

0 comments on commit 0955c30

Please sign in to comment.