/**
* @file media-error.js
*/
import {assign, isObject} de './utils/obj' ;
/**
* Une classe `MediaError` personnalisée qui imite la classe standard HTML5 `MediaError`.
*
* @param {numéro|chaîne|Objet|MediaError} valeur
* Il peut s'agir de plusieurs types :
* - number : devrait être un code d'erreur standard
* - string : un message d'erreur (le code sera 0)
* - Objet : propriétés arbitraires
* - `MediaError` (native) : utilisé pour remplir un objet `MediaError` de video.js
* - `MediaError` (video.js) : se retournera lui-même s'il est déjà un
* objet video.js `MediaError`.
*
* @see [MediaError Spec]{@link https://dev.w3.org/html5/spec-author-view/video.html#mediaerror}
* @see [Encrypted MediaError Spec]{@link https://www.w3.org/TR/2013/WD-encrypted-media-20130510/#error-codes}
*
* @classe MediaError
*/
function MediaError(value) {
// Autoriser les appels redondants à ce constructeur pour éviter d'avoir des `instanceof`
// vérifications disséminées dans le code.
if (value instanceof MediaError) {
valeur de retour ;
}
if (typeof value === 'number') {
this.code = valeur ;
} else if (typeof value === 'string') {
// le code par défaut est zéro, il s'agit donc d'une erreur personnalisée
this.message = valeur ;
} else if (isObject(value)) {
// Nous assignons la propriété `code` manuellement parce que les objets `MediaError` natifs
// ne pas l'exposer en tant que propriété propre/énumérable de l'objet.
if (typeof value.code === 'number') {
this.code = value.code ;
}
assign(this, value) ;
}
if (!this.message) {
this.message = MediaError.defaultMessages[this.code] || '' ;
}
}
/**
* Le code d'erreur qui se réfère à deux des types définis `MediaError`
*
* @type {Nombre}
*/
MediaError.prototype.code = 0 ;
/**
* Un message facultatif à afficher avec l'erreur. Le message ne fait pas partie de la norme HTML5
* mais permet des erreurs personnalisées plus informatives.
*
* @type {String}
*/
MediaError.prototype.message = '' ;
/**
* Un code d'état optionnel qui peut être défini par des plugins pour fournir encore plus de détails sur
* l'erreur. Par exemple, un plugin peut fournir un code d'état HTTP spécifique et un code d'état
* message d'erreur pour ce code. Ensuite, lorsque le plugin obtient cette erreur, cette classe va
* savoir comment afficher un message d'erreur à ce sujet. Cela permet d'afficher un message personnalisé
* sur l'écran d'erreur `Player`.
*
* @type {Array}
*/
MediaError.prototype.status = null ;
/**
* Erreurs indexées par la norme W3C. La commande **NE PEUT PAS CHANGER** ! Voir le
* énumérées sous {@link MediaError} pour plus d'informations.
*
* @enum {array}
* en lecture seule
* @property {string} 0 - MEDIA_ERR_CUSTOM
* @property {string} 1 - MEDIA_ERR_ABORTED
* @property {string} 2 - MEDIA_ERR_NETWORK
* @property {string} 3 - MEDIA_ERR_DECODE
* @property {string} 4 - MEDIA_ERR_SRC_NOT_SUPPORTED
* @property {string} 5 - MEDIA_ERR_ENCRYPTED
*/
MediaError.errorTypes = [
'MEDIA_ERR_CUSTOM',
'MEDIA_ERR_ABORTED',
'MEDIA_ERR_NETWORK',
'MEDIA_ERR_DECODE',
'MEDIA_ERR_SRC_NOT_SUPPORTED',
'MEDIA_ERR_ENCRYPTED' (EN FRANÇAIS DANS LE TEXTE)
] ;
/**
* Les messages `MediaError` par défaut basés sur les {@link MediaError.errorTypes}.
*
* @type {Array}
* @constant
*/
MediaError.defaultMessages = {
1 : 'Vous avez interrompu la lecture du média',
2 : une erreur de réseau a entraîné l'échec partiel du téléchargement des médias,
3 : la lecture du média a été interrompue en raison d'un problème de corruption ou parce que le média utilisait des fonctions que votre navigateur ne prenait pas en charge,
4 : le support n'a pas pu être chargé, soit parce que le serveur ou le réseau a échoué, soit parce que le format n'est pas pris en charge,
5 : les médias sont cryptés et nous n'avons pas les clés pour les décrypter
};
// Ajouter les types en tant que propriétés sur MediaError
// par exemple, MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4 ;
for (let errNum = 0 ; errNum < MediaError.errorTypes.length ; errNum++) {
MediaError[MediaError.errorTypes[errNum]] = errNum ;
// les valeurs doivent être accessibles à la fois à la classe et à l'instance
MediaError.prototype[MediaError.errorTypes[errNum]] = errNum ;
}
// jsdocs pour les membres d'instance/statiques ajoutés ci-dessus
// les méthodes d'instance utilisent `#` et les méthodes statiques utilisent `.`
/**
* Code d'erreur W3C pour toute erreur personnalisée.
*
* @member MediaError#MEDIA_ERR_CUSTOM
* @constant {number}
* @default 0
*/
/**
* Code d'erreur W3C pour toute erreur personnalisée.
*
* @member MediaError.MEDIA_ERR_CUSTOM
* @constant {number}
* @default 0
*/
/**
* Code d'erreur W3C pour l'erreur de média interrompue.
*
* @member MediaError#MEDIA_ERR_ABORTED
* @constant {number}
* @défaut 1
*/
/**
* Code d'erreur W3C pour l'erreur de média interrompue.
*
* @member MediaError.MEDIA_ERR_ABORTED
* @constant {number}
* @défaut 1
*/
/**
* Code d'erreur W3C pour toute erreur de réseau.
*
* @member MediaError#MEDIA_ERR_NETWORK
* @constant {number}
* @default 2
*/
/**
* Code d'erreur W3C pour toute erreur de réseau.
*
* @member MediaError.MEDIA_ERR_NETWORK
* @constant {number}
* @default 2
*/
/**
* Code d'erreur W3C pour toute erreur de décodage.
*
* @member MediaError#MEDIA_ERR_DECODE
* @constant {number}
* @default 3
*/
/**
* Code d'erreur W3C pour toute erreur de décodage.
*
* @member MediaError.MEDIA_ERR_DECODE
* @constant {number}
* @default 3
*/
/**
* Code d'erreur du W3C à chaque fois qu'une source n'est pas prise en charge.
*
* @member MediaError#MEDIA_ERR_SRC_NOT_SUPPORTED
* @constant {number}
* @default 4
*/
/**
* Code d'erreur du W3C à chaque fois qu'une source n'est pas prise en charge.
*
* @member MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED
* @constant {number}
* @default 4
*/
/**
* Code d'erreur du W3C à chaque fois qu'une source est cryptée.
*
* @member MediaError#MEDIA_ERR_ENCRYPTED
* @constant {number}
* @default 5
*/
/**
* Code d'erreur du W3C à chaque fois qu'une source est cryptée.
*
* @member MediaError.MEDIA_ERR_ENCRYPTED
* @constant {number}
* @default 5
*/
export default MediaError ;