From b9dfb5e30d353a3d993b8c2c9a05a1be17ccaf7c Mon Sep 17 00:00:00 2001 From: the1812 Date: Tue, 30 Aug 2022 22:03:30 +0800 Subject: [PATCH] Improve expandDanmakuList - Add option maxDanmakuCount (#2972) - 3.x player support (#3187) --- .../components/video/danmaku/expand/index.ts | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/registry/lib/components/video/danmaku/expand/index.ts b/registry/lib/components/video/danmaku/expand/index.ts index 7d33abea5..0348d83d5 100644 --- a/registry/lib/components/video/danmaku/expand/index.ts +++ b/registry/lib/components/video/danmaku/expand/index.ts @@ -2,13 +2,39 @@ import { ComponentEntry, ComponentMetadata } from '@/components/types' import { videoChange } from '@/core/observer' import { select } from '@/core/spin-query' import { matchUrlPattern } from '@/core/utils' +import { useScopedConsole } from '@/core/utils/log' import { mediaListUrls, videoAndBangumiUrls } from '@/core/utils/urls' +const getDanmakuCount = async () => { + const countElement = await select('.bilibili-player-video-info-danmaku-number, .bpx-player-video-info-dm') + /* + 3.x: 已装填 n 条弹幕 + 2.x: n + */ + const countText = countElement?.textContent ?? '' + const countMatch = countText.match(/\d+/) + if (!countMatch) { + return null + } + const count = parseInt(countMatch[0]) + if (Number.isNaN(count)) { + return null + } + return count +} + const entry: ComponentEntry = async ({ settings: { options } }) => { + const console = useScopedConsole('展开弹幕列表') videoChange(async () => { if (mediaListUrls.some(url => matchUrlPattern(url)) && options.ignoreMediaList) { return } + const danmakuCount = await getDanmakuCount() + console.log(`当前弹幕量: ${danmakuCount}`) + if (danmakuCount !== null && danmakuCount > options.maxDanmakuCount) { + console.log(`超过了最大弹幕数量 ${options.maxDanmakuCount}, 跳过展开`) + return + } const danmakuBox = await select('.bui-collapse-wrap') if (danmakuBox && danmakuBox.classList.contains('bui-collapse-wrap-folded')) { const button = await select('.bui-collapse-header') as HTMLDivElement @@ -23,13 +49,17 @@ export const component: ComponentMetadata = { entry, tags: [componentsTags.video], description: { - 'zh-CN': '每次加载视频时自动展开弹幕列表.', + 'zh-CN': '每次加载视频时自动展开弹幕列表, 如果弹幕装载量超过 `最大弹幕数量`, 则不展开以免对页面造成卡顿.', }, options: { ignoreMediaList: { defaultValue: true, displayName: '合集类页面不自动展开', }, + maxDanmakuCount: { + defaultValue: 500, + displayName: '最大弹幕数量', + }, }, urlInclude: [ ...videoAndBangumiUrls,