feat: smart title extraction from filename for 2.0.2
This commit is contained in:
@@ -13,7 +13,7 @@ from pathlib import Path
|
||||
# ---- Globale App-Informationen (aus config.json) ----
|
||||
APP_INFO = {
|
||||
"app_name": "fcco Converter",
|
||||
"app_version": "2.0.0",
|
||||
"app_version": "2.0.2",
|
||||
"repo_owner": "public",
|
||||
"repo_name": "fcco-Converter",
|
||||
"gitea_api_base": "https://git.joelunger.de/api/v1"
|
||||
|
||||
@@ -205,7 +205,8 @@ def convert_file_entry(
|
||||
audio_settings = {"output_format": "mp3", "bitrate": "192", "encoding_mode": "CBR"}
|
||||
|
||||
file_path = Path(entry["full_path"])
|
||||
title = file_path.stem
|
||||
from .metadata import extract_title_from_filename
|
||||
title = extract_title_from_filename(file_path.stem)
|
||||
output_format = audio_settings.get("output_format", "mp3")
|
||||
|
||||
try:
|
||||
|
||||
@@ -4,6 +4,7 @@ fcco-Converter V2 – Metadaten-Modul
|
||||
Hilfsfunktionen für ID3-Tags, Cover-Bilder und Albumname-Generierung.
|
||||
"""
|
||||
|
||||
import re
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
@@ -51,6 +52,47 @@ def extract_event_from_folder(file_path: Path) -> tuple[str, str]:
|
||||
return "", ""
|
||||
|
||||
|
||||
def extract_title_from_filename(filename: str) -> str:
|
||||
"""Extrahiert einen sauberen Titel aus dem komplexen Dateinamen-Format.
|
||||
|
||||
Format-Erwartung: [Prefix]_[Track]_[Type]_[Lang][ Remainder]
|
||||
Beispiele:
|
||||
260719So_N_10_Predigt_D Vorname Nachname -> "Predigt Vorname Nachname"
|
||||
260719So_N_04_Lied_D Zum blauen Himmel -> "Zum blauen Himmel"
|
||||
"""
|
||||
# Regulärer Ausdruck, um die Komponenten zu extrahieren
|
||||
match = re.match(r"^.*?_\d+_(?P<type>[a-zA-Z]+)_(?P<lang>[a-zA-Z]+)(?: (?P<remainder>.*))?$", filename)
|
||||
if not match:
|
||||
return filename
|
||||
|
||||
typ = match.group("type")
|
||||
lang = match.group("lang")
|
||||
remainder = match.group("remainder") or ""
|
||||
|
||||
typ_lower = typ.lower()
|
||||
|
||||
if typ_lower in ["predigt", "vorwort", "gedicht"]:
|
||||
if remainder:
|
||||
return f"{typ} {remainder}"
|
||||
return f"{typ} {lang}"
|
||||
|
||||
elif typ_lower == "lied":
|
||||
if remainder:
|
||||
return remainder
|
||||
return f"{typ} {lang}"
|
||||
|
||||
elif typ_lower in ["chor", "orchester"]:
|
||||
if remainder:
|
||||
return f"{remainder} ({typ})"
|
||||
return f"{typ} {lang}"
|
||||
|
||||
else:
|
||||
# Fallback
|
||||
if remainder:
|
||||
return f"{typ} {remainder}"
|
||||
return f"{typ} {lang}"
|
||||
|
||||
|
||||
from mutagen.id3 import ID3, APIC, TIT2, TPE1, TALB, TRCK, TDRC
|
||||
|
||||
def apply_id3_tags(
|
||||
|
||||
Reference in New Issue
Block a user