/**
 * @file media-error.js
 */
從 './utils/obj' 導入 {assign, isObject};

/**
 * 模仿標準 HTML5 MediaError 類的自定義 MediaError 類。
 *
 * @param {number|string|Object|MediaError} 值
 * 這可以是多種類型:
 * - 數字:應該是標準錯誤代碼
 * - 字符串:錯誤消息(代碼將為 0)
 * - 對象:任意屬性
 * - `MediaError`(本機):用於填充 video.js `MediaError` 對象
 * - `MediaError` (video.js): 如果它已經是
 * video.js `MediaError` 對象。
 *
 * @see [MediaError 規範]{@link https://dev.w3.org/html5/spec-author-view/video.html#mediaerror}
 * @see [加密媒體錯誤規範]{@link https://www.w3.org/TR/2013/WD-encrypted-media-20130510/#error-codes}
 *
 * @class 媒體錯誤
 */
函數 MediaError(值){

  // 允許對該構造函數進行冗餘調用以避免出現 `instanceof`
  //檢查代碼周圍。
  如果(值 instanceof MediaError){
    返回值;
  }

  如果(類型值==='數字'){
    這個。代碼=值;
  } else if (typeof value === 'string') {
    // 默認代碼為零,所以這是一個自定義錯誤
    this.message = 值;
  } else if (isObject(value)) {

    // 我們手動分配 `code` 屬性,因為原生 `MediaError` 對象
    // 不要將其公開為對象的自有/可枚舉屬性。
    if (typeof value.code === 'number') {
      this.code = value.code;
    }

    賦值(這個,值);
  }

  如果(!this.message){
    this.message = MediaError.defaultMessages[this.code] || '';
  }
}

/**
 * 引用兩個已定義的 MediaError 類型的錯誤代碼
 *
 * @type {數字}
 */
MediaError.prototype.code = 0;

/**
 * 與錯誤一起顯示的可選消息。消息不是 HTML5 的一部分
 * 視頻規範,但允許提供更多信息的自定義錯誤。
 *
 * @type {字符串}
 */
MediaError.prototype.message = '';

/**
 * 一個可選的狀態代碼,可以由插件設置以允許更多詳細信息
 * 錯誤。例如,一個插件可能會提供一個特定的 HTTP 狀態代碼和一個
 * 該代碼的錯誤消息。然後當插件收到該錯誤時,此類將
 * 知道如何為它顯示錯誤信息。這允許顯示自定義消息
 * 在 `Player` 錯誤疊加層上。
 *
 * @type {數組}
 */
MediaError.prototype.status = null;

/**
 * W3C 標準索引的錯誤。訂單**不能更改**!見
 * {@link MediaError} 下列出的規範以獲取更多信息。
 *
 * @enum {數組}
 * @只讀
 * @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'
];

/**
 * 基於 {@link MediaError.errorTypes} 的默認 `MediaError` 消息。
 *
 * @type {數組}
 * @持續的
 */
MediaError.defaultMessages = {
  1:'你中止了媒體播放',
  2:'網絡錯誤導致媒體下載中途失敗。',
  3:'由於損壞問題或媒體使用了您的瀏覽器不支持的功能,媒體播放被中止。',
  4:'無法加載媒體,可能是因為服務器或網絡出現故障,也可能是因為格式不受支持。',
  5:“媒體已加密,我們沒有解密它的密鑰。”
};

// 添加類型作為 MediaError 的屬性
// 例如 MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
for (let errNum = 0; errNum < MediaError.errorTypes.length; errNum++) {
  MediaError[MediaError.errorTypes[errNum]] = errNum;
  // 值應該在類和實例上都可以訪問
  MediaError.prototype[MediaError.errorTypes[errNum]] = errNum;
}

// 上面添加的實例/靜態成員的 jsdocs
// 實例方法使用 `#`,靜態方法使用 `.`
/**
 * 任何自定義錯誤的 W3C 錯誤代碼。
 *
 * @member MediaError#MEDIA_ERR_CUSTOM
 * @constant {數字}
 * @默認0
 */
/**
 * 任何自定義錯誤的 W3C 錯誤代碼。
 *
 * @member MediaError.MEDIA_ERR_CUSTOM
 * @constant {數字}
 * @默認0
 */

/**
 * 媒體錯誤的 W3C 錯誤代碼中止。
 *
 * @member MediaError#MEDIA_ERR_ABORTED
 * @constant {數字}
 * @默認1
 */
/**
 * 媒體錯誤的 W3C 錯誤代碼中止。
 *
 * @member MediaError.MEDIA_ERR_ABORTED
 * @constant {數字}
 * @默認1
 */

/**
 * 任何網絡錯誤的 W3C 錯誤代碼。
 *
 * @member MediaError#MEDIA_ERR_NETWORK
 * @constant {數字}
 * @默認2
 */
/**
 * 任何網絡錯誤的 W3C 錯誤代碼。
 *
 * @member MediaError.MEDIA_ERR_NETWORK
 * @constant {數字}
 * @默認2
 */

/**
 * 任何解碼錯誤的 W3C 錯誤代碼。
 *
 * @member MediaError#MEDIA_ERR_DECODE
 * @constant {數字}
 * @默認3
 */
/**
 * 任何解碼錯誤的 W3C 錯誤代碼。
 *
 * @member MediaError.MEDIA_ERR_DECODE
 * @constant {數字}
 * @默認3
 */

/**
 * 任何時候不支持源的 W3C 錯誤代碼。
 *
 * @member MediaError#MEDIA_ERR_SRC_NOT_SUPPORTED
 * @constant {數字}
 * @默認4
 */
/**
 * 任何時候不支持源的 W3C 錯誤代碼。
 *
 * @member MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED
 * @constant {數字}
 * @默認4
 */

/**
 * 任何時候源被加密的 W3C 錯誤代碼。
 *
 * @member MediaError#MEDIA_ERR_ENCRYPTED
 * @constant {數字}
 * @默認5
 */
/**
 * 任何時候源被加密的 W3C 錯誤代碼。
 *
 * @member MediaError.MEDIA_ERR_ENCRYPTED
 * @constant {數字}
 * @默認5
 */

導出默認 MediaError;