为 Hexo-Redefine 主题启用 MetingJs
最近把 Hexo 的主题切换到了 Redefine,用着还不错
看文档说支持 Aplayer 播放器,但是不支持 MetingJs,只能自己添加音频直链,挺麻烦的(而且也不支持页面内嵌 Aplayer 播放器)
于是我就花了点时间捣鼓了一下,实现效果还不错,但是移动端好像无法正常显示🤔
不知道咋回事,先将就用着吧,看有没有大佬能够完善一下或者看作者会不会加到主题里面了>︿<
引入 JS 文件
第一步当然是引入相关的 js 文件了,我的选择是把文件保存本地然后在主题里面以相对路径引用。
由于 Aplayer.min.js 主题里面已经有了,所以我们只需要把 Meting.min.js 下载下来就行了。
Meting.min.js: Meting.min.js
随后将 Meting.min.js 移至 theme/redefine/source/js/build/libs
即可。
然后新建一个文件,路径为 theme/redefine/layout/components/plugins/meting_js_only.ejs
,内容为
1 2
| <%- renderJS('libs/APlayer.min.js') %> <%- renderJS('libs/Meting.min.js') %>
|
起这个名字的原因是 我仅想引入 Aplayer 和 Meting 的 js 文件而不直接创建一个 Aplayer 的容器,因为我不想搞那个全局吸底,我想弄的是页面内嵌播放器
页面内嵌播放器的格式跟全局吸底的不同
然后在同级目录里面创建一个名为 meting.ejs
的文件(路径: theme/redefine/layout/components/plugins/meting.ejs
),内容为:
1 2
| <div id="meting-container"></div> <%- renderJS('plugins/meting.js') %>
|
既然有纯 js 版的也就有创建容器版的,但是这个就只是创建容器而没有引入 js 了
Meting.js 之构建全局播放器
欸,上面说不是有引入 js/plugins/meting.js
吗?那文件呢?
你先别急,这不就来了吗
这个文件是用于 读取配置文件中的参数来构建一个全局吸底的播放器
此文件路径 themes/redefine/source/build/js/plugins/meting.js
meting.js
内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| const metingConfig = theme.plugins.meting; console.log('Meting Config:', metingConfig);
function initMetingPlayer() { if (!metingConfig.id || !metingConfig.server || !metingConfig.type) { console.error('Missing required parameters:', { id: metingConfig.id, server: metingConfig.server, type: metingConfig.type }); return; }
const metingElement = document.createElement('meting-js'); metingElement.setAttribute('server', metingConfig.server); metingElement.setAttribute('type', metingConfig.type); metingElement.setAttribute('id', metingConfig.id);
if (metingConfig.playerType === 'fixed') { metingElement.setAttribute('fixed', 'true'); } else if (metingConfig.playerType === 'mini') { metingElement.setAttribute('mini', 'true'); }
if (metingConfig.autoplay !== undefined) { metingElement.setAttribute('autoplay', metingConfig.autoplay); } if (metingConfig.theme !== undefined) { metingElement.setAttribute('theme', metingConfig.theme); } if (metingConfig.loop !== undefined) { metingElement.setAttribute('loop', metingConfig.loop); } if (metingConfig.order !== undefined) { metingElement.setAttribute('order', metingConfig.order); } if (metingConfig.preload !== undefined) { metingElement.setAttribute('preload', metingConfig.preload); } if (metingConfig.volume !== undefined) { metingElement.setAttribute('volume', metingConfig.volume); } if (metingConfig.mutex !== undefined) { metingElement.setAttribute('mutex', metingConfig.mutex); } if (metingConfig.lrcType !== undefined) { metingElement.setAttribute('lrc-type', metingConfig.lrcType); } if (metingConfig.listFolded !== undefined) { metingElement.setAttribute('list-folded', metingConfig.listFolded); } if (metingConfig.listMaxHeight !== undefined) { metingElement.setAttribute('list-max-height', metingConfig.listMaxHeight); } if (metingConfig.storageName !== undefined) { metingElement.setAttribute('storage-name', metingConfig.storageName); }
const apContainer = document.getElementById('meting-container'); if (apContainer) { apContainer.innerHTML = ''; apContainer.appendChild(metingElement); }
console.log('Created meting element:', metingElement.outerHTML); }
if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initMetingPlayer); } else { initMetingPlayer(); }
|
注入主题文件
万事俱备,只欠东风。
现在我们只需要把这些组件给注入到主题文件里面就行了。
编辑布局文件 theme/redefine/layout/layout.ejs
将其修改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <!DOCTYPE html> <html lang="<%= config.language %>"> <%- partial('components/header/head') %> <body> <%- body %> <%- partial('components/scripts') %> <% if (theme.plugins.aplayer.enable) { %> <%- partial('components/plugins/aplayer') %> <% } %> <% if (theme.plugins.meting.enable) { %> <%- partial('components/plugins/meting_js_only') %> <% } %> <% if (theme.plugins.meting.global_sticky_enable) { %> <%- partial('components/plugins/meting') %> <% } %> </body> </html>
|
即可。
你可能会发现,在布局文件中有几个开关来控制是否引入这些文件,那么我们现在添加。
在 config.redefine.yml
添加一个配置项:(在 plugins
下,其实紧挨着 aplayer
配置项就行了,注意缩进)
1 2 3 4 5 6 7 8 9 10
| meting: enable: true global_sticky_enable: false id: '1926144232' server: 'netease' type: 'song' playerType: 'fixed' preload: 'auto' loop: 'all' theme: '#4586F3'
|
更多配置项可前往 Github 查看:Option
OK,大功告成。你现在可以使用 hexo s
预览你的播放器效果了。
我只是想在页面中插入播放器
差点忘了这一茬。
如果你只希望在页面中插入播放器的话(而非全局吸底),那么其实可以这样
- 先引入 JS 文件,将 Meting.min.js 移至
theme/redefine/source/js/build/libs
- 编辑布局文件,
theme/redefine/layout/layout.ejs
,修改为
1 2 3 4 5 6 7 8 9 10 11 12
| <!DOCTYPE html> <html lang="<%= config.language %>"> <%- partial('components/header/head') %> <body> <%- body %> <%- partial('components/scripts') %> <% if (theme.plugins.meting.enable) { %> <%- renderJS('libs/APlayer.min.js') %> <%- renderJS('libs/Meting.min.js') %> <% } %> </body> </html>
|
此处我把主题原本的 Aplayer 相关给删了,如果有需要可以加回来
- 在
config.redefine.yml
添加一个配置项:(在 plugins
下,其实紧挨着 aplayer
配置项就行了,注意缩进)
插入格式为
1 2 3 4 5
| <meting-js server="netease" type="song" id="5221167"> </meting-js>
|
效果:
Never Gonna Give You Up
- Rick Astley
-
1
Never Gonna Give You Up
Rick Astley
更多使用方法可前往 Github 查看:Quick Start