170 lines
6.7 KiB
Python
170 lines
6.7 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
SERMAN RSS Feed Generator - Lokale Version
|
|
Generiert RSS-Feeds aus lokalen MP3-Dateien für Podcast-Apps.
|
|
Optimiert für Cron-Jobs.
|
|
"""
|
|
|
|
from local_podcast_generator import LocalPodcastGenerator
|
|
import argparse
|
|
import sys
|
|
import os
|
|
import contextlib
|
|
from io import StringIO
|
|
|
|
|
|
class QuietLocalPodcastGenerator(LocalPodcastGenerator):
|
|
"""Erweiterte Version des Generators mit Quiet-Mode-Unterstützung."""
|
|
|
|
def __init__(self, audio_dir="../httpdocs/_audio", output_file="podcast_feed.xml",
|
|
base_url="https://www.serman.club", quiet=False):
|
|
super().__init__(audio_dir, output_file, base_url)
|
|
self.quiet = quiet
|
|
self.errors = []
|
|
|
|
def log(self, message):
|
|
"""Logging-Funktion die das quiet-Flag berücksichtigt."""
|
|
if not self.quiet:
|
|
print(message)
|
|
|
|
def log_error(self, message):
|
|
"""Error-Logging das immer ausgegeben wird."""
|
|
print(message)
|
|
self.errors.append(message)
|
|
|
|
def get_mp3_files(self):
|
|
"""Überschreibt die Original-Methode für besseres Logging."""
|
|
from pathlib import Path
|
|
|
|
audio_path = Path(self.audio_dir)
|
|
if not audio_path.exists():
|
|
self.log_error(f"❌ Audio-Verzeichnis '{self.audio_dir}' existiert nicht!")
|
|
return []
|
|
|
|
mp3_files = list(audio_path.glob("*.mp3"))
|
|
self.log(f"🎵 {len(mp3_files)} MP3-Dateien gefunden in '{self.audio_dir}/'")
|
|
|
|
# Debug: Zeige alle gefundenen Dateien
|
|
for i, mp3_file in enumerate(mp3_files):
|
|
self.log(f" Datei {i+1}: '{mp3_file.name}'")
|
|
|
|
# Benenne MP3-Dateien um (Leerzeichen → Unterstriche)
|
|
renamed_files = []
|
|
rename_count = 0
|
|
for mp3_file in mp3_files:
|
|
self.log(f" 🔍 Prüfe: '{mp3_file.name}' - Leerzeichen vorhanden: {' ' in mp3_file.name}")
|
|
if ' ' in mp3_file.name:
|
|
# Neuer Dateiname ohne Leerzeichen
|
|
new_name = mp3_file.name.replace(' ', '_')
|
|
new_path = mp3_file.parent / new_name
|
|
|
|
# Prüfe ob neue Datei bereits existiert
|
|
if not new_path.exists():
|
|
try:
|
|
mp3_file.rename(new_path)
|
|
self.log(f" 📝 Umbenannt: '{mp3_file.name}' → '{new_name}'")
|
|
renamed_files.append(new_path)
|
|
rename_count += 1
|
|
except Exception as e:
|
|
self.log_error(f" ⚠️ Fehler beim Umbenennen von '{mp3_file.name}': {e}")
|
|
renamed_files.append(mp3_file)
|
|
else:
|
|
self.log(f" ⚠️ Datei '{new_name}' existiert bereits, überspringe Umbenennung")
|
|
# Verwende die bereits existierende umbenannte Datei
|
|
renamed_files.append(new_path)
|
|
else:
|
|
self.log(f" ✅ Keine Umbenennung nötig: '{mp3_file.name}'")
|
|
renamed_files.append(mp3_file)
|
|
|
|
self.log(f" 📊 {rename_count} Dateien umbenannt, {len(renamed_files)} Dateien total")
|
|
|
|
# Sortiere nach Änderungsdatum (neueste zuerst)
|
|
renamed_files.sort(key=lambda x: x.stat().st_mtime, reverse=True)
|
|
|
|
return renamed_files
|
|
|
|
def create_rss_feed_quiet(self, podcast_title="SERMAN - Organic House Podcast",
|
|
podcast_description=None, podcast_author="SERMAN"):
|
|
"""RSS-Feed-Erstellung mit unterdrückter Ausgabe für Cron-Jobs."""
|
|
|
|
if self.quiet:
|
|
# Unterdrücke alle print-Ausgaben während der Feed-Erstellung
|
|
with contextlib.redirect_stdout(StringIO()), contextlib.redirect_stderr(StringIO()):
|
|
try:
|
|
return super().create_rss_feed(podcast_title, podcast_description, podcast_author)
|
|
except Exception as e:
|
|
self.log_error(f"❌ Fehler beim Erstellen des RSS-Feeds: {e}")
|
|
return False
|
|
else:
|
|
# Normale Ausgabe
|
|
return super().create_rss_feed(podcast_title, podcast_description, podcast_author)
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="SERMAN RSS Feed Generator - Lokale Version")
|
|
parser.add_argument("-a", "--audio-dir", default="../httpdocs/_audio",
|
|
help="Verzeichnis mit MP3-Dateien (Standard: ../httpdocs/_audio)")
|
|
parser.add_argument("-o", "--output", default="serman_podcast.xml",
|
|
help="Ausgabedatei für den RSS-Feed (Standard: serman_podcast.xml)")
|
|
parser.add_argument("-u", "--base-url", default="https://www.serman.club",
|
|
help="Basis-URL für Audio-Dateien (Standard: https://www.serman.club)")
|
|
parser.add_argument("-t", "--title", default="SERMAN - Organic House Podcast",
|
|
help="Titel des Podcasts")
|
|
parser.add_argument("--author", default="SERMAN",
|
|
help="Autor des Podcasts")
|
|
parser.add_argument("-q", "--quiet", action="store_true",
|
|
help="Unterdrückt Ausgaben (nützlich für Cron-Jobs)")
|
|
|
|
args = parser.parse_args()
|
|
|
|
# Unterdrücke Ausgaben wenn --quiet gesetzt ist
|
|
def log(message):
|
|
if not args.quiet:
|
|
print(message)
|
|
|
|
log("🎵 SERMAN RSS Feed Generator - Lokale Version")
|
|
log("=" * 50)
|
|
|
|
# Prüfe ob Audio-Verzeichnis existiert
|
|
if not os.path.exists(args.audio_dir):
|
|
log(f"❌ Audio-Verzeichnis '{args.audio_dir}' existiert nicht!")
|
|
log(f"💡 Erstelle das Verzeichnis und lege deine MP3-Dateien dort ab.")
|
|
return 1
|
|
|
|
# Erstelle den Generator
|
|
generator = QuietLocalPodcastGenerator(
|
|
audio_dir=args.audio_dir,
|
|
output_file=args.output,
|
|
base_url=args.base_url,
|
|
quiet=args.quiet
|
|
)
|
|
|
|
# Generiere den RSS-Feed
|
|
log(f"📂 Scanne '{args.audio_dir}/' nach MP3-Dateien...")
|
|
success = generator.create_rss_feed_quiet(
|
|
podcast_title=args.title,
|
|
podcast_author=args.author
|
|
)
|
|
|
|
if not success:
|
|
log("❌ Fehler beim Erstellen des RSS-Feeds!")
|
|
# Zeige Fehler auch im quiet-Modus
|
|
if args.quiet and hasattr(generator, 'errors') and generator.errors:
|
|
for error in generator.errors:
|
|
print(error)
|
|
return 1
|
|
|
|
log("\n🎉 RSS-Feed erfolgreich erstellt!")
|
|
log(f"📄 Datei: {args.output}")
|
|
log(f"🌐 URL: {args.base_url}/{args.output}")
|
|
|
|
# Im quiet-Modus nur Erfolg bei Fehlern ausgeben
|
|
if args.quiet and success:
|
|
print(f"✅ RSS-Feed erfolgreich erstellt: {args.output}")
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|