mirror of
https://github.com/drewcassidy/quicktex.git
synced 2024-09-13 06:37:34 +00:00
64 lines
2.3 KiB
Python
64 lines
2.3 KiB
Python
import pathlib
|
|
from typing import List
|
|
|
|
import click
|
|
from PIL import Image
|
|
|
|
|
|
def get_decoded_extensions(feature: str = 'open') -> List[str]:
|
|
"""Gets a list of extensions for Pillow formats supporting a supplied feature"""
|
|
extensions = Image.registered_extensions() # using registered_extensions() triggers lazy loading of format data
|
|
formats = getattr(Image, feature.upper()).keys()
|
|
|
|
return [ext for ext, fmt in extensions.items() if fmt in formats]
|
|
|
|
|
|
# noinspection PyUnusedLocal
|
|
def validate_decoded_extension(ctx, param, value) -> str:
|
|
"""Check if an extension for a decoded image is valid"""
|
|
if value[0] != '.':
|
|
value = '.' + value
|
|
|
|
if value not in decoded_extensions:
|
|
raise click.BadParameter(f'Invalid extension for decoded file. Valid extensions are:\n{decoded_extensions}')
|
|
|
|
return value
|
|
|
|
|
|
decoded_extensions = get_decoded_extensions()
|
|
encoded_extensions = '.dds'
|
|
|
|
|
|
def path_pairs(inputs, output, suffix, extension):
|
|
"""
|
|
Generates pairs of (inpath, outpath) for the given parameters
|
|
:param inputs: A list of input paths to read from
|
|
:param output: output to write to. can be a file, directory, or None to convert in place
|
|
:param suffix: suffix to add to destinations
|
|
:param extension: extension to use for destinations
|
|
:return: A list of pairs of (inpath, outpath)
|
|
"""
|
|
|
|
if len(inputs) < 1:
|
|
raise click.BadArgumentUsage('No input files were provided.')
|
|
|
|
inpaths = [pathlib.Path(i) for i in inputs]
|
|
|
|
if not output:
|
|
# decode in place
|
|
return [(inpath, inpath.with_name(inpath.stem + suffix + extension)) for inpath in inpaths]
|
|
|
|
else:
|
|
outpath = pathlib.Path(output)
|
|
if outpath.is_file():
|
|
# decode to a file
|
|
if len(inputs) > 1:
|
|
raise click.BadOptionUsage('output', 'Output is a single file, but multiple input files were provided.')
|
|
# if outpath.suffix not in decoded_extensions:
|
|
# raise click.BadOptionUsage('output', f'File has incorrect extension for decoded file. Valid extensions are:\n{decoded_extensions}')
|
|
|
|
return [(inpath, outpath) for inpath in inpaths]
|
|
else:
|
|
# decode to directory
|
|
return [(inpath, outpath / (inpath.stem + suffix + extension)) for inpath in inpaths]
|