Skip to content

Commit 7a4f00e

Browse files
committed
finished frontend and extension page
1 parent 919e45c commit 7a4f00e

File tree

8 files changed

+63
-9
lines changed

8 files changed

+63
-9
lines changed

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@
8282
"*://api.live.bilibili.com/*",
8383
"*://live.bilibili.com/*",
8484
"*://*.bilivideo.com/*",
85-
"*://*.ericlamm.xyz/*"
85+
"*://*.ericlamm.xyz/*",
86+
"*://*.cloudflare.com/*"
8687
],
8788
"permissions": [
8889
"notifications",

src/background/forwards.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as danmaku from './forwards/danmaku'
44
import * as jimaku from './forwards/jimaku'
55
import * as redirect from './forwards/redirect'
66
import * as streamContent from './forwards/stream-content'
7+
import * as jimakuSummarize from './forwards/summerize'
78

89
export type ForwardData = typeof forwards
910

@@ -153,5 +154,6 @@ const forwards = {
153154
'redirect': redirect,
154155
'danmaku': danmaku,
155156
'blive-data': bliveData,
156-
'stream-content': streamContent
157+
'stream-content': streamContent,
158+
'jimaku-summarize': jimakuSummarize
157159
}

src/background/forwards/summerize.ts

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { useDefaultHandler } from "~background/forwards"
2+
3+
export type ForwardBody = string[]
4+
5+
export default useDefaultHandler<ForwardBody>()

src/features/jimaku/components/ButtonArea.tsx

+20-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import type { Jimaku } from "./JimakuLine";
88
import { createPortal } from "react-dom";
99
import ButtonSwitchList from "./ButtonSwitchList";
1010
import TailwindScope from "~components/TailwindScope";
11+
import { toast } from "sonner/dist";
12+
import { sendMessager } from "~utils/messaging";
13+
import { sendForward } from "~background/forwards";
14+
import { sleep } from "~utils/misc";
1115

1216
export type ButtonAreaProps = {
1317
clearJimaku: VoidFunction
@@ -17,7 +21,7 @@ export type ButtonAreaProps = {
1721
function ButtonArea({ clearJimaku, jimakus }: ButtonAreaProps): JSX.Element {
1822

1923
const { settings, info } = useContext(ContentContext)
20-
const { jimakuZone, buttonZone: btnStyle, jimakuPopupWindow } = useContext(JimakuFeatureContext)
24+
const { jimakuZone, buttonZone: btnStyle, jimakuPopupWindow, aiZone } = useContext(JimakuFeatureContext)
2125

2226
const { order } = jimakuZone
2327
const { enabledRecording } = settings["settings.features"]
@@ -36,6 +40,16 @@ function ButtonArea({ clearJimaku, jimakus }: ButtonAreaProps): JSX.Element {
3640

3741
const [show, setShow] = useState(!info.isTheme)
3842

43+
const summerize = async () => {
44+
if (jimakus.length < 10) {
45+
toast.warning('至少需要有10条同传字幕才可总结。')
46+
return
47+
}
48+
await sendMessager('open-tab', { tab: 'summerizer', params: { roomId: info.room } })
49+
await sleep(2000)
50+
sendForward('pages', 'jimaku-summarize', jimakus.map(j => j.text))
51+
}
52+
3953
return (
4054
<Fragment>
4155
{show && (
@@ -59,6 +73,11 @@ function ButtonArea({ clearJimaku, jimakus }: ButtonAreaProps): JSX.Element {
5973
弹出同传视窗
6074
</JimakuButton>
6175
}
76+
{aiZone.enabled && (
77+
<JimakuButton onClick={summerize}>
78+
同传字幕AI总结
79+
</JimakuButton>
80+
)}
6281
</div>
6382
)}
6483
{info.isTheme && document.querySelector(upperHeaderArea) !== null && createPortal(

src/llms/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export type LLMs = typeof llms
2121

2222
export type LLMTypes = keyof LLMs
2323

24-
async function createLLMProvider<K extends LLMTypes, M extends LLMs[K]>(type: K, ...args: ConstructorParameters<M>): Promise<LLMProviders> {
24+
function createLLMProvider<K extends LLMTypes, M extends LLMs[K]>(type: K, ...args: ConstructorParameters<M>): LLMProviders {
2525
const LLM = llms[type].bind(this, ...args)
2626
return new LLM()
2727
}

src/options/features/jimaku/components/AIFragment.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ function AIFragment({ state, useHandler }: StateProxy<AISchema>): JSX.Element {
3838
try {
3939
let provider: LLMProviders;
4040
if (state.provider === 'qwen') {
41-
provider = await createLLMProvider(state.provider, state.accountId, state.apiToken)
41+
provider = createLLMProvider(state.provider, state.accountId, state.apiToken)
4242
} else {
43-
provider = await createLLMProvider(state.provider)
43+
provider = createLLMProvider(state.provider)
4444
}
4545
await provider.validate()
4646
toast.success('配置可用!')
@@ -68,7 +68,7 @@ function AIFragment({ state, useHandler }: StateProxy<AISchema>): JSX.Element {
6868
<Selector<typeof state.provider>
6969
className="col-span-2"
7070
data-testid="ai-provider"
71-
label="AI 提供商"
71+
label="技术来源"
7272
value={state.provider}
7373
onChange={e => state.provider = e}
7474
options={[

src/tabs/summarizer.tsx

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { useEffect, useState } from "react";
2+
import { getForwarder } from "~background/forwards";
3+
import { useForwarder } from "~hooks/forwarder";
4+
import '~style.css'
5+
6+
const urlParams = new URLSearchParams(window.location.search);
7+
const roomId = urlParams.get('roomId')
8+
9+
function App() {
10+
11+
const [danmakus, setDanmakus] = useState<string[]>([])
12+
const forwarder = useForwarder('jimaku-summarize', 'content-script')
13+
14+
useEffect(() => forwarder.addHandler(setDanmakus), []);
15+
16+
// TODO: when no danmakus, show a receving message
17+
// TODO: when danmakus are received, show a summary
18+
19+
return (
20+
<div>
21+
<h1>Summarizer</h1>
22+
</div>
23+
)
24+
}
25+
26+
27+
export default App;

tests/units/llm.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ test('嘗試使用 Cloudflare AI 對話', { tag: "@scoped" }, async () => {
1717
// return await llm.prompt('你好')
1818
// }, { accountId: process.env.CF_ACCOUNT_ID, apiToken: process.env.CF_API_TOKEN })
1919

20-
const llm = await createLLMProvider('qwen', process.env.CF_ACCOUNT_ID, process.env.CF_API_TOKEN)
20+
const llm = createLLMProvider('qwen', process.env.CF_ACCOUNT_ID, process.env.CF_API_TOKEN)
2121
const res = await llm.prompt('你好')
2222

2323
logger.info('response: ', res)
@@ -61,7 +61,7 @@ test('嘗試使用 Remote Worker 對話', { tag: "@scoped" }, async () => {
6161
// return await llm.prompt('你好')
6262
// })
6363

64-
const llm = await createLLMProvider('worker')
64+
const llm = createLLMProvider('worker')
6565
const res = await llm.prompt('你好')
6666

6767
logger.info('response: ', res)

0 commit comments

Comments
 (0)