diff --git a/e-hentai-downloader.meta.js b/e-hentai-downloader.meta.js
index 6fe03b6..c84748f 100644
--- a/e-hentai-downloader.meta.js
+++ b/e-hentai-downloader.meta.js
@@ -1,6 +1,6 @@
// ==UserScript==
// @name E-Hentai Downloader
-// @version 1.34.5
+// @version 1.35.0
// @description Download E-Hentai archive as zip file
// @author 864907600cc
// @icon https://secure.gravatar.com/avatar/147834caf9ccb0a66b2505c753747867
diff --git a/src/main.js b/src/main.js
index ba3d6fd..16ecab3 100644
--- a/src/main.js
+++ b/src/main.js
@@ -2,6 +2,7 @@
var zip;
var imageList = [];
var imageData = [];
+var infoObj;
var infoStr;
var origin = window.location.origin;
var setting = null;
@@ -504,6 +505,85 @@ function storeRes(res, index) {
res = null;
}
+function getMetadataInZipComment(info, comments) {
+ // https://code.google.com/archive/p/comicbookinfo/wikis/Example.wiki
+ var out = {
+ "appID": "eHentaiDownloader/",
+ }
+ var comicBookInfo = {
+ "publisher": "E-hentai",
+ "comments": comments
+ }
+
+ if (info["Posted"]) {
+ out["lastModified"] = new Date(info["Posted"]).toISOString().replace('T',' ').replace('Z','')
+ }
+
+ // 尝试使用正则从 SubTitle 中提取作者与题名
+ // 正则可视化
+ // https://jex.im/regulex/#!flags=&re=(.*%3F%5C%5B((%3F%3A(%3F!%E6%B1%89%E5%8C%96%7C%E6%BC%A2%E5%8C%96%7CCE%E5%AE%B6%E6%97%8F%7C%E5%A4%A9%E9%B5%9D%E4%B9%8B%E6%88%80%7C%E7%BF%BB%E8%A8%B3)%5B%5E%5C%5B%5C%5D%5D)*)%5C%5D(%3F%3A%5Cs*(%3F%3A%5C%5B%5B%5E%5C(%5C)%5D%2B%5C%5D%7C%5C(%5B%5E%5C%5B%5C%5D%5C(%5C)%5D%2B%5C))%5Cs*)*(%5B%5E%5C%5B%5C%5D%5C(%5C)%5D%2B).*)
+ var re = /(.*?\[((?:(?!汉化|漢化|CE家族|天鵝之戀|翻訳)[^\[\]])*)\](?:\s*(?:\[[^\(\)]+\]|\([^\[\]\(\)]+\))\s*)*([^\[\]\(\)]+).*)/
+ var title = ''
+ var author = 'c80c3db2b2cb606bacf75bac6c2e4b9221e58958b5c800a6b0031b726c3f4bc1' // 设置特殊数值防止碰撞
+ if (info["SubTitle"]) {
+ var ms = info["SubTitle"].match(re)
+ if (ms) {
+ title = ms[3].trim()
+ author = ms[2].trim()
+ } else {
+ title = info["SubTitle"]
+ }
+ } else {
+ var ms = info["Title"].match(re)
+ if (ms) {
+ title = ms[3].trim()
+ author = ms[2].trim()
+ } else {
+ title = info["Title"]
+ }
+ }
+
+ var autorInfos = []
+ if (author === "c80c3db2b2cb606bacf75bac6c2e4b9221e58958b5c800a6b0031b726c3f4bc1") {
+ var artistTags = info["Tags"].filter((t) => t.startsWith('artist:'))
+ if (artistTags.length !== 0) {
+ artistTags
+ .map((t) => t.replace(/^artist:/,''))
+ .forEach((a) => {
+ autorInfos.push({
+ "person": a,
+ "role": "Writer"
+ })
+ })
+ }
+ else {
+ autorInfos.push({
+ "person": 'Unknown',
+ "role": "Writer"
+ })
+ }
+ } else {
+ autorInfos.push({
+ "person": author,
+ "role": "Writer"
+ })
+ }
+
+ comicBookInfo["title"] = title
+ comicBookInfo["credits"] = autorInfos
+
+ if (info["Language"]) {
+ comicBookInfo["language"] = info["Language"].replace(/TR$/,"").trim()
+ }
+
+ if (info["Tags"]) {
+ comicBookInfo.tags = info["Tags"]
+ }
+
+ out["ComicBookInfo/1.0"] = comicBookInfo
+ return out
+}
+
function generateZip(isFromFS, fs, isRetry, forced){
isSaving = true;
@@ -704,6 +784,15 @@ function generateZip(isFromFS, fs, isRetry, forced){
try {
var lastMetaTime = 0;
+ var getZipComment = function () {
+ if (setting['save-as-cbz']) {
+ return JSON.stringify(getMetadataInZipComment(infoObj, infoStr))
+ } else if (setting['save-info'] === 'comment') {
+ return infoStr.replace(/\n/gi, '\r\n')
+ } else {
+ return undefined
+ }
+ }
var generateConfig = {
type: 'arraybuffer',
compression: setting['compression-level'] ? 'DEFLATE' : 'STORE',
@@ -711,7 +800,7 @@ function generateZip(isFromFS, fs, isRetry, forced){
level: Math.min(Math.max(setting['compression-level'], 1), 9)
},
streamFiles: setting['file-descriptor'] ? true : false,
- comment: setting['save-info'] === 'comment' ? infoStr.replace(/\n/gi, '\r\n') : undefined
+ comment: getZipComment()
};
var onProgress = function (meta) {
// meta update function will be called nearly every 1ms, for performance, update every 300ms
@@ -1848,6 +1937,7 @@ function initEHDownload() {
isPausing = false;
zip = new JSZip();
infoStr = '';
+ infoObj = {};
fetchPagesXHR.abort();
if (setting['recheck-file-name']) {
@@ -1927,6 +2017,9 @@ function initEHDownload() {
// Array.prototype.some() is a bit ugly, so we use toString().indexOf() lol
var infoNeeds = setting['save-info-list'].toString();
+
+ infoObj["Title"] = document.getElementById('gn').textContent
+ infoObj["SubTitle"] = document.getElementById('gj').textContent
if (infoNeeds.indexOf('title') >= 0) {
infoStr += replaceHTMLEntites(
document.getElementById('gn').textContent + '\n' +
@@ -1935,6 +2028,8 @@ function initEHDownload() {
);
}
+ infoObj["Category"] = document.querySelector('#gdc .cs').textContent.trim()
+ infoObj["Uploader"] = replaceHTMLEntites(document.querySelector('#gdn').textContent)
if (infoNeeds.indexOf('metas') >= 0) {
infoStr += 'Category: ' + document.querySelector('#gdc .cs').textContent.trim() + '\n' +
'Uploader: ' + replaceHTMLEntites(document.querySelector('#gdn').textContent) + '\n';
@@ -1943,29 +2038,37 @@ function initEHDownload() {
for (var i = 0; i < metaNodes.length; i++) {
var c1 = replaceHTMLEntites(metaNodes[i].getElementsByClassName('gdt1')[0].textContent);
var c2 = replaceHTMLEntites(metaNodes[i].getElementsByClassName('gdt2')[0].textContent);
+ infoObj[c1.replace(/:$/, "")] = c2
if (infoNeeds.indexOf('metas') >= 0) infoStr += c1 + ' ' + c2 + '\n';
}
+ infoObj["Rating"] = unsafeWindow.average_rating
if (infoNeeds.indexOf('metas') >= 0) infoStr += 'Rating: ' + unsafeWindow.average_rating + '\n\n';
- if (infoNeeds.indexOf('tags') >= 0) {
- infoStr += 'Tags:\n';
+ var tagStr = 'Tags:\n';
+ infoObj["Tags"] = []
+ var tagsList = document.querySelectorAll('#taglist tr');
+ Array.prototype.forEach.call(tagsList, function(elem){
+ var tds = elem.getElementsByTagName('td');
+ tagStr += '> ' + tds[0].textContent + ' ';
- var tagsList = document.querySelectorAll('#taglist tr');
- Array.prototype.forEach.call(tagsList, function(elem){
- var tds = elem.getElementsByTagName('td');
- infoStr += '> ' + tds[0].textContent + ' ';
+ var tags = tds[1].querySelectorAll('a');
+ tagStr += Array.prototype.map.call(tags, function(e){
+ return e.textContent;
+ }).join(', ') + '\n';
- var tags = tds[1].querySelectorAll('a');
- infoStr += Array.prototype.map.call(tags, function(e){
- return e.textContent;
- }).join(', ') + '\n';
- });
+ for (var tag of tags) {
+ infoObj["Tags"].push(tds[0].textContent + tag.textContent)
+ }
+ });
+ tagStr += '\n';
- infoStr += '\n';
+ if (infoNeeds.indexOf('tags') >= 0) {
+ infoStr += tagStr;
}
if (infoNeeds.indexOf('uploader-comment') >= 0 && document.getElementById('comment_0')) {
infoStr += 'Uploader Comment:\n' + document.getElementById('comment_0').innerHTML.replace(/
|
/gi, '\n') + '\n\n';
+ infoObj["Uploader Comment"] = document.getElementById('comment_0').innerHTML.replace(/
|
/gi, '\n')
}
isDownloading = true;
pushDialog(infoStr);