Fix Zotero save completion handling
This commit is contained in:
parent
b4a7555104
commit
f3076c52ce
@ -104,8 +104,7 @@ async def save_to_zotero(url, headless_mode="new"):
|
|||||||
else:
|
else:
|
||||||
assert worker is not None
|
assert worker is not None
|
||||||
print("[*] Triggering save via extension service worker evaluation...")
|
print("[*] Triggering save via extension service worker evaluation...")
|
||||||
# We wrap the call in a try/catch and return a structured object so we can extract the sessionID
|
save_result = await worker.evaluate('''async () => {
|
||||||
session_id = await worker.evaluate('''async () => {
|
|
||||||
try {
|
try {
|
||||||
let tabs = await chrome.tabs.query({ active: true, currentWindow: true });
|
let tabs = await chrome.tabs.query({ active: true, currentWindow: true });
|
||||||
if (!tabs || tabs.length === 0) return {error: "No active tab found."};
|
if (!tabs || tabs.length === 0) return {error: "No active tab found."};
|
||||||
@ -113,11 +112,11 @@ async def save_to_zotero(url, headless_mode="new"):
|
|||||||
let tabInfo = Zotero.Connector_Browser.getTabInfo(tab.id);
|
let tabInfo = Zotero.Connector_Browser.getTabInfo(tab.id);
|
||||||
|
|
||||||
if (tabInfo && tabInfo.translators && tabInfo.translators.length) {
|
if (tabInfo && tabInfo.translators && tabInfo.translators.length) {
|
||||||
await Zotero.Connector_Browser.saveWithTranslator(tab, 0, {fallbackOnFailure: true});
|
let result = await Zotero.Connector_Browser.saveWithTranslator(tab, 0, {fallbackOnFailure: true});
|
||||||
return { sessionID: tabInfo.instanceID }; // usually acts as sessionID
|
return { ok: true, mode: "translator", result };
|
||||||
} else if (tabInfo) {
|
} else if (tabInfo) {
|
||||||
await Zotero.Connector_Browser.saveAsWebpage(tab, tabInfo.frameId, { snapshot: true });
|
let result = await Zotero.Connector_Browser.saveAsWebpage(tab, tabInfo.frameId, { snapshot: true });
|
||||||
return { sessionID: tabInfo.instanceID };
|
return { ok: true, mode: "webpage", result };
|
||||||
} else {
|
} else {
|
||||||
return {error: "No translator or webpage saving options available."};
|
return {error: "No translator or webpage saving options available."};
|
||||||
}
|
}
|
||||||
@ -126,33 +125,14 @@ async def save_to_zotero(url, headless_mode="new"):
|
|||||||
}
|
}
|
||||||
}''')
|
}''')
|
||||||
|
|
||||||
if not session_id or "error" in session_id:
|
if not save_result or "error" in save_result:
|
||||||
print(f"[!] Save trigger failed: {session_id.get('error') if session_id else 'Unknown error'}")
|
print(f"[!] Save trigger failed: {save_result.get('error') if save_result else 'Unknown error'}")
|
||||||
else:
|
else:
|
||||||
sid = session_id.get("sessionID")
|
save_mode = save_result.get("mode", "unknown")
|
||||||
print(f"[*] Save triggered (Session ID: {sid}). Polling for progress...")
|
returned = save_result.get("result")
|
||||||
|
print(f"[*] Save completed successfully via {save_mode}.")
|
||||||
# Poll for completion
|
if returned is not None:
|
||||||
max_polls = 60
|
print(f"[*] Save returned: {returned}")
|
||||||
for _ in range(max_polls):
|
|
||||||
await asyncio.sleep(1)
|
|
||||||
progress = await worker.evaluate('''async (sid) => {
|
|
||||||
try {
|
|
||||||
if (!Zotero.Connector) return {done: false, error: "Zotero.Connector uninitialized"};
|
|
||||||
let res = await Zotero.Connector.callMethod("sessionProgress", { sessionID: sid });
|
|
||||||
return res || {done: false};
|
|
||||||
} catch(e) {
|
|
||||||
return {done: true, error: e.message}; // typically throws when it's totally done/cleaned up
|
|
||||||
}
|
|
||||||
}''', sid)
|
|
||||||
|
|
||||||
if progress and progress.get("error"):
|
|
||||||
# Normally, when the progress tracker cleans up, callMethod("sessionProgress") throws
|
|
||||||
print(f"[*] Save completed or session ended. Error: {progress.get('error')}")
|
|
||||||
break
|
|
||||||
if progress and progress.get("done"):
|
|
||||||
print("[*] Translation and save processes finished successfully.")
|
|
||||||
break
|
|
||||||
|
|
||||||
print("[*] Operation finished. Closing browser.")
|
print("[*] Operation finished. Closing browser.")
|
||||||
await browser_context.close()
|
await browser_context.close()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user