@@ -35,10 +35,30 @@ let lastStatusSentAt = 0
|
||||
let connectionKey = ''
|
||||
let eventaContext: ReturnType<typeof createRuntimeEventaContext>['context'] | undefined
|
||||
|
||||
function buildNotifyKey(payload: { title?: string, url: string, videoId?: string }) {
|
||||
async function refreshClient() {
|
||||
const nextKey = `${settings.enabled}:${settings.wsUrl}:${settings.token}`
|
||||
if (nextKey !== connectionKey) {
|
||||
connectionKey = nextKey
|
||||
if (state.client)
|
||||
state.client.close()
|
||||
state.client = null
|
||||
state.connected = false
|
||||
}
|
||||
await ensureClient(state, settings)
|
||||
}
|
||||
|
||||
function buildNotifyKey(payload: { url: string, title?: string, videoId?: string }) {
|
||||
return [payload.videoId, payload.title, payload.url].filter(Boolean).join('|')
|
||||
}
|
||||
|
||||
function shouldNotifyVideo(payload: { url: string, title?: string, videoId?: string }) {
|
||||
const key = buildNotifyKey(payload)
|
||||
if (!key || key === lastVideoNotifyKey)
|
||||
return false
|
||||
lastVideoNotifyKey = key
|
||||
return true
|
||||
}
|
||||
|
||||
function emitStatus() {
|
||||
const now = Date.now()
|
||||
if (now - lastStatusSentAt < 300)
|
||||
@@ -48,6 +68,18 @@ function emitStatus() {
|
||||
eventaContext?.emit(backgroundStatusChanged, toStatus(state, settings))
|
||||
}
|
||||
|
||||
async function updateSettings(partial: Partial<ExtensionSettings>) {
|
||||
settings = await saveSettings(partial)
|
||||
await refreshClient()
|
||||
emitStatus()
|
||||
}
|
||||
|
||||
async function init() {
|
||||
settings = await loadSettings()
|
||||
await refreshClient()
|
||||
emitStatus()
|
||||
}
|
||||
|
||||
function handleContentMessage(message: ContentToBackgroundMessage) {
|
||||
switch (message.type) {
|
||||
case 'content:page': {
|
||||
@@ -59,15 +91,6 @@ function handleContentMessage(message: ContentToBackgroundMessage) {
|
||||
emitStatus()
|
||||
break
|
||||
}
|
||||
case 'content:subtitle': {
|
||||
const payload = {
|
||||
...message.payload,
|
||||
site: message.payload.site === 'unknown' ? detectSiteFromUrl(message.payload.url) : message.payload.site,
|
||||
}
|
||||
handleSubtitle(state, settings, payload)
|
||||
emitStatus()
|
||||
break
|
||||
}
|
||||
case 'content:video': {
|
||||
const payload = {
|
||||
...message.payload,
|
||||
@@ -77,6 +100,15 @@ function handleContentMessage(message: ContentToBackgroundMessage) {
|
||||
emitStatus()
|
||||
break
|
||||
}
|
||||
case 'content:subtitle': {
|
||||
const payload = {
|
||||
...message.payload,
|
||||
site: message.payload.site === 'unknown' ? detectSiteFromUrl(message.payload.url) : message.payload.site,
|
||||
}
|
||||
handleSubtitle(state, settings, payload)
|
||||
emitStatus()
|
||||
break
|
||||
}
|
||||
case 'content:vision:frame': {
|
||||
state.lastVisionFrameAt = Date.now()
|
||||
emitStatus()
|
||||
@@ -85,38 +117,6 @@ function handleContentMessage(message: ContentToBackgroundMessage) {
|
||||
}
|
||||
}
|
||||
|
||||
async function init() {
|
||||
settings = await loadSettings()
|
||||
await refreshClient()
|
||||
emitStatus()
|
||||
}
|
||||
|
||||
async function refreshClient() {
|
||||
const nextKey = `${settings.enabled}:${settings.wsUrl}:${settings.token}`
|
||||
if (nextKey !== connectionKey) {
|
||||
connectionKey = nextKey
|
||||
if (state.client)
|
||||
state.client.close()
|
||||
state.client = null
|
||||
state.connected = false
|
||||
}
|
||||
await ensureClient(state, settings)
|
||||
}
|
||||
|
||||
function shouldNotifyVideo(payload: { title?: string, url: string, videoId?: string }) {
|
||||
const key = buildNotifyKey(payload)
|
||||
if (!key || key === lastVideoNotifyKey)
|
||||
return false
|
||||
lastVideoNotifyKey = key
|
||||
return true
|
||||
}
|
||||
|
||||
async function updateSettings(partial: Partial<ExtensionSettings>) {
|
||||
settings = await saveSettings(partial)
|
||||
await refreshClient()
|
||||
emitStatus()
|
||||
}
|
||||
|
||||
export default defineBackground(() => {
|
||||
const { context } = createRuntimeEventaContext()
|
||||
eventaContext = context
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { startContentObserver } from '../src/content'
|
||||
|
||||
export default defineContentScript({
|
||||
main() {
|
||||
startContentObserver()
|
||||
},
|
||||
matches: [
|
||||
'*://*/*',
|
||||
],
|
||||
runAt: 'document_idle',
|
||||
main() {
|
||||
startContentObserver()
|
||||
},
|
||||
})
|
||||
|
||||
@@ -13,14 +13,14 @@ export const usePopupStore = createGlobalState(() => {
|
||||
const initialized = ref(false)
|
||||
|
||||
const form = reactive<ExtensionSettings>({
|
||||
enabled: true,
|
||||
enableVision: false,
|
||||
sendPageContext: true,
|
||||
sendSparkNotify: true,
|
||||
sendSubtitles: true,
|
||||
sendVideoContext: true,
|
||||
token: '',
|
||||
wsUrl: '',
|
||||
token: '',
|
||||
enabled: true,
|
||||
sendPageContext: true,
|
||||
sendVideoContext: true,
|
||||
sendSubtitles: true,
|
||||
sendSparkNotify: true,
|
||||
enableVision: false,
|
||||
})
|
||||
|
||||
const connected = computed(() => status.value?.connected ?? false)
|
||||
@@ -111,18 +111,18 @@ export const usePopupStore = createGlobalState(() => {
|
||||
}
|
||||
|
||||
return {
|
||||
applySettings,
|
||||
captureFrame,
|
||||
clearLastError,
|
||||
connected,
|
||||
form,
|
||||
init,
|
||||
lastError,
|
||||
lastSubtitle,
|
||||
lastVideo,
|
||||
refresh,
|
||||
status,
|
||||
syncing,
|
||||
form,
|
||||
connected,
|
||||
lastVideo,
|
||||
lastSubtitle,
|
||||
lastError,
|
||||
init,
|
||||
refresh,
|
||||
applySettings,
|
||||
toggle,
|
||||
captureFrame,
|
||||
clearLastError,
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user