Files
SEONexus/code/public/static/js/modules/player/dplayer.init.js

166 lines
5.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(function () {
/**
* =====================================================
* DPlayer Initializer (Scoped by dom_prefix)
* -----------------------------------------------------
* - 不使用全局变量
* - 支持一个页面多个播放器
* - 只初始化 data-engine="dplayer" 的模块
* =====================================================
*/
function ensurePrefix(root) {
if (!root || root.dataset.prefix) {
return;
}
var cls = root.className || '';
var m = cls.match(/([a-z0-9]{4,8})-player/);
if (m) {
root.dataset.prefix = m[1];
}
}
function resolveContainer(root) {
if (root && root.querySelector) {
return root.querySelector('.dplayer, [id="dplayer"]');
}
return document.getElementById('dplayer') || document.querySelector('.dplayer');
}
function initDPlayer(root, strPlayUrl) {
var DomDPlayer = resolveContainer(root);
if (!DomDPlayer) {
showError(root, '播放器容器不存在');
return null;
}
// ---- 创建 DPlayer 实例 ----
try {
var videoPlayer = new DPlayer({
container: DomDPlayer,
autoplay: true,
screenshot: false,
//logo: dplayerLogo,
video: {
url: strPlayUrl,
type: 'hls',
},
pluginOptions: {
hls: {
maxBufferLength: 600,
},
},
});
videoPlayer.play()
// ---- 错误处理(兜底)----
videoPlayer.on('error', function () {
showError(root, '播放失败,请尝试切换线路');
});
return videoPlayer;
} catch (e) {
console.log(e)
showError(root, '播放器初始化失败');
return null;
}
}
function showError(root, msg) {
if (!root || !root.querySelector) {
console.warn(msg);
return;
}
ensurePrefix(root);
var err = root.querySelector('.' + root.dataset.prefix + '-player-status');
if (!err) {
err = document.createElement('div');
err.className = root.dataset.prefix + '-player-status is-error';
root.appendChild(err);
}
err.innerText = msg;
}
function boot() {
var players = document.querySelectorAll('[data-engine="dplayer"]');
if (!players.length) return;
players.forEach(function (root) {
ensurePrefix(root);
});
}
// 获取第一个线路 key带容错
function getDefaultLine() {
if (typeof arrPlayUrl === "undefined" || !arrPlayUrl || typeof arrPlayUrl !== "object") {
console.warn("arrPlayUrl 无效:");
return null;
}
const keys = Object.keys(arrPlayUrl);
if (keys.length === 0) {
console.warn("没有任何播放线路");
return null;
}
return keys[0]; // 后端排序,第一位为默认
}
// 获取某个线路的第一个 url
function getFirstPlayUrl(playLine) {
if (!arrPlayUrl || !arrPlayUrl[playLine] || !arrPlayUrl[playLine][0]) {
console.warn("播放线路不存在:", playLine, arrPlayUrl);
return null;
}
return arrPlayUrl[playLine][0].url || null;
}
// DOM Ready
document.addEventListener("DOMContentLoaded", function () {
try {
if (typeof strVideoId == "undefined") return;
var root = document.querySelector('[data-engine="dplayer"]');
if (!root) return;
ensurePrefix(root);
console.log(strPlayType)
console.log(boolIsPlayPage)
if (typeof strPlayType !== "undefined" && boolIsPlayPage) {
// 用户指定线路
if (strPlayType !== "default") {
const activeUrl = arrPlayUrl[strPlayType][intPlayUrlIndex - 1];
strPlayUrl = activeUrl.url;
// checkLine(strPlayType);
// 默认播放第一个线路的第一个 URL
} else {
const defaultLine = getDefaultLine();
strPlayUrl = getFirstPlayUrl(defaultLine);
// checkLine(defaultLine);
}
console.log('strPlayUrlstrPlayUrl')
initDPlayer(root, strPlayUrl);
} else if (strPlayType == "default" && !boolIsPlayPage) {
const defaultLine = getDefaultLine();
strPlayUrl = getFirstPlayUrl(defaultLine);
// checkLine(defaultLine);
initDPlayer(root, strPlayUrl);
}
} catch (error) {
console.log(error);
}
})
})();