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