Switch to Manifest V2 for Firefox; convert background to non-module, add global aria2 helpers, and use browserAction badges

This commit is contained in:
Jordan Wages 2025-08-22 00:04:58 -05:00
commit 2c34e41815
3 changed files with 69 additions and 12 deletions

View file

@ -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": [
{ {

View file

@ -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
View 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;
})();