""" fcco-Converter V2 – Metadaten-Modul Hilfsfunktionen für ID3-Tags, Cover-Bilder und Albumname-Generierung. """ from datetime import datetime from pathlib import Path from mutagen.easyid3 import EasyID3 from mutagen.id3 import ID3, APIC from .config import WEEKDAY_SHORT_DE def generate_album_name(veranstaltung: str = "") -> str: """Erstellt einen Albumnamen basierend auf dem aktuellen Datum und der Veranstaltung.""" date_str = datetime.now().strftime("%d.%m.%Y") if veranstaltung: return f"{date_str} {veranstaltung}" return date_str def generate_folder_name(date_part: str, veranstaltung: str) -> str: """Erstellt den Ordnernamen für den Export.""" if veranstaltung: return f"{date_part} {veranstaltung}" return date_part def generate_date_part() -> str: """Erstellt das Datumskürzel (z.B. '260719Sa') für die aktuelle Zeit.""" now = datetime.now() return now.strftime("%y%m%d") + WEEKDAY_SHORT_DE[now.weekday()] def extract_event_from_folder(file_path: Path) -> tuple[str, str]: """Versucht, Datum und Veranstaltung aus dem Ordnernamen zu extrahieren. Erwartetes Format: 'YYMMDDWt Veranstaltungsname' z.B. '260406Mo Ostermontag' Returns: (date_part, veranstaltung) oder ("", "") wenn nicht erkannt. """ folder_name = file_path.parent.name if len(folder_name) >= 8 and folder_name[:6].isdigit() and folder_name[6:8] in WEEKDAY_SHORT_DE: date_part = folder_name[:8] veranstaltung = folder_name[8:].strip() if len(folder_name) > 8 else "" return date_part, veranstaltung return "", "" def apply_id3_tags( mp3_path: Path, title: str, artist: str, album: str, track_number: int, year: str, cover_path: Path | None = None, ) -> None: """Schreibt ID3-Metadaten und optional ein Cover in die MP3-Datei.""" audiofile = EasyID3(str(mp3_path)) audiofile["title"] = title audiofile["artist"] = artist or "Unbekannt" audiofile["album"] = album or "Unbekanntes Album" audiofile["tracknumber"] = str(track_number) audiofile["date"] = year audiofile.save() if cover_path and cover_path.exists(): audio_id3 = ID3(str(mp3_path)) mime = "image/jpeg" suffix = cover_path.suffix.lower() if suffix == ".png": mime = "image/png" with open(cover_path, "rb") as img: audio_id3.add( APIC( encoding=3, mime=mime, type=3, desc="Cover", data=img.read(), ) ) audio_id3.save()