background.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. const SCROBBLE_ENDPOINT = "https://life.lab.unbl.ink/?scrobble_url=";
  2. const STOP_ENDPOINT = "https://life.lab.unbl.ink/?action=stop&scrobble_url=";
  3. // Default settings
  4. // *.google.com
  5. // *.annas-archive.org
  6. // *.limetorrents.fun
  7. // gmail.com
  8. // *.duckduckgo.com
  9. // *.ebay.com
  10. // *.amazon.com
  11. // *.boardgamegeek.com
  12. // *.chatgpt.com
  13. const DEFAULT_SETTINGS = {
  14. delay: 7,
  15. blacklist: ["*.unbl.ink", "moz-extension://"],
  16. paused: false,
  17. };
  18. // Utility: wildcard match
  19. function matchPattern(url, pattern) {
  20. if (pattern.startsWith("*.")) {
  21. const domain = pattern.slice(2);
  22. return url.includes(domain);
  23. }
  24. return url.startsWith(pattern);
  25. }
  26. function isBlacklisted(url, blacklist) {
  27. return blacklist.some((p) => matchPattern(url, p));
  28. }
  29. let activeTabs = new Map();
  30. // Load settings
  31. async function getSettings() {
  32. return new Promise((resolve) => {
  33. browser.storage.local.get(DEFAULT_SETTINGS, (items) => resolve(items));
  34. });
  35. }
  36. // Save pause state
  37. async function setPaused(paused) {
  38. await browser.storage.local.set({ paused });
  39. updateIcon(paused ? "pause" : "wait");
  40. }
  41. function updateIcon(state) {
  42. const icons = {
  43. wait: "icons/wait.png",
  44. scrobbled: "icons/check.png",
  45. stopped: "icons/stop.png",
  46. pause: "icons/pause.png",
  47. };
  48. browser.browserAction.setIcon({ path: icons[state] });
  49. }
  50. // Handle tab updates
  51. browser.tabs.onUpdated.addListener(async (tabId, changeInfo, tab) => {
  52. if (changeInfo.status !== "complete" || !tab.url) return;
  53. const settings = await getSettings();
  54. const { delay, blacklist, paused } = settings;
  55. if (paused || isBlacklisted(tab.url, blacklist)) return;
  56. if (tab.url.startsWith("moz-extension://")) return;
  57. const url = encodeURIComponent(tab.url);
  58. updateIcon("wait");
  59. if (activeTabs.has(tabId)) clearTimeout(activeTabs.get(tabId));
  60. const timeout = setTimeout(() => {
  61. fetch(`${SCROBBLE_ENDPOINT}${url}`).then(() => updateIcon("scrobbled"));
  62. }, delay * 1000);
  63. activeTabs.set(tabId, timeout);
  64. });
  65. // Stop scrobble when navigating away or closing
  66. function stopScrobble(tabId, url) {
  67. getSettings().then(({ blacklist }) => {
  68. if (!url || isBlacklisted(url, blacklist)) return;
  69. if (url.startsWith("moz-extension://")) return;
  70. fetch(`${STOP_ENDPOINT}${encodeURIComponent(url)}`).then(() =>
  71. updateIcon("stopped"),
  72. );
  73. });
  74. }
  75. browser.tabs.onRemoved.addListener((tabId) => {
  76. if (activeTabs.has(tabId)) clearTimeout(activeTabs.get(tabId));
  77. });
  78. //browser.webNavigation.onBeforeNavigate.addListener((details) => {
  79. // stopScrobble(details.tabId, details.url);
  80. //});
  81. // Toggle pause on icon click
  82. browser.browserAction.onClicked.addListener(async () => {
  83. const { paused } = await getSettings();
  84. setPaused(!paused);
  85. });