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:
@ -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)
|
||||
|
Reference in New Issue
Block a user