| | import re |
| | import hashlib |
| |
|
| | from typing import Dict, Callable, NamedTuple |
| | from pathlib import Path |
| |
|
| |
|
| | class Info(NamedTuple): |
| | path: Path |
| | output_ext: str |
| |
|
| |
|
| | def hash(i: Info, algo='sha1') -> str: |
| | try: |
| | hash = hashlib.new(algo) |
| | except ImportError: |
| | raise ValueError(f"'{algo}' is invalid hash algorithm") |
| |
|
| | |
| | with open(i.path, 'rb') as file: |
| | hash.update(file.read()) |
| |
|
| | return hash.hexdigest() |
| |
|
| |
|
| | pattern = re.compile(r'\[([\w:]+)\]') |
| |
|
| | |
| | |
| | available_formats: Dict[str, Callable] = { |
| | 'name': lambda i: i.path.stem, |
| | 'extension': lambda i: i.path.suffix[1:], |
| | 'hash': hash, |
| |
|
| | 'output_extension': lambda i: i.output_ext |
| | } |
| |
|
| |
|
| | def format(match: re.Match, info: Info) -> str: |
| | matches = match[1].split(':') |
| | name, args = matches[0], matches[1:] |
| |
|
| | if name not in available_formats: |
| | return match[0] |
| |
|
| | return available_formats[name](info, *args) |
| |
|