cejs
Version:
A JavaScript module framework that is simple to use.
169 lines (139 loc) • 5.44 kB
JavaScript
/**
* @name CeL module for downloading YOUNG ACE UP, TYPE-MOON comics.
*
* @fileoverview 本檔案包含了解析並處理、批量下載 KADOKAWA CORPORATION webエース ヤングエースUP(アップ)
* Webコミック、TYPE-MOONコミックエース 漫画 的工具。
*
* <code>
CeL.ace({
// configuration
site : '' || CeL.get_script_name()
}).start(work_id);
</code>
*
* @since 2020/4/26 5:58:57 模組化。
*/
// More examples:
// @see
// https://github.com/kanasimi/work_crawler/blob/master/comic.ja-JP/youngaceup.js
;
// --------------------------------------------------------------------------------------------
// 不採用 if 陳述式,可以避免 Eclipse JSDoc 與 format 多縮排一層。
typeof CeL === 'function' && CeL.run({
// module name
name : 'application.net.work_crawler.sites.ace',
require : 'application.net.work_crawler.',
// 設定不匯出的子函式。
no_extend : '*',
// 為了方便格式化程式碼,因此將 module 函式主體另外抽出。
code : module_code
});
function module_code(library_namespace) {
// requiring
// --------------------------------------------------------------------------------------------
var default_configuration = {
// 日本的網路漫畫網站習慣刪掉舊章節,因此每一次都必須從頭檢查。
// e.g., ヱデンズボゥイ
recheck : true,
// one_by_one : true,
base_URL : 'https://web-ace.jp/',
// 取得作品的章節資料。 get_work_data()
work_URL : function(work_id) {
return 'contents/' + work_id + '/';
},
parse_work_data : function(html, get_label, extract_work_data) {
var work_data = JSON.parse(html.between(
'<script type="application/ld+json">', '</script>'));
extract_work_data(work_data, html);
// 放在這裡以預防被extract_work_data()覆蓋。
Object.assign(work_data, {
// 必要屬性:須配合網站平台更改。
title : get_label(html.between('<h1>', '</h1>')),
authors : html.all_between('<p class="author">', '</p>').map(
get_label),
// 選擇性屬性:須配合網站平台更改。
subtitle : get_label(html.between('<p class="subtitle">',
'</p>')),
description : get_label(html.between(
'<div class="description">', '</div>')),
status : html.between('<p class="genre">', '</p>').replace(
'ジャンル:', '').split(' / ').map(get_label),
last_update : get_label(html.between(
'<span class="updated-date">', '</span>'))
|| (new Date).toISOString(),
next_update : html.all_between(
'<span class="label_day-of-the-week">', '</span>').map(
get_label)
// 隔週火曜日更新 次回更新予定日:2018年11月27日
.map(function(token) {
return token.replace('次回更新予定日:', '');
})
});
work_data.author = work_data.authors.map(function(name) {
// 原作: 漫画: キャラクター原案:
return name.replace(/^[^:]+:/, '').trim();
});
// console.log(work_data);
return work_data;
},
chapter_list_URL : function(work_id, work_data) {
return this.work_URL(work_id) + 'episode/';
},
get_chapter_list : function(work_data, html, get_label) {
// <div class="container" id="read">
html = html.between(' id="read">', '</section>')
// <ul class="table-view">
.between('<ul', '</ul>');
work_data.chapter_list = [];
var some_skipped;
html.each_between('<li', '</li>', function(token) {
var matched = token.between('<p class="yudo_wa">', '</div>');
if (matched) {
library_namespace.info(work_data.title + ': '
+ get_label(matched).replace(/\s{2,}/g, ' '));
some_skipped = true;
return;
}
matched = token
.match(/<a [^<>]*?href=["']([^"'<>]+)["'][^<>]*>/);
var chapter_data = {
title : get_label(token
//
.between('<p class="text-bold">', '</p>')),
date : token.between('<span class="updated-date">',
'</span>'),
// 直接取得圖片網址資訊。
url : matched[1] + 'json/'
};
work_data.chapter_list.push(chapter_data);
});
work_data.chapter_list.reverse();
if (some_skipped) {
// 因為中間的章節可能已經被下架,因此依章節標題來定章節編號。
this.set_chapter_NO_via_title(work_data);
}
},
parse_chapter_data : function(html, work_data, get_label, chapter_NO) {
// console.log(html);
var chapter_data = work_data.chapter_list[chapter_NO - 1];
Object.assign(chapter_data, {
// 設定必要的屬性。
image_list : JSON.parse(html)
});
return chapter_data;
}
};
// --------------------------------------------------------------------------------------------
function new_ace_comics_crawler(configuration, callback, initializer) {
// library_namespace.set_debug(9);
configuration = configuration ? Object.assign(Object.create(null),
default_configuration, configuration) : default_configuration;
configuration.base_URL += (configuration.site
// || library_namespace.get_script_name()
) + '/';
// 每次呼叫皆創建一個新的實體。
var crawler = new library_namespace.work_crawler(configuration);
return crawler;
}
return new_ace_comics_crawler;
}