Unminify using 1.5.323
Repo with tag: https://github.com/MediaBrowser/emby-webcomponents/tree/1.5.323
This commit is contained in:
parent
4678528d00
commit
de6ac33ec1
289 changed files with 78483 additions and 54701 deletions
|
@ -1,193 +1,466 @@
|
|||
define(["events", "globalize", "playbackManager", "connectionManager", "playMethodHelper", "layoutManager", "serverNotifications", "paper-icon-button-light", "css!./playerstats"], function(events, globalize, playbackManager, connectionManager, playMethodHelper, layoutManager, serverNotifications) {
|
||||
"use strict";
|
||||
define(['events', 'globalize', 'playbackManager', 'connectionManager', 'playMethodHelper', 'layoutManager', 'serverNotifications', 'paper-icon-button-light', 'css!./playerstats'], function (events, globalize, playbackManager, connectionManager, playMethodHelper, layoutManager, serverNotifications) {
|
||||
'use strict';
|
||||
|
||||
function init(instance) {
|
||||
var parent = document.createElement("div");
|
||||
parent.classList.add("playerStats"), layoutManager.tv && parent.classList.add("playerStats-tv"), parent.classList.add("hide");
|
||||
|
||||
var parent = document.createElement('div');
|
||||
|
||||
parent.classList.add('playerStats');
|
||||
|
||||
if (layoutManager.tv) {
|
||||
parent.classList.add('playerStats-tv');
|
||||
}
|
||||
|
||||
parent.classList.add('hide');
|
||||
|
||||
var button;
|
||||
button = layoutManager.tv ? "" : '<button type="button" is="paper-icon-button-light" class="playerStats-closeButton"><i class="md-icon">close</i></button>';
|
||||
var contentClass = layoutManager.tv ? "playerStats-content playerStats-content-tv" : "playerStats-content";
|
||||
parent.innerHTML = '<div class="' + contentClass + '">' + button + '<div class="playerStats-stats"></div></div>', button = parent.querySelector(".playerStats-closeButton"), button && button.addEventListener("click", onCloseButtonClick.bind(instance)), document.body.appendChild(parent), instance.element = parent
|
||||
|
||||
if (layoutManager.tv) {
|
||||
button = '';
|
||||
} else {
|
||||
button = '<button type="button" is="paper-icon-button-light" class="playerStats-closeButton"><i class="md-icon">close</i></button>';
|
||||
}
|
||||
|
||||
var contentClass = layoutManager.tv ? 'playerStats-content playerStats-content-tv' : 'playerStats-content';
|
||||
|
||||
parent.innerHTML = '<div class="' + contentClass + '">' + button + '<div class="playerStats-stats"></div></div>';
|
||||
|
||||
button = parent.querySelector('.playerStats-closeButton');
|
||||
|
||||
if (button) {
|
||||
button.addEventListener('click', onCloseButtonClick.bind(instance));
|
||||
}
|
||||
|
||||
document.body.appendChild(parent);
|
||||
|
||||
instance.element = parent;
|
||||
}
|
||||
|
||||
function onCloseButtonClick() {
|
||||
this.enabled(!1)
|
||||
this.enabled(false);
|
||||
}
|
||||
|
||||
function renderStats(elem, categories) {
|
||||
elem.querySelector(".playerStats-stats").innerHTML = categories.map(function(category) {
|
||||
var categoryHtml = "",
|
||||
stats = category.stats;
|
||||
stats.length && category.name && (categoryHtml += '<div class="playerStats-stat playerStats-stat-header">', categoryHtml += '<div class="playerStats-stat-label">', categoryHtml += category.name, categoryHtml += "</div>", categoryHtml += '<div class="playerStats-stat-value">', categoryHtml += category.subText || "", categoryHtml += "</div>", categoryHtml += "</div>");
|
||||
for (var i = 0, length = stats.length; i < length; i++) {
|
||||
categoryHtml += '<div class="playerStats-stat">';
|
||||
var stat = stats[i];
|
||||
categoryHtml += '<div class="playerStats-stat-label">', categoryHtml += stat.label, categoryHtml += "</div>", categoryHtml += '<div class="playerStats-stat-value">', categoryHtml += stat.value, categoryHtml += "</div>", categoryHtml += "</div>"
|
||||
|
||||
elem.querySelector('.playerStats-stats').innerHTML = categories.map(function (category) {
|
||||
|
||||
var categoryHtml = '';
|
||||
|
||||
var stats = category.stats;
|
||||
|
||||
if (stats.length && category.name) {
|
||||
categoryHtml += '<div class="playerStats-stat playerStats-stat-header">';
|
||||
|
||||
categoryHtml += '<div class="playerStats-stat-label">';
|
||||
categoryHtml += category.name;
|
||||
categoryHtml += '</div>';
|
||||
|
||||
categoryHtml += '<div class="playerStats-stat-value">';
|
||||
categoryHtml += category.subText || '';
|
||||
categoryHtml += '</div>';
|
||||
|
||||
categoryHtml += '</div>';
|
||||
}
|
||||
return categoryHtml
|
||||
}).join("")
|
||||
|
||||
for (var i = 0, length = stats.length; i < length; i++) {
|
||||
|
||||
categoryHtml += '<div class="playerStats-stat">';
|
||||
|
||||
var stat = stats[i];
|
||||
|
||||
categoryHtml += '<div class="playerStats-stat-label">';
|
||||
categoryHtml += stat.label;
|
||||
categoryHtml += '</div>';
|
||||
|
||||
categoryHtml += '<div class="playerStats-stat-value">';
|
||||
categoryHtml += stat.value;
|
||||
categoryHtml += '</div>';
|
||||
|
||||
categoryHtml += '</div>';
|
||||
}
|
||||
|
||||
return categoryHtml;
|
||||
|
||||
}).join('');
|
||||
}
|
||||
|
||||
function getSession(instance, player) {
|
||||
if ((new Date).getTime() - (instance.lastSessionTime || 0) < 1e4) return Promise.resolve(instance.lastSession);
|
||||
|
||||
var now = new Date().getTime();
|
||||
|
||||
if ((now - (instance.lastSessionTime || 0)) < 10000) {
|
||||
return Promise.resolve(instance.lastSession);
|
||||
}
|
||||
|
||||
var apiClient = connectionManager.getApiClient(playbackManager.currentItem(player).ServerId);
|
||||
|
||||
return apiClient.getSessions({
|
||||
deviceId: apiClient.deviceId()
|
||||
}).then(function(sessions) {
|
||||
return instance.lastSession = sessions[0] || {}, instance.lastSessionTime = (new Date).getTime(), Promise.resolve(instance.lastSession)
|
||||
}, function() {
|
||||
return Promise.resolve({})
|
||||
})
|
||||
}).then(function (sessions) {
|
||||
|
||||
instance.lastSession = sessions[0] || {};
|
||||
instance.lastSessionTime = new Date().getTime();
|
||||
|
||||
return Promise.resolve(instance.lastSession);
|
||||
|
||||
}, function () {
|
||||
return Promise.resolve({});
|
||||
});
|
||||
}
|
||||
|
||||
function translateReason(reason) {
|
||||
return globalize.translate("sharedcomponents#" + reason)
|
||||
|
||||
return globalize.translate('sharedcomponents#' + reason);
|
||||
}
|
||||
|
||||
function getTranscodingStats(session, player, displayPlayMethod) {
|
||||
var videoCodec, audioCodec, totalBitrate, sessionStats = [];
|
||||
return session.TranscodingInfo && (videoCodec = session.TranscodingInfo.VideoCodec, audioCodec = session.TranscodingInfo.AudioCodec, totalBitrate = session.TranscodingInfo.Bitrate, session.TranscodingInfo.AudioChannels), videoCodec && sessionStats.push({
|
||||
label: "Video codec:",
|
||||
value: session.TranscodingInfo.IsVideoDirect ? videoCodec.toUpperCase() + " (direct)" : videoCodec.toUpperCase()
|
||||
}), audioCodec && sessionStats.push({
|
||||
label: "Audio codec:",
|
||||
value: session.TranscodingInfo.IsAudioDirect ? audioCodec.toUpperCase() + " (direct)" : audioCodec.toUpperCase()
|
||||
}), "Transcode" === displayPlayMethod && (totalBitrate && sessionStats.push({
|
||||
label: "Bitrate:",
|
||||
value: getDisplayBitrate(totalBitrate)
|
||||
}), session.TranscodingInfo.CompletionPercentage && sessionStats.push({
|
||||
label: "Transcoding progress:",
|
||||
value: session.TranscodingInfo.CompletionPercentage.toFixed(1) + "%"
|
||||
}), session.TranscodingInfo.Framerate && sessionStats.push({
|
||||
label: "Transcoding framerate:",
|
||||
value: session.TranscodingInfo.Framerate + " fps"
|
||||
}), session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length && sessionStats.push({
|
||||
label: "Reason for transcoding:",
|
||||
value: session.TranscodingInfo.TranscodeReasons.map(translateReason).join("<br/>")
|
||||
})), sessionStats
|
||||
var sessionStats = [];
|
||||
|
||||
var videoCodec;
|
||||
var audioCodec;
|
||||
var totalBitrate;
|
||||
var audioChannels;
|
||||
|
||||
if (session.TranscodingInfo) {
|
||||
|
||||
videoCodec = session.TranscodingInfo.VideoCodec;
|
||||
audioCodec = session.TranscodingInfo.AudioCodec;
|
||||
totalBitrate = session.TranscodingInfo.Bitrate;
|
||||
audioChannels = session.TranscodingInfo.AudioChannels;
|
||||
}
|
||||
|
||||
if (videoCodec) {
|
||||
|
||||
sessionStats.push({
|
||||
label: 'Video codec:',
|
||||
value: session.TranscodingInfo.IsVideoDirect ? (videoCodec.toUpperCase() + ' (direct)') : videoCodec.toUpperCase()
|
||||
});
|
||||
}
|
||||
|
||||
if (audioCodec) {
|
||||
|
||||
sessionStats.push({
|
||||
label: 'Audio codec:',
|
||||
value: session.TranscodingInfo.IsAudioDirect ? (audioCodec.toUpperCase() + ' (direct)') : audioCodec.toUpperCase()
|
||||
});
|
||||
}
|
||||
|
||||
//if (audioChannels) {
|
||||
|
||||
// sessionStats.push({
|
||||
// label: 'Audio channels:',
|
||||
// value: audioChannels
|
||||
// });
|
||||
//}
|
||||
|
||||
if (displayPlayMethod === 'Transcode') {
|
||||
if (totalBitrate) {
|
||||
|
||||
sessionStats.push({
|
||||
label: 'Bitrate:',
|
||||
value: getDisplayBitrate(totalBitrate)
|
||||
});
|
||||
}
|
||||
if (session.TranscodingInfo.CompletionPercentage) {
|
||||
|
||||
sessionStats.push({
|
||||
label: 'Transcoding progress:',
|
||||
value: session.TranscodingInfo.CompletionPercentage.toFixed(1) + '%'
|
||||
});
|
||||
}
|
||||
if (session.TranscodingInfo.Framerate) {
|
||||
|
||||
sessionStats.push({
|
||||
label: 'Transcoding framerate:',
|
||||
value: session.TranscodingInfo.Framerate + ' fps'
|
||||
});
|
||||
}
|
||||
if (session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) {
|
||||
|
||||
sessionStats.push({
|
||||
label: 'Reason for transcoding:',
|
||||
value: session.TranscodingInfo.TranscodeReasons.map(translateReason).join('<br/>')
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return sessionStats;
|
||||
}
|
||||
|
||||
function getDisplayBitrate(bitrate) {
|
||||
return bitrate > 1e6 ? (bitrate / 1e6).toFixed(1) + " Mbps" : Math.floor(bitrate / 1e3) + " kbps"
|
||||
|
||||
if (bitrate > 1000000) {
|
||||
return (bitrate / 1000000).toFixed(1) + ' Mbps';
|
||||
} else {
|
||||
return Math.floor(bitrate / 1000) + ' kbps';
|
||||
}
|
||||
}
|
||||
|
||||
function getMediaSourceStats(session, player, displayPlayMethod) {
|
||||
var sessionStats = [],
|
||||
mediaSource = playbackManager.currentMediaSource(player) || {},
|
||||
totalBitrate = mediaSource.Bitrate;
|
||||
mediaSource.Container && sessionStats.push({
|
||||
label: "Container:",
|
||||
value: mediaSource.Container
|
||||
}), totalBitrate && sessionStats.push({
|
||||
label: "Bitrate:",
|
||||
value: getDisplayBitrate(totalBitrate)
|
||||
});
|
||||
var mediaStreams = mediaSource.MediaStreams || [],
|
||||
videoStream = mediaStreams.filter(function(s) {
|
||||
return "Video" === s.Type
|
||||
})[0] || {},
|
||||
videoCodec = videoStream.Codec,
|
||||
audioStreamIndex = playbackManager.getAudioStreamIndex(player),
|
||||
audioStream = playbackManager.audioTracks(player).filter(function(s) {
|
||||
return "Audio" === s.Type && s.Index === audioStreamIndex
|
||||
})[0] || {},
|
||||
audioCodec = audioStream.Codec,
|
||||
audioChannels = audioStream.Channels,
|
||||
videoInfos = [];
|
||||
videoCodec && videoInfos.push(videoCodec.toUpperCase()), videoStream.Profile && videoInfos.push(videoStream.Profile), videoInfos.length && sessionStats.push({
|
||||
label: "Video codec:",
|
||||
value: videoInfos.join(" ")
|
||||
}), videoStream.BitRate && sessionStats.push({
|
||||
label: "Video bitrate:",
|
||||
value: getDisplayBitrate(videoStream.BitRate)
|
||||
});
|
||||
|
||||
var sessionStats = [];
|
||||
|
||||
var mediaSource = playbackManager.currentMediaSource(player) || {};
|
||||
var totalBitrate = mediaSource.Bitrate;
|
||||
|
||||
if (mediaSource.Container) {
|
||||
sessionStats.push({
|
||||
label: 'Container:',
|
||||
value: mediaSource.Container
|
||||
});
|
||||
}
|
||||
|
||||
if (totalBitrate) {
|
||||
|
||||
sessionStats.push({
|
||||
label: 'Bitrate:',
|
||||
value: getDisplayBitrate(totalBitrate)
|
||||
});
|
||||
}
|
||||
|
||||
var mediaStreams = mediaSource.MediaStreams || [];
|
||||
var videoStream = mediaStreams.filter(function (s) {
|
||||
|
||||
return s.Type === 'Video';
|
||||
|
||||
})[0] || {};
|
||||
|
||||
var videoCodec = videoStream.Codec;
|
||||
|
||||
var audioStreamIndex = playbackManager.getAudioStreamIndex(player);
|
||||
var audioStream = playbackManager.audioTracks(player).filter(function (s) {
|
||||
|
||||
return s.Type === 'Audio' && s.Index === audioStreamIndex;
|
||||
|
||||
})[0] || {};
|
||||
|
||||
var audioCodec = audioStream.Codec;
|
||||
var audioChannels = audioStream.Channels;
|
||||
|
||||
var videoInfos = [];
|
||||
|
||||
if (videoCodec) {
|
||||
videoInfos.push(videoCodec.toUpperCase());
|
||||
}
|
||||
|
||||
if (videoStream.Profile) {
|
||||
videoInfos.push(videoStream.Profile);
|
||||
}
|
||||
|
||||
if (videoInfos.length) {
|
||||
sessionStats.push({
|
||||
label: 'Video codec:',
|
||||
value: videoInfos.join(' ')
|
||||
});
|
||||
}
|
||||
|
||||
if (videoStream.BitRate) {
|
||||
sessionStats.push({
|
||||
label: 'Video bitrate:',
|
||||
value: getDisplayBitrate(videoStream.BitRate)
|
||||
});
|
||||
}
|
||||
|
||||
var audioInfos = [];
|
||||
return audioCodec && audioInfos.push(audioCodec.toUpperCase()), audioStream.Profile && audioInfos.push(audioStream.Profile), audioInfos.length && sessionStats.push({
|
||||
label: "Audio codec:",
|
||||
value: audioInfos.join(" ")
|
||||
}), audioStream.BitRate && sessionStats.push({
|
||||
label: "Audio bitrate:",
|
||||
value: getDisplayBitrate(audioStream.BitRate)
|
||||
}), audioChannels && sessionStats.push({
|
||||
label: "Audio channels:",
|
||||
value: audioChannels
|
||||
}), audioStream.SampleRate && sessionStats.push({
|
||||
label: "Audio sample rate:",
|
||||
value: audioStream.SampleRate + " Hz"
|
||||
}), audioStream.BitDepth && sessionStats.push({
|
||||
label: "Audio bit depth:",
|
||||
value: audioStream.BitDepth
|
||||
}), sessionStats
|
||||
|
||||
if (audioCodec) {
|
||||
audioInfos.push(audioCodec.toUpperCase());
|
||||
}
|
||||
|
||||
if (audioStream.Profile) {
|
||||
audioInfos.push(audioStream.Profile);
|
||||
}
|
||||
|
||||
if (audioInfos.length) {
|
||||
sessionStats.push({
|
||||
label: 'Audio codec:',
|
||||
value: audioInfos.join(' ')
|
||||
});
|
||||
}
|
||||
|
||||
if (audioStream.BitRate) {
|
||||
sessionStats.push({
|
||||
label: 'Audio bitrate:',
|
||||
value: getDisplayBitrate(audioStream.BitRate)
|
||||
});
|
||||
}
|
||||
|
||||
if (audioChannels) {
|
||||
sessionStats.push({
|
||||
label: 'Audio channels:',
|
||||
value: audioChannels
|
||||
});
|
||||
}
|
||||
|
||||
if (audioStream.SampleRate) {
|
||||
sessionStats.push({
|
||||
label: 'Audio sample rate:',
|
||||
value: audioStream.SampleRate + ' Hz'
|
||||
});
|
||||
}
|
||||
|
||||
if (audioStream.BitDepth) {
|
||||
sessionStats.push({
|
||||
label: 'Audio bit depth:',
|
||||
value: audioStream.BitDepth
|
||||
});
|
||||
}
|
||||
|
||||
return sessionStats;
|
||||
}
|
||||
|
||||
function getStats(instance, player) {
|
||||
var statsPromise = player.getStats ? player.getStats() : Promise.resolve({}),
|
||||
sessionPromise = getSession(instance, player);
|
||||
return Promise.all([statsPromise, sessionPromise]).then(function(responses) {
|
||||
var playerStatsResult = responses[0],
|
||||
playerStats = playerStatsResult.categories || [],
|
||||
session = responses[1],
|
||||
displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session),
|
||||
baseCategory = {
|
||||
stats: [],
|
||||
name: "Playback Info"
|
||||
};
|
||||
|
||||
var statsPromise = player.getStats ? player.getStats() : Promise.resolve({});
|
||||
var sessionPromise = getSession(instance, player);
|
||||
|
||||
return Promise.all([statsPromise, sessionPromise]).then(function (responses) {
|
||||
|
||||
var playerStatsResult = responses[0];
|
||||
var playerStats = playerStatsResult.categories || [];
|
||||
var session = responses[1];
|
||||
|
||||
var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session);
|
||||
|
||||
var baseCategory = {
|
||||
stats: [],
|
||||
name: 'Playback Info'
|
||||
};
|
||||
|
||||
baseCategory.stats.unshift({
|
||||
label: "Play method:",
|
||||
label: 'Play method:',
|
||||
value: displayPlayMethod
|
||||
}), baseCategory.stats.unshift({
|
||||
label: "Player:",
|
||||
});
|
||||
|
||||
baseCategory.stats.unshift({
|
||||
label: 'Player:',
|
||||
value: player.name
|
||||
});
|
||||
|
||||
var categories = [];
|
||||
|
||||
categories.push(baseCategory);
|
||||
|
||||
for (var i = 0, length = playerStats.length; i < length; i++) {
|
||||
|
||||
var category = playerStats[i];
|
||||
"audio" === category.type ? category.name = "Audio Info" : "video" === category.type && (category.name = "Video Info"), categories.push(category)
|
||||
if (category.type === 'audio') {
|
||||
category.name = 'Audio Info';
|
||||
}
|
||||
else if (category.type === 'video') {
|
||||
category.name = 'Video Info';
|
||||
}
|
||||
categories.push(category);
|
||||
}
|
||||
return session.TranscodingInfo && categories.push({
|
||||
stats: getTranscodingStats(session, player, displayPlayMethod),
|
||||
name: "Transcode" === displayPlayMethod ? "Transcoding Info" : "Direct Stream Info"
|
||||
}), categories.push({
|
||||
|
||||
if (session.TranscodingInfo) {
|
||||
|
||||
categories.push({
|
||||
stats: getTranscodingStats(session, player, displayPlayMethod),
|
||||
name: displayPlayMethod === 'Transcode' ? 'Transcoding Info' : 'Direct Stream Info'
|
||||
});
|
||||
}
|
||||
|
||||
categories.push({
|
||||
stats: getMediaSourceStats(session, player),
|
||||
name: "Original Media Info"
|
||||
}), Promise.resolve(categories)
|
||||
})
|
||||
name: 'Original Media Info'
|
||||
});
|
||||
|
||||
return Promise.resolve(categories);
|
||||
});
|
||||
}
|
||||
|
||||
function renderPlayerStats(instance, player) {
|
||||
var now = (new Date).getTime();
|
||||
now - (instance.lastRender || 0) < 700 || (instance.lastRender = now, getStats(instance, player).then(function(stats) {
|
||||
|
||||
var now = new Date().getTime();
|
||||
|
||||
if ((now - (instance.lastRender || 0)) < 700) {
|
||||
return;
|
||||
}
|
||||
|
||||
instance.lastRender = now;
|
||||
|
||||
getStats(instance, player).then(function (stats) {
|
||||
|
||||
var elem = instance.element;
|
||||
elem && renderStats(elem, stats)
|
||||
}))
|
||||
if (!elem) {
|
||||
return;
|
||||
}
|
||||
|
||||
renderStats(elem, stats);
|
||||
});
|
||||
}
|
||||
|
||||
function bindEvents(instance, player) {
|
||||
var localOnTimeUpdate = function() {
|
||||
renderPlayerStats(instance, player)
|
||||
|
||||
var localOnTimeUpdate = function () {
|
||||
renderPlayerStats(instance, player);
|
||||
};
|
||||
instance.onTimeUpdate = localOnTimeUpdate, events.on(player, "timeupdate", localOnTimeUpdate)
|
||||
|
||||
instance.onTimeUpdate = localOnTimeUpdate;
|
||||
events.on(player, 'timeupdate', localOnTimeUpdate);
|
||||
}
|
||||
|
||||
function unbindEvents(instance, player) {
|
||||
|
||||
var localOnTimeUpdate = instance.onTimeUpdate;
|
||||
localOnTimeUpdate && events.off(player, "timeupdate", localOnTimeUpdate)
|
||||
|
||||
if (localOnTimeUpdate) {
|
||||
events.off(player, 'timeupdate', localOnTimeUpdate);
|
||||
}
|
||||
}
|
||||
|
||||
function PlayerStats(options) {
|
||||
this.options = options, init(this), this.enabled(!0)
|
||||
|
||||
this.options = options;
|
||||
|
||||
init(this);
|
||||
|
||||
this.enabled(true);
|
||||
}
|
||||
return PlayerStats.prototype.enabled = function(enabled) {
|
||||
if (null == enabled) return this._enabled;
|
||||
|
||||
PlayerStats.prototype.enabled = function (enabled) {
|
||||
|
||||
if (enabled == null) {
|
||||
return this._enabled;
|
||||
}
|
||||
|
||||
var options = this.options;
|
||||
options && (this._enabled = enabled, enabled ? (this.element.classList.remove("hide"), bindEvents(this, options.player)) : (this.element.classList.add("hide"), unbindEvents(this, options.player)))
|
||||
}, PlayerStats.prototype.toggle = function() {
|
||||
this.enabled(!this.enabled())
|
||||
}, PlayerStats.prototype.destroy = function() {
|
||||
|
||||
if (!options) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._enabled = enabled;
|
||||
if (enabled) {
|
||||
this.element.classList.remove('hide');
|
||||
bindEvents(this, options.player);
|
||||
} else {
|
||||
this.element.classList.add('hide');
|
||||
unbindEvents(this, options.player);
|
||||
}
|
||||
};
|
||||
|
||||
PlayerStats.prototype.toggle = function () {
|
||||
this.enabled(!this.enabled());
|
||||
};
|
||||
|
||||
PlayerStats.prototype.destroy = function () {
|
||||
|
||||
var options = this.options;
|
||||
options && (this.options = null, unbindEvents(this, options.player));
|
||||
|
||||
if (options) {
|
||||
|
||||
this.options = null;
|
||||
unbindEvents(this, options.player);
|
||||
}
|
||||
|
||||
var elem = this.element;
|
||||
elem && (elem.parentNode.removeChild(elem), this.element = null)
|
||||
}, PlayerStats
|
||||
if (elem) {
|
||||
elem.parentNode.removeChild(elem);
|
||||
this.element = null;
|
||||
}
|
||||
};
|
||||
|
||||
return PlayerStats;
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue