Verbessere die Cover-Optimierung und -Integration für bessere Kompatibilität mit Apple Podcasts durch Anpassungen bei der Bildverarbeitung und dem Hinzufügen von Cover-Tags.

This commit is contained in:
2025-07-05 21:01:45 +02:00
parent 6172a898c3
commit 9750e14234

View File

@ -165,16 +165,22 @@ class LocalPodcastGenerator:
# Skaliere auf Zielgröße # Skaliere auf Zielgröße
image = image.resize((target_size, target_size), Image.Resampling.LANCZOS) image = image.resize((target_size, target_size), Image.Resampling.LANCZOS)
# Konvertiere zu RGB falls nötig (für JPEG) # Konvertiere zu RGB falls nötig (für JPEG) - Apple Podcasts erfordert festen Hintergrund
if image.mode in ('RGBA', 'LA', 'P'): if image.mode in ('RGBA', 'LA', 'P'):
# Verwende weißen Hintergrund für Transparenz (Apple Podcasts Anforderung)
background = Image.new('RGB', image.size, (255, 255, 255)) background = Image.new('RGB', image.size, (255, 255, 255))
if image.mode == 'P': if image.mode == 'P':
image = image.convert('RGBA') image = image.convert('RGBA')
background.paste(image, mask=image.split()[-1] if image.mode == 'RGBA' else None) if image.mode in ('RGBA', 'LA'):
# Berücksichtige Alpha-Kanal für bessere Transparenz-Behandlung
background.paste(image, mask=image.split()[-1] if len(image.split()) > 3 else None)
else:
background.paste(image)
image = background image = background
print(f" 🔄 Transparenz entfernt (Apple Podcasts Anforderung)")
# Speichere das optimierte Cover # Speichere das optimierte Cover mit höherer Qualität für Apple Podcasts
image.save(cover_path, 'JPEG', quality=95, optimize=True) image.save(cover_path, 'JPEG', quality=98, optimize=True, progressive=True)
final_width, final_height = image.size final_width, final_height = image.size
print(f" 🖼️ Cover optimiert und gespeichert: {cover_filename} ({final_width}x{final_height}px)") print(f" 🖼️ Cover optimiert und gespeichert: {cover_filename} ({final_width}x{final_height}px)")
@ -297,9 +303,18 @@ Ich spezialisiere mich auf House Music, die mehr als nur Beats bietet sie er
for episode_index, mp3_file in enumerate(mp3_files): for episode_index, mp3_file in enumerate(mp3_files):
metadata = self.get_mp3_metadata(mp3_file) metadata = self.get_mp3_metadata(mp3_file)
print(f"\n🎵 Episode {episode_index + 1}: {metadata['title']}")
print(f" 📄 Datei: {metadata['filename']}")
print(f" 🎨 Cover-Daten vorhanden: {'Ja' if metadata['cover_data'] else 'Nein'}")
# Episode-Cover extrahieren # Episode-Cover extrahieren
episode_cover_url = self.extract_episode_cover(metadata, episode_index) episode_cover_url = self.extract_episode_cover(metadata, episode_index)
if episode_cover_url:
print(f" 🔗 Cover-URL: {episode_cover_url}")
else:
print(f" ❌ Keine Cover-URL generiert")
item = ET.SubElement(channel, "item") item = ET.SubElement(channel, "item")
# Titel # Titel
@ -355,11 +370,18 @@ Ich spezialisiere mich auf House Music, die mehr als nur Beats bietet sie er
itunes_episode_type = ET.SubElement(item, "itunes:episodeType") itunes_episode_type = ET.SubElement(item, "itunes:episodeType")
itunes_episode_type.text = "full" itunes_episode_type.text = "full"
# Episode-Cover hinzufügen - nur iTunes Format für bessere Kompatibilität # Episode-Cover hinzufügen - beide Formate für maximale Kompatibilität
if episode_cover_url: if episode_cover_url:
# Standard RSS image tag (für breite Kompatibilität)
item_image = ET.SubElement(item, "image")
item_image.text = episode_cover_url
# iTunes image tag (das Standard-Format für Podcast-Apps) # iTunes image tag (das Standard-Format für Podcast-Apps)
itunes_image_item = ET.SubElement(item, "itunes:image") itunes_image_item = ET.SubElement(item, "itunes:image")
itunes_image_item.set("href", episode_cover_url) itunes_image_item.set("href", episode_cover_url)
print(f" ✅ Cover-Tags hinzugefügt (Standard + iTunes): {episode_cover_url}")
else:
print(f" ⚠️ Kein Episode-Cover verfügbar - verwende Standard-Podcast-Cover")
# Keywords/Tags basierend auf Dateiname # Keywords/Tags basierend auf Dateiname
if any(keyword in metadata['title'].lower() for keyword in ['organic', 'house']): if any(keyword in metadata['title'].lower() for keyword in ['organic', 'house']):
@ -367,6 +389,10 @@ Ich spezialisiere mich auf House Music, die mehr als nur Beats bietet sie er
itunes_keywords.text = "Organic house" itunes_keywords.text = "Organic house"
print(f"{metadata['title']} ({self.format_duration(metadata['duration']) if metadata['duration'] else 'Unbekannte Dauer'})") print(f"{metadata['title']} ({self.format_duration(metadata['duration']) if metadata['duration'] else 'Unbekannte Dauer'})")
if episode_cover_url:
print(f" 🖼️ Mit Episode-Cover: {episode_cover_url}")
else:
print(f" 📷 Ohne Episode-Cover")
# XML in Datei schreiben # XML in Datei schreiben
tree = ET.ElementTree(rss) tree = ET.ElementTree(rss)