Signatur
Beschreibung
load() gehört zu den Encrypted Media Extensions (EME) und stellt eine zuvor gespeicherte, persistente Schlüsselsitzung wieder her. Das ist z. B. für Offline-Wiedergabe gedacht: Eine Lizenz wurde bei einem früheren Besuch angefordert und vom Content Decryption Module (CDM) dauerhaft gespeichert. Mit der gemerkten sessionId lässt sie sich später ohne neue Lizenzanfrage an den Server wiederverwenden.
Voraussetzung ist, dass die Sitzung mit mediaKeys.createSession("persistent-license") erzeugt wurde und das zugrunde liegende MediaKeySystemAccess mit persistentState: "required" (oder zumindest "optional" und tatsächlich unterstützt) angefordert wurde. Auf einer temporären Sitzung wirft load() einen Fehler.
Das zurückgegebene Promise wird mit true erfüllt, wenn Daten für die ID gefunden und geladen wurden, und mit false, wenn keine gespeicherte Sitzung mit dieser ID existiert. Nach erfolgreichem Laden stehen die Schlüssel über keyStatuses bereit; gegebenenfalls feuert ein keystatuseschange- oder message-Ereignis.
Jedes MediaKeySession-Objekt kann nur einmal initialisiert werden: Wurde bereits generateRequest() oder load() aufgerufen, muss für eine weitere Sitzung ein neues Objekt erzeugt werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $sessionId Pflicht | string | Die eindeutige ID der zu ladenden persistenten Sitzung, typischerweise zuvor aus session.sessionId gelesen und z. B. in localStorage oder IndexedDB gespeichert. |
Rückgabewert
true erfüllt, wenn die Sitzungsdaten geladen wurden, mit false, wenn keine Daten zur ID existieren. Abgelehnt mit TypeError (leere ID), InvalidStateError (Sitzung bereits initialisiert oder geschlossen) bzw. NotSupportedError/InvalidAccessError (Sitzungstyp nicht persistent).Beispiele
Persistente Sitzung erzeugen und ID merken
const video = document.querySelector('video');
const access = await navigator.requestMediaKeySystemAccess('com.widevine.alpha', [{
initDataTypes: ['cenc'],
videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }],
persistentState: 'required',
sessionTypes: ['persistent-license']
}]);
const mediaKeys = await access.createMediaKeys();
await video.setMediaKeys(mediaKeys);
video.addEventListener('encrypted', async (event) => {
const session = mediaKeys.createSession('persistent-license');
session.addEventListener('message', async (e) => {
// Lizenz vom Server holen und an das CDM übergeben
const res = await fetch('/license', { method: 'POST', body: e.message });
await session.update(await res.arrayBuffer());
// ID für spätere Offline-Nutzung speichern
localStorage.setItem('drmSessionId', session.sessionId);
console.log('Gespeichert:', session.sessionId);
});
await session.generateRequest(event.initDataType, event.initData);
});
Gespeicherte Sitzung mit load() wiederherstellen
const restoreSession = async (mediaKeys) => {
const sessionId = localStorage.getItem('drmSessionId');
if (!sessionId) return null;
const session = mediaKeys.createSession('persistent-license');
try {
const loaded = await session.load(sessionId);
if (!loaded) {
console.warn('Keine gespeicherten Daten für', sessionId);
localStorage.removeItem('drmSessionId');
await session.close();
return null;
}
console.log('Sitzung geladen, Schlüssel:', session.keyStatuses.size);
return session;
} catch (err) {
console.error('load() fehlgeschlagen:', err.name, err.message);
return null;
}
};
const session = await restoreSession(mediaKeys);
Geladene Lizenz endgültig entfernen
const deleteOfflineLicense = async (mediaKeys, sessionId) => {
const session = mediaKeys.createSession('persistent-license');
if (await session.load(sessionId)) {
// remove() löscht die persistenten Daten im CDM
await session.remove();
await session.close();
localStorage.removeItem('drmSessionId');
console.log('Lizenz gelöscht');
}
};
await deleteOfflineLicense(mediaKeys, localStorage.getItem('drmSessionId'));
// Wichtig · Fallstricke
- Nur persistente Sitzungen:
load()funktioniert ausschließlich mit Sitzungen vom Typ"persistent-license". Viele CDMs (z. B. Widevine auf Desktop-Chrome ohne Offline-Unterstützung, FairPlay in Safari) unterstützen diesen Typ gar nicht – vorher perrequestMediaKeySystemAccess()mitsessionTypes: ["persistent-license"]prüfen. - Einmalige Initialisierung: Nach
generateRequest()oder einem vorherigenload()führt ein erneuter Aufruf zuInvalidStateError. Pro Ladevorgang ein neues Sitzungsobjekt erstellen. falseist kein Fehler: Wenn die ID unbekannt ist (z. B. nach Löschen der Browserdaten oder im privaten Modus), wird das Promise mitfalseerfüllt, nicht abgelehnt – beide Fälle behandeln.- Sicherer Kontext: EME ist nur über HTTPS verfügbar; in iframes kann die Permissions-Policy
encrypted-mediaden Zugriff blockieren. - Datenschutz: Persistente Sitzungs-IDs können zur Wiedererkennung von Nutzern dienen; Browser löschen sie daher häufig zusammen mit Cookies.