Dieses Dokument fasst alle Verbesserungen am REDAXO Podcast Manager Addon zusammen, die im Rahmen der Modernisierung und Optimierung für 2025 implementiert wurden.
descriptionTEXT - Dediziertes Feld für Episode-BeschreibungenpublishdateVARCHAR(255) - Veröffentlichungsdatum
- ✅ UTF8MB4 Support für bessere Unicode-Unterstützung (Emojis)
- ✅ Index auf
statusundpublishdatefür Performance - ✅ Automatische Migration von
richtextzudescription - ✅ Backward-kompatibel: Bestehende Daten bleiben erhalten
// Automatisch bei Addon-Update:
- Neue Felder werden hinzugefügt
- UTF8MB4 Konvertierung
- Daten-Migration von richtext zu descriptionProblem gelöst: Episodes wurden angezeigt, auch wenn das Veröffentlichungsdatum in der Zukunft lag.
- Automatische Filterung in
PodcastOutput::getEpisodes() - Automatische Filterung in
PodcastRSS::getEpisodes() - SQL WHERE-Klausel prüft Datum vs. heute
// Nur Episodes mit Datum in Vergangenheit oder heute
STR_TO_DATE(publishdate, "%d.%m.%Y") <= STR_TO_DATE("heute", "%d.%m.%Y")- ✅ Frontend: Zukünftige Episodes unsichtbar
- ✅ RSS Feed: Zukünftige Episodes nicht im Feed
- ✅ Backend: Alle Episodes sichtbar zur Bearbeitung
- ✅ Leere Datumswerte werden akzeptiert (Backward-Compat)
Problem gelöst: Unbenutzerfreundliche Sekunden-Eingabe für Runtime.
// getID3 Library extrahiert automatisch:
- Laufzeit in Sekunden
- Formatierte Laufzeit (HH:MM:SS)
- Nur wenn Runtime-Feld leer ist- Eingabe: Weiterhin Sekunden (backward-kompatibel)
- Ausgabe Frontend: Automatisch HH:MM:SS
- Ausgabe RSS: Automatisch HH:MM:SS (iTunes-konform)
$item['runtime'] = 3665; // Sekunden (DB)
$item['runtime_formatted'] = '01:01:05'; // HH:MM:SS (Display)<itunes:type>episodic</itunes:type>
<itunes:episodeType>full</itunes:episodeType>
<itunes:episode>123</itunes:episode>
<podcast xmlns="https://podcastindex.org/namespace/1.0">- ✅ Korrekte XML-Struktur
- ✅ Vollständige Metadaten
- ✅ Validierte Enclosure-Tags
- ✅ Atom-Self-Link für Discovery
- lastBuildDate für Aktualität
- Episode-spezifische Bilder
- Korrekte Duration-Formatierung (HH:MM:SS)
- Vollständige Dublin Core Metadaten
Neu: Drei verschiedene Formate für Episode-Beschreibungen!
- Text (Standard): Plain text mit lesbaren Links
- Markdown (NEU!): Human & machine-readable
- HTML: Sauberes HTML (nur sichere Tags)
// Text (Standard)
$rss = new PodcastRSS('text');
// Markdown (NEU!)
$rss = new PodcastRSS('markdown');
// HTML
$rss = new PodcastRSS('html');
echo $rss->generate('rss2');- ✅ Menschenlesbar im Rohformat
- ✅ Maschinenlesbar für Parser/Bots
- ✅ Behält Formatierung (Listen, Links, Überschriften)
- ✅ Perfekt für moderne Podcast-Apps
- ✅ GitHub/Markdown-Editor kompatibel
# Episode Titel
In dieser Episode besprechen wir:
* REDAXO CMS
* Podcast-Optimierung
* SEO Best Practices
[Mehr Infos](https://example.com)Problem gelöst: XOPF-Replacements (z.B. Affiliate-Links) wurden nicht im RSS gerendert.
// Automatische Verarbeitung wenn xoutputfilter aktiv
if (rex_addon::exists('xoutputfilter')) {
$str = xoutputfilter::replace($str, rex_clang::getCurrentId());
}- ✅ Affiliate-Links funktionieren in RSS
- ✅ Graceful fallback wenn Addon nicht verfügbar
- ✅ Funktioniert mit allen drei Formaten (text, markdown, html)
Input: [[AMAZON_LINK produkt=123|Buchtitel=Das beste Buch]]
Output: Das beste Buch (https://amazon.de/dp/123?tag=affiliate-id)
Neu: Filterung nach Kategorien im Frontend möglich.
$output = new PodcastOutput([
'mode' => 'overview',
'category' => 5, // Nur Kategorie 5
]);
echo $output->render();FIND_IN_SET(category_id, `podcastmanager_category_id`)- ✅ Single Category Filter
- ✅ Funktioniert in allen Modi (start, overview, detail)
- ✅ Optional: Leer = Alle Kategorien
// Alle IDs zu Integer konvertiert
$item_id = (int)$item_id;
// Status-Check in SQL
WHERE (`status` = 1)// Verhindert: ../../../etc/passwd
if (strpos(realpath($path), realpath(rex_path::media())) !== 0) {
return; // BLOCKED
}// Alle Ausgaben escaped
htmlspecialchars($value)
// CDATA für RSS
<![CDATA[...]]>- ✅ Media-Objekt Validierung
- ✅ File Existence Checks
- ✅ Sanitized URLs in RSS
Problem: strftime() deprecated in PHP 8.1, entfernt in PHP 8.4.
// Alt (deprecated):
strftime("%d.%m.%y", $timestamp);
// Neu (PHP 8.4 ready):
date('d.m.y', $timestamp);- ✅ PHP 5.6
- ✅ PHP 7.0 - 7.4
- ✅ PHP 8.0 - 8.4
php:
version: '>=5.6,<8.5'Neu: PodcastSEO Helper-Klasse
echo PodcastSEO::generateStructuredData($episode);{
"@context": "https://schema.org",
"@type": "PodcastEpisode",
"name": "Episode Title",
"episodeNumber": "123"
}echo PodcastSEO::generateOpenGraphTags($episode);<meta property="og:type" content="music.song">
<meta property="og:title" content="Episode Title">
<meta property="og:audio" content="...">echo PodcastSEO::generateTwitterCardTags($episode);<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:player" content="...">echo PodcastSEO::generateSitemapEntries();// Alle SEO Tags auf einmal
echo PodcastSEO::generateAllTags($episode);- ✅ Jede Episode kann eigenes Bild haben
- ✅ Fallback zu Podcast-Hauptbild
- ✅ Automatische Ausgabe in RSS
<itunes:image href="https://example.com/episode-123.jpg" />- ✅ Erste Bild aus images-Feld wird verwendet
- ✅ Media Manager Integration
- ✅ Bestehende Episodes funktionieren
- ✅ Alte Module funktionieren
- ✅ Keine Breaking Changes
- ✅ Automatische Daten-Migration
// update.php bei Addon-Update:
1. Neue Felder hinzufügen
2. richtext → description kopieren (wenn leer)
3. UTF8MB4 Konvertierung (optional)
4. Index erstellen- Runtime: Sekunden weiterhin unterstützt
- Publishdate: Leere Werte funktionieren
- Description: Fallback zu richtext
- RSS: Standard bleibt 'text' Format
- ✅ Index auf
statusundpublishdate - ✅ Optimierte WHERE-Klauseln
- ✅ LIMIT-Support in allen Queries
// Beispiel
$cache_key = 'podcast_episodes_overview';
if ($cached = rex_cache::get($cache_key)) {
echo $cached;
} else {
$output = new PodcastOutput(['mode' => 'overview']);
$html = $output->render();
rex_cache::set($cache_key, $html, 3600);
echo $html;
}- CHANGELOG_2025.md - Komplette Feature-Übersicht
- RSS_FORMAT_EXAMPLES.md - Markdown Format Beispiele
- Kommentare in Code - Ausführliche PHPDoc
- RSS Feed Templates
- Module mit Kategorie-Filter
- API Endpunkte
- SEO Integration
- Zukünftige Episode: Unsichtbar ✅
- Heutige Episode: Sichtbar ✅
- Vergangene Episode: Sichtbar ✅
- Leeres Datum: Sichtbar ✅
- Neue Episode ohne Runtime: Auto-Extrahiert ✅
- Episode mit Runtime: Bleibt unverändert ✅
- HH:MM:SS Anzeige: Funktioniert ✅
- Text Format: Funktioniert ✅
- Markdown Format: Funktioniert ✅
- HTML Format: Funktioniert ✅
- XOPF Integration: Funktioniert ✅
- Ungültige ID: Geblockt ✅
- Status=0: Geblockt ✅
- Path Traversal: Geblockt ✅
- XSS: Escaped ✅
- Keine deprecated Warnings ✅
- Alle Funktionen getestet ✅
- Admin-UI für Runtime (HH:MM:SS Picker)
- Bulk-Operations für Episodes
- Export/Import Funktionalität
- Chapter Markers Support
- Transkript-Integration
- WebVTT/Untertitel
- Multi-Format Audio (AAC, Opus)
- Video Podcast Support
- Analytics Dashboard
- Auto-Publishing Scheduler
- AI-generierte Zusammenfassungen
- GitHub Issues: https://github.com/FriendsOfREDAXO/podcastmanager/issues
- REDAXO Slack: #addons Channel
- Forum: https://www.redaxo.org/de/forum/
Feedback zu den Verbesserungen ist willkommen! Besonders zu:
- Markdown Format
- PHP 8.4 Kompatibilität
- SEO Features
- Performance
✅ 14 Major Improvements ✅ Volle Backward-Kompatibilität ✅ PHP 8.4 Ready ✅ Apple Podcasts 2025 Compliant ✅ Spotify Compatible ✅ SEO Optimiert ✅ Sicherheit verbessert ✅ Performance optimiert
✅ Keine deprecated Functions mehr ✅ Moderne Code-Standards ✅ Comprehensive Documentation ✅ Security Best Practices
✅ Bessere RSS Feeds ✅ Automatische ID3 Auslese ✅ Zuverlässige Datums-Filterung ✅ Markdown Support ✅ Verbesserte SEO
Version: 1.1.0
Datum: 2025-01-14
REDAXO: 5.13+
PHP: 5.6 - 8.4
Status: ✅ Production Ready