Adobe Firefly 直接提供下载按钮, 无水印
// ==UserScript==
// @name Adobe Firefly 下载
// @namespace http://tampermonkey.net/
// @version 1.3
// @description Adobe Firefly 直接提供下载按钮, 无水印
// @license AGPL-3.0-or-later
// @author Y.V
// @match *://firefly.adobe.com/*
// @icon https://firefly.adobe.com/adobe_favicon.ico
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @grant GM_registerMenuCommand
// @grant unsafeWindow
// @require https://code.jquery.com/jquery-3.6.0.min.js
// ==/UserScript==
class AdobeFireflyDownloader {
constructor() {
this.init = false;
this.initCanvas = false;
this.initSpBtn = false;
this.intervalId = null;
}
initialize() {
this.intervalId = setInterval(this.main.bind(this), 1000);
}
createButton(clickHandler) {
const userLanguage = navigator.language;
const buttonEl = $("<button class='test'>");
buttonEl.css({
display: "inline-block",
position: "absolute",
bottom: "10px",
right: "10px",
padding: "10px",
"z-index": "9999",
backgroundColor: "#4A90E2",
color: "#FFF",
border: "none",
borderRadius: "4px",
fontSize: "14px",
fontWeight: "bold",
textTransform: "uppercase",
cursor: "pointer",
outline: "none",
boxShadow: "0px 2px 4px rgba(0, 0, 0, 0.2)",
transition: "background-color 0.3s ease",
});
buttonEl.hover(
() => {
buttonEl.css({
backgroundColor: "#357ACD",
});
},
() => {
buttonEl.css({
backgroundColor: "#4A90E2",
});
}
);
if (userLanguage.startsWith("zh")) {
buttonEl.text("下载图片");
} else {
buttonEl.text("Download");
}
buttonEl.on("click", clickHandler);
return buttonEl;
}
main() {
const textToImages = $(".clio-thumbnail-wrapper img");
const textEffectsCanvas = $("canvas")[0];
const testEl = $(".test")[0];
let generativeFill = $('sp-theme clio-inpaint')[0];
let self = this;
if (textToImages.length === 4) {
if (!this.init) {
textToImages.each(function () {
const buttonEl = self.createButton( () => {
const linkEl = $("<a>");
const timestamp = Date.now();
const fileName = "image" + timestamp + ".jpg";
linkEl.attr("href", $(this).attr("src"));
linkEl.attr("download", fileName);
linkEl.css("display", "none");
$("body").append(linkEl);
linkEl[0].click();
linkEl.remove();
});
$(this).parent().parent().parent().parent().append(buttonEl);
});
this.init = true;
}
}
if (!testEl) {
const buttonEl = this.createButton(() => {
const dataURL = textEffectsCanvas.toDataURL("image/png");
const link = $("<a>").attr({
"href": dataURL,
"download": "image" + Date.now() + ".png",
}).appendTo("body");
link[0].click();
link.remove();
});
if (textEffectsCanvas) {
textEffectsCanvas.parentElement.appendChild(buttonEl.get(0));
}
}
if (generativeFill) {
generativeFill = generativeFill.shadowRoot;
const b = $(generativeFill).find('main clio-md-stage')[0].shadowRoot;
const c = $(b).find('#container clio-md-compositor-canvas')[0].shadowRoot;
const gfCanvas = $(c).find('canvas')[0];
const buttonEl = this.createButton(() => {
const dataURL = gfCanvas.toDataURL("image/png");
const link = $("<a>").attr({
"href": dataURL,
"download": "image" + Date.now() + ".png",
}).appendTo("body");
link[0].click();
link.remove();
});
if (gfCanvas && !$(generativeFill).find('.test')[0]) {
$(generativeFill)[0].appendChild(buttonEl.get(0));
}
}
}
initializeSpBtnListener() {
let self = this;
setInterval(() => {
const sp = $('sp-button');
if (sp) {
if (!this.initSpBtn) {
sp.click(() => {
this.init = false;
$('.test').remove();
});
$(document).keydown(function(event) {
if (event.keyCode === 13) {
self.init = false;
$('.test').remove();
}
});
} else {
this.initSpBtn = true;
}
}
}, 1000);
}
start() {
this.initialize();
this.initializeSpBtnListener();
}
stop() {
clearInterval(this.intervalId);
}
}
const downloader = new AdobeFireflyDownloader();
downloader.start();