Switch to Manifest V2 for Firefox; convert background to non-module, add global aria2 helpers, and use browserAction badges
This commit is contained in:
parent
3fdd76d631
commit
2c34e41815
3 changed files with 69 additions and 12 deletions
|
|
@ -1,9 +1,9 @@
|
||||||
{
|
{
|
||||||
"manifest_version": 3,
|
"manifest_version": 2,
|
||||||
"name": "Archive.org Link Grabber",
|
"name": "Archive.org Link Grabber",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"description": "Filter and export archive.org /download links; copy or send to aria2 RPC.",
|
"description": "Filter and export archive.org /download links; copy or send to aria2 RPC.",
|
||||||
"action": {
|
"browser_action": {
|
||||||
"default_title": "Archive.org Link Grabber",
|
"default_title": "Archive.org Link Grabber",
|
||||||
"default_popup": "src/popup/index.html"
|
"default_popup": "src/popup/index.html"
|
||||||
},
|
},
|
||||||
|
|
@ -15,16 +15,16 @@
|
||||||
"storage",
|
"storage",
|
||||||
"clipboardWrite",
|
"clipboardWrite",
|
||||||
"activeTab",
|
"activeTab",
|
||||||
"contextMenus"
|
"contextMenus",
|
||||||
],
|
|
||||||
"host_permissions": [
|
|
||||||
"https://archive.org/*",
|
"https://archive.org/*",
|
||||||
"http://localhost:6800/*",
|
"http://localhost:6800/*",
|
||||||
"https://localhost:6800/*"
|
"https://localhost:6800/*"
|
||||||
],
|
],
|
||||||
"background": {
|
"background": {
|
||||||
"service_worker": "src/background/index.js",
|
"scripts": [
|
||||||
"type": "module"
|
"src/lib/aria2-bg.js",
|
||||||
|
"src/background/index.js"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"content_scripts": [
|
"content_scripts": [
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { addUrisBatch } from "../lib/aria2.js";
|
// In MV2 background, aria2 helpers are exposed on globalThis by src/lib/aria2-bg.js
|
||||||
|
|
||||||
browser.runtime.onMessage.addListener(async (msg, sender) => {
|
browser.runtime.onMessage.addListener(async (msg, sender) => {
|
||||||
if (!msg || !msg.type) return;
|
if (!msg || !msg.type) return;
|
||||||
|
|
@ -9,7 +9,7 @@ browser.runtime.onMessage.addListener(async (msg, sender) => {
|
||||||
return { ok: false, error: 'Missing endpoint or URIs' };
|
return { ok: false, error: 'Missing endpoint or URIs' };
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const res = await addUrisBatch({ endpoint, secret, uris, options });
|
const res = await globalThis.addUrisBatch({ endpoint, secret, uris, options });
|
||||||
return { ok: true, result: res };
|
return { ok: true, result: res };
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
return { ok: false, error: String(err && err.message || err) };
|
return { ok: false, error: String(err && err.message || err) };
|
||||||
|
|
@ -40,9 +40,8 @@ browser.contextMenus.onClicked.addListener(async (info, tab) => {
|
||||||
lastCollected: { tabId: tab.id, url: tab.url, time: Date.now(), count },
|
lastCollected: { tabId: tab.id, url: tab.url, time: Date.now(), count },
|
||||||
lastItems: items
|
lastItems: items
|
||||||
});
|
});
|
||||||
try { await browser.action.setBadgeBackgroundColor({ color: '#3b82f6', tabId: tab.id }); } catch (e) {}
|
try { await browser.browserAction.setBadgeBackgroundColor({ color: '#3b82f6' }); } catch (e) {}
|
||||||
try { await browser.action.setBadgeText({ text: count ? String(count) : '', tabId: tab.id }); } catch (e) {}
|
try { await browser.browserAction.setBadgeText({ text: count ? String(count) : '' }); } catch (e) {}
|
||||||
try { if (browser.action.openPopup) await browser.action.openPopup(); } catch (e) {}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// Swallow errors; context menu is best-effort
|
// Swallow errors; context menu is best-effort
|
||||||
}
|
}
|
||||||
|
|
|
||||||
58
src/lib/aria2-bg.js
Normal file
58
src/lib/aria2-bg.js
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
// Background-friendly (non-module) aria2 helpers
|
||||||
|
// Exposes addUri, addUrisBatch, and getVersion on globalThis
|
||||||
|
|
||||||
|
(function(){
|
||||||
|
function rpcCall(endpoint, body) {
|
||||||
|
return fetch(endpoint, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify(body)
|
||||||
|
}).then(async (res) => {
|
||||||
|
if (!res.ok) {
|
||||||
|
const text = await res.text().catch(() => String(res.status));
|
||||||
|
throw new Error(`aria2 RPC error ${res.status}: ${text}`);
|
||||||
|
}
|
||||||
|
return res.json();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function addUri({ endpoint, secret, uri, options = {} }) {
|
||||||
|
const body = {
|
||||||
|
jsonrpc: "2.0",
|
||||||
|
id: "archive-org-link-grabber:" + Date.now(),
|
||||||
|
method: "aria2.addUri",
|
||||||
|
params: [
|
||||||
|
secret ? `token:${secret}` : undefined,
|
||||||
|
[uri],
|
||||||
|
options
|
||||||
|
].filter(v => v !== undefined)
|
||||||
|
};
|
||||||
|
return rpcCall(endpoint, body);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function addUrisBatch({ endpoint, secret, uris, options = {} }) {
|
||||||
|
const results = [];
|
||||||
|
for (const uri of uris) {
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
const r = await addUri({ endpoint, secret, uri, options });
|
||||||
|
results.push(r);
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getVersion({ endpoint, secret }) {
|
||||||
|
const body = {
|
||||||
|
jsonrpc: "2.0",
|
||||||
|
id: "archive-org-link-grabber:getVersion:" + Date.now(),
|
||||||
|
method: "aria2.getVersion",
|
||||||
|
params: [secret ? `token:${secret}` : undefined].filter(Boolean)
|
||||||
|
};
|
||||||
|
return rpcCall(endpoint, body);
|
||||||
|
}
|
||||||
|
|
||||||
|
// expose
|
||||||
|
globalThis.addUrisBatch = addUrisBatch;
|
||||||
|
globalThis.addUri = addUri;
|
||||||
|
globalThis.getVersion = getVersion;
|
||||||
|
})();
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue