diff --git a/_audio/README.md b/_audio/README.md deleted file mode 100644 index 360e62d..0000000 --- a/_audio/README.md +++ /dev/null @@ -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 -``` diff --git a/local_podcast_generator.py b/local_podcast_generator.py index cd2d626..5aefc74 100644 --- a/local_podcast_generator.py +++ b/local_podcast_generator.py @@ -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