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:
@ -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
|
|
||||||
```
|
|
@ -136,7 +136,7 @@ class LocalPodcastGenerator:
|
|||||||
print(f" 📐 Original Cover-Größe: {original_width}x{original_height}px")
|
print(f" 📐 Original Cover-Größe: {original_width}x{original_height}px")
|
||||||
|
|
||||||
# Apple Podcasts benötigt quadratische Cover zwischen 1400-3000px
|
# 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:
|
if original_width < 1400 or original_height < 1400:
|
||||||
target_size = 1400
|
target_size = 1400
|
||||||
print(f" ⚠️ Cover zu klein, skaliere auf {target_size}x{target_size}px")
|
print(f" ⚠️ Cover zu klein, skaliere auf {target_size}x{target_size}px")
|
||||||
@ -179,10 +179,35 @@ class LocalPodcastGenerator:
|
|||||||
image = background
|
image = background
|
||||||
print(f" 🔄 Transparenz entfernt (Apple Podcasts Anforderung)")
|
print(f" 🔄 Transparenz entfernt (Apple Podcasts Anforderung)")
|
||||||
|
|
||||||
# Speichere das optimierte Cover mit höherer Qualität für Apple Podcasts
|
# Speichere das optimierte Cover mit angepasster Qualität für Episode-Cover
|
||||||
image.save(cover_path, 'JPEG', quality=98, optimize=True, progressive=True)
|
# 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
|
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:
|
except ImportError:
|
||||||
print(" ❌ PIL/Pillow nicht installiert - kann Cover nicht optimieren!")
|
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 self-link (erforderlich für RSS-Validierung)
|
||||||
atom_link = ET.SubElement(channel, "atom:link")
|
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("rel", "self")
|
||||||
atom_link.set("type", "application/rss+xml")
|
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"
|
itunes_type.text = "episodic"
|
||||||
|
|
||||||
# Standard-Bild (kann später angepasst werden)
|
# 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 = ET.SubElement(channel, "image")
|
||||||
image_url_elem = ET.SubElement(image, "url")
|
image_url_elem = ET.SubElement(image, "url")
|
||||||
image_url_elem.text = image_url
|
image_url_elem.text = image_url
|
||||||
|
Reference in New Issue
Block a user