feat: rewrite application as modular fcco-Converter V2 with new GUI, metadata handling, and updater logic
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
"""
|
||||
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()
|
||||
Reference in New Issue
Block a user