@vacantthinker/firefox-addon-framework-easy 2026.618.1727 → 2026.619.849

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,8 +6,9 @@
6
6
  * @param filename
7
7
  * @param querySelector - Optional custom selector if you aren't targeting the
8
8
  * first <img>.
9
+ * @param delayMs
9
10
  */
10
- export declare function ctJsDownloadYoutubeImageViaCanvas(filename: string, querySelector?: string): void;
11
+ export declare function ctJsDownloadYoutubeImageViaCanvas(filename: string, querySelector?: string, delayMs?: number): Promise<void>;
11
12
  /**
12
13
  * Delays execution for a random period to emulate human actions and bypass
13
14
  * anti-bot detections.
@@ -1 +1 @@
1
- {"version":3,"file":"ContentJs.d.ts","sourceRoot":"","sources":["../src/ContentJs.ts"],"names":[],"mappings":"AAYA;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,GAAE,MAAc,GAAG,IAAI,CAmCvG;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvE;AAED,wBAAsB,wBAAwB,kBAE7C;AAED,wBAAsB,wBAAwB,kBAE7C;AAED,wBAAsB,wBAAwB,kBAE7C;AAED,wBAAsB,uBAAuB,kBAE5C;AAED,wBAAsB,sBAAsB,kBAE3C;AAED,QAAA,MAAM,YAAY;;;;;;CAMR,CAAC;AAEX,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,OAAO,YAAY,iBAGtE;AAID;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKpE;AAGD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtF;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,iBAE7C;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,iBAEzD;AAED,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,iBAExD;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAKnD;AAQD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAW,EAAE,SAAS,UAAO,QAgB/D;AAED,wBAAsB,YAAY,kBAIjC;AAED,wBAAsB,oBAAoB,kBAIzC;AAED,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,iBAK3D;AAED,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,iBAK5D;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,iBAGtD;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAIxE;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,iBAIrD;AAED,wBAAsB,6BAA6B,CAAC,CAAC,SAAS;IAC5D,GAAG,EAAE,MAAM,CAAA;CACZ,EAAE,OAAO,EAAE,CAAC,iBAEZ"}
1
+ {"version":3,"file":"ContentJs.d.ts","sourceRoot":"","sources":["../src/ContentJs.ts"],"names":[],"mappings":"AAYA;;;;;;;;;GASG;AACH,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,MAAM,EAChB,aAAa,GAAE,MAAc,EAC7B,OAAO,GAAE,MAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAoDf;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvE;AAED,wBAAsB,wBAAwB,kBAE7C;AAED,wBAAsB,wBAAwB,kBAE7C;AAED,wBAAsB,wBAAwB,kBAE7C;AAED,wBAAsB,uBAAuB,kBAE5C;AAED,wBAAsB,sBAAsB,kBAE3C;AAED,QAAA,MAAM,YAAY;;;;;;CAMR,CAAC;AAEX,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,OAAO,YAAY,iBAGtE;AAID;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKpE;AAGD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtF;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,iBAE7C;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,iBAEzD;AAED,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,iBAExD;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAKnD;AAQD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAW,EAAE,SAAS,UAAO,QAgB/D;AAED,wBAAsB,YAAY,kBAIjC;AAED,wBAAsB,oBAAoB,kBAIzC;AAED,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,iBAK3D;AAED,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,iBAK5D;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,iBAGtD;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAIxE;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,iBAIrD;AAED,wBAAsB,6BAA6B,CAAC,CAAC,SAAS;IAC5D,GAAG,EAAE,MAAM,CAAA;CACZ,EAAE,OAAO,EAAE,CAAC,iBAEZ"}
package/dist/ContentJs.js CHANGED
@@ -9,36 +9,50 @@ import { browserRuntimeSendMessage } from "./browserRuntime";
9
9
  * @param filename
10
10
  * @param querySelector - Optional custom selector if you aren't targeting the
11
11
  * first <img>.
12
+ * @param delayMs
12
13
  */
13
- export function ctJsDownloadYoutubeImageViaCanvas(filename, querySelector = 'img') {
14
- const img = document.body.querySelector(querySelector);
15
- if (!img) {
16
- console.warn("downloadYoutubeImageViaCanvas: No image element found on the page.");
17
- return;
18
- }
19
- // Map YouTube naturalWidths to their expected canvas proportions (handling
20
- // black bars)
21
- const sizes = new Map();
22
- sizes.set(1280, { w: 1280, h: 720 });
23
- sizes.set(320, { w: 1280, h: 720 });
24
- sizes.set(640, { w: 1280, h: 900 });
25
- sizes.set(480, { w: 1280, h: 900 });
26
- const { w, h } = sizes.get(img.naturalWidth) || {
27
- w: img.naturalWidth,
28
- h: img.naturalHeight
29
- };
30
- const canvas = document.createElement('canvas');
31
- canvas.width = w;
32
- canvas.height = h;
33
- const ctx = canvas.getContext('2d');
34
- if (!ctx)
35
- return;
36
- ctx.drawImage(img, 0, 0, w, h);
37
- const canvasUrl = canvas.toDataURL('image/jpeg', 1.0);
38
- const eleA = document.createElement('a');
39
- eleA.href = canvasUrl;
40
- eleA.download = filename;
41
- eleA.click();
14
+ export function ctJsDownloadYoutubeImageViaCanvas(filename, querySelector = 'img', delayMs = 300) {
15
+ return new Promise((resolve, reject) => {
16
+ const img = document.body.querySelector(querySelector);
17
+ if (!img) {
18
+ console.warn("No image element found on the page.");
19
+ return resolve();
20
+ }
21
+ const sizes = new Map();
22
+ sizes.set(1280, { w: 1280, h: 720 });
23
+ sizes.set(320, { w: 1280, h: 720 });
24
+ sizes.set(640, { w: 1280, h: 900 });
25
+ sizes.set(480, { w: 1280, h: 900 });
26
+ const { w, h } = sizes.get(img.naturalWidth) || {
27
+ w: img.naturalWidth,
28
+ h: img.naturalHeight
29
+ };
30
+ const canvas = document.createElement('canvas');
31
+ canvas.width = w;
32
+ canvas.height = h;
33
+ const ctx = canvas.getContext('2d');
34
+ if (!ctx)
35
+ return resolve();
36
+ ctx.drawImage(img, 0, 0, w, h);
37
+ // BETTER WAY: Use toBlob instead of toDataURL
38
+ canvas.toBlob((blob) => {
39
+ if (!blob) {
40
+ return reject(new Error("Canvas to Blob conversion failed"));
41
+ }
42
+ // Create a temporary local URL for the binary data
43
+ const blobUrl = URL.createObjectURL(blob);
44
+ const eleA = document.createElement('a');
45
+ eleA.href = blobUrl;
46
+ eleA.download = filename;
47
+ eleA.click();
48
+ // Clean up the memory immediately after the click
49
+ URL.revokeObjectURL(blobUrl);
50
+ // Wait for the browser to register the download before resolving
51
+ setTimeout(() => {
52
+ resolve();
53
+ }, delayMs);
54
+ }, 'image/jpeg', 1.0);
55
+ });
42
56
  }
43
57
  /**
44
58
  * Delays execution for a random period to emulate human actions and bypass
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vacantthinker/firefox-addon-framework-easy",
3
- "version": "2026.0618.1727",
3
+ "version": "2026.0619.0849",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",