mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-06-09 15:13:32 -07:00
fix(overlay): Linux X11/XWayland stacking, stale pause state, multi-copy selector (#101)
This commit is contained in:
@@ -1,5 +1,10 @@
|
||||
import type { SubtitleData } from '../../types';
|
||||
|
||||
type CurrentSubtitleMpvClient = {
|
||||
connected?: boolean;
|
||||
requestProperty: (name: string) => Promise<unknown>;
|
||||
};
|
||||
|
||||
export async function resolveCurrentSubtitleForRenderer(deps: {
|
||||
currentSubText: string;
|
||||
currentSubtitleData: SubtitleData | null;
|
||||
@@ -27,3 +32,81 @@ export async function resolveCurrentSubtitleForRenderer(deps: {
|
||||
tokens: null,
|
||||
});
|
||||
}
|
||||
|
||||
export async function primeVisibleOverlaySubtitleFromMpv(deps: {
|
||||
getMpvClient: () => CurrentSubtitleMpvClient | null;
|
||||
setCurrentSubText: (text: string) => void;
|
||||
getCurrentSubtitleData: () => SubtitleData | null;
|
||||
consumeCachedSubtitle: (text: string) => SubtitleData | null;
|
||||
onSubtitleChange: (text: string) => void;
|
||||
refreshCurrentSubtitle: (text: string) => void;
|
||||
emitSubtitle: (payload: SubtitleData) => void;
|
||||
setCurrentSecondarySubText?: (text: string) => void;
|
||||
emitSecondarySubtitle?: (text: string) => void;
|
||||
logDebug?: (message: string) => void;
|
||||
}): Promise<void> {
|
||||
const client = deps.getMpvClient();
|
||||
if (!client?.connected) {
|
||||
return;
|
||||
}
|
||||
|
||||
let subTextRaw: unknown;
|
||||
try {
|
||||
subTextRaw = await client.requestProperty('sub-text');
|
||||
} catch (error) {
|
||||
deps.logDebug?.(
|
||||
`[visible-overlay-subtitle-prime] failed to read sub-text: ${
|
||||
error instanceof Error ? error.message : String(error)
|
||||
}`,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const text = typeof subTextRaw === 'string' ? subTextRaw : '';
|
||||
deps.setCurrentSubText(text);
|
||||
|
||||
const primeSecondarySubtitle = async (): Promise<void> => {
|
||||
if (!deps.setCurrentSecondarySubText && !deps.emitSecondarySubtitle) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const secondarySubTextRaw = await client.requestProperty('secondary-sub-text');
|
||||
const secondaryText = typeof secondarySubTextRaw === 'string' ? secondarySubTextRaw : '';
|
||||
deps.setCurrentSecondarySubText?.(secondaryText);
|
||||
deps.emitSecondarySubtitle?.(secondaryText);
|
||||
} catch (error) {
|
||||
deps.logDebug?.(
|
||||
`[visible-overlay-subtitle-prime] failed to read secondary-sub-text: ${
|
||||
error instanceof Error ? error.message : String(error)
|
||||
}`,
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
if (!text.trim()) {
|
||||
deps.onSubtitleChange(text);
|
||||
deps.emitSubtitle({ text, tokens: null });
|
||||
await primeSecondarySubtitle();
|
||||
return;
|
||||
}
|
||||
|
||||
const currentPayload = deps.getCurrentSubtitleData();
|
||||
if (currentPayload?.text === text) {
|
||||
deps.emitSubtitle(currentPayload);
|
||||
deps.refreshCurrentSubtitle(text);
|
||||
await primeSecondarySubtitle();
|
||||
return;
|
||||
}
|
||||
|
||||
const cachedPayload = deps.consumeCachedSubtitle(text);
|
||||
if (cachedPayload) {
|
||||
deps.onSubtitleChange(text);
|
||||
deps.emitSubtitle(cachedPayload);
|
||||
await primeSecondarySubtitle();
|
||||
return;
|
||||
}
|
||||
|
||||
deps.refreshCurrentSubtitle(text);
|
||||
await primeSecondarySubtitle();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user