hexo-tag-cbplayer
Version:
Embed CBPlayer in Hexo posts/pages
206 lines (191 loc) • 7.19 kB
JavaScript
/**
* hexo-tag-dplayer
* Embed CBPlayer2(https://github.com/cdnbye/CBPlayer) in Hexo posts/pages.
* Syntax:
* {% dplayer key=value ... %}
*/
'use strict';
const
//fs = require('hexo-fs'),
util = require('hexo-util'),
log = require('hexo-log')({name:"hexo-tag-cbplayer",debug:false}), // logger
urlFn = require('url'),
path = require('path');
// srcDir = path.dirname(require.resolve('dplayer')),
// scriptDir = '/assets/js/', // default script directories
// styleDir = '/assets/css/',
// files = [
// ['DPlayer.min.css', styleDir],
// ['DPlayer.min.js', scriptDir],
// some map for debug use
//['DPlayer.min.css.map', styleDir],
//['DPlayer.min.js.map', scriptDir],
// if there be any other dplayer file
//['someDplayerFile.xxx', targetDir],
// ];
String.prototype.replaceAll = function(search, replacement) {
var target = this;
//log.debug(target.split(search))
return target.split(search).join(replacement);
};
var counter = 0,
conf = hexo.config['hexo-tag-cbplayer'] || {},
tbIns=[];
if (!conf.cdn){
conf.cdn = [
'https://cdn.jsdelivr.net/npm/cbplayer2@0.11.1/dist/CBPlayer.min.js',
'https://code.bdstatic.com/npm/hls.js@0.14.13/dist/hls.min.js',
'https://cdn.jsdelivr.net/npm/cdnbye@latest/dist/hlsjs-p2p-engine.min.js'
];
log.info('找不到hexo-tag-dplayer 的js配置,使用默认cdn');
// 移除这个是因为dplayer/DPlayer 的依赖 太多, 就为了两个js文件,实属买椟还珠
// files.forEach(item => {
// var destPath = item[1], filePath = path.join(srcDir, item[0]);
// if (item[1] === scriptDir){
// destPath = conf.js_path || item[1];
// } else if (item[1] === styleDir){
// destPath = conf.css_path || item[1];
// }
// fs.access(filePath, (fs.constants || fs).R_OK , (err) => {
// if(err){
// log.info(item[0]+' is not found in this version of dplayer, skip it.');
// } else {
// hexo.extend.generator.register(path.posix.join(destPath, item[0]), (_) => {
// return {
// path: path.relative(hexo.config.root, path.posix.join(destPath, item[0])),
// data: function() {
// return fs.createReadStream(filePath);
// }
// }
// });
// tbIns.push(path.posix.join(destPath, item[0]));
// }
// })
// })
}
hexo.extend.filter.register('after_render:html', (str, data) => {
if(str.includes('</html>') && str.includes('class="dplayer hexo-tag-cbplayer-mark"')){ //make sure dplayer used in final html
log.debug("got page that dplayer used");
var target = conf.cdn || tbIns,
s = str;
target.forEach(item => {
//console.log(item);
if (item.endsWith('.css')) {
var tag = util.htmlTag('link', {rel: 'stylesheet', type: 'text/css', href: item });
s = s.replace(/<\/head>/, tag + '</head>');
}else if (item.endsWith('.js')) {
var tag = util.htmlTag('script', {src: item}, '');
s = s.replace(/<\/head>/, tag + '</head>');
}else if (item.endsWith('.map')) {
//do nothing when sorce map used
}else{
log.info('unknown file type of dplayer file:'+item);
}
})
//log.debug('postfilter: '+s);
return s;
}
return str;
})
// {% cbplayer key=value ... %}
hexo.extend.tag.register('cbplayer', function (args) {
//hexo.locals.get('posts').forEach(console.log)
const def = conf['default'] || {};
//log.debug("default setting:"+def)
var id = 'dplayer' + (counter++), opt = {};
for (var i in args) {
var k = args[i].split('=')[0],
v = args[i].split("=").length < 2 ? "true" : args[i].slice(args[i].indexOf('=')+1);
if (['autoplay', 'loop', 'screenshot', 'hotkey', 'mutex', 'dmunlimited'].indexOf(k) >= 0){
// bool
v = v.toLowerCase();
opt[k] = ['true', 'yes', '1', 'y', 'on', ''].indexOf(v) >= 0;
} else if (['preload', 'theme', 'lang', 'logo', 'url', 'pic', 'thumbnails', 'vidtype', 'suburl', 'subtype', 'subbottom', 'subcolor', 'subcolor', 'id', 'api', 'token', 'addition', 'dmuser', 'width', 'height', 'code'].indexOf(k) >= 0){
// string
opt[k] = v.toString();
} else if (['volume', 'maximum'].indexOf(k) >= 0){
// number
opt[k] = Number(v) || undefined;
} else if (['yet not implemented'].indexOf(k) >= 0){
// native
continue;
}
}
const width = opt.width || def.width,
height = opt.height || def.height;
var url = opt.url || def.url;
var raw = '<div id="'+ id + '" class="dplayer hexo-tag-cbplayer-mark" style="margin-bottom: 20px;'+(width ?' width:'+width+';':'')+(height?' height:'+height+';':'')+'"></div>';
if(url != undefined){
if (hexo.config['post_asset_folder'] == true ){
//for #10, if post_asset_folder is enable, regard url as relative url
if (! (url.startsWith('https://') || url.startsWith('http://') || url.startsWith('/'))){
var PostAsset = hexo.model('PostAsset');
var asset = PostAsset.findOne({post: this._id, slug: url});
if (!asset) return 'bad asset path...';
opt.url = urlFn.resolve(hexo.config.root, asset.path);
}
}
raw += '<script>(function(){var player = new CBPlayer(' +
JSON.stringify({
//element: "document.getElementById('')",
container: "document.getElementById('')",
autoplay: 'autoplay',
theme: 'theme',
loop: 'loop',
lang: 'lang',
screenshot: 'screenshot',
hotkey: 'hotkey',
preload: 'preload',
logo: 'logo',
volume: 'volume',
mutex: 'mutex',
video: {
url: 'url',
pic: 'pic',
thumbnails: 'thumbnails',
type: 'vidtype',
},
subtitle: {
url: 'suburl',
type: 'subtype',
fontSize: 'subsize',
bottom: 'subbottom',
color: 'subcolor',
},
danmaku: {
id: 'id',
api: 'api',
token: 'token',
maximum: 'maximum',
addition: ['addition'],
user: 'dmuser',
unlimited: 'dmunlimited',
},
icons: 'icons',
contextmenu: 'menu',
},(k,v)=>{
//log.debug("k",k,"v",v,"?",opt[k],"?a", def[k])
if (typeof v === 'string') {
if (v !== "document.getElementById('')"){
return opt[v] || def[v];
} else {
return v;
}
} else if (k === "subtitle" && !(opt.suburl || def.suburl)) {
return undefined;
} else if (k === "danmaku" && !(opt.api || def.api)) {
return undefined;
} else if (k === "addition" && !(opt.addition || def.addition)) {
return undefined;
} else {
return v;
}
}).replace("\"document.getElementById('')\"",'document.getElementById("'+ id +'")') +
');window.dplayers||(window.dplayers=[]);window.dplayers.push(player);' + (opt.code || def.code || '') + '})()</script>';
//console.log(opt.code,def.code,(opt.code || def.code || ''));
}
else{
raw += '<p>no url specified, no dplayer _(:3」∠)_</p>';
}
return raw;
});