diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index d5cfbbb3..9e777318 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -1,20 +1,20 @@
diff --git a/arrangement/classify_and_compress.js b/arrangement/classify_and_compress.js
index f39e850e..c1b992dd 100644
--- a/arrangement/classify_and_compress.js
+++ b/arrangement/classify_and_compress.js
@@ -522,7 +522,7 @@ function classify(fso_name, fso_path, fso_status, sub_fso_list) {
if (
// "1", "12-13-15", "3211231", "2014"
- /^(?:[\d\- ]*|Ongoing|Eng?|English(?:-Uncen)?|korean|kor|Jap|Japanese|RUS|英訳|中国語|更正|GIFs?|CG|mp3|FLAC|APE)$/i
+ /^(?:[\d\- ]*|Ongoing|Eng?|English(?:-Uncen)?|korean|kor|Jap|Japanese|RUS|英訳|中国語|更正|GIFs?|CG|mp3|FLAC|APE|文庫版?)$/i
.test(matched[1])) {
// [Pixiv] 60枚 (3322006).zip
} else if (matched[1] !== '仮') {
diff --git a/comic.cmn-Hans-CN/comic.cmn-Hans-CN.bat b/comic.cmn-Hans-CN/comic.cmn-Hans-CN.bat
index 7a33ef49..e1b2e830 100644
--- a/comic.cmn-Hans-CN/comic.cmn-Hans-CN.bat
+++ b/comic.cmn-Hans-CN/comic.cmn-Hans-CN.bat
@@ -1,10 +1,11 @@
@ECHO OFF
-REM This is a batch file to show how to execute every crawler in one click. You must setup .txt title list file first.
-
+REM parallelly
REM chcp 65001
-chcp 936
+REM chcp 936
REM cd/d D:\USB\cgi-bin\program\comic
REM CD "%~n0"
-FORFILES /M *.js /C "cmd.exe /c IF @isdir==FALSE node @file l=@fname.txt || PAUSE"
+REM It's often too slow, so trying to execute parallelly.
+FORFILES /M *.js /C "cmd.exe /c IF @isdir==FALSE START node @file l=@fname.txt || PAUSE"
+
REM CD ..
diff --git a/comic.cmn-Hans-CN/dagu.js b/comic.cmn-Hans-CN/dagu.js
index cf2e31e9..6044c24d 100644
--- a/comic.cmn-Hans-CN/dagu.js
+++ b/comic.cmn-Hans-CN/dagu.js
@@ -57,6 +57,7 @@ var crawler = new CeL.work_crawler({
: matched[1].replace('/', '-'));
id_data.push(get_label(matched[2]));
}, this);
+ // console.log([ id_list, id_data ]);
return [ id_list, id_data ];
},
@@ -107,10 +108,12 @@ var crawler = new CeL.work_crawler({
work_data.chapter_list.push(chapter_data);
}
work_data.chapter_list.reverse();
+ // console.log(work_data.chapter_list);
},
pre_parse_chapter_data
- // 執行在解析章節資料 process_chapter_data() 之前的作業 (async)。必須自行保證不丟出異常。
+ // 執行在解析章節資料 process_chapter_data() 之前的作業 (async)。
+ // 必須自行保證執行 callback(),不丟出異常、中斷。
: function(XMLHttp, work_data, callback, chapter_NO) {
var chapter_data = work_data.chapter_list[chapter_NO - 1],
//
@@ -161,11 +164,12 @@ var crawler = new CeL.work_crawler({
chapter_data.image_list = [];
extract_image(XMLHttp);
- CeL.run_serial(function(run_next, NO, index) {
- var image_page_url = url.replace(/(\.[^.]+)$/, '_' + NO + '$1');
+ CeL.run_serial(function(run_next, image_NO, index) {
+ var image_page_url = url.replace(/(\.[^.]+)$/, '_' + image_NO
+ + '$1');
// console.log('Get #' + index + ': ' + image_page_url);
- process.stdout.write('Get image pages of #' + chapter_NO + ': '
- + NO + '/' + image_count + '...\r');
+ process.stdout.write('Get image data pages of #' + chapter_NO
+ + ': ' + image_NO + '/' + image_count + '...\r');
_this.get_URL(image_page_url, function(XMLHttp) {
extract_image(XMLHttp);
run_next();
diff --git a/comic.cmn-Hans-CN/dm5.js b/comic.cmn-Hans-CN/dm5.js
index a37ab60d..719a628f 100644
--- a/comic.cmn-Hans-CN/dm5.js
+++ b/comic.cmn-Hans-CN/dm5.js
@@ -75,18 +75,28 @@ var crawler = new CeL.work_crawler({
var work_data = {
// 必要屬性:須配合網站平台更改。
title : get_label(html.between('
',
- '')),
+ '')
+ // 土豪漫画
+ || html.between('', '
')),
// 選擇性屬性:須配合網站平台更改。
- author : get_label(html.between('', '
')
- .replace(/^.*?[::]/, '')),
+ // e.g., "作者:...图:.../文:...
"
+ author : get_label(html.between('', '
')),
description : get_label(html.between('')
.between('>').replace(/', '
'),
- part_list : part_list
+ // 土豪漫画: 每周六更
+ next_update : html.between(' class="remind">', '<'),
+ part_list : part_list,
+ // reset work_data.chapter_list
+ chapter_list : []
};
+ if (!/[::][^::]+?[::]/.test(work_data.author)) {
+ work_data.author = work_data.author.replace(/^.*?[::]/, '');
+ }
+
if (matched) {
work_data.latest_chapter = matched[1];
}
@@ -101,18 +111,19 @@ var crawler = new CeL.work_crawler({
}
});
- work_data.status = work_data.状态;
+ Object.assign(work_data, {
+ status : work_data.状态,
+ last_update : work_data.更新时间
+ });
return work_data;
},
get_chapter_list : function(work_data, html, get_label) {
- // 1: 由舊至新
- work_data.inverted_order = / DM5_COMIC_SORT\s*=\s*2/.test(html);
+ // 1: 由舊至新, 2: 由新至舊
+ work_data.inverted_order = !/ DM5_COMIC_SORT\s*=\s*1/.test(html);
html = html.between('detail-list-select', '');
- // reset chapter_list
- work_data.chapter_list = [];
var PATTERN_chapter = /
([\s\S]+?)<\/li>|]+)>/g, matched;
while (matched = PATTERN_chapter.exec(html)) {
if (matched[2]) {
@@ -122,7 +133,9 @@ var crawler = new CeL.work_crawler({
if (matched[2]
&& (matched[2] = work_data.part_list[matched[2][1]])) {
this.set_part(work_data, matched[2]);
- } else if (!matched[0].includes(' class="chapteritem">')) {
+ } else if (!matched[0].includes(' class="chapteritem">')
+ //
+ && work_data.part_list.length > 0) {
CeL.error('get_chapter_list: Invalid NO: ' + matched[0]);
}
continue;
@@ -135,7 +148,12 @@ var crawler = new CeL.work_crawler({
// e.g., 古惑仔
|| get_label(matched
// for 七原罪 第168话 <十戒>歼灭计划
- .replace(/ title="[^"]+"/, '')).replace(/\s+/g, ' '),
+ .replace(/ title="[^"]+"/, '')).replace(/\s+/g, ' ')
+ // 土豪漫画
+ || get_label(matched
+ // title(1P)
+ //
+ .match(/]+>([\s\S]+?)<\/span>/)[1]),
url : matched.between(' href="', '"')
};
@@ -145,10 +163,12 @@ var crawler = new CeL.work_crawler({
}
this.add_chapter(work_data, chapter_data);
}
+ // console.log(work_data);
},
pre_parse_chapter_data
- // 執行在解析章節資料 process_chapter_data() 之前的作業 (async)。必須自行保證不丟出異常。
+ // 執行在解析章節資料 process_chapter_data() 之前的作業 (async)。
+ // 必須自行保證執行 callback(),不丟出異常、中斷。
: function(XMLHttp, work_data, callback, chapter_NO) {
if (!work_data.image_list) {
// image_list[chapter_NO] = [url, url, ...]
diff --git a/comic.cmn-Hans-CN/hhcool.js b/comic.cmn-Hans-CN/hhcool.js
index 15adc43d..ed45a3d8 100644
--- a/comic.cmn-Hans-CN/hhcool.js
+++ b/comic.cmn-Hans-CN/hhcool.js
@@ -101,7 +101,8 @@ var crawler = new CeL.work_crawler({
},
pre_parse_chapter_data
- // 執行在解析章節資料 process_chapter_data() 之前的作業 (async)。必須自行保證不丟出異常。
+ // 執行在解析章節資料 process_chapter_data() 之前的作業 (async)。
+ // 必須自行保證執行 callback(),不丟出異常、中斷。
: function(XMLHttp, work_data, callback, chapter_NO) {
var html = XMLHttp.responseText;
diff --git a/comic.cmn-Hans-CN/katui.js b/comic.cmn-Hans-CN/katui.js
index 2c2b1b27..f82d4ca4 100644
--- a/comic.cmn-Hans-CN/katui.js
+++ b/comic.cmn-Hans-CN/katui.js
@@ -1,7 +1,7 @@
/**
* 批量下載 卡推漫画 的工具。 Download katui comics.
*
- * @see 733dm.js , archive/733dm.js
+ * @see archive/733dm.201811.js , archive/733dm.201808.js
*/
'use strict';
diff --git a/comic.cmn-Hans-CN/mh160.js b/comic.cmn-Hans-CN/mh160.js
index 8cd1492a..2ba2a42e 100644
--- a/comic.cmn-Hans-CN/mh160.js
+++ b/comic.cmn-Hans-CN/mh160.js
@@ -46,7 +46,7 @@ var crawler = new CeL.work_crawler({
key : work_title
} ];
},
- // @see archive/733dm.js comic.cmn-Hans-CN/katui.js
+ // @see archive/733dm.201808.js comic.cmn-Hans-CN/katui.js
parse_search_result : function(html) {
// console.log(html);
var id_list = [], id_data = [], matched, PATTERN =
diff --git a/comic.cmn-Hans-CN/mrblue.js b/comic.cmn-Hans-CN/mrblue.js
index c81cf051..8f801ca0 100644
--- a/comic.cmn-Hans-CN/mrblue.js
+++ b/comic.cmn-Hans-CN/mrblue.js
@@ -67,7 +67,8 @@ var crawler = new CeL.work_crawler({
return chapter_data;
},
- after_get_images : function(image_list, work_data, chapter_NO) {
+ // 每個圖片下載結束都會執行一次。
+ after_get_image : function(image_list, work_data, chapter_NO) {
// console.log(image_list);
var latest_image_data = image_list[image_list.index];
// console.log(latest_image_data);
diff --git a/comic.cmn-Hans-CN/nokiacn.js b/comic.cmn-Hans-CN/nokiacn.js
index 6c1c5546..73bcb083 100644
--- a/comic.cmn-Hans-CN/nokiacn.js
+++ b/comic.cmn-Hans-CN/nokiacn.js
@@ -53,6 +53,7 @@ var crawler = new CeL.work_crawler({
: matched[1].replace('/', '-'));
id_data.push(get_label(matched[2]));
}, this);
+ // console.log([ id_list, id_data ]);
return [ id_list, id_data ];
},
@@ -103,6 +104,7 @@ var crawler = new CeL.work_crawler({
work_data.chapter_list.push(chapter_data);
}
work_data.chapter_list.reverse();
+ // console.log(work_data.chapter_list);
},
parse_chapter_data : function(html, work_data) {
diff --git a/comic.cmn-Hans-CN/webtoon.js b/comic.cmn-Hans-CN/webtoon.js
index f46f30b0..240e0766 100644
--- a/comic.cmn-Hans-CN/webtoon.js
+++ b/comic.cmn-Hans-CN/webtoon.js
@@ -17,6 +17,7 @@ var crawler = CeL.webtoon({
// https://www.webtoons.com/zh-hant/
language_code : 'zh-hant',
+ // 規範 work id 的正規模式;提取出引數中的作品id 以回傳。
extract_work_id : function(work_information) {
if (CeL.is_digits(work_information)
// e.g., webtoon 投稿新星專區 id 下載: "challenge_00000"
diff --git a/comic.ja-JP/ComicWalker.js b/comic.ja-JP/ComicWalker.js
index 2a61cada..c94d2097 100644
--- a/comic.ja-JP/ComicWalker.js
+++ b/comic.ja-JP/ComicWalker.js
@@ -192,6 +192,7 @@ var crawler = new CeL.work_crawler({
return;
// console.log(image_data);
if (image_data.meta.drm_hash === null) {
+ // e.g., 英雄の娘として生まれ変わった英雄は再び英雄を目指す
// 這個情況下所獲得的圖片內容似乎沒問題?
// CeL.warn('Bad image data?');
// console.log(image_data);
diff --git a/comic.ja-JP/pixivcomic.js b/comic.ja-JP/pixivcomic.js
index 052daa9d..5186c480 100644
--- a/comic.ja-JP/pixivcomic.js
+++ b/comic.ja-JP/pixivcomic.js
@@ -127,7 +127,8 @@ var crawler = new CeL.work_crawler({
},
pre_parse_chapter_data
- // 執行在解析章節資料 process_chapter_data() 之前的作業 (async)。必須自行保證不丟出異常。
+ // 執行在解析章節資料 process_chapter_data() 之前的作業 (async)。
+ // 必須自行保證執行 callback(),不丟出異常、中斷。
: function(XMLHttp, work_data, callback, chapter_NO) {
var _this = this, html = XMLHttp.responseText, url = html.between(
'