From 9750e14234c7f324474457e02190d7310228db74 Mon Sep 17 00:00:00 2001 From: Manuel Weiser Date: Sat, 5 Jul 2025 21:01:45 +0200 Subject: [PATCH] =?UTF-8?q?Verbessere=20die=20Cover-Optimierung=20und=20-I?= =?UTF-8?q?ntegration=20f=C3=BCr=20bessere=20Kompatibilit=C3=A4t=20mit=20A?= =?UTF-8?q?pple=20Podcasts=20durch=20Anpassungen=20bei=20der=20Bildverarbe?= =?UTF-8?q?itung=20und=20dem=20Hinzuf=C3=BCgen=20von=20Cover-Tags.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- local_podcast_generator.py | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/local_podcast_generator.py b/local_podcast_generator.py index a7450b7..1f6d848 100644 --- a/local_podcast_generator.py +++ b/local_podcast_generator.py @@ -165,16 +165,22 @@ class LocalPodcastGenerator: # Skaliere auf Zielgröße 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'): + # Verwende weißen Hintergrund für Transparenz (Apple Podcasts Anforderung) background = Image.new('RGB', image.size, (255, 255, 255)) if image.mode == 'P': 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 + print(f" 🔄 Transparenz entfernt (Apple Podcasts Anforderung)") - # Speichere das optimierte Cover - image.save(cover_path, 'JPEG', quality=95, optimize=True) + # Speichere das optimierte Cover mit höherer Qualität für Apple Podcasts + image.save(cover_path, 'JPEG', quality=98, optimize=True, progressive=True) final_width, final_height = image.size 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): 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_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") # 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.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: + # 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_item = ET.SubElement(item, "itunes:image") 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 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" 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 tree = ET.ElementTree(rss)