import { BilibiliVideoApi } from "@/api/BilibiliVideoApi"; import Artplayer from "artplayer"; import type { Events } from "artplayer"; /** 配置信息 */ export type ArtPlayerPluginTopToolBarOption = { /** 是否显示容器 @default false */ showWrap?: boolean; /** 是否显示右侧视图 */ showRight?: boolean; /** 是否显示右侧下面的follow */ showRightFollow?: boolean; /** 视频标题文字 */ title?: string; /** 是否显示标题 @default false */ showTitle?: boolean; onlineInfoParams: { /** 视频的aid */ aid: number | string; /** 视频的cid */ cid: number | string; } & { /** 视频的bvid */ bvid: string; /** 视频的cid */ cid: number | string; }; /** 是否显示在线观看人数 @default false */ showOnlineTotal?: boolean; }; export type ArtPlayerPluginTopToolBarResult = { name: string; /** * 更新参数时调用 * @param option */ update(option: ArtPlayerPluginTopToolBarOption): void; }; const TAG = "[artplayer-plugin-TopToolBar]:"; /** 工具函数 */ const TopToolBarUtils = { /** 显示元素,有个问题,不能单纯的使用display,会卡死 */ show($el: HTMLElement) { if (!$el) { return; } // $el.classList.remove("art-common-hide"); }, /** 隐藏元素 */ hide($el: HTMLElement) { if (!$el) { return; } // $el.classList.add("art-common-hide"); }, }; /** 事件 */ const TopToolBarEvent = { events: { control: (state) => { if (!state) { return; } TopToolBar.updateOnlineTotal({ showOnlineTotal: TopToolBar.$data.option.showOnlineTotal!, onlineInfoParams: TopToolBar.$data.option.onlineInfoParams, }); }, } as { [key in keyof Events]?: (...args: Events[key]) => unknown; }, /** * 绑定事件 */ bind() { Object.keys(this.events).forEach((eventName) => { TopToolBar.art.on(eventName as keyof Events, (this.events as any)[eventName as keyof Events]); }); }, /** * 取消绑定事件 */ unbind() { Object.keys(this.events).forEach((eventName) => { TopToolBar.art.off(eventName as keyof Events, (this.events as any)[eventName as keyof Events]); }); }, }; const TopToolBar = { art: null as any as Artplayer, $el: { /** 容器 */ $topWrap: null as any as HTMLElement, $topTitle: null as any as HTMLElement, /** 视频标题 */ $topTitleText: null as any as HTMLDivElement, /** 视频标题的下面的容器 */ $topTitleFollow: null as any as HTMLDivElement, /** 视频标题下面的在线观看人数 */ $topTitleFollowText: null as any as HTMLDivElement, /** 右侧容器 */ $topRight: null as any as HTMLDivElement, /** 右侧容器的下面的容器 */ $topRightFollow: null as any as HTMLDivElement, }, $data: { /** 是否已初始化 */ isInit: false, __option: {} as ArtPlayerPluginTopToolBarOption, /** 配置 */ option: {} as ArtPlayerPluginTopToolBarOption, }, $key: { plugin_KEY: "plugin-bilibili-topToolBar", }, /** * 初始化 */ init(option: ArtPlayerPluginTopToolBarOption) { this.art.layers.add({ name: "top-wrap", html: /*html*/ `
`, mounted: async function ($topWrap) { TopToolBar.$el.$topWrap = $topWrap; TopToolBar.$el.$topTitle = $topWrap.querySelector(".art-player-top-title")!; TopToolBar.$el.$topTitleText = $topWrap.querySelector(".art-player-top-title-text")!; TopToolBar.$el.$topTitleFollow = $topWrap.querySelector(".art-player-top-follow")!; TopToolBar.$el.$topTitleFollowText = $topWrap.querySelector(".art-player-top-follow-text")!; TopToolBar.$el.$topRight = $topWrap.querySelector(".art-player-top-right")!; TopToolBar.$el.$topRightFollow = $topWrap.querySelector(".art-player-top-right-follow")!; // 先隐藏视频标题 TopToolBarUtils.hide(TopToolBar.$el.$topTitleFollow); // 更新总视图 TopToolBar.update(option); // 绑定事件 TopToolBarEvent.bind(); }, }); }, /** * 更新配置 */ update(option: ArtPlayerPluginTopToolBarOption) { if (!this.$data.isInit) { this.$data.isInit = true; Object.defineProperties(this.$data.option, { /** 是否显示容器 @default false */ showWrap: { set(this: ArtPlayerPluginTopToolBarOption, value) { TopToolBar.$data.__option.showWrap = value; // 更新容器状态 if (value) { TopToolBarUtils.show(TopToolBar.$el.$topWrap); } else { TopToolBarUtils.hide(TopToolBar.$el.$topWrap); } }, get(this: ArtPlayerPluginTopToolBarOption) { return TopToolBar.$data.__option.showWrap; }, }, /** 是否显示标题 @default false */ showTitle: { set(this: ArtPlayerPluginTopToolBarOption, value) { TopToolBar.$data.__option.showTitle = value; // 更新标题显示状态 if (value) { TopToolBarUtils.show(TopToolBar.$el.$topTitle); } else { TopToolBarUtils.hide(TopToolBar.$el.$topTitle); } }, get(this: ArtPlayerPluginTopToolBarOption) { return TopToolBar.$data.__option.showTitle; }, }, /** 视频标题文字 */ title: { set(this: ArtPlayerPluginTopToolBarOption, value) { TopToolBar.$data.__option.title = value; // 更新标题显示的文字 if (typeof value === "string") { TopToolBar.$el.$topTitleText.innerText = value; } }, get(this: ArtPlayerPluginTopToolBarOption) { return TopToolBar.$data.__option.title; }, }, /** 是否显示在线观看人数 @default false */ showOnlineTotal: { set(this: ArtPlayerPluginTopToolBarOption, value) { TopToolBar.$data.__option.showOnlineTotal = value; // 更新在线观看人数显示状态 if (value) { TopToolBarUtils.show(TopToolBar.$el.$topTitleFollow); } else { TopToolBarUtils.hide(TopToolBar.$el.$topTitleFollow); } }, get(this: ArtPlayerPluginTopToolBarOption) { return TopToolBar.$data.__option.showOnlineTotal; }, }, /** 在线人数请求参数信息 */ onlineInfoParams: { set(this: ArtPlayerPluginTopToolBarOption, value) { TopToolBar.$data.__option.onlineInfoParams = value; // 更新在线人数参数信息 TopToolBar.updateOnlineTotal({ showOnlineTotal: this.showOnlineTotal, onlineInfoParams: value, }); }, get(this: ArtPlayerPluginTopToolBarOption) { return TopToolBar.$data.__option.onlineInfoParams; }, }, /** 是否显示右侧视图 */ showRight: { set(this: ArtPlayerPluginTopToolBarOption, value) { TopToolBar.$data.__option.showRight = value; // 更新右侧视图显示状态 if (value) { TopToolBarUtils.show(TopToolBar.$el.$topRight); } else { TopToolBarUtils.hide(TopToolBar.$el.$topRight); } }, get(this: ArtPlayerPluginTopToolBarOption) { return TopToolBar.$data.__option.showRight; }, }, /** 是否显示右侧下面的follow */ showRightFollow: { set(this: ArtPlayerPluginTopToolBarOption, value) { TopToolBar.$data.__option.showRightFollow = value; // 更新右侧下面的follow显示状态 if (value) { TopToolBarUtils.show(TopToolBar.$el.$topRightFollow); } else { TopToolBarUtils.hide(TopToolBar.$el.$topRightFollow); } }, get(this: ArtPlayerPluginTopToolBarOption) { return TopToolBar.$data.__option.showRightFollow; }, }, }); } Object.assign(this.$data.option, option); }, /** * 更新在线观看人数 */ async updateOnlineTotal(option: { showOnlineTotal: ArtPlayerPluginTopToolBarOption["showOnlineTotal"]; onlineInfoParams: ArtPlayerPluginTopToolBarOption["onlineInfoParams"]; }) { if (!option.showOnlineTotal) { return; } // 请求在线观看人数 let onlineTotalInfo = await BilibiliVideoApi.onlineTotal({ aid: option.onlineInfoParams.aid, bvid: option.onlineInfoParams.bvid, cid: option.onlineInfoParams.cid, }); if (!onlineTotalInfo) { return; } // 更新在线观看人数 TopToolBar.$el.$topTitleFollowText.innerText = `${ onlineTotalInfo["total"] || onlineTotalInfo["count"] || 0 }人正在看`; // console.log( // TAG + `更新在线观看人数,请求的数据 ==> ${JSON.stringify( // onlineTotalInfo // )}` // ); }, }; export const artplayerPluginTopToolBar = (option: ArtPlayerPluginTopToolBarOption) => { return (art: Artplayer): ArtPlayerPluginTopToolBarResult => { TopToolBar.art = art; TopToolBar.init(option); return { name: TopToolBar.$key.plugin_KEY, update(option: ArtPlayerPluginTopToolBarOption) { TopToolBar.update(option); }, }; }; }; /** * 插件id */ export const ArtPlayer_PLUGIN_TOP_TOOLBAR_KEY = TopToolBar.$key.plugin_KEY;