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",
 | 
			
		||||
  "version": "0.1.0",
 | 
			
		||||
  "description": "Filter and export archive.org /download links; copy or send to aria2 RPC.",
 | 
			
		||||
  "action": {
 | 
			
		||||
  "browser_action": {
 | 
			
		||||
    "default_title": "Archive.org Link Grabber",
 | 
			
		||||
    "default_popup": "src/popup/index.html"
 | 
			
		||||
  },
 | 
			
		||||
| 
						 | 
				
			
			@ -15,16 +15,16 @@
 | 
			
		|||
    "storage",
 | 
			
		||||
    "clipboardWrite",
 | 
			
		||||
    "activeTab",
 | 
			
		||||
    "contextMenus"
 | 
			
		||||
  ],
 | 
			
		||||
  "host_permissions": [
 | 
			
		||||
    "contextMenus",
 | 
			
		||||
    "https://archive.org/*",
 | 
			
		||||
    "http://localhost:6800/*",
 | 
			
		||||
    "https://localhost:6800/*"
 | 
			
		||||
  ],
 | 
			
		||||
  "background": {
 | 
			
		||||
    "service_worker": "src/background/index.js",
 | 
			
		||||
    "type": "module"
 | 
			
		||||
    "scripts": [
 | 
			
		||||
      "src/lib/aria2-bg.js",
 | 
			
		||||
      "src/background/index.js"
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  "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) => {
 | 
			
		||||
  if (!msg || !msg.type) return;
 | 
			
		||||
| 
						 | 
				
			
			@ -9,7 +9,7 @@ browser.runtime.onMessage.addListener(async (msg, sender) => {
 | 
			
		|||
      return { ok: false, error: 'Missing endpoint or URIs' };
 | 
			
		||||
    }
 | 
			
		||||
    try {
 | 
			
		||||
      const res = await addUrisBatch({ endpoint, secret, uris, options });
 | 
			
		||||
      const res = await globalThis.addUrisBatch({ endpoint, secret, uris, options });
 | 
			
		||||
      return { ok: true, result: res };
 | 
			
		||||
    } catch (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 },
 | 
			
		||||
      lastItems: items
 | 
			
		||||
    });
 | 
			
		||||
    try { await browser.action.setBadgeBackgroundColor({ color: '#3b82f6', tabId: tab.id }); } catch (e) {}
 | 
			
		||||
    try { await browser.action.setBadgeText({ text: count ? String(count) : '', tabId: tab.id }); } catch (e) {}
 | 
			
		||||
    try { if (browser.action.openPopup) await browser.action.openPopup(); } catch (e) {}
 | 
			
		||||
    try { await browser.browserAction.setBadgeBackgroundColor({ color: '#3b82f6' }); } catch (e) {}
 | 
			
		||||
    try { await browser.browserAction.setBadgeText({ text: count ? String(count) : '' }); } catch (e) {}
 | 
			
		||||
  } catch (e) {
 | 
			
		||||
    // 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