喜迎
春节
首页 技术

第一种方法

用xshell连接服务器进入typecho/usr/themes/Cuteen/base目录编辑head.php

cd typecho/usr/themes/Cuteen/base
vim head.php

引入js
添加以下内容

<script>
// DPlayer API
document.addEventListener('DOMContentLoaded', initDplayer);
function initDplayer() {
    const common = {
        loadResource: function (id, resource, type, callback) {
            let loaded = document.head.querySelector('#' + id);
            if (loaded) {
                callback();
                return;
            }
            const element = document.createElement(type);
            element.onload = element.onreadystatechange = () => {
                if (!loaded && (!element.readyState || /loaded|complete/.test(element.readyState))) {
                    element.onload = element.onreadystatechange = null;
                    loaded = true;
                    callback();
                }
            }
            if (type === 'link') {
                element.rel = 'stylesheet';
                element.href = resource;
            } else {
                element.src = resource;
            }
            element.id = id;
            document.getElementsByTagName('head')[0].appendChild(element);
        },
        loadResources: function (callback) {
            const cdn = '//s0.pstatp.com/cdn/expire-1-M';
            const resources = [
                '/dplayer/1.25.0/DPlayer.min.css',
                '/dplayer/1.25.0/DPlayer.min.js',
                '/hls.js/0.12.4/hls.light.min.js',
                '/flv.js/1.5.0/flv.min.js'
            ];
            let unloadedResourceCount = resources.length;
            resources.forEach(resource => {
                this.loadResource(btoa(resource).replace(/[=+\/]/g, ''), cdn + resource,
                    ({
                        'css': 'link',
                        'js': 'script'
                    })[resource.split('.').pop()],
                    () => --unloadedResourceCount ? null : callback()
                );
            });
        },
        createDplayers: function (sources, callback) {
            for (let i = 0; i < sources.length; i++) {
                const child = document.createElement('div');
                const src = sources[i].getAttribute('src');
                sources[i].parentNode.insertBefore(child, sources[i]);
                sources[i].style.display = 'none';
                const type = src.split('.').pop();
                const option = { url: src };
                type === 'flv' ? option.type = type : null;
                const dplayer = new DPlayer({ container: child, preload: 'none', autoplay: false, screenshot: false, video: option });
            }
            if (typeof callback === 'function') callback();
        }
    };
    const mirages = {
        isMirages: function () { return Mirages || false },
        fixVideoSize: function (length) {
            let outerTimer = false;
            const outerInterval = setInterval(() => {
                if (outerTimer) return;
                const videos = document.getElementsByTagName('video');
                if (videos.length === length) {
                    const dplayerWraps = document.querySelectorAll('.dplayer-video-wrap');
                    for (let i = 0; i < length; i++) {
                        const videoContainers = dplayerWraps[i].querySelectorAll('.video-container.video-4-3');
                        if (videoContainers.length) {
                            videoContainers[0].style = 'position: initial;';
                            videoContainers[0].className = 'video-container video-16-9';
                            console.log('video-4-3 fixed.');
                        } else {
                            const videoContainer = document.createElement('div');
                            videoContainer.style = 'position: initial;';
                            videoContainer.className = 'video-container video-16-9';
                            videoContainer.appendChild(videos[i]);
                            dplayerWraps[i].appendChild(videoContainer);
                            console.log('video-16-9 inserted.');
                            const targetNode = videoContainer;
                            const config = { childList: true };
                            const callback = (mutationsList, observer) => {
                                const newVideoContainers = videoContainer.querySelectorAll(
                                    '.video-container.video-4-3');
                                if (newVideoContainers.length) {
                                    newVideoContainers[0].className = '';
                                    console.log('auto inserted video-4-3 fixed.');
                                    observer.disconnect();
                                }
                            };
                            const observer = new MutationObserver(callback);
                            observer.observe(targetNode, config);
                            setTimeout(() => observer.disconnect(), 1000 * 120);
                        }
                    }
                    outerTimer = true;
                    clearInterval(outerInterval);
                }
            }, 500);
        }
    };
    const dps = document.getElementsByTagName('dp');
    if (dps.length !== 0) {
        common.loadResources(() => common.createDplayers(dps, () => {
            // 修正 Mirages 视频比例错误
            mirages.isMirages() ? mirages.fixVideoSize(dps.length) : null;
        }));
    }
};
</script>

引入视频

插入代码

!!!
<dp src="你的视频地址"></dp>
!!!


在所需位置以 html 形式插入代码,即可添加播放器。

第二种方法

使用插件
下载后将文件夹名改为DPlayer上传启用即可。
使用方法
支持 m3u8、mp4,flv 和 mkv 格式,不过编码必须是 H.264 AAC。




文章评论

评论已关闭

目录