diff --git a/build/pxer-utility.js b/build/pxer-utility.js
index e64b6a3..ab07298 100644
--- a/build/pxer-utility.js
+++ b/build/pxer-utility.js
@@ -4,7 +4,7 @@ const Babel = require('babel-core');
module.exports.pxerURL ='https://pxer-app.pea3nut.org/';
module.exports.rootPath ='../';
-module.exports.pxerVersion ='7.0.11';
+module.exports.pxerVersion ='7.1.0';
module.exports.path2URL =function(path){
var url =module.exports.pxerURL;
diff --git a/dist/launcher.js b/dist/launcher.js
index ac0aa3a..6688f7e 100644
--- a/dist/launcher.js
+++ b/dist/launcher.js
@@ -6,7 +6,7 @@
~function () {
var libURL = /**/"dist/lib.js"; //*/'';
var supportURL = /**/"dist/support.js"; //*/'';
- window['PXER_VERSION'] = /**/"7.0.11"; //*/'';
+ window['PXER_VERSION'] = /**/"7.1.0"; //*/'';
Promise.resolve().then(function () {
var script = document.createElement('script');
diff --git a/dist/lib.js b/dist/lib.js
index 7e07641..60961d4 100644
--- a/dist/lib.js
+++ b/dist/lib.js
@@ -196,6 +196,9 @@ window.execPromise = function (taskList, call) {
* - member_works 自己/其他人作品列表页
* - search 检索页
* - index 首页
+ * - discovery 探索
+ * - rank 排行榜
+ * - bookmark_new 关注的新作品
* - unknown 未知
* @param {string} url
* @return {string} - 页面类型
@@ -218,8 +221,12 @@ window.getPageType = function () {
} else {
type = 'bookmark_works';
}
+ } else if (URLData.path === '/bookmark_new_illust.php') {
+ type = 'bookmark_new';
} else if (URLData.path === '/member.php') {
type = 'member_info';
+ } else if (URLData.path === '/ranking.php') {
+ type = 'rank';
} else if (URLData.path === '/member_illust.php') {
if (URLData.query && URLData.query.mode) {
switch (URLData.query.mode) {
@@ -240,6 +247,8 @@ window.getPageType = function () {
}
} else if (URLData.path === '/search.php') {
type = 'search';
+ } else if (URLData.path === '/discovery') {
+ type = 'discovery';
} else if (URLData.path === '/') {
type = 'index';
} else {
@@ -247,6 +256,23 @@ window.getPageType = function () {
}
return type;
};
+/**
+ * 查询对应页面类型每页作品数量
+ * @param {string} type - 作品类型
+ * @return {number} - 每页作品数
+ */
+window.getOnePageWorkCount = function (type) {
+ switch (type) {
+ case "search":
+ return 40;
+ case "rank":
+ return 50;
+ case "discovery":
+ return 3000;
+ default:
+ return 20;
+ };
+};
/*EventTarget扩展
EventTarget.prototype['addOneEventListener'] =function(type,listener,useCapture){
var fn;
diff --git a/dist/pxer-core.js b/dist/pxer-core.js
index 9bce90e..f8ef2b2 100644
--- a/dist/pxer-core.js
+++ b/dist/pxer-core.js
@@ -12,6 +12,8 @@ var _createClass = function () { function defineProperties(target, props) { for
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
@@ -54,6 +56,7 @@ var PxerPageRequest = function (_PxerRequest) {
var _this = _possibleConstructorReturn(this, (_ref2 = PxerPageRequest.__proto__ || Object.getPrototypeOf(PxerPageRequest)).call.apply(_ref2, [this].concat(argn)));
+ _this.type = argn[0].type;
return _ret = denyNewAttr(_this), _possibleConstructorReturn(_this, _ret);
}
@@ -530,96 +533,217 @@ PxerHtmlParser.parsePage = function (task) {
return false;
}
- var URLData = parseURL(task.url);
- var dom = PxerHtmlParser.HTMLParser(task.html);
-
- // old method
var taskList = [];
+ switch (task.type) {
+ case "bookmark_works":
+ case "member_works":
+ var dom = PxerHtmlParser.HTMLParser(task.html);
+ var elts = dom.body.querySelectorAll('a.work._work');
+ var _iteratorNormalCompletion = true;
+ var _didIteratorError = false;
+ var _iteratorError = undefined;
- var searchResult = dom.body.querySelector("input#js-mount-point-search-result-list");
- var elts = null;
- if (searchResult) {
- var searchData = JSON.parse(searchResult.getAttribute('data-items'));
- var _iteratorNormalCompletion = true;
- var _didIteratorError = false;
- var _iteratorError = undefined;
+ try {
+ for (var _iterator = elts[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ var elt = _step.value;
+
+ var task = new PxerWorksRequest({
+ html: {},
+ type: function (elt) {
+ switch (true) {
+ case elt.matches('.ugoku-illust'):
+ return "ugoira";
+ case elt.matches('.manga'):
+ return "manga";
+ default:
+ return "illust";
+ }
+ }(elt),
+ isMultiple: elt.matches(".multiple"),
+ id: elt.getAttribute('href').match(/illust_id=(\d+)/)[1]
+ });
+
+ task.url = PxerHtmlParser.getUrlList(task);
+
+ taskList.push(task);
+ }
+ } catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+ }
- try {
- for (var _iterator = searchData[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
- var searchItem = _step.value;
+ ;
+ break;
+ case "rank":
+ var data = JSON.parse(task.html);
+ var _iteratorNormalCompletion2 = true;
+ var _didIteratorError2 = false;
+ var _iteratorError2 = undefined;
- var task = new PxerWorksRequest({
- html: {},
- type: searchItem.illustType == 2 ? 'ugoira' : searchItem.illustType == 1 ? 'manga' : 'illust',
+ try {
+ for (var _iterator2 = data['contents'][Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
+ var task = _step2.value;
- isMultiple: searchItem.pageCount > 1,
- id: searchItem.illustId
- });
- task.url = PxerHtmlParser.getUrlList(task);
- taskList.push(task);
+ var task = new PxerWorksRequest({
+ html: {},
+ type: this.parseIllustType(task['illust_type']),
+ isMultiple: task['illust_page_count'] > 1,
+ id: task['illust_id'].toString()
+ });
+ task.url = PxerHtmlParser.getUrlList(task);
+
+ taskList.push(task);
+ }
+ } catch (err) {
+ _didIteratorError2 = true;
+ _iteratorError2 = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion2 && _iterator2.return) {
+ _iterator2.return();
+ }
+ } finally {
+ if (_didIteratorError2) {
+ throw _iteratorError2;
+ }
+ }
}
- } catch (err) {
- _didIteratorError = true;
- _iteratorError = err;
- } finally {
+
+ ;
+ break;
+ case "discovery":
+ var data = JSON.parse(task.html);
+ var _iteratorNormalCompletion3 = true;
+ var _didIteratorError3 = false;
+ var _iteratorError3 = undefined;
+
try {
- if (!_iteratorNormalCompletion && _iterator.return) {
- _iterator.return();
+ for (var _iterator3 = data.recommendations[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
+ var id = _step3.value;
+
+ var task = new PxerWorksRequest({
+ html: {},
+ type: null,
+ isMultiple: null,
+ id: id.toString()
+ });
+ task.url = PxerHtmlParser.getUrlList(task);
+
+ taskList.push(task);
}
+ } catch (err) {
+ _didIteratorError3 = true;
+ _iteratorError3 = err;
} finally {
- if (_didIteratorError) {
- throw _iteratorError;
+ try {
+ if (!_iteratorNormalCompletion3 && _iterator3.return) {
+ _iterator3.return();
+ }
+ } finally {
+ if (_didIteratorError3) {
+ throw _iteratorError3;
+ }
}
}
- }
- ;
- } else {
- elts = dom.body.querySelectorAll('a.work._work');
+ ;
+ break;
+ case "search":
+ var dom = PxerHtmlParser.HTMLParser(task.html);
+ var searchResult = dom.body.querySelector("input#js-mount-point-search-result-list");
+ var searchData = JSON.parse(searchResult.getAttribute('data-items'));
+ var _iteratorNormalCompletion4 = true;
+ var _didIteratorError4 = false;
+ var _iteratorError4 = undefined;
- var _iteratorNormalCompletion2 = true;
- var _didIteratorError2 = false;
- var _iteratorError2 = undefined;
+ try {
+ for (var _iterator4 = searchData[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
+ var searchItem = _step4.value;
+
+ var task = new PxerWorksRequest({
+ html: {},
+ type: this.parseIllustType(searchItem.illustType),
+ isMultiple: searchItem.pageCount > 1,
+ id: searchItem.illustId
+ });
+ task.url = PxerHtmlParser.getUrlList(task);
+ taskList.push(task);
+ }
+ } catch (err) {
+ _didIteratorError4 = true;
+ _iteratorError4 = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion4 && _iterator4.return) {
+ _iterator4.return();
+ }
+ } finally {
+ if (_didIteratorError4) {
+ throw _iteratorError4;
+ }
+ }
+ }
- try {
- for (var _iterator2 = elts[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
- var elt = _step2.value;
+ ;
+ break;
+ case "bookmark_new":
+ var dom = PxerHtmlParser.HTMLParser(task.html);
+ var data = JSON.parse(dom.body.querySelector("div#js-mount-point-latest-following").getAttribute("data-items"));
+ var _iteratorNormalCompletion5 = true;
+ var _didIteratorError5 = false;
+ var _iteratorError5 = undefined;
- var task = new PxerWorksRequest({
- html: {},
- type: elt.matches('.ugoku-illust') ? 'ugoira' : elt.matches(".manga") ? 'manga' : "illust",
+ try {
+ for (var _iterator5 = data[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
+ var task = _step5.value;
- isMultiple: elt.matches(".multiple"),
- id: elt.getAttribute('href').match(/illust_id=(\d+)/)[1]
- });
- task.url = PxerHtmlParser.getUrlList(task);
+ var task = new PxerWorksRequest({
+ html: {},
+ type: this.parseIllustType(task.illustType),
+ isMultiple: task.pageCount > 1,
+ id: task.illustId.toString()
+ });
+ task.url = PxerHtmlParser.getUrlList(task);
- taskList.push(task);
- }
- } catch (err) {
- _didIteratorError2 = true;
- _iteratorError2 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion2 && _iterator2.return) {
- _iterator2.return();
+ taskList.push(task);
}
+ } catch (err) {
+ _didIteratorError5 = true;
+ _iteratorError5 = err;
} finally {
- if (_didIteratorError2) {
- throw _iteratorError2;
+ try {
+ if (!_iteratorNormalCompletion5 && _iterator5.return) {
+ _iterator5.return();
+ }
+ } finally {
+ if (_didIteratorError5) {
+ throw _iteratorError5;
+ }
}
}
- }
- ;
- }
+ ;
+ break;
+ default:
+ throw new Error('Unknown PageWorks type ' + task.type);
+ };
- if (elts !== null && elts.length === 0 && !searchResult) {
+ if (taskList.length < 1) {
window['PXER_ERROR'] = 'PxerHtmlParser.parsePage: result empty';
return false;
- }
+ };
return taskList;
};
@@ -636,36 +760,23 @@ PxerHtmlParser.parseWorks = function (task) {
}
if (!task.url.every(function (item) {
return task.html[item];
- }) || !task.type) {
- window['PXER_ERROR'] = 'PxerHtmlParser.parsePage: task illegal';
+ })) {
+ window['PXER_ERROR'] = 'PxerHtmlParser.parseWorks: task illegal';
return false;
}
- var pw;
- if (task.type === 'ugoira') {
- pw = new PxerUgoiraWorks();
- } else if (task.isMultiple) {
- pw = new PxerMultipleWorks();
- } else {
- pw = new PxerWorks();
- };
-
for (var url in task.html) {
var data = {
dom: PxerHtmlParser.HTMLParser(task.html[url]),
- url: url, pw: pw, task: task
+ task: task
};
try {
switch (true) {
case url.indexOf('mode=medium') !== -1:
- PxerHtmlParser.parseMediumHtml(data);
- break;
- case url.indexOf('mode=manga') !== -1:
- PxerHtmlParser.parseMangaHtml(data);
+ var pw = PxerHtmlParser.parseMediumHtml(data);
break;
default:
- return false;
- window['PXER_ERROR'] = 'PxerHtmlParser.parsePage: count not parse task url "' + url + '"';
+ throw new Error('PxerHtmlParser.parsePage: count not parse task url "' + url + '"');
};
} catch (e) {
window['PXER_ERROR'] = task.id + ':' + e.message;
@@ -673,7 +784,6 @@ PxerHtmlParser.parseWorks = function (task) {
return false;
}
};
-
return pw;
};
@@ -686,29 +796,28 @@ PxerHtmlParser.getUrlList = function (task) {
return ["https://www.pixiv.net/member_illust.php?mode=medium&illust_id=" + task.id];
};
-PxerHtmlParser.parseMangaHtml = function (_ref8) {
+PxerHtmlParser.parseMediumHtml = function (_ref8) {
var task = _ref8.task,
- dom = _ref8.dom,
- url = _ref8.url,
- pw = _ref8.pw;
-
- pw.multiple = +dom.body.querySelector('img[data-src]').innerHTML;
-};
-PxerHtmlParser.parseMediumHtml = function (_ref9) {
- var task = _ref9.task,
- dom = _ref9.dom,
- url = _ref9.url,
- pw = _ref9.pw;
-
- pw.id = task.id;
- pw.type = task.type;
+ dom = _ref8.dom;
var illustData = dom.head.innerHTML.match(this.REGEXP['getInitData'])[0];
illustData = this.getKeyFromStringObjectLiteral(illustData, "preload");
illustData = this.getKeyFromStringObjectLiteral(illustData, 'illust');
- illustData = this.getKeyFromStringObjectLiteral(illustData, pw.id);
+ illustData = this.getKeyFromStringObjectLiteral(illustData, task.id);
illustData = JSON.parse(illustData);
+ var pw;
+ switch (true) {
+ case illustData.illustType === 2:
+ pw = new PxerUgoiraWorks();break;
+ case illustData.pageCount > 1:
+ pw = new PxerMultipleWorks();break;
+ default:
+ pw = new PxerWorks();break;
+ }
+
+ pw.id = task.id;
+ pw.type = this.parseIllustType(illustData.illustType);
pw.tagList = illustData.tags.tags.map(function (e) {
return e.tag;
});
@@ -728,7 +837,11 @@ PxerHtmlParser.parseMediumHtml = function (_ref9) {
pw.domain = URLObj.domain;
pw.date = src.match(PxerHtmlParser.REGEXP['getDate'])[1];
- pw.frames = meta['body']['frames'];
+ pw.frames = {
+ framedef: meta['body']['frames'],
+ height: illustData.height,
+ width: illustData.width
+ };
} else {
var _src = illustData.urls.original;
var _URLObj = parseURL(_src);
@@ -737,6 +850,22 @@ PxerHtmlParser.parseMediumHtml = function (_ref9) {
pw.date = _src.match(PxerHtmlParser.REGEXP['getDate'])[1];
pw.fileFormat = _src.match(/\.(jpg|gif|png)$/)[1];
};
+ return pw;
+};
+
+PxerHtmlParser.parseIllustType = function (type) {
+ switch (type.toString()) {
+ case "0":
+ case "illust":
+ return "illust";
+ case "1":
+ case "manga":
+ return "manga";
+ case "2":
+ case "ugoira":
+ return "ugoira";
+ }
+ return null;
};
PxerHtmlParser.REGEXP = {
@@ -874,32 +1003,32 @@ PxerHtmlParser.parseObjectLiteral = function () {
PxerHtmlParser.getKeyFromStringObjectLiteral = function (s, key) {
var resolvedpairs = this.parseObjectLiteral(s);
- var _iteratorNormalCompletion3 = true;
- var _didIteratorError3 = false;
- var _iteratorError3 = undefined;
+ var _iteratorNormalCompletion6 = true;
+ var _didIteratorError6 = false;
+ var _iteratorError6 = undefined;
try {
- for (var _iterator3 = resolvedpairs[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
- var pair = _step3.value;
+ for (var _iterator6 = resolvedpairs[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
+ var pair = _step6.value;
if (pair[0] === key) return pair[1];
}
} catch (err) {
- _didIteratorError3 = true;
- _iteratorError3 = err;
+ _didIteratorError6 = true;
+ _iteratorError6 = err;
} finally {
try {
- if (!_iteratorNormalCompletion3 && _iterator3.return) {
- _iterator3.return();
+ if (!_iteratorNormalCompletion6 && _iterator6.return) {
+ _iterator6.return();
}
} finally {
- if (_didIteratorError3) {
- throw _iteratorError3;
+ if (_didIteratorError6) {
+ throw _iteratorError6;
}
}
}
- throw new Error("Key not found.");
+ return false;
};
var PxerPrinter = function () {
@@ -955,15 +1084,15 @@ var PxerPrinter = function () {
* @return {void}
* */
PxerPrinter.prototype['fillAddress'] = function (worksList) {
- var _iteratorNormalCompletion4 = true;
- var _didIteratorError4 = false;
- var _iteratorError4 = undefined;
+ var _iteratorNormalCompletion7 = true;
+ var _didIteratorError7 = false;
+ var _iteratorError7 = undefined;
try {
- for (var _iterator4 = worksList[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
+ for (var _iterator7 = worksList[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
var _address;
- var works = _step4.value;
+ var works = _step7.value;
var configKey = PxerPrinter.getWorksKey(works);
if (configKey === 'ugoira_zip' && this.config['ugoira_frames'] === 'yes') {
@@ -974,16 +1103,16 @@ PxerPrinter.prototype['fillAddress'] = function (worksList) {
(_address = this.address).push.apply(_address, _toConsumableArray(PxerPrinter.countAddress(works, this.config[configKey])));
}
} catch (err) {
- _didIteratorError4 = true;
- _iteratorError4 = err;
+ _didIteratorError7 = true;
+ _iteratorError7 = err;
} finally {
try {
- if (!_iteratorNormalCompletion4 && _iterator4.return) {
- _iterator4.return();
+ if (!_iteratorNormalCompletion7 && _iterator7.return) {
+ _iterator7.return();
}
} finally {
- if (_didIteratorError4) {
- throw _iteratorError4;
+ if (_didIteratorError7) {
+ throw _iteratorError7;
}
}
}
@@ -1005,13 +1134,13 @@ PxerPrinter.prototype['fillTaskInfo'] = function (worksList) {
worksNum = _fill2[5],
address = _fill2[6];
- var _iteratorNormalCompletion5 = true;
- var _didIteratorError5 = false;
- var _iteratorError5 = undefined;
+ var _iteratorNormalCompletion8 = true;
+ var _didIteratorError8 = false;
+ var _iteratorError8 = undefined;
try {
- for (var _iterator5 = worksList[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
- var works = _step5.value;
+ for (var _iterator8 = worksList[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
+ var works = _step8.value;
var configKey = PxerPrinter.getWorksKey(works);
if (this.config[configKey] === 'no') continue;
@@ -1047,16 +1176,16 @@ PxerPrinter.prototype['fillTaskInfo'] = function (worksList) {
};
}
} catch (err) {
- _didIteratorError5 = true;
- _iteratorError5 = err;
+ _didIteratorError8 = true;
+ _iteratorError8 = err;
} finally {
try {
- if (!_iteratorNormalCompletion5 && _iterator5.return) {
- _iterator5.return();
+ if (!_iteratorNormalCompletion8 && _iterator8.return) {
+ _iterator8.return();
}
} finally {
- if (_didIteratorError5) {
- throw _iteratorError5;
+ if (_didIteratorError8) {
+ throw _iteratorError8;
}
}
}
@@ -1076,7 +1205,15 @@ PxerPrinter.prototype['print'] = function () {
alert('Pxer:\n浏览器拦截了弹出窗口,请检查浏览器提示,设置允许此站点的弹出式窗口。');
return;
};
- var str = ['
', '/** 这个页面是动图压缩包的动画参数,目前Pxer还无法将动图压缩包打包成GIF,请寻找其他第三方软件 */', JSON.stringify(this.ugoiraFrames, null, 4), '
'];
+
+ var scriptname = "";
+ switch (navigator.platform) {
+ case "Win32":
+ scriptname = "bat批处理";break;
+ default:
+ scriptname = "bash";break;
+ }
+ var str = ['/** 这个页面是自动生成的使用FFmpeg自行合成动图的' + scriptname + '脚本,详细使用教程见http://pxer.pea3nut.org/md/ugoira_concat */
', '']);
win.document.write(str.join('\n'));
};
@@ -1087,7 +1224,7 @@ PxerPrinter.prototype['print'] = function () {
alert('Pxer:\n浏览器拦截了弹出窗口,请检查浏览器提示,设置允许此站点的弹出式窗口。');
return;
};
- var _str = ['', '/** 这个页面是抓取到的下载地址,你可以将它们复制到第三方下载工具如QQ旋风中下载 */', '/**', this.taskInfo.replace(/\
/g, ''), '*/', this.address.join('\n'), '
'];
+ var _str = ['', '/** 这个页面是抓取到的下载地址,你可以将它们复制到第三方下载工具如QQ旋风中下载 */
', this.taskInfo, '
', ''];
_win.document.write(_str.join('\n'));
}
};
@@ -1107,6 +1244,91 @@ PxerPrinter.getWorksKey = function (works) {
};
return configKey;
};
+
+/**
+ * 根据动图参数,生成ffmpeg脚本
+ * @param 动图参数
+ * @return {String[]} 生成的脚本行
+ * @see PxerPrinter.prototype['print']
+ */
+PxerPrinter.prototype['generateUgoiraScript'] = function (frames) {
+ var lines = [];
+ var resstring;
+ var ffmpeg;
+ var isWindows = ['Win32', 'Win64', 'Windows', 'WinCE'].indexOf(navigator.platform) !== -1;
+ switch (this.config.ugoira_zip) {
+ case "max":
+ resstring = "1920x1080";break;
+ case "600p":
+ resstring = "600x338";break;
+ }
+ var slashstr = "";
+ if (isWindows) {
+ slashstr = "^";
+ ffmpeg = "ffmpeg";
+ lines.push("@echo off");
+ lines.push("set /p ext=请输入输出文件扩展名(mp4/gif/...):");
+ } else {
+ slashstr = "\\";
+ ffmpeg = "$ffmpeg";
+ lines.push("#!/bin/bash");
+ lines.push("");
+ lines.push("{ hash ffmpeg 2>/dev/null && ffmpeg=ffmpeg;} || { [ -x ./ffmpeg ] && ffmpeg=./ffmpeg;} || { echo >&2 \"Failed to locate ffmpeg executable. Aborting.\"; exit 1;}");
+ lines.push("read -p '请输入输出文件扩展名(mp4/gif/...):' ext");
+ }
+ for (var key in frames) {
+ var foldername = key + "_ugoira" + resstring;
+ var confpath = foldername + "/config.txt";
+ var height = frames[key].height;
+ var width = frames[key].width;
+ if (this.config.ugoira_zip === "600p") {
+ var scale = Math.max(height, width) / 600;
+ height = parseInt(height / scale);
+ width = parseInt(width / scale);
+ }
+ lines.push(isWindows ? "del " + foldername + "\\config.txt >nul 2>nul" : "rm " + foldername + "/config.txt &> /dev/null");
+ var _iteratorNormalCompletion9 = true;
+ var _didIteratorError9 = false;
+ var _iteratorError9 = undefined;
+
+ try {
+ for (var _iterator9 = frames[key].framedef[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) {
+ var frame = _step9.value;
+
+ lines.push("echo file " + slashstr + "'" + frame['file'] + slashstr + "' >> " + confpath);
+ lines.push("echo duration " + frame['delay'] / 1000 + " >> " + confpath);
+ }
+ } catch (err) {
+ _didIteratorError9 = true;
+ _iteratorError9 = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion9 && _iterator9.return) {
+ _iterator9.return();
+ }
+ } finally {
+ if (_didIteratorError9) {
+ throw _iteratorError9;
+ }
+ }
+ }
+
+ lines.push("echo file " + slashstr + "'" + frames[key].framedef[frames[key].framedef.length - 1]['file'] + slashstr + "' >> " + confpath);
+ lines.push(isWindows ? "if %ext%==gif (" : "if [ $ext == \"gif\"]; then");
+ lines.push(ffmpeg + " -f concat -i " + confpath + " -vf palettegen " + foldername + "/palette.png");
+ lines.push(ffmpeg + " -f concat -i " + confpath + " -i " + foldername + "/palette.png -lavfi paletteuse -framerate 30 -vsync -1 -s " + width + "x" + height + " " + foldername + "/remux." + (isWindows ? "%ext%" : "$ext"));
+ lines.push(isWindows ? ") else (" : "else");
+ lines.push(ffmpeg + " -f concat -i " + confpath + " -framerate 30 -vsync -1 -s " + width + "x" + height + " " + foldername + "/remux." + (isWindows ? "%ext%" : "$ext"));
+ lines.push(isWindows ? ")" : "fi");
+ }
+ if (isWindows) {
+ lines.push("echo 完成 & pause");
+ } else {
+ lines.push("read -n 1 -p \"完成,按任意键退出\" m && echo");
+ }
+ return lines;
+};
+
/**返回默认的配置对象*/
PxerPrinter.defaultConfig = function () {
return {
@@ -1233,9 +1455,9 @@ var PxerThread = function (_PxerEvent) {
* @param {Object} config 线程的配置信息
* */
function PxerThread() {
- var _ref10 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
- id = _ref10.id,
- config = _ref10.config;
+ var _ref9 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+ id = _ref9.id,
+ config = _ref9.config;
_classCallCheck(this, PxerThread);
@@ -1433,13 +1655,13 @@ var PxerThreadManager = function (_PxerEvent2) {
* @param {number} thread - 线程数
* */
function PxerThreadManager() {
- var _ref11 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
- _ref11$timeout = _ref11.timeout,
- timeout = _ref11$timeout === undefined ? 5000 : _ref11$timeout,
- _ref11$retry = _ref11.retry,
- retry = _ref11$retry === undefined ? 3 : _ref11$retry,
- _ref11$thread = _ref11.thread,
- thread = _ref11$thread === undefined ? 8 : _ref11$thread;
+ var _ref10 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+ _ref10$timeout = _ref10.timeout,
+ timeout = _ref10$timeout === undefined ? 5000 : _ref10$timeout,
+ _ref10$retry = _ref10.retry,
+ retry = _ref10$retry === undefined ? 3 : _ref10$retry,
+ _ref10$thread = _ref10.thread,
+ thread = _ref10$thread === undefined ? 8 : _ref10$thread;
_classCallCheck(this, PxerThreadManager);
@@ -1529,13 +1751,13 @@ PxerThreadManager.prototype['run'] = function () {
return false;
};
- var _iteratorNormalCompletion6 = true;
- var _didIteratorError6 = false;
- var _iteratorError6 = undefined;
+ var _iteratorNormalCompletion10 = true;
+ var _didIteratorError10 = false;
+ var _iteratorError10 = undefined;
try {
var _loop = function _loop() {
- var thread = _step6.value;
+ var thread = _step10.value;
thread.on('load', function (data) {
@@ -1550,20 +1772,20 @@ PxerThreadManager.prototype['run'] = function () {
next(_this8, thread);
};
- for (var _iterator6 = this.threads[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
+ for (var _iterator10 = this.threads[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) {
_loop();
}
} catch (err) {
- _didIteratorError6 = true;
- _iteratorError6 = err;
+ _didIteratorError10 = true;
+ _iteratorError10 = err;
} finally {
try {
- if (!_iteratorNormalCompletion6 && _iterator6.return) {
- _iterator6.return();
+ if (!_iteratorNormalCompletion10 && _iterator10.return) {
+ _iterator10.return();
}
} finally {
- if (_didIteratorError6) {
- throw _iteratorError6;
+ if (_didIteratorError10) {
+ throw _iteratorError10;
}
}
}
@@ -1619,8 +1841,9 @@ var PxerApp = function (_PxerEvent3) {
/**
* 页面的作品数量
* @type {number|null}
+ * @see PxerApp.init
* */
- _this9.worksNum = PxerApp.getWorksNum();
+ _this9.worksNum = null;
/**
* 任务队列
@@ -1672,13 +1895,46 @@ var PxerApp = function (_PxerEvent3) {
}
_createClass(PxerApp, [{
- key: 'stop',
+ key: 'init',
+ /**
+ * 初始化时的耗时任务
+ */
+ value: function () {
+ var _ref11 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
+ return regeneratorRuntime.wrap(function _callee$(_context) {
+ while (1) {
+ switch (_context.prev = _context.next) {
+ case 0:
+ _context.next = 2;
+ return PxerApp.getWorksNum(document);
+
+ case 2:
+ this.worksNum = _context.sent;
+
+ case 3:
+ case 'end':
+ return _context.stop();
+ }
+ }
+ }, _callee, this);
+ }));
+
+ function init() {
+ return _ref11.apply(this, arguments);
+ }
+
+ return init;
+ }()
+
/**
* 停止执行当前任务
* 调用后仍会触发对应的finish*事件
* */
+
+ }, {
+ key: 'stop',
value: function stop() {
this.dispatch('stop');
this.ptm.stop();
@@ -1694,15 +1950,32 @@ var PxerApp = function (_PxerEvent3) {
return false;
};
- var onePageWorksNumber = this.pageType === 'search' ? 40 : 20;
+ var onePageWorksNumber = getOnePageWorkCount(this.pageType);
var pageNum = Math.ceil(this.taskOption.limit ? this.taskOption.limit : this.worksNum) / onePageWorksNumber;
- var separator = /\?/.test(document.URL) ? "&" : "?";
- for (var i = 0; i < pageNum; i++) {
+ if (this.pageType === "discovery") {
+ var mode;
+ switch (true) {
+ case document.URL.match(/mode=(r18|safe|all)/) === null:
+ mode = "all";break;
+ default:
+ mode = document.URL.match(/mode=(r18|safe|all)/)[1];break;
+ }
+ var recomCount = this.taskOption.limit ? this.taskOption.limit : this.worksNum;
this.taskList.push(new PxerPageRequest({
- url: document.URL + separator + "p=" + (i + 1)
+ url: 'https://www.pixiv.net/rpc/recommender.php?type=illust&sample_illusts=auto&num_recommendations=' + recomCount + '&page=discovery&mode=' + mode + '&tt=' + pixiv.context.token,
+ type: this.pageType
}));
+ } else {
+ var separator = document.URL.includes("?") ? "&" : "?";
+ var extraparam = this.pageType === 'rank' ? "&format=json" : "";
+ for (var i = 0; i < pageNum; i++) {
+ this.taskList.push(new PxerPageRequest({
+ type: this.pageType,
+ url: document.URL + separator + "p=" + (i + 1) + extraparam
+ }));
+ };
};
}
}, {
@@ -1742,13 +2015,13 @@ var PxerApp = function (_PxerEvent3) {
});
ptm.on('load', function () {
var parseResult = [];
- var _iteratorNormalCompletion7 = true;
- var _didIteratorError7 = false;
- var _iteratorError7 = undefined;
+ var _iteratorNormalCompletion11 = true;
+ var _didIteratorError11 = false;
+ var _iteratorError11 = undefined;
try {
- for (var _iterator7 = _this10.taskList[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
- var result = _step7.value;
+ for (var _iterator11 = _this10.taskList[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) {
+ var result = _step11.value;
result = PxerHtmlParser.parsePage(result);
if (!result) {
@@ -1758,16 +2031,16 @@ var PxerApp = function (_PxerEvent3) {
parseResult.push.apply(parseResult, _toConsumableArray(result));
}
} catch (err) {
- _didIteratorError7 = true;
- _iteratorError7 = err;
+ _didIteratorError11 = true;
+ _iteratorError11 = err;
} finally {
try {
- if (!_iteratorNormalCompletion7 && _iterator7.return) {
- _iterator7.return();
+ if (!_iteratorNormalCompletion11 && _iterator11.return) {
+ _iterator11.return();
}
} finally {
- if (_didIteratorError7) {
- throw _iteratorError7;
+ if (_didIteratorError11) {
+ throw _iteratorError11;
}
}
}
@@ -1842,13 +2115,13 @@ var PxerApp = function (_PxerEvent3) {
_this11.resultSet = [];
var tl = _this11.taskList.slice( //限制结果集条数
0, _this11.taskOption.limit ? _this11.taskOption.limit : undefined);
- var _iteratorNormalCompletion8 = true;
- var _didIteratorError8 = false;
- var _iteratorError8 = undefined;
+ var _iteratorNormalCompletion12 = true;
+ var _didIteratorError12 = false;
+ var _iteratorError12 = undefined;
try {
- for (var _iterator8 = tl[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
- var pwr = _step8.value;
+ for (var _iterator12 = tl[Symbol.iterator](), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) {
+ var pwr = _step12.value;
if (!pwr.completed) continue; //跳过未完成的任务
var pw = PxerHtmlParser.parseWorks(pwr);
@@ -1865,16 +2138,16 @@ var PxerApp = function (_PxerEvent3) {
_this11.resultSet.push(pw);
}
} catch (err) {
- _didIteratorError8 = true;
- _iteratorError8 = err;
+ _didIteratorError12 = true;
+ _iteratorError12 = err;
} finally {
try {
- if (!_iteratorNormalCompletion8 && _iterator8.return) {
- _iterator8.return();
+ if (!_iteratorNormalCompletion12 && _iterator12.return) {
+ _iterator12.return();
}
} finally {
- if (_didIteratorError8) {
- throw _iteratorError8;
+ if (_didIteratorError12) {
+ throw _iteratorError12;
}
}
}
@@ -1933,7 +2206,6 @@ var PxerApp = function (_PxerEvent3) {
/**
* 输出抓取到的作品
- * @return {string}
* */
value: function printWorks() {
var pp = new PxerPrinter(this.ppConfig);
@@ -1951,42 +2223,86 @@ var PxerApp = function (_PxerEvent3) {
;
/**直接抓取本页面的作品*/
-PxerApp.prototype['getThis'] = function () {
+PxerApp.prototype['getThis'] = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
var _this12 = this;
- // 生成任务对象
- var initdata = document.head.innerHTML.match(PxerHtmlParser.REGEXP['getInitData'])[0];
- var id = document.URL.match(/illust_id=(\d+)/)[1];
-
- initdata = PxerHtmlParser.getKeyFromStringObjectLiteral(initdata, "preload");
- initdata = PxerHtmlParser.getKeyFromStringObjectLiteral(initdata, 'illust');
- initdata = PxerHtmlParser.getKeyFromStringObjectLiteral(initdata, id);
- initdata = JSON.parse(initdata);
-
- var type = initdata.illustType;
- var pageCount = initdata.pageCount;
- var pwr = new PxerWorksRequest({
- isMultiple: pageCount > 1,
- id: id
- }); //[manga|ugoira|illust]
- switch (type) {
- case 2:
- pwr.type = 'ugoira';break;
- case 1:
- pwr.type = 'illust';break;
- case 0:
- pwr.type = 'manga';break;
- default:
- throw new Error("Unknown work type. id:" + id);
- }
- pwr.url = PxerHtmlParser.getUrlList(pwr);
- // 添加执行
- this.taskList.push(pwr);
- this.one('finishWorksTask', function () {
- return _this12.printWorks();
- });
- this.executeWroksTask();
-};
+ var initdata, id, type, pageCount, pwr;
+ return regeneratorRuntime.wrap(function _callee2$(_context2) {
+ while (1) {
+ switch (_context2.prev = _context2.next) {
+ case 0:
+ // 生成任务对象
+ initdata = document.head.innerHTML.match(PxerHtmlParser.REGEXP['getInitData'])[0];
+ id = document.URL.match(/illust_id=(\d+)/)[1];
+
+
+ initdata = PxerHtmlParser.getKeyFromStringObjectLiteral(initdata, "preload");
+ initdata = PxerHtmlParser.getKeyFromStringObjectLiteral(initdata, 'illust');
+ initdata = PxerHtmlParser.getKeyFromStringObjectLiteral(initdata, id);
+
+ if (!initdata) {
+ _context2.next = 9;
+ break;
+ }
+
+ initdata = JSON.parse(initdata);
+ _context2.next = 14;
+ break;
+
+ case 9:
+ _context2.next = 11;
+ return fetch("https://www.pixiv.net/ajax/illust/" + id);
+
+ case 11:
+ _context2.next = 13;
+ return _context2.sent.json();
+
+ case 13:
+ initdata = _context2.sent['body'];
+
+ case 14:
+ ;
+
+ type = initdata.illustType;
+ pageCount = initdata.pageCount;
+ pwr = new PxerWorksRequest({
+ isMultiple: pageCount > 1,
+ id: id
+ }); //[manga|ugoira|illust]
+
+ _context2.t0 = type;
+ _context2.next = _context2.t0 === 2 ? 21 : _context2.t0 === 1 ? 23 : _context2.t0 === 0 ? 25 : 27;
+ break;
+
+ case 21:
+ pwr.type = 'ugoira';return _context2.abrupt('break', 28);
+
+ case 23:
+ pwr.type = 'illust';return _context2.abrupt('break', 28);
+
+ case 25:
+ pwr.type = 'manga';return _context2.abrupt('break', 28);
+
+ case 27:
+ throw new Error("Unknown work type. id:" + id);
+
+ case 28:
+ pwr.url = PxerHtmlParser.getUrlList(pwr);
+ // 添加执行
+ this.taskList = [pwr];
+ this.one('finishWorksTask', function () {
+ return _this12.printWorks();
+ });
+ this.executeWroksTask();
+ return _context2.abrupt('return', true);
+
+ case 33:
+ case 'end':
+ return _context2.stop();
+ }
+ }
+ }, _callee2, this);
+}));
/**
* 获取当前页面的总作品数
@@ -1994,9 +2310,69 @@ PxerApp.prototype['getThis'] = function () {
* @return {number} - 作品数
* */
PxerApp.getWorksNum = function () {
+ var _this13 = this;
+
var dom = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
- var elt = dom.querySelector(".count-badge");
- if (!elt) return null;
- return parseInt(elt.innerHTML);
+ return new Promise(function (resolve, reject) {
+ if (getPageType() === "rank") {
+ var queryurl = dom.URL + "&format=json";
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", queryurl);
+ xhr.onload = function (e) {
+ return resolve(JSON.parse(xhr.responseText)['rank_total']);
+ };
+ xhr.send();
+ } else if (getPageType() === "bookmark_new") {
+ // 关注的新作品页数最多100页
+ // 因为一般用户关注的用户数作品都足够填满100页,所以从100开始尝试页数
+ // 如果没有100页进行一次二分查找
+ var currpage = parseInt(dom.querySelector("ul.page-list>li.current").innerHTML);
+ _this13.getFollowingBookmarkWorksNum(currpage, 100, 100).then(function (res) {
+ return resolve(res);
+ });
+ } else if (getPageType() === "discovery") {
+ resolve(3000);
+ } else {
+ var elt = dom.querySelector(".count-badge");
+ if (!elt) resolve(null);
+ resolve(parseInt(elt.innerHTML));
+ }
+ });
+};
+
+/**
+ * 获取关注的新作品页的总作品数
+ * @param {number} min - 最小页数
+ * @param {number} max - 最大页数
+ * @param {number} cur - 当前页数
+ * @return {number} - 作品数
+ */
+PxerApp.getFollowingBookmarkWorksNum = function (min, max, cur) {
+ var _this14 = this;
+
+ return new Promise(function (resolve, reject) {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", "https://www.pixiv.net/bookmark_new_illust.php?p=" + cur);
+ xhr.onload = function (e) {
+ var html = xhr.response;
+ var el = document.createElement("div");
+ el.innerHTML = html;
+ if (min === max) {
+ var lastworkcount = JSON.parse(el.querySelector("div#js-mount-point-latest-following").getAttribute("data-items")).length;
+ resolve((min - 1) * 20 + lastworkcount);
+ } else {
+ if (!!el.querySelector("div._no-item")) {
+ _this14.getFollowingBookmarkWorksNum(min, cur - 1, parseInt((min + cur) / 2)).then(function (res) {
+ return resolve(res);
+ });
+ } else {
+ _this14.getFollowingBookmarkWorksNum(cur, max, parseInt((cur + max + 1) / 2)).then(function (res) {
+ return resolve(res);
+ });
+ }
+ }
+ };
+ xhr.send();
+ });
};
\ No newline at end of file
diff --git a/dist/support.js b/dist/support.js
index 2101e6c..4e7d07f 100644
--- a/dist/support.js
+++ b/dist/support.js
@@ -7,22 +7,26 @@
// 环境检测
window['PXER_SUPPORT'] = true;
window['PXER_LOAD_APP'] = false;
- var supportType = ['bookmark_works', 'member_works', 'search', 'works_medium'];
+ var supportType = ['bookmark_works', 'member_works', 'search', 'works_medium', 'bookmark_new', 'rank', 'discovery'];
var URLData = parseURL(document.URL);
if (URLData.domain === 'www.pixiv.net') {
if (supportType.indexOf(getPageType()) !== -1) {
window['PXER_SUPPORT'] = true;
window['PXER_LOAD_APP'] = true;
+ window['PXER_LOAD_ANALYTICS'] = true;
} else {
window['PXER_SUPPORT'] = true;
window['PXER_LOAD_APP'] = false;
+ window['PXER_LOAD_ANALYTICS'] = true;
}
} else if (URLData.domain === '127.0.0.1' || URLData.domain === 'localhost') {
window['PXER_SUPPORT'] = true;
window['PXER_LOAD_APP'] = true;
+ window['PXER_LOAD_ANALYTICS'] = false;
} else {
window['PXER_SUPPORT'] = false;
window['PXER_LOAD_APP'] = false;
+ window['PXER_LOAD_ANALYTICS'] = false;
return; //退出整个程序
};
@@ -30,7 +34,7 @@
var appClass = /**/"dist/pxer-core.js"; //*/[];
var viewTpl = /**/"dist/view/template.html"; //*/'';
var viewStyles = /**/"dist/view/style.css"; //*/[];
- var viewScripts = /**/["dist/view/vue.min.js", "dist/view/vm.js"]; //*/[];
+ var viewScripts = /**/["dist/view/PxerAnalytics.class.js", "dist/view/vue.min.js", "dist/view/vm.js"]; //*/[];
var afterRun = /**/"dist/run.js"; //*/[];
var linkResource = /**/["dist/public/favicon.ico"]; //*/[];
diff --git a/dist/view/PxerAnalytics.class.js b/dist/view/PxerAnalytics.class.js
new file mode 100644
index 0000000..7b4c72e
--- /dev/null
+++ b/dist/view/PxerAnalytics.class.js
@@ -0,0 +1,50 @@
+'use strict';
+
+/**
+ * Pxer统计类
+ * @class
+ * */
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var PxerAnalytics = function () {
+ function PxerAnalytics() {
+ _classCallCheck(this, PxerAnalytics);
+
+ this.uid = window.localStorage.getItem("PXER_UID");
+ if (!this.uid) {
+ this.uid = Math.random().toString(36).replace(/[^a-z]+/g, '') + Math.random().toString(36).replace(/[^a-z]+/g, '');
+ window.localStorage.setItem("PXER_UID", this.uid);
+ }
+ this.enabled = window['PXER_LOAD_ANALYTICS'] && !window.localStorage.getItem("PXER_OPT_OUT_ANALYTICS");
+ }
+
+ _createClass(PxerAnalytics, [{
+ key: 'postData',
+
+ /**
+ *
+ * @param {String} event - 发送的事件名称
+ * @param {Object} data - 发送的数据(uid|pxer_mode|referer自动添加)
+ */
+ value: function postData(event, data) {
+ if (!this.enabled) return;
+ data.uid = this.uid;
+ data.pxer_mode = window['PXER_MODE'];
+
+ var xhr = new XMLHttpRequest();
+ xhr.open("POST", window['PXER_URL'] + "stats/" + event.replace(/\./g, "/"), true);
+ xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
+ xhr.onerror = function (e) {
+ return console.error('PxerAnalytics.postData: ' + e.error);
+ };
+ xhr.send(JSON.stringify(data));
+ }
+ }]);
+
+ return PxerAnalytics;
+}();
+
+;
\ No newline at end of file
diff --git a/dist/view/style.css b/dist/view/style.css
index 941716b..78d1bdf 100644
--- a/dist/view/style.css
+++ b/dist/view/style.css
@@ -1,10 +1,4 @@
.pxer-app {
- /*!
- * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
- * Copyright 2011-2017 The Bootstrap Authors
- * Copyright 2011-2017 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
max-width: 970px;
width: 100%;
margin: 0 auto;
@@ -17,11 +11,12 @@
.pxer-app *::before,
.pxer-app *::after {
box-sizing: inherit; }
+
@-ms-viewport {
width: device-width; }
.pxer-app html {
-ms-overflow-style: scrollbar;
- -webkit-tap-highlight-color: transparent; }
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
.pxer-app body {
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
font-size: 1rem;
@@ -492,7 +487,8 @@
.pxer-app .btn-primary.disabled, .pxer-app .btn-primary:disabled {
background-color: #0275d8;
border-color: #0275d8; }
- .pxer-app .btn-primary:active, .pxer-app .btn-primary.active, .show > .pxer-app .btn-primary.dropdown-toggle {
+ .pxer-app .btn-primary:active, .pxer-app .btn-primary.active,
+ .show > .pxer-app .btn-primary.dropdown-toggle {
color: #fff;
background-color: #025aa5;
background-image: none;
@@ -510,7 +506,8 @@
.pxer-app .btn-secondary.disabled, .pxer-app .btn-secondary:disabled {
background-color: #fff;
border-color: #ccc; }
- .pxer-app .btn-secondary:active, .pxer-app .btn-secondary.active, .show > .pxer-app .btn-secondary.dropdown-toggle {
+ .pxer-app .btn-secondary:active, .pxer-app .btn-secondary.active,
+ .show > .pxer-app .btn-secondary.dropdown-toggle {
color: #292b2c;
background-color: #e6e6e6;
background-image: none;
@@ -528,7 +525,8 @@
.pxer-app .btn-info.disabled, .pxer-app .btn-info:disabled {
background-color: #5bc0de;
border-color: #5bc0de; }
- .pxer-app .btn-info:active, .pxer-app .btn-info.active, .show > .pxer-app .btn-info.dropdown-toggle {
+ .pxer-app .btn-info:active, .pxer-app .btn-info.active,
+ .show > .pxer-app .btn-info.dropdown-toggle {
color: #fff;
background-color: #31b0d5;
background-image: none;
@@ -546,7 +544,8 @@
.pxer-app .btn-success.disabled, .pxer-app .btn-success:disabled {
background-color: #5cb85c;
border-color: #5cb85c; }
- .pxer-app .btn-success:active, .pxer-app .btn-success.active, .show > .pxer-app .btn-success.dropdown-toggle {
+ .pxer-app .btn-success:active, .pxer-app .btn-success.active,
+ .show > .pxer-app .btn-success.dropdown-toggle {
color: #fff;
background-color: #449d44;
background-image: none;
@@ -564,7 +563,8 @@
.pxer-app .btn-warning.disabled, .pxer-app .btn-warning:disabled {
background-color: #f0ad4e;
border-color: #f0ad4e; }
- .pxer-app .btn-warning:active, .pxer-app .btn-warning.active, .show > .pxer-app .btn-warning.dropdown-toggle {
+ .pxer-app .btn-warning:active, .pxer-app .btn-warning.active,
+ .show > .pxer-app .btn-warning.dropdown-toggle {
color: #fff;
background-color: #ec971f;
background-image: none;
@@ -582,7 +582,8 @@
.pxer-app .btn-danger.disabled, .pxer-app .btn-danger:disabled {
background-color: #d9534f;
border-color: #d9534f; }
- .pxer-app .btn-danger:active, .pxer-app .btn-danger.active, .show > .pxer-app .btn-danger.dropdown-toggle {
+ .pxer-app .btn-danger:active, .pxer-app .btn-danger.active,
+ .show > .pxer-app .btn-danger.dropdown-toggle {
color: #fff;
background-color: #c9302c;
background-image: none;
@@ -601,7 +602,8 @@
.pxer-app .btn-outline-primary.disabled, .pxer-app .btn-outline-primary:disabled {
color: #0275d8;
background-color: transparent; }
- .pxer-app .btn-outline-primary:active, .pxer-app .btn-outline-primary.active, .show > .pxer-app .btn-outline-primary.dropdown-toggle {
+ .pxer-app .btn-outline-primary:active, .pxer-app .btn-outline-primary.active,
+ .show > .pxer-app .btn-outline-primary.dropdown-toggle {
color: #fff;
background-color: #0275d8;
border-color: #0275d8; }
@@ -619,7 +621,8 @@
.pxer-app .btn-outline-secondary.disabled, .pxer-app .btn-outline-secondary:disabled {
color: #ccc;
background-color: transparent; }
- .pxer-app .btn-outline-secondary:active, .pxer-app .btn-outline-secondary.active, .show > .pxer-app .btn-outline-secondary.dropdown-toggle {
+ .pxer-app .btn-outline-secondary:active, .pxer-app .btn-outline-secondary.active,
+ .show > .pxer-app .btn-outline-secondary.dropdown-toggle {
color: #fff;
background-color: #ccc;
border-color: #ccc; }
@@ -637,7 +640,8 @@
.pxer-app .btn-outline-info.disabled, .pxer-app .btn-outline-info:disabled {
color: #5bc0de;
background-color: transparent; }
- .pxer-app .btn-outline-info:active, .pxer-app .btn-outline-info.active, .show > .pxer-app .btn-outline-info.dropdown-toggle {
+ .pxer-app .btn-outline-info:active, .pxer-app .btn-outline-info.active,
+ .show > .pxer-app .btn-outline-info.dropdown-toggle {
color: #fff;
background-color: #5bc0de;
border-color: #5bc0de; }
@@ -655,7 +659,8 @@
.pxer-app .btn-outline-success.disabled, .pxer-app .btn-outline-success:disabled {
color: #5cb85c;
background-color: transparent; }
- .pxer-app .btn-outline-success:active, .pxer-app .btn-outline-success.active, .show > .pxer-app .btn-outline-success.dropdown-toggle {
+ .pxer-app .btn-outline-success:active, .pxer-app .btn-outline-success.active,
+ .show > .pxer-app .btn-outline-success.dropdown-toggle {
color: #fff;
background-color: #5cb85c;
border-color: #5cb85c; }
@@ -673,7 +678,8 @@
.pxer-app .btn-outline-warning.disabled, .pxer-app .btn-outline-warning:disabled {
color: #f0ad4e;
background-color: transparent; }
- .pxer-app .btn-outline-warning:active, .pxer-app .btn-outline-warning.active, .show > .pxer-app .btn-outline-warning.dropdown-toggle {
+ .pxer-app .btn-outline-warning:active, .pxer-app .btn-outline-warning.active,
+ .show > .pxer-app .btn-outline-warning.dropdown-toggle {
color: #fff;
background-color: #f0ad4e;
border-color: #f0ad4e; }
@@ -691,7 +697,8 @@
.pxer-app .btn-outline-danger.disabled, .pxer-app .btn-outline-danger:disabled {
color: #d9534f;
background-color: transparent; }
- .pxer-app .btn-outline-danger:active, .pxer-app .btn-outline-danger.active, .show > .pxer-app .btn-outline-danger.dropdown-toggle {
+ .pxer-app .btn-outline-danger:active, .pxer-app .btn-outline-danger.active,
+ .show > .pxer-app .btn-outline-danger.dropdown-toggle {
color: #fff;
background-color: #d9534f;
border-color: #d9534f; }
@@ -844,4 +851,25 @@
.pxer-app .text-right {
text-align: right; }
-/*# sourceMappingURL=style.css.map */
+div#wave {
+ position: relative;
+ margin-left: auto;
+ margin-right: auto; }
+ div#wave .dot {
+ display: inline-block;
+ width: 9px;
+ height: 9px;
+ border-radius: 50%;
+ margin-right: 3px;
+ background: #303131;
+ animation: wave 1.3s linear infinite; }
+ div#wave .dot:nth-child(2) {
+ animation-delay: -1.1s; }
+ div#wave .dot:nth-child(3) {
+ animation-delay: -0.9s; }
+
+@keyframes wave {
+ 0%, 60%, 100% {
+ transform: initial; }
+ 30% {
+ transform: translateY(-8px); } }
diff --git a/dist/view/template.html b/dist/view/template.html
index 29b4529..71746ff 100644
--- a/dist/view/template.html
+++ b/dist/view/template.html
@@ -10,7 +10,7 @@
diff --git a/dist/view/vm.js b/dist/view/vm.js
index c9eb9cf..80c54e6 100644
--- a/dist/view/vm.js
+++ b/dist/view/vm.js
@@ -17,9 +17,10 @@ afterLoad(function () {
return {
pxer: new PxerApp(),
showAll: false,
- state: 'loaded', //[loaded|ready|page|works|finish|re-ready|stop|error]
+ state: 'standby', //[standby|init|ready|page|works|finish|re-ready|stop|error]
stateMap: {
- loaded: '初始完毕',
+ standby: '待命',
+ init: '初始化',
ready: '就绪',
page: '抓取页码中',
works: '抓取作品中',
@@ -41,18 +42,26 @@ afterLoad(function () {
stopId: ''
},
showLoadBtn: true,
- errmsg: ''
+ errmsg: '',
+ analytics: new PxerAnalytics()
};
},
created: function created() {
var _this = this;
window['PXER_VM'] = this;
+ window['PXER_ANALYTICS'] = this.analytics;
+ this.analytics.postData("pxer.app.created", {});
this.pxer.on('error', function (err) {
_this.errmsg = err;
});
- this.pxer.on('finishWorksTask', function () {
- window.blinkTitle();
+ this.pxer.on('finishWorksTask', function (result) {
+ _this.analytics.postData("pxer.app.finish", {
+ result_count: result.length,
+ ptm_config: _this.pxer.ptmConfig,
+ task_option: _this.pxer.taskOption,
+ error_count: _this.pxer.failList.length
+ });
});
},
@@ -62,6 +71,9 @@ afterLoad(function () {
'member_works': '作品列表页',
'search': '检索页',
'bookmark_works': '收藏列表页',
+ 'rank': '排行榜',
+ 'bookmark_new': '关注的新作品',
+ 'discovery': '探索',
'unknown': '未知'
};
return map[this.pxer.pageType];
@@ -74,7 +86,8 @@ afterLoad(function () {
return this.pxer.taskOption.limit || this.pxer.worksNum;
},
taskCount: function taskCount() {
- return Math.ceil(this.worksNum / 20) + +this.worksNum;
+ var pageWorkCount = getOnePageWorkCount(this.pxer.pageType);
+ return Math.ceil(this.worksNum / pageWorkCount) + +this.worksNum;
},
finishCount: function finishCount() {
if (this.state === 'page') {
@@ -166,19 +179,34 @@ afterLoad(function () {
load: function load() {
var _this4 = this;
+ this.state = 'init';
if (this.pxer.pageType === 'works_medium') {
- this.pxer.getThis();
this.showLoadBtn = false;
this.pxer.one('finishWorksTask', function () {
- return _this4.showLoadBtn = true;
+ _this4.showLoadBtn = true;
+ _this4.state = 'standby';
});
+ this.pxer.getThis();
} else {
- this.state = 'ready';
+ this.pxer.init().then(function () {
+ return _this4.state = 'ready';
+ });
+ this.pxer.on('finishWorksTask', function () {
+ window.blinkTitle();
+ });
}
+ this.analytics.postData("pxer.app.load", {
+ page_type: this.pxer.pageType
+ });
},
run: function run() {
var _this5 = this;
+ this.analytics.postData("pxer.app.start", {
+ ptm_config: this.pxer.ptmConfig,
+ task_option: this.pxer.taskOption,
+ vm_state: this.state
+ });
if (this.state === 'ready') {
this.state = 'page';
this.pxer.initPageTask();
@@ -203,12 +231,31 @@ afterLoad(function () {
stop: function stop() {
this.state = 'stop';
this.pxer.stop();
+ this.analytics.postData("pxer.app.halt", {
+ task_count: this.taskCount,
+ finish_count: this.finishCount
+ });
},
count: function count() {
this.taskInfo = this.pxer.getWorksInfo();
},
+ printWorks: function printWorks() {
+ this.pxer.printWorks();
+ var sanitizedpfConfig = {};
+ for (var key in this.pxer.pfConfig) {
+ sanitizedpfConfig[key] = this.pxer.pfConfig[key].length ? this.pxer.pfConfig[key].length : this.pxer.pfConfig[key];
+ }
+ this.analytics.postData("pxer.app.print", {
+ pp_config: this.pxer.ppConfig,
+ pf_config: sanitizedpfConfig,
+ task_option: this.pxer.taskOption
+ });
+ },
useTaskOption: function useTaskOption() {
this.showTaskOption = false;
+ this.analytics.postData("pxer.app.taskoption", {
+ task_option: this.taskOption
+ });
Object.assign(this.pxer.taskOption, this.taskOption);
},
formatFailType: function formatFailType(type) {
@@ -235,6 +282,9 @@ afterLoad(function () {
var _tryFailWroksList;
(_tryFailWroksList = this.tryFailWroksList).push.apply(_tryFailWroksList, _toConsumableArray(this.checkedFailWorksList));
+ this.analytics.postData("pxer.app.reready", {
+ checked_works: this.checkedFailWorksList
+ });
this.checkedFailWorksList = [];
this.state = 're-ready';
},
diff --git a/src/launcher.js b/src/launcher.js
index ffd337d..78ba1fc 100644
--- a/src/launcher.js
+++ b/src/launcher.js
@@ -4,7 +4,7 @@
~function(){
var libURL =/**/"src/app/lib.js";//*/'';
var supportURL =/**/"src/app/support.js";//*/'';
- window['PXER_VERSION'] =/**/"7.0.11";//*/'';
+ window['PXER_VERSION'] =/**/"7.1.0";//*/'';
Promise.resolve().then(function(){
var script = document.createElement('script');