delarte/src/delarte/naming.py

56 lines
1.4 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
from typing import Optional
from .model import Program, VideoMeta, AudioMeta, SubtitlesMeta
def file_name_builder(
v_meta: VideoMeta,
a_meta: AudioMeta,
s_meta: Optional[SubtitlesMeta],
*,
use_id=False,
use_slug=False,
sep=" - ",
seq_pfx=" - ",
seq_no_pad=False,
add_resolution=False,
):
"""Create a file namer from context."""
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: Program) -> str:
"""Create a file name for given program."""
if use_id:
return program.id
if use_slug:
return program.slug
fields = [replace_sequence_counter(program.meta.title)]
if program.meta.subtitle:
fields.add(replace_sequence_counter(program.meta.subtitles))
if add_resolution:
fields.append(f"{v_meta.height}p")
name = sep.join(fields)
name = re.sub(r'[/:<>"\\|?*]', "", name)
return name
return build_file_name