Verbessere die Cover-URL-Generierung durch Verwendung einer sicheren URL-Encoding-Methode und aktualisiere die Sprach- und Datumsformate für bessere Kompatibilität mit RSS-Standards.

This commit is contained in:
2025-07-05 21:15:33 +02:00
parent 9750e14234
commit 1b6a91f22d

View File

@ -121,7 +121,7 @@ class LocalPodcastGenerator:
# Prüfe ob Cover bereits existiert
if cover_path.exists():
# Cover existiert bereits - verwende es einfach (URL-encoded)
cover_url = f"{self.base_url}/_audio/{urllib.parse.quote(cover_filename)}"
cover_url = f"{self.base_url}/_audio/{self.safe_url_encode(cover_filename)}"
print(f" 🖼️ Cover bereits vorhanden: {cover_filename}")
return cover_url
@ -193,13 +193,18 @@ class LocalPodcastGenerator:
return None
# Rückgabe der URL zum Cover (URL-encoded für korrekte Links)
cover_url = f"{self.base_url}/_audio/{urllib.parse.quote(cover_filename)}"
cover_url = f"{self.base_url}/_audio/{self.safe_url_encode(cover_filename)}"
return cover_url
except Exception as e:
print(f" ⚠️ Fehler beim Extrahieren des Covers: {e}")
return None
def safe_url_encode(self, filename):
"""Erstellt URL-sichere Dateinamen durch korrektes Encoding."""
# Verwende quote_plus für bessere URL-Sicherheit (ersetzt Leerzeichen mit +)
return urllib.parse.quote(filename, safe='')
def format_duration(self, seconds):
"""Formatiert die Dauer in HH:MM:SS Format."""
if not seconds:
@ -209,6 +214,14 @@ class LocalPodcastGenerator:
minutes = (seconds % 3600) // 60
seconds = seconds % 60
return f"{hours:02d}:{minutes:02d}:{seconds:02d}"
"""Formatiert die Dauer in HH:MM:SS Format."""
if not seconds:
return "00:00:00"
hours = seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60
return f"{hours:02d}:{minutes:02d}:{seconds:02d}"
def create_rss_feed(self, podcast_title="SERMAN - Organic House Podcast",
podcast_description=None, podcast_author="SERMAN"):
@ -247,13 +260,13 @@ Ich spezialisiere mich auf House Music, die mehr als nur Beats bietet sie er
link.text = self.base_url
language = ET.SubElement(channel, "language")
language.text = "de-DE"
language.text = "de" # ISO 639-1 Code (nicht de-DE)
# Wichtig: lastBuildDate für bessere Erkennung von Updates
# Wichtig: lastBuildDate für bessere Erkennung von Updates (RFC 2822 konform)
last_build = ET.SubElement(channel, "lastBuildDate")
last_build.text = datetime.now().strftime('%a, %d %b %Y %H:%M:%S +0000')
# pubDate für den Channel
# pubDate für den Channel (RFC 2822 konform)
channel_pub_date = ET.SubElement(channel, "pubDate")
channel_pub_date.text = datetime.now().strftime('%a, %d %b %Y %H:%M:%S +0000')
@ -334,14 +347,14 @@ Ich spezialisiere mich auf House Music, die mehr als nur Beats bietet sie er
# GUID (eindeutige ID - verwende Audio-URL)
item_guid = ET.SubElement(item, "guid")
# Die Audio-URL als eindeutige GUID
audio_url = f"{self.base_url}/_audio/{urllib.parse.quote(metadata['filename'])}"
# Die Audio-URL als eindeutige GUID (URL-safe encoded)
audio_url = f"{self.base_url}/_audio/{self.safe_url_encode(metadata['filename'])}"
item_guid.text = audio_url
item_guid.set("isPermaLink", "false")
# Veröffentlichungsdatum (korrekt formatiert für RSS)
# Veröffentlichungsdatum (RFC 2822 konform)
item_pubdate = ET.SubElement(item, "pubDate")
# RFC 2822 Format für RSS (mit Timezone)
# RFC 2822 Format mit korrekter Timezone
pub_date_formatted = metadata['pub_date'].strftime('%a, %d %b %Y %H:%M:%S +0000')
item_pubdate.text = pub_date_formatted
@ -351,10 +364,10 @@ Ich spezialisiere mich auf House Music, die mehr als nur Beats bietet sie er
enclosure.set("type", "audio/mpeg")
enclosure.set("length", str(metadata['file_size']))
# Dauer
# Dauer (Apple empfiehlt Sekunden als Integer)
if metadata['duration']:
item_duration = ET.SubElement(item, "itunes:duration")
item_duration.text = self.format_duration(metadata['duration'])
item_duration.text = str(int(metadata['duration'])) # Integer Sekunden für Apple
# iTunes-spezifische Tags für bessere Episode-Erkennung
itunes_title = ET.SubElement(item, "itunes:title")
@ -399,7 +412,8 @@ Ich spezialisiere mich auf House Music, die mehr als nur Beats bietet sie er
ET.indent(tree, space=" ", level=0)
try:
tree.write(self.output_file, encoding='utf-8', xml_declaration=True)
# Explizite XML-Deklaration mit UTF-8 encoding
tree.write(self.output_file, encoding='UTF-8', xml_declaration=True)
print(f"✅ RSS-Feed erfolgreich erstellt: {self.output_file}")
print(f"📊 Anzahl der Episoden: {len(mp3_files)}")
print(f"🌐 Audio-URLs verwenden Basis-URL: {self.base_url}")