222 | {/* title */}
223 |
224 |
225 | {segments != null && segments.length > 0 &&
226 |
}
228 |
229 |
237 |
238 | {translateEnable &&
240 |
241 |
}
242 | {summarizeEnable &&
243 |
244 |
245 |
}
246 | {noVideo &&
247 |
248 |
}
249 |
250 |
251 | {/* search */}
252 | {showSearchInput &&
253 |
{
254 | // enter
255 | if (e.key === 'Enter') {
256 | if (!inputting) {
257 | e.preventDefault()
258 | e.stopPropagation()
259 | onAsk()
260 | dispatch(setSearchText(''))
261 | }
262 | }
263 | }} />
264 | {searchText &&
}
265 |
}
266 |
267 | {disconnected &&
}
270 |
271 | {/* auto scroll btn */}
272 | {!autoScroll &&
276 |
277 |
}
278 |
279 | {/* body */}
280 |
286 | {/* asks */}
287 | {asks.map(ask =>
)}
288 |
289 | {/* segments */}
290 | {segments?.map((segment, segmentIdx) =>
)}
292 |
293 | {/* tip */}
294 |
快捷键提示
295 |
296 | - 单击字幕跳转,双击字幕跳转+切换暂停。
297 | - alt+单击字幕复制单条字幕。
298 | - 上下方向键来移动当前字幕(可先点击字幕使焦点在字幕列表内)。
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 | }
307 |
308 | export default Body
309 |
--------------------------------------------------------------------------------
/src/inject/inject.ts:
--------------------------------------------------------------------------------
1 | import { TOTAL_HEIGHT_DEF, HEADER_HEIGHT, TOTAL_HEIGHT_MIN, TOTAL_HEIGHT_MAX, IFRAME_ID, STORAGE_ENV, DEFAULT_USE_PORT } from '@/consts/const'
2 | import { AllExtensionMessages, AllInjectMessages, AllAPPMessages } from '@/message-typings'
3 | import { InjectMessaging } from '../message'
4 |
5 | const debug = (...args: any[]) => {
6 | console.debug('[Inject]', ...args)
7 | }
8 |
9 | (async function () {
10 | // 如果路径不是/video或/list,则不注入
11 | if (!location.pathname.startsWith('/video') && !location.pathname.startsWith('/list')) {
12 | debug('Not inject')
13 | return
14 | }
15 |
16 | // 读取envData
17 | const envDataStr = (await chrome.storage.sync.get(STORAGE_ENV))[STORAGE_ENV]
18 | let sidePanel: boolean | null = null
19 | let manualInsert: boolean | null = null
20 | if (envDataStr) {
21 | try {
22 | const envData = JSON.parse(envDataStr)
23 | debug('envData: ', envData)
24 |
25 | sidePanel = envData.sidePanel
26 | manualInsert = envData.manualInsert
27 | } catch (error) {
28 | console.error('Error parsing envData:', error)
29 | }
30 | }
31 |
32 | const runtime: {
33 | injectMessaging: InjectMessaging