50 lines
1.2 KiB
Python
50 lines
1.2 KiB
Python
# License: GNU AGPL v3: http://www.gnu.org/licenses/
|
|
# This file is part of `delarte` (https://git.afpy.org/fcode/delarte.git)
|
|
|
|
"""Provide contextualized based file naming utility."""
|
|
import re
|
|
|
|
|
|
def file_name_builder(
|
|
*,
|
|
use_id=False,
|
|
sep=" - ",
|
|
seq_pfx=" - ",
|
|
seq_no_pad=False,
|
|
add_rendition=False,
|
|
add_variant=False
|
|
):
|
|
"""Create a file namer."""
|
|
|
|
def sub_sequence_counter(match):
|
|
index = match[1]
|
|
if not seq_no_pad:
|
|
index = (len(match[2]) - len(index)) * "0" + index
|
|
|
|
return seq_pfx + index
|
|
|
|
def replace_sequence_counter(s: str) -> str:
|
|
return re.sub(r"\s+\((\d+)/(\d+)\)", sub_sequence_counter, s)
|
|
|
|
def build_file_name(program, rendition, variant):
|
|
"""Create a file name."""
|
|
if use_id:
|
|
return program.id
|
|
|
|
fields = [replace_sequence_counter(program.title)]
|
|
if program.subtitle:
|
|
fields.append(replace_sequence_counter(program.subtitle))
|
|
|
|
if add_rendition:
|
|
fields.append(rendition.code)
|
|
|
|
if add_variant:
|
|
fields.append(variant.code)
|
|
|
|
name = sep.join(fields)
|
|
name = re.sub(r'[/:<>"\\|?*]', "", name)
|
|
|
|
return name
|
|
|
|
return build_file_name
|