56 lines
1.4 KiB
Python
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
|