
🚀 Installation
composer require mpc/mpc-vidply
Dann:
- Datenbankaktualisierung → Admin-Tools → Wartung → Datenbankstruktur analysieren
- Site-Set hinzufügen → Site-Verwaltung → Sites → Ihre Site → Sets → Hinzufügen
mpc/mpc-vidply - Caches leeren
📁 Verzeichnisstruktur
mpc_vidply/
├── Classes/
│ ├── Backend/
│ │ ├── Form/FieldWizard/ # MediaTypeFilterWizard
│ │ └── Preview/ # VidPlyPreviewRenderer
│ └── DataProcessing/ # VidPly, Listview, Detail processors
├── Configuration/
│ ├── Sets/mpc-vidply/ # Site Set (TYPO3 13.4+)
│ ├── TCA/
│ │ ├── tx_mpcvidply_media.php # Media record TCA
│ │ └── Overrides/
│ │ └── tt_content.php # Content element TCA
│ ├── TypoScript/
│ ├── ContentSecurityPolicies.php
│ ├── Icons.php
│ ├── JavaScriptModules.php
│ └── Services.yaml
├── Resources/
│ ├── Private/
│ │ ├── Language/ # XLF translations (en, de)
│ │ ├── Partials/VidPly/ # Modular template partials
│ │ └── Templates/ # Main VidPly.html template
│ └── Public/
│ ├── Css/vidply.min.css
│ ├── Icons/
│ └── JavaScript/
│ ├── hls.min.js # HLS streaming (loaded only when needed)
│ ├── dash.all.min.js # DASH streaming (loaded only when needed)
│ ├── PlaylistInit.js # Playlist logic
│ ├── PrivacyLayer.js # GDPR consent (YouTube/Vimeo/SoundCloud)
│ └── vidply/ # Core player (compiled from TypeScript, ESM, code-split)
└── Documentation/
├── AssetLoading.md
├── HLS-Implementation.md
├── Partials.md
├── PrivacyLayer.md
└── SettingsArchitecture.md
⚡ Site-Set
Aktivieren in config/sites/<site>/config.yaml:
dependencies:
- mpc/mpc-vidply
Oder über das Backend: Website-Verwaltung → Websites → Sets → VidPly hinzufügen.
📦 Datenbanktabellen
tx_mpcvidply_media
Medienbibliotheksdatensätze mit folgenden Typen: video, audio, youtube, vimeo, soundcloud
Schlüsselspalten:
| Spalte | Typ | Beschreibung |
|---|---|---|
media_type | Zeichenkette | Typ-Diskriminator |
media_file | Datei | Dateiverweise (Video/Audio, HLS/DASH, YouTube/Vimeo/SoundCloud über FAL-Online-Media-Helfer) |
title | Zeichenkette | Anzeigetitel |
artist | Zeichenkette | Name des Urhebers |
poster | Datei | Miniaturbild |
captions | Datei | VTT-Untertiteldateien |
chapters | Datei | VTT-Kapitel-Dateien |
audio_description | Datei | AD-Videospur |
sign_language | Datei | Gebärdensprache-Einblendung |
enable_transcript | bool | Transkript-Fenster anzeigen |
tx_mpcvidply_content_media_mm
MM-Beziehung zwischen tt_content und tx_mpcvidply_media.
tx_mpcvidply_privacy_settings
Siteweite Konfiguration der Datenschutzebene für externe Dienste (YouTube, Vimeo, SoundCloud).
Schlüsselspalten:
| Spalte | Typ | Beschreibung |
|---|---|---|
youtube_headline | varchar(255) | Optionale Überschrift |
youtube_intro_text | text | Einleitungstext vor dem Link |
youtube_outro_text | text | Abschlusstext nach dem Link |
youtube_policy_link | varchar(255) | URL der Datenschutzerklärung |
youtube_link_text | varchar(255) | Link-Text |
youtube_button_label | varchar(255) | Schaltfläche aria-label |
vimeo_* | (gleiche Felder) | Vimeo-Einstellungen |
soundcloud_* | (gleiche Felder) | SoundCloud-Einstellungen |
sys_language_uid | int | Sprach-ID (mehrsprachig) |
🎬 Inhaltselement
CType: mpc_vidply
TCA-Felder:
| Feld | Typ | Beschreibung |
|---|---|---|
tx_mpcvidply_media_items | Gruppe | Auswahl von Mediendatensätzen (MM) |
tx_mpcvidply_options | Check | Bitmasken-Optionen |
tx_mpcvidply_volume | dezimal | Standardlautstärke (0–1) |
tx_mpcvidply_playback_speed | dezimal | Standardgeschwindigkeit (0,25–2,0) |
tx_mpcvidply_language | Auswahl | UI-Sprache erzwingen |
Optionen-Bitmaske
const AUTOPLAY = 1; // Auto-start playback
const LOOP = 2; // Loop content
const MUTED = 4; // Start muted
const CONTROLS = 8; // Show controls
const CAPTIONS_DEFAULT = 16; // Captions on by default
const KEYBOARD = 64; // Enable keyboard shortcuts
const AUTO_ADVANCE = 256; // Auto-play next in playlist
// Default: 328 = CONTROLS + KEYBOARD + AUTO_ADVANCE
Hinweise:
- Die adaptive Größenanpassung ist immer aktiviert (kein Umschaltknopf).
- Die Transkription wird pro Mediendatensatz gesteuert (
tx_mpcvidply_media.enable_transcript).
Option in Fluid aktivieren:
<f:if condition="{data.tx_mpcvidply_options} % 16 >= 8">
<!-- Controls enabled -->
</f:if>
🔧 Datenverarbeitung
VidPlyProcessor
Verarbeitet Medienelemente für die Frontend-Darstellung.
TypoScript:
tt_content.mpc_vidply =< lib.contentElement
tt_content.mpc_vidply {
templateName = VidPly
dataProcessing {
10 = Mpc\MpcVidply\DataProcessing\VidPlyProcessor
}
}
Verfügbar in der Vorlage:
{mediaItems} <!-- Array of processed media -->
{isPlaylist} <!-- true if 2+ items -->
{hasLocalMedia} <!-- Has video/audio (including HLS/DASH sources) -->
{hasExternalService} <!-- Has YouTube/Vimeo/SoundCloud -->
{playerOptions} <!-- Decoded options array -->
{privacySettings} <!-- Privacy layer settings per service -->
Listview & Detail (Mediathek-artige CEs)
ListviewProcessor—mpc_vidply_listview; erstelltlistview.rowsmit Karten, Paginierungsflags, Sortiervorgaben usw. SieheDocumentation/Listview.md(Routing, i18n, Editorfelder).DetailProcessor—mpc_vidply_detail; erstelltdetail.*und Player- Daten für die Detailseite. Vorlage:Detail.html+ListviewCSS, wenn gemeinsam genutzt. Das zugehörige Regal wird nur geladen, wenntt_content.tx_mpcvidply_show_relatedaktiviert ist (Standard1); bei Deaktivierungdetail.relatedist es leer.
Vorlagen / Partials: Templates/Listview.html, Partials/Listview/*.
🎨 Vorlagenstruktur
Hauptvorlage
Resources/Private/Templates/VidPly.html
Partials
| Partial | Zweck |
|---|---|
VidPly/Assets.html | Bedingte Asset-Registrierung |
VidPly/VideoSources.html | <source> Elemente für Video |
VidPly/AudioSources.html | <source> Elemente für Audio |
VidPly/Tracks.html | Untertitel/Kapitel <track> Elemente |
VidPly/MetadataScripts.html | JSON-LD-Metadaten zur Barrierefreiheit |
VidPly/PrivacyLayer.html | DSGVO-Einwilligungs-Overlay |
Anpassung
Überschreiben Sie Vorlagen in Ihrem Sitepackage:
tt_content.mpc_vidply {
templateRootPaths.20 = EXT:my_sitepackage/Resources/Private/Templates/
partialRootPaths.20 = EXT:my_sitepackage/Resources/Private/Partials/
}
📜 JavaScript-Architektur
Bedingtes Laden
VidPly lädt nur das für die aktuellen Medientypen benötigte JavaScript:
| Szenario | Geladene Assets | Größe |
|---|---|---|
| Nur YouTube/Vimeo/SoundCloud | PrivacyLayer.js | ~5 KB |
| Lokale Video-/Audiodateien | vidply/vidply.esm.min.js (+ Chunks) + PlaylistInit.js | ~180 KB |
| HLS-Streaming | + hls.min.js | +60 KB |
| DASH-Streaming | + dash.all.min.js | +200 KB |
| Wiedergabeliste (2+ Elemente) | + PlaylistInit.js | +5 KB |
Bis zu 97 % Reduzierung bei ausschließlich externen Inhalten.
Dateien
| Datei | Zweck |
|---|---|
PrivacyLayer.js | DSGVO-Einwilligung für externe Dienste (YouTube / Vimeo / SoundCloud) |
PlaylistInit.js | Wiedergabelisten-Benutzeroberfläche und Navigation |
hls.min.js | hls.js für adaptives HLS-Streaming (Chrome / Firefox / Edge / Desktop-Safari) |
dash.all.min.js | dash.js für MPEG-DASH-Streaming |
vidply/*.js | Kern-Player (kompiliertes TypeScript → ESM, Code-Split, enthält SoundCloud-Renderer + Puffer-Spinner + optionalen Download-Button) |
Player-Initialisierung
// This is roughly what `PlaylistInit.js` does internally:
import { Player, PlaylistManager } from './vidply/vidply.esm.min.js';
const player = new Player('#my-player', {
controls: true,
keyboard: true,
responsive: true,
});
// Optional: attach a playlist
const playlist = new PlaylistManager(player, { autoAdvance: true });
🔒 Datenschutzebene
Implementierung
Externe Dienste (YouTube, Vimeo, SoundCloud) zeigen Einwilligungs-Overlay an:
PrivacySettingsServiceRuft Einstellungen ab vontx_mpcvidply_privacy_settingsTabelle- Vorlage rendert Poster + Wiedergabetaste (kein Iframe) mit Datenbankeinstellungen
PrivacyLayer.js/PlaylistInit.jsverarbeitet Klick- Bei Zustimmung: Erstellt Iframe, lädt den Player des Dienstes
- Kein Tracking, bis der Nutzer explizit auf „Wiedergabe“ klickt
Datenschutzeinstellungen-Dienst
Classes/Service/PrivacySettingsService.php bietet:
$privacySettings = $privacySettingsService->getSettingsForService('youtube', $languageId);
// Returns: ['headline', 'intro_text', 'outro_text', 'policy_link', 'link_text', 'button_label']
Einstellungen greifen auf Übersetzungen aus der Sprachdatei zurück, wenn Datenbankfelder leer sind.
Datenschutzerklärung anpassen
Empfohlen: Über das Backend konfigurieren (List-Modul → Einstellungen für Datenschutzebene)
Oder Vorlage überschreiben: Partials/VidPly/PrivacyLayer.html
<div class="vidply-privacy-layer"
data-service="{service}"
data-embed-url="{embedUrl}">
<f:if condition="{privacySettings.headline}">
<h3>{privacySettings.headline}</h3>
</f:if>
<img src="{poster}" alt="{title}" />
<button class="vidply-privacy-play">
{privacySettings.button_label}
</button>
<p class="vidply-privacy-notice">
{privacySettings.intro_text}
<a href="{privacySettings.policy_link}">{privacySettings.link_text}</a>
{privacySettings.outro_text}
</p>
</div>
🌐 HLS- und DASH-Streaming
HLS und DASH sind keine separaten Medientypen. Streaming-Quellen (.m3u8 / .mpd) werden als Dateien innerhalb des Medientyps „Video“ oder „Audio“ zusammen mit progressiven Fallbacks hinzugefügt.
So funktioniert es
HLS:
- Erkennt
.m3u8Quelle in Medien-Dateiverweisen (nach MIME-Typ oder Erweiterung) - Bindet
hls.min.js(nur bei Bedarf) – das VidPly-Bundle nutzt dies in Chrome / Firefox / Edge / Desktop-Safari für vollständige Funktionsparität - Auf iOS / iPadOS Safari (wo MSE nicht verfügbar ist) greift VidPly automatisch auf natives HLS zurück und bindet die
TextTrackin die VidPly-Menüs für Untertitel, Transkripte und Qualität ein – es ist kein separater Codepfad erforderlich - Bietet eine Benutzeroberfläche zum Wechseln der Qualität
- Eingebettete Untertitel aus dem HLS-Manifest werden standardmäßig verwendet; lokale VTT-Dateien haben Vorrang
- Der HLS-Renderer reagiert zudem auf
Hls.Events.SUBTITLE_FRAG_PROCESSED, sodass das interaktive Transkript synchron bleibt, während neue Untertitel-Fragmente für lange / Live-Streams geladen werden
DASH:
- Erkennt
.mpdQuelle in Medien-Dateiverweisen (nach MIME-Typ oder Erweiterung) - Bezieht
dash.all.min.js(nur bei Bedarf) - Initialisiert dash.js für Video-/Audio-Elemente
- Bietet Unterstützung für adaptive Qualität sowie TTML- und WebVTT-Untertitel
- Eingebettete Untertitel aus dem DASH-Manifest werden standardmäßig verwendet; lokale VTT-Dateien haben Vorrang
Quellenpriorität: DASH → HLS → progressiv (MP4/WebM/MP3/OGG)
CSP-Konfiguration
Configuration/ContentSecurityPolicies.php Setzt Streaming-Domains und die von hls.js / dash.js.
Benutzerdefinierte Domänen hinzufügen:
return [
'default-src' => ["'self'"],
'media-src' => ["'self'", 'blob:', 'data:', 'https://your-cdn.com'],
'connect-src' => ["'self'", 'https://your-cdn.com'],
];
blob:ist erforderlich, dahls.js/dash.jseinblob:URL während<video>.srcwährend der Wiedergabe.data:ist erforderlich, da einige HLS-Varianten Init-Segmente / Untertitel inline als Daten-URIs einbetten.
🛠️ VidPly erweitern
Benutzerdefinierten Medientyp hinzufügen
- TCA erweitern (
Configuration/TCA/Overrides/tx_mpcvidply_media.php):
$GLOBALS['TCA']['tx_mpcvidply_media']['columns']['media_type']['config']['items'][] = [
'label' => 'My Service',
'value' => 'myservice',
];
$GLOBALS['TCA']['tx_mpcvidply_media']['types']['myservice'] = [
'showitem' => '...',
];
Aktualisieren Sie DataProcessor, um den neuen Typ zu verarbeiten
Erstellen Sie ein Partial für die Darstellung
Benutzerdefinierte Player-Optionen
Hinzufügen zu tt_content.php:
$GLOBALS['TCA']['tt_content']['columns']['tx_mpcvidply_options']['config']['items'][] = [
'label' => 'My Option',
'value' => 512, // Next power of 2
];
🐛 Debugging
Häufige Probleme
| Problem | Lösung |
|---|---|
| Medien werden nicht angezeigt | Überprüfen tx_mpcvidply_media , ob der Datensatz nicht ausgeblendet ist |
| MM-Beziehung unterbrochen | Prüfen tx_mpcvidply_content_media_mm Tabelle |
| JS wird nicht geladen | Browser-Konsole überprüfen; TypoScript überprüfen |
| HLS funktioniert nicht | Überprüfen Sie die CORS-Header in der .m3u8-Datei; stellen Sie sicher, dass die Quelldatei im Medien-Record enthalten ist |
| DASH funktioniert nicht | Überprüfen Sie die CORS-Header in der .mpd-Datei; stellen Sie sicher, dass die Quelldatei im Medien-Record enthalten ist; stellen Sie sicher, dass dash.js geladen wird |
| Privacy Layer hängt | Caches leeren; PrivacyLayer.js überprüfen |
Nützliche Abfragen
-- Check media records
SELECT uid, title, media_type, hidden FROM tx_mpcvidply_media;
-- Check MM relations
SELECT * FROM tx_mpcvidply_content_media_mm WHERE uid_local = [tt_content.uid];
-- Check file references
SELECT * FROM sys_file_reference WHERE tablenames = 'tx_mpcvidply_media';
Debug-Modus
Aktivieren Sie den TYPO3-Debug-Modus, um detaillierte Fehler anzuzeigen:
$GLOBALS['TYPO3_CONF_VARS']['BE']['debug'] = true;
$GLOBALS['TYPO3_CONF_VARS']['FE']['debug'] = true;
📚 Dokumentationsindex
| Datei | Inhalt |
|---|---|
| AssetLoading.md | Optimierung des bedingten Ladens von JS |
| Partials.md | Dokumentation zu Template-Partials |
| PrivacyLayer.md | Details zur DSGVO-Implementierung |
| HLS-Implementation.md | Technische Details zu HLS- und DASH-Streaming (integriert in Video-/Audio-Typen) |
| SettingsArchitecture.md | Konfigurationssystem |
| Editors-Guide.md | Leitfaden für Content-Redakteure |
🔗 Externe Ressourcen
Schnellreferenz
Installieren
composer require mpc/mpc-vidply
# → Database update → Include Site Set → Clear caches
Wichtige Dateien
| Was | Wo |
|---|---|
| Medien-TCA | Configuration/TCA/tx_mpcvidply_media.php |
| Inhalt TCA | Configuration/TCA/Overrides/tt_content.php |
| Datenverarbeiter | Classes/DataProcessing/VidPlyProcessor.php |
| Datenschutzdienst | Classes/Service/PrivacySettingsService.php |
| Hauptvorlage | Resources/Private/Templates/VidPly.html |
| Datenschutz-JS | Resources/Public/JavaScript/PrivacyLayer.js |
| Datenschutz-CSS | Resources/Public/Css/privacy-layer.css |
Datenbank
-- Tables
tx_mpcvidply_media -- Media library
tx_mpcvidply_content_media_mm -- Content-to-media relation
tx_mpcvidply_privacy_settings -- Privacy layer configuration
Version: 1.1.3 | TYPO3: 13.4+ / 14.x | PHP: ≥8.2