From 394d1a3cdad0cc5d4fff7009ce286f2bd2d90a02 Mon Sep 17 00:00:00 2001 From: truewhile <62226914+truewhile@users.noreply.github.com> Date: Sun, 6 Sep 2026 20:32:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(danmaku):=20=E6=94=AF=E6=8C=81=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E5=A1=AB=E5=85=A5=E5=BD=93=E5=89=8D=E7=89=87=E5=90=8D?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E9=87=8D=E6=96=B0=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/components/DanmakuStage.tsx | 7 +++++-- web/src/components/PlayerDanmakuPanel.tsx | 21 ++++++++++++++++++--- web/src/pages/PlayerPage.tsx | 12 ++++++++++++ web/src/pages/PlayerVideoStage.tsx | 3 +++ 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/web/src/components/DanmakuStage.tsx b/web/src/components/DanmakuStage.tsx index 71d6048..23ec15a 100644 --- a/web/src/components/DanmakuStage.tsx +++ b/web/src/components/DanmakuStage.tsx @@ -28,6 +28,8 @@ type DanmakuStageProps = { search?: string | null /** Explicit danmaku library chosen by the user; null = auto-resolve. */ episodeId?: number | string | null + /** Counter or token changed to trigger refetch even when search stays identical. */ + searchTrigger?: number /** Called after each fetch attempt (success or error) finishes with metadata. */ onLoaded?: (info: DanmakuLoadedInfo | null) => void /** Called when multiple anime matched and the user must pick one. */ @@ -50,6 +52,7 @@ export function DanmakuStage({ area = 1, search = null, episodeId = null, + searchTrigger = 0, onLoaded, onCandidates, }: DanmakuStageProps) { @@ -252,8 +255,8 @@ export function DanmakuStage({ manager.unmount() managerRef.current = null } - // search / episodeId 变化时重新拉取弹幕(含媒体/开关切换)。 - }, [media, videoRef, enabled, search, episodeId, onLoaded, onCandidates]) + // search / episodeId / searchTrigger 变化时重新拉取弹幕(含媒体/开关切换)。 + }, [media, videoRef, enabled, search, episodeId, searchTrigger, onLoaded, onCandidates]) // Live renderer knobs: opacity / area / font size without recreating the // engine. font size additionally rescales currently visible comments. diff --git a/web/src/components/PlayerDanmakuPanel.tsx b/web/src/components/PlayerDanmakuPanel.tsx index c4a00e0..0d6eec0 100644 --- a/web/src/components/PlayerDanmakuPanel.tsx +++ b/web/src/components/PlayerDanmakuPanel.tsx @@ -25,6 +25,8 @@ type PlayerDanmakuPanelProps = { candidates: DanmakuAnime[] /** Human-readable label of the currently selected library. */ selectedSource?: string + /** Title used by auto-matching (e.g. anime title, media title or filename). */ + autoMatchTitle?: string /** Loaded danmaku metadata (title, episode, count, match mode). */ danmakuInfo?: DanmakuLoadedInfo | null onSelectEpisode: (episodeId: number, animeTitle: string, episodeTitle: string) => void @@ -47,6 +49,7 @@ export function PlayerDanmakuPanel({ onFontSizeChange, candidates, selectedSource, + autoMatchTitle, danmakuInfo, onSelectEpisode, onResetAuto, @@ -203,7 +206,19 @@ export function PlayerDanmakuPanel({ {/* 搜索弹幕 */}