// ==UserScript==
// @name Save Pixiv images to Eagle
// @name:zh 批量导入 Pixiv 图片到 Eagle
// @name:zh-CN 批量导入 Pixiv 图片到 Eagle
// @name:zh-TW 批次導入 Pixiv 圖片到 Eagle
// @description Launch a script on Pixiv that automatically converts all images on the page into large images (with links, names) to be added to the Eagle App.
// @description:zh 请确保你的网路环境可以正常访问 Pixiv,如果设备网路无法访问,此脚本将无法正常运作。在 Pixiv 页面启动脚本,此脚本会自动将页面中所有图片转换成大图(包含链接、名称),添加至 Eagle App。
// @description:zh-CN 请确保你的网路环境可以正常访问 Pixiv,如果设备网路无法访问,此脚本将无法正常运作。在 Pixiv 页面启动脚本,此脚本会自动将页面中所有图片转换成大图(包含链接、名称),添加至 Eagle App。
// @description:zh-TW 在 Pixiv 畫版頁面啓動腳本,此腳本會自動將頁面中所有圖片轉換成大圖(包含鏈接、名稱),添加至 Eagle App。
// @author pickuse2013
// @namespace https://pickuse2013.github.io/
// @homepageURL https://github.com/pickuse2013/pixiv-to-eagle
// @supportURL https://github.com/pickuse2013/pixiv-to-eagle
// @icon https://www.pixiv.net/favicon.ico
// @license MIT License
// @match https://www.pixiv.net/*
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// @run-at context-menu
// @connect localhost
// @connect www.pixiv.net
// @connect i.pximg.net
// @require https://code.jquery.com/jquery-3.5.1.min.js
// @date 08/28/2020
// @modified 02/08/2022
// @version 0.0.3
// @downloadURL https://update.greasyfork.icu/scripts/410209/Save%20Pixiv%20images%20to%20Eagle.user.js
// @updateURL https://update.greasyfork.icu/scripts/410209/Save%20Pixiv%20images%20to%20Eagle.meta.js
// ==/UserScript==
'use strict';
(function () {
// waitForKeyElements.js
function waitForKeyElements(
selectorTxt,
actionFunction,
bWaitOnce,
iframeSelector
) {
var targetNodes, btargetsFound;
if (typeof iframeSelector == "undefined")
targetNodes = $(selectorTxt);
else
targetNodes = $(iframeSelector).contents()
.find(selectorTxt);
if (targetNodes && targetNodes.length > 0) {
btargetsFound = true;
targetNodes.each(function () {
var jThis = $(this);
var alreadyFound = jThis.data('alreadyFound') || false;
if (!alreadyFound) {
//--- Call the payload function.
var cancelFound = actionFunction(jThis);
if (cancelFound)
btargetsFound = false;
else
jThis.data('alreadyFound', true);
}
});
} else {
btargetsFound = false;
}
var controlObj = waitForKeyElements.controlObj || {};
var controlKey = selectorTxt.replace(/[^\w]/g, "_");
var timeControl = controlObj[controlKey];
if (btargetsFound && bWaitOnce && timeControl) {
clearInterval(timeControl);
delete controlObj[controlKey]
} else {
if (!timeControl) {
timeControl = setInterval(function () {
waitForKeyElements(selectorTxt,
actionFunction,
bWaitOnce,
iframeSelector
);
},
300
);
controlObj[controlKey] = timeControl;
}
}
waitForKeyElements.controlObj = controlObj;
}
$("body").append(`
prepare to start ...
`);
if (location.href.indexOf("pixiv.") === -1) {
alert("This script only works on pixiv.net.");
return;
}
// Eagle API 服务器位置
const EAGLE_SERVER_URL = "http://localhost:41595";
const EAGLE_IMPORT_API_URL = `${EAGLE_SERVER_URL}/api/item/addFromURL`;
const EAGLE_CREATE_FOLDER_API_URL = `${EAGLE_SERVER_URL}/api/folder/create`;
// Pixiv 当前图片、链接命名规则
const SELECTOR_IMAGE = "section ul li a img[class]";
const SELECTOR_DIALOG = "div#save-to-eagle-dialog"
// 是否要使用Pixiv的tags
const SUPPORT_TAGS = false;
let DOWNLOAD_COUNTER = 0;
let TOTAL_COUNTER = 0;
let FINISH = false;
// 创建文件夹
var createFolder = function (folderName, callback) {
GM_xmlhttpRequest({
url: EAGLE_CREATE_FOLDER_API_URL,
method: "POST",
data: JSON.stringify({
folderName: folderName
}),
onload: function (response) {
try {
var result = JSON.parse(response.response);
if (result.status === "success" && result.data && result.data.id) {
callback(undefined, result.data);
} else {
callback(true);
}
} catch (err) {
callback(true);
}
}
});
};
// 将图片添加至 Eagle
function addImageToEagle(data) {
GM_xmlhttpRequest({
url: EAGLE_IMPORT_API_URL,
method: "POST",
data: JSON.stringify(data),
onload: function (response) {}
});
}
function updateDialog() {
$(SELECTOR_DIALOG).html(`Downloading...
${DOWNLOAD_COUNTER} download.`);
//$(SELECTOR_DIALOG).html(`Downloading...
${DOWNLOAD_COUNTER}/${TOTAL_COUNTER}`);
if (FINISH == true) {
$(SELECTOR_DIALOG).html(`Download
Complate!`);
setTimeout(function () {
$(SELECTOR_DIALOG).remove();
}, 1000);
}
}
function getImages(folder) {
DOWNLOAD_COUNTER = 0;
TOTAL_COUNTER = 0;
$(SELECTOR_IMAGE).each(function (i, e) {
let index = i;
let IMAGE_LINK_URL = $(e).closest('a')[0].href;
let IMAGE_AMOUNT = $(e).closest("a").find("div:first span").text();
if (IMAGE_AMOUNT == "") {
IMAGE_AMOUNT = 1;
} else {
IMAGE_AMOUNT = IMAGE_AMOUNT * 1;
}
TOTAL_COUNTER += IMAGE_AMOUNT;
updateDialog();
$.get(IMAGE_LINK_URL, function (html) {
var parser = new DOMParser();
var doc = parser.parseFromString(html, "text/html");
var preloadData = doc.querySelectorAll('meta#meta-preload-data')[0];
let content = JSON.parse(preloadData.content);
let IMAGE_ID = Object.keys(content.illust)[0];
let IMAGE_URL = content.illust[IMAGE_ID].urls.original;
let IMAGE_TYPE = content.illust[IMAGE_ID].urls.original.split(".").pop();
let IMAGE_TITLE = content.illust[IMAGE_ID].title
let IMAGE_DESCRIPTION = content.illust[IMAGE_ID].alt;
let IMAGE_WEBSITE = content.illust[IMAGE_ID].extraData.meta.canonical;
let IMAGE_TAGS = Object.values(content.illust[IMAGE_ID].tags.tags).map(item => item.tag);
for (let i = 0; i <= (IMAGE_AMOUNT - 1); i++) {
let DOWNLOAD_IMAGE_URL = IMAGE_URL.replace("p0", "p" + i);
console.log("prepare download: ", DOWNLOAD_IMAGE_URL)
let image = {
"url": DOWNLOAD_IMAGE_URL,
"name": IMAGE_TITLE,
"website": IMAGE_WEBSITE,
"annotation": IMAGE_DESCRIPTION,
"folderId": folder.id,
"headers": {
"referer": IMAGE_WEBSITE
}
};
if (SUPPORT_TAGS) {
image.tags = IMAGE_TAGS;
}
DOWNLOAD_COUNTER++;
addImageToEagle(image);
console.log(index, $(SELECTOR_IMAGE).length - 1);
updateDialog();
}
if (index == $(SELECTOR_IMAGE).length - 1) {
FINISH = true;
}
updateDialog();
});
});
}
// 脚本开始
// 创建本次保存使用文件夹
var folderName = document.querySelector("h1") && document.querySelector("h1").innerText || "Pixiv";
console.log("Pixiv to Eagle")
waitForKeyElements(SELECTOR_IMAGE + ':first', actionFunction, true);
function actionFunction() {
createFolder(folderName, function (err, folder) {
if (folder) {
getImages(folder);
} else {
alert("软件尚未打开,或当前软件版本不支持,需至 Eagle 官网下载,手动重新安装最新版本");
}
});
}
})();