UNPKG

hexo-bilibili-bangumi

Version:
634 lines (632 loc) 29.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* eslint-disable no-underscore-dangle */ var fs = require('hexo-fs'); var path = require('path'); var axios = require('axios'); var hexoLog = require('hexo-log'); var log = typeof hexoLog["default"] === 'function' ? hexoLog["default"]({ debug: false, silent: false }) : hexoLog({ debug: false, silent: false }); var ProgressBar = require('progress'); var cheerio = require('cheerio'); var tunnel = require('tunnel'); var bangumiData = require('bangumi-data'); var jp2cnName = function jp2cnName(name) { var _bangumiData$items$fi; return ((_bangumiData$items$fi = bangumiData.items.find(function (item) { return item.title === name; })) === null || _bangumiData$items$fi === void 0 || (_bangumiData$items$fi = _bangumiData$items$fi.titleTranslate) === null || _bangumiData$items$fi === void 0 || (_bangumiData$items$fi = _bangumiData$items$fi['zh-Hans']) === null || _bangumiData$items$fi === void 0 ? void 0 : _bangumiData$items$fi[0]) || name; }; var TYPE = { 1: '书籍', 2: '动画', 3: '音乐', 4: '游戏', 6: '三次元' }; var getBangumiDataFromBangumiSubject = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(items, sourceDir, proxy, coverMirror) { return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return Promise.allSettled(items.map(/*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(item, index) { var cachePath, subjectPath, options; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: cachePath = path.join(sourceDir, '/_data/Bangumi-Subject-Cache'); subjectPath = path.join(cachePath, "".concat(item.id, ".json")); if (!fs.existsSync(cachePath)) { fs.mkdirSync(cachePath); } if (!fs.existsSync(subjectPath)) { _context.next = 5; break; } return _context.abrupt("return", { config: { itemData: item }, data: fs.readFileSync(subjectPath).toString(), status: 200 }); case 5: options = { itemData: item, responseType: 'json', validateStatus: function validateStatus(status) { return status >= 200 && status < 300 || status === 403; }, proxy: false, timeout: 30 * 1000 }; if (proxy !== null && proxy !== void 0 && proxy.host && proxy !== null && proxy !== void 0 && proxy.port) { options.httpsAgent = tunnel.httpsOverHttp({ proxy: proxy, options: { rejectUnauthorized: false } }); } _context.next = 9; return axios.get("https://cdn.jsdelivr.net/gh/czy0729/Bangumi-Subject@master/data/".concat(parseInt(parseInt(item.id, 10) / 100, 10), "/").concat(item.id, ".json"), options).then(function (response) { return response; })["catch"](function (error) { if (error.response) { console.error('Error', error.response.status); } else { console.error('Error', error.stack); } return { config: { itemData: item }, error: error }; }); case 9: return _context.abrupt("return", _context.sent); case 10: case "end": return _context.stop(); } }, _callee); })); return function (_x5, _x6) { return _ref2.apply(this, arguments); }; }())); case 2: return _context2.abrupt("return", _context2.sent.map(function (_ref3) { var value = _ref3.value, reason = _ref3.reason; var _ref4 = value || reason, config = _ref4.config, data = _ref4.data, status = _ref4.status; var bangumiData = data; if (reason || status === 403 || !data) { return { id: config === null || config === void 0 ? void 0 : config.itemData.id, title: jp2cnName(config.itemData.name), type: '未知', cover: config.itemData.cover, score: '-', des: '-', wish: '-', doing: '-', collect: '-', totalCount: '-' }; } if (typeof data === 'string') { try { // eslint-disable-next-line no-param-reassign bangumiData = JSON.parse(data.replace(/(?<!":|\/|\\)("[^":,\]}][^"]*?[^":])"(?!,|]|}|:)/g, '\\$1\\"')); } catch (e) { console.log("Error Id: ".concat(config.itemData.id)); console.error(e); } } var _bangumiData = bangumiData, id = _bangumiData.id, name = _bangumiData.name, type = _bangumiData.type, image = _bangumiData.image, _bangumiData$rating = _bangumiData.rating, _bangumiData$rating2 = _bangumiData$rating === void 0 ? {} : _bangumiData$rating, score = _bangumiData$rating2.score, summary = _bangumiData.summary, _bangumiData$collecti = _bangumiData.collection, _bangumiData$collecti2 = _bangumiData$collecti === void 0 ? {} : _bangumiData$collecti, wish = _bangumiData$collecti2.wish, doing = _bangumiData$collecti2.doing, collect = _bangumiData$collecti2.collect, eps = _bangumiData.eps, epsLength = _bangumiData.epsLength; var totalCount = epsLength || (eps === null || eps === void 0 ? void 0 : eps.length); var subjectPath = path.join(sourceDir, '/_data/Bangumi-Subject-Cache', "".concat(config.itemData.id, ".json")); if (!fs.existsSync(subjectPath)) { if (id && name && type && image && score && summary && wish && doing && collect && (eps === null || eps === void 0 ? void 0 : eps.length) > 0) { fs.writeFileSync(subjectPath, JSON.stringify({ id: id, name: name, type: type, image: image, rating: { score: score }, summary: summary, collection: { wish: wish, doing: doing, collect: collect }, epsLength: eps.length })); } } return { id: id || config.itemData.id, title: jp2cnName(name || config.itemData.name), type: TYPE[type] || '未知', cover: coverMirror + image || config.itemData.cover, score: score || '-', des: (summary === null || summary === void 0 ? void 0 : summary.replace(/\r?\n/g, '').trim()) || '-', wish: wish || '-', doing: doing || '-', collect: collect || '-', totalCount: totalCount ? "\u5168".concat(totalCount).concat(type === 6 ? '集' : '话') : '-', myStars: config.itemData.myStars, myComment: config.itemData.myComment }; })); case 3: case "end": return _context2.stop(); } }, _callee2); })); return function getBangumiDataFromBangumiSubject(_x, _x2, _x3, _x4) { return _ref.apply(this, arguments); }; }(); var getBangumiDataFromBangumiApi = /*#__PURE__*/function () { var _ref5 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4(items, sourceDir, proxy, coverMirror) { return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return Promise.allSettled(items.map(/*#__PURE__*/function () { var _ref6 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3(item, index) { var cachePath, subjectPath, options; return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: cachePath = path.join(sourceDir, '/_data/Bangumi-Api-Cache'); subjectPath = path.join(cachePath, "".concat(item.id, ".json")); if (!fs.existsSync(cachePath)) { fs.mkdirSync(cachePath); } if (!fs.existsSync(subjectPath)) { _context3.next = 5; break; } return _context3.abrupt("return", { config: { itemData: item }, data: JSON.parse(fs.readFileSync(subjectPath).toString()), status: 200 }); case 5: options = { itemData: item, responseType: 'json', validateStatus: function validateStatus(status) { return status >= 200 && status < 300 || status === 403; }, proxy: false, timeout: 30 * 1000 }; if (proxy !== null && proxy !== void 0 && proxy.host && proxy !== null && proxy !== void 0 && proxy.port) { options.httpsAgent = tunnel.httpsOverHttp({ proxy: proxy, options: { rejectUnauthorized: false } }); } _context3.next = 9; return axios.get("https://api.bgm.tv/v0/subjects/".concat(item.id), _objectSpread(_objectSpread({}, options), {}, { headers: { 'user-agent': 'HCLonely/hexo-bilibili-bangumi (https://github.com/HCLonely/hexo-bilibili-bangumi)' } })).then(function (response) { return response; })["catch"](function (error) { if (error.response) { console.error('Error', error.response.status); } else { console.error('Error', error.stack); } return { config: { itemData: item }, error: error }; }); case 9: return _context3.abrupt("return", _context3.sent); case 10: case "end": return _context3.stop(); } }, _callee3); })); return function (_x11, _x12) { return _ref6.apply(this, arguments); }; }())); case 2: return _context4.abrupt("return", _context4.sent.map(function (_ref7) { var value = _ref7.value, reason = _ref7.reason; var _ref8 = value || reason, config = _ref8.config, data = _ref8.data, status = _ref8.status; if (reason || status === 403 || !data) { return { id: config.itemData.id, title: jp2cnName(config.itemData.name), type: '未知', cover: config.itemData.cover, score: '-', des: '-', wish: '-', doing: '-', collect: '-', totalCount: '-' }; } // eslint-disable-next-line camelcase var id = data.id, name = data.name, name_cn = data.name_cn, type = data.type, image = data.images.common, _data$rating = data.rating, _data$rating2 = _data$rating === void 0 ? {} : _data$rating, score = _data$rating2.score, summary = data.summary, _data$collection = data.collection, _data$collection2 = _data$collection === void 0 ? {} : _data$collection, wish = _data$collection2.wish, doing = _data$collection2.doing, collect = _data$collection2.collect, eps = data.eps, total_episodes = data.total_episodes; // eslint-disable-next-line camelcase var totalCount = total_episodes || eps; var subjectPath = path.join(sourceDir, '/_data/Bangumi-Api-Cache', "".concat(config.itemData.id, ".json")); if (!fs.existsSync(subjectPath)) { // eslint-disable-next-line camelcase if (id && name && type && image && score && summary && wish && doing && collect && (total_episodes || eps)) { // eslint-disable-next-line camelcase fs.writeFileSync(subjectPath, JSON.stringify({ id: id, name: name, name_cn: name_cn, type: type, images: { common: image }, rating: { score: score }, summary: summary, collection: { wish: wish, doing: doing, collect: collect }, eps: eps, total_episodes: total_episodes })); } } return { id: id || config.itemData.id, // eslint-disable-next-line camelcase title: name_cn || jp2cnName(name || config.itemData.name), type: TYPE[type] || '未知', cover: coverMirror + image || config.itemData.cover, score: score || '-', des: (summary === null || summary === void 0 ? void 0 : summary.replace(/\r?\n/g, '').trim()) || '-', wish: wish || '-', doing: doing || '-', collect: collect || '-', totalCount: totalCount ? "\u5168".concat(totalCount).concat(type === 6 ? '集' : '话') : '-', myStars: config.itemData.myStars, myComment: config.itemData.myComment }; })); case 3: case "end": return _context4.stop(); } }, _callee4); })); return function getBangumiDataFromBangumiApi(_x7, _x8, _x9, _x10) { return _ref5.apply(this, arguments); }; }(); var getItemsId = /*#__PURE__*/function () { var _ref10 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5(_ref9) { var _response$request$pat; var vmid, type, status, showProgress, sourceDir, proxy, infoApi, host, coverMirror, getBangumiData, items, bar, options, response, username, $, pageNum, _loop, i; return _regenerator["default"].wrap(function _callee5$(_context6) { while (1) switch (_context6.prev = _context6.next) { case 0: vmid = _ref9.vmid, type = _ref9.type, status = _ref9.status, showProgress = _ref9.showProgress, sourceDir = _ref9.sourceDir, proxy = _ref9.proxy, infoApi = _ref9.infoApi, host = _ref9.host, coverMirror = _ref9.coverMirror; getBangumiData = infoApi === 'bgmSub' ? getBangumiDataFromBangumiSubject : getBangumiDataFromBangumiApi; items = []; options = { proxy: false, timeout: 30 * 1000 }; if (proxy !== null && proxy !== void 0 && proxy.host && proxy !== null && proxy !== void 0 && proxy.port) { options.httpsAgent = tunnel.httpsOverHttp({ proxy: proxy, options: { rejectUnauthorized: false } }); } _context6.next = 7; return axios.get("https://".concat(host, "/").concat(type, "/list/").concat(vmid, "/").concat(status, "?page=1"), options); case 7: response = _context6.sent; username = (_response$request$pat = response.request.path.match(/(anime|game|real)\/list\/(.*?)\//)) === null || _response$request$pat === void 0 ? void 0 : _response$request$pat[2]; if (username) { _context6.next = 11; break; } return _context6.abrupt("return", console.error('Failed to get "username"!')); case 11: if (!(response !== null && response !== void 0 && response.data)) { _context6.next = 32; break; } $ = cheerio.load(response.data); pageNum = Math.max.apply(Math, (0, _toConsumableArray2["default"])($('#multipage').find('a').map(function (index, el) { var _$$attr; return parseInt(((_$$attr = $(el).attr('href')) === null || _$$attr === void 0 || (_$$attr = _$$attr.match(/\?page=([\d]+)/)) === null || _$$attr === void 0 ? void 0 : _$$attr[1]) || '0', 10); }).get())) || $('#multipage').find('a').length; _context6.t0 = items.push; _context6.t1 = items; _context6.t2 = _toConsumableArray2["default"]; _context6.next = 19; return getBangumiData($('#browserItemList>li').map(function (index, el) { var _$$find$attr; return { id: $(el).attr('id').replace('item_', ''), cover: $(el).find('img').attr('src'), name: $(el).find('h3>a').text(), myStars: (_$$find$attr = $(el).find('.starlight').attr('class')) === null || _$$find$attr === void 0 || (_$$find$attr = _$$find$attr.match(/stars([\d]+)/)) === null || _$$find$attr === void 0 ? void 0 : _$$find$attr[1], myComment: $(el).find('#comment_box').text().trim() }; }).get(), sourceDir, proxy, coverMirror); case 19: _context6.t3 = _context6.sent; _context6.t4 = (0, _context6.t2)(_context6.t3); _context6.t0.apply.call(_context6.t0, _context6.t1, _context6.t4); if (showProgress) { // eslint-disable-next-line no-nested-ternary bar = new ProgressBar("\u6B63\u5728\u83B7\u53D6 ".concat(status === 'wish' ? '[想看]' : status === 'do' ? '[在看]' : '[已看]', " ").concat(type === 'game' ? '游戏' : type === 'real' ? '追剧' : '番剧', " [:bar] :percent :elapseds"), { total: pageNum < 2 ? 1 : pageNum, complete: '█' }); bar.tick(); } if (!(pageNum < 2)) { _context6.next = 25; break; } return _context6.abrupt("return", items); case 25: _loop = /*#__PURE__*/_regenerator["default"].mark(function _loop() { var response, $; return _regenerator["default"].wrap(function _loop$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: if (showProgress) bar.tick(); _context5.next = 3; return axios.get("https://".concat(host, "/").concat(type, "/list/").concat(username, "/").concat(status, "?page=").concat(i), _objectSpread(_objectSpread({}, options), {}, { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 Edg/97.0.1072.69' })); case 3: response = _context5.sent; $ = cheerio.load(response.data); _context5.t0 = items.push; _context5.t1 = items; _context5.t2 = _toConsumableArray2["default"]; _context5.next = 10; return getBangumiData($('#browserItemList>li').map(function (index, el) { var _$$find$attr2; return { id: $(el).attr('id').replace('item_', ''), cover: $(el).find('img').attr('src'), name: $(el).find('h3>a').text(), myStars: (_$$find$attr2 = $(el).find('.starlight').attr('class')) === null || _$$find$attr2 === void 0 || (_$$find$attr2 = _$$find$attr2.match(/stars([\d]+)/)) === null || _$$find$attr2 === void 0 ? void 0 : _$$find$attr2[1], myComment: $(el).find('#comment_box').text().trim() }; }).get(), sourceDir, proxy, coverMirror); case 10: _context5.t3 = _context5.sent; _context5.t4 = (0, _context5.t2)(_context5.t3); _context5.t0.apply.call(_context5.t0, _context5.t1, _context5.t4); case 13: case "end": return _context5.stop(); } }, _loop); }); i = 2; case 27: if (!(i <= pageNum)) { _context6.next = 32; break; } return _context6.delegateYield(_loop(), "t5", 29); case 29: i++; _context6.next = 27; break; case 32: return _context6.abrupt("return", items); case 33: case "end": return _context6.stop(); } }, _callee5); })); return function getItemsId(_x13) { return _ref10.apply(this, arguments); }; }(); module.exports.getBgmData = /*#__PURE__*/function () { var _getBgmData = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6(_ref11) { var vmid, type, showProgress, sourceDir, extraOrder, pagination, proxy, infoApi, host, coverMirror, typePathMap, startTime, wantWatch, watching, watched, endTime, bangumis, allBangumis, _JSON$parse, wantWatchExtra, watchingExtra, watchedExtra; return _regenerator["default"].wrap(function _callee6$(_context7) { while (1) switch (_context7.prev = _context7.next) { case 0: vmid = _ref11.vmid, type = _ref11.type, showProgress = _ref11.showProgress, sourceDir = _ref11.sourceDir, extraOrder = _ref11.extraOrder, pagination = _ref11.pagination, proxy = _ref11.proxy, infoApi = _ref11.infoApi, host = _ref11.host, coverMirror = _ref11.coverMirror; log.info('Getting bangumis, please wait...'); typePathMap = { bangumi: 'anime', game: 'game', cinema: 'real' }; startTime = new Date().getTime(); _context7.next = 6; return getItemsId({ vmid: vmid, type: typePathMap[type], status: 'wish', showProgress: showProgress, sourceDir: sourceDir, proxy: proxy, infoApi: infoApi, host: host, coverMirror: coverMirror }); case 6: wantWatch = _context7.sent; _context7.next = 9; return getItemsId({ vmid: vmid, type: typePathMap[type], status: 'do', showProgress: showProgress, sourceDir: sourceDir, proxy: proxy, infoApi: infoApi, host: host, coverMirror: coverMirror }); case 9: watching = _context7.sent; _context7.next = 12; return getItemsId({ vmid: vmid, type: typePathMap[type], status: 'collect', showProgress: showProgress, sourceDir: sourceDir, proxy: proxy, infoApi: infoApi, host: host, coverMirror: coverMirror }); case 12: watched = _context7.sent; endTime = new Date().getTime(); log.info("".concat(wantWatch.length + watching.length + watched.length, " ").concat(type, "s have been loaded in ").concat(endTime - startTime, " ms")); bangumis = { wantWatch: wantWatch, watching: watching, watched: watched }; if (!fs.existsSync(path.join(sourceDir, '/_data/'))) { fs.mkdirSync(path.join(sourceDir, '/_data/')); } fs.writeFile(path.join(sourceDir, "/_data/".concat(type, "s.json")), JSON.stringify(bangumis), function (err) { if (err) { log.info("Failed to write data to _data/".concat(type, "s.json")); console.error(err); } else { log.info("Bangumi ".concat(type, "s data has been saved")); } }); if (pagination) { allBangumis = _objectSpread({}, bangumis); // extra bangumis if (fs.existsSync(path.join(sourceDir, "/_data/extra_".concat(type, "s.json")))) { _JSON$parse = JSON.parse(fs.readFileSync(path.join(this.source_dir, "/_data/extra_".concat(type, "s.json")))), wantWatchExtra = _JSON$parse.wantWatchExtra, watchingExtra = _JSON$parse.watchingExtra, watchedExtra = _JSON$parse.watchedExtra; if (wantWatchExtra) { if (extraOrder === 1) { allBangumis.wantWatch = [].concat((0, _toConsumableArray2["default"])(wantWatchExtra), (0, _toConsumableArray2["default"])(allBangumis.wantWatch)); } else { allBangumis.wantWatch = [].concat((0, _toConsumableArray2["default"])(allBangumis.wantWatch), (0, _toConsumableArray2["default"])(wantWatchExtra)); } } if (watchingExtra) { if (extraOrder === 1) { allBangumis.watching = [].concat((0, _toConsumableArray2["default"])(watchingExtra), (0, _toConsumableArray2["default"])(allBangumis.watching)); } else { allBangumis.watching = [].concat((0, _toConsumableArray2["default"])(allBangumis.watching), (0, _toConsumableArray2["default"])(watchingExtra)); } } if (watchedExtra) { if (extraOrder === 1) { allBangumis.watched = [].concat((0, _toConsumableArray2["default"])(watchedExtra), (0, _toConsumableArray2["default"])(allBangumis.watched)); } else { allBangumis.watched = [].concat((0, _toConsumableArray2["default"])(allBangumis.watched), (0, _toConsumableArray2["default"])(watchedExtra)); } } } fs.writeFile(path.join(sourceDir, "/".concat(type, "s.json")), JSON.stringify(allBangumis), function (err) { if (err) { log.info("Failed to write data to ".concat(type, "s.json")); console.error(err); } else { log.info("Bangumi ".concat(type, "s data has been saved")); } }); } case 19: case "end": return _context7.stop(); } }, _callee6, this); })); function getBgmData(_x14) { return _getBgmData.apply(this, arguments); } return getBgmData; }();