Optimiere die Cover-Bildverarbeitung für Apple Podcasts durch Anpassung der JPEG-Qualität, um die Dateigröße unter 512KB zu halten. Aktualisiere den Atom-Link und die Standard-Bild-URL im RSS-Feed.

This commit is contained in:
2025-07-06 10:28:15 +02:00
parent f1078d825a
commit 3e8a78d9bf
2 changed files with 31 additions and 35 deletions

View File

@ -1,29 +0,0 @@
# Audio-Dateien
Lege deine MP3-Dateien in diesem Verzeichnis ab, um sie im RSS-Feed verfügbar zu machen.
## Unterstützte Formate
- MP3-Dateien (.mp3)
## Metadaten
Das System versucht automatisch ID3-Tags aus den MP3-Dateien zu lesen:
- **Titel**: Aus dem TIT2-Tag, sonst Dateiname
- **Künstler**: Aus dem TPE1-Tag, sonst "SERMAN"
- **Album**: Aus dem TALB-Tag (optional)
- **Dauer**: Automatisch erkannt
## Reihenfolge
Die Dateien werden nach Änderungsdatum sortiert (neueste zuerst).
## Beispiel-Struktur
```text
_audio/
├── SERMAN - Organic House 01.07.2025.mp3
├── SERMAN - Organic House PT2 28.06.25.mp3
└── README.md
```

View File

@ -136,7 +136,7 @@ class LocalPodcastGenerator:
print(f" 📐 Original Cover-Größe: {original_width}x{original_height}px")
# Apple Podcasts benötigt quadratische Cover zwischen 1400-3000px
# Wähle Zielgröße basierend auf Originalgröße
# Behalte Originalmaße bei, nur Qualität optimieren für <512KB
if original_width < 1400 or original_height < 1400:
target_size = 1400
print(f" ⚠️ Cover zu klein, skaliere auf {target_size}x{target_size}px")
@ -179,10 +179,35 @@ class LocalPodcastGenerator:
image = background
print(f" 🔄 Transparenz entfernt (Apple Podcasts Anforderung)")
# Speichere das optimierte Cover mit höherer Qualität für Apple Podcasts
image.save(cover_path, 'JPEG', quality=98, optimize=True, progressive=True)
# Speichere das optimierte Cover mit angepasster Qualität für Episode-Cover
# Reduziere nur JPEG-Qualität, behalte Bildgröße zwischen 1400-3000px bei
quality = 85
max_file_size = 512 * 1024 # 512KB in Bytes
# Ersten Versuch mit Standard-Qualität
temp_buffer = io.BytesIO()
image.save(temp_buffer, 'JPEG', quality=quality, optimize=True, progressive=True)
file_size = temp_buffer.tell()
# Reduziere nur Qualität iterativ falls Datei zu groß (Bildgröße bleibt gleich)
while file_size > max_file_size and quality > 30:
quality -= 5
temp_buffer = io.BytesIO()
image.save(temp_buffer, 'JPEG', quality=quality, optimize=True, progressive=True)
file_size = temp_buffer.tell()
print(f" 📉 Reduziere Qualität auf {quality}% (Dateigröße: {file_size//1024}KB)")
# Speichere die finale Version (Bildgröße bleibt bei {target_size}x{target_size}px)
image.save(cover_path, 'JPEG', quality=quality, optimize=True, progressive=True)
final_width, final_height = image.size
print(f" 🖼️ Cover optimiert und gespeichert: {cover_filename} ({final_width}x{final_height}px)")
final_size_kb = cover_path.stat().st_size // 1024
print(f" 🖼️ Cover optimiert: {cover_filename} ({final_width}x{final_height}px, {final_size_kb}KB, Qualität: {quality}%)")
# Prüfe finale Dateigröße und warne bei Überschreitung
if final_size_kb > 512:
print(f" ⚠️ Warnung: Cover-Datei größer als 512KB ({final_size_kb}KB)")
else:
print(f" ✅ Cover-Datei unter 512KB Limit")
except ImportError:
print(" ❌ PIL/Pillow nicht installiert - kann Cover nicht optimieren!")
@ -270,7 +295,7 @@ Ich spezialisiere mich auf House Music, die mehr als nur Beats bietet sie er
# Atom self-link (erforderlich für RSS-Validierung)
atom_link = ET.SubElement(channel, "atom:link")
atom_link.set("href", f"{self.base_url}/podcast_feed.xml")
atom_link.set("href", f"{self.base_url}/{self.output_file}")
atom_link.set("rel", "self")
atom_link.set("type", "application/rss+xml")
@ -320,7 +345,7 @@ Ich spezialisiere mich auf House Music, die mehr als nur Beats bietet sie er
itunes_type.text = "episodic"
# Standard-Bild (kann später angepasst werden)
image_url = f"{self.base_url}/_img/podcast-cover.png"
image_url = f"{self.base_url}/_img/podcast-cover.jpg"
image = ET.SubElement(channel, "image")
image_url_elem = ET.SubElement(image, "url")
image_url_elem.text = image_url