#!/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}/'") # Sortiere nach Änderungsdatum (neueste zuerst) mp3_files.sort(key=lambda x: x.stat().st_mtime, reverse=True) return mp3_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())