UNPKG

hexo-bilibili-bangumi

Version:
251 lines (250 loc) 14.1 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; } var fs = require('hexo-fs'); var path = require('path'); var axios = require('axios'); var hexoLog = require('hexo-log'); var ANILIST_API = 'https://graphql.anilist.co'; var CACHE_DIR = '_data'; var CACHE_FILE = 'bangumis.json'; var EXTRA_CACHE_FILE = 'extra_bangumis.json'; var USER_AGENT = 'HCLonely/hexo-bilibili-bangumi'; var MAX_RETRIES = 3; var RETRY_DELAY = 1000; var STATUS_MAP = { PLANNING: 'wantWatch', CURRENT: 'watching', REPEATING: 'watching', COMPLETED: 'watched' }; var log = typeof hexoLog["default"] === 'function' ? hexoLog["default"]({ debug: false, silent: false }) : hexoLog({ debug: false, silent: false }); var MEDIA_LIST_QUERY = "\n query($userId:Int,$userName:String,$type:MediaType){\n MediaListCollection(userId:$userId,userName:$userName,type:$type){\n lists{\n entries{\n ...mediaListEntry\n }\n }\n }\n }\n fragment mediaListEntry on MediaList{\n id\n mediaId\n status\n score\n progress\n notes\n media{\n id\n title{\n userPreferred\n romaji\n english\n native\n }\n coverImage{\n large\n }\n status(version:2)\n episodes\n averageScore\n popularity\n countryOfOrigin\n genres\n description(asHtml: false)\n }\n }\n"; var delay = function delay(ms) { return new Promise(function (resolve) { return setTimeout(resolve, ms); }); }; var _fetchWithRetry = function () { var _ref = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee(postData) { var retries, response, _args = arguments, _t; return _regenerator["default"].wrap(function (_context) { while (1) switch (_context.prev = _context.next) { case 0: retries = _args.length > 1 && _args[1] !== undefined ? _args[1] : MAX_RETRIES; _context.prev = 1; _context.next = 2; return axios.post(ANILIST_API, postData, { headers: { 'User-Agent': USER_AGENT } }); case 2: response = _context.sent; return _context.abrupt("return", response); case 3: _context.prev = 3; _t = _context["catch"](1); if (!(retries > 0)) { _context.next = 5; break; } _context.next = 4; return delay(RETRY_DELAY); case 4: return _context.abrupt("return", _fetchWithRetry(postData, retries - 1)); case 5: throw _t; case 6: case "end": return _context.stop(); } }, _callee, null, [[1, 3]]); })); return function fetchWithRetry(_x) { return _ref.apply(this, arguments); }; }(); var formatBangumiData = function formatBangumiData(bangumi, coverMirror) { var _bangumi$media, _bangumi$media2, _bangumi$media3, _bangumi$media4, _bangumi$media5, _bangumi$media6, _bangumi$media7, _bangumi$media8, _bangumi$media$averag, _bangumi$media9, _bangumi$media0, _bangumi$media1, _bangumi$media10, _bangumi$media11; return { title: (bangumi === null || bangumi === void 0 || (_bangumi$media = bangumi.media) === null || _bangumi$media === void 0 || (_bangumi$media = _bangumi$media.title) === null || _bangumi$media === void 0 ? void 0 : _bangumi$media.userPreferred) || (bangumi === null || bangumi === void 0 || (_bangumi$media2 = bangumi.media) === null || _bangumi$media2 === void 0 || (_bangumi$media2 = _bangumi$media2.title) === null || _bangumi$media2 === void 0 ? void 0 : _bangumi$media2["native"]) || (bangumi === null || bangumi === void 0 || (_bangumi$media3 = bangumi.media) === null || _bangumi$media3 === void 0 || (_bangumi$media3 = _bangumi$media3.title) === null || _bangumi$media3 === void 0 ? void 0 : _bangumi$media3.english) || (bangumi === null || bangumi === void 0 || (_bangumi$media4 = bangumi.media) === null || _bangumi$media4 === void 0 || (_bangumi$media4 = _bangumi$media4.title) === null || _bangumi$media4 === void 0 ? void 0 : _bangumi$media4.romaji), type: (bangumi === null || bangumi === void 0 || (_bangumi$media5 = bangumi.media) === null || _bangumi$media5 === void 0 || (_bangumi$media5 = _bangumi$media5.genres) === null || _bangumi$media5 === void 0 ? void 0 : _bangumi$media5[0]) || '-', cover: coverMirror + (bangumi === null || bangumi === void 0 || (_bangumi$media6 = bangumi.media) === null || _bangumi$media6 === void 0 || (_bangumi$media6 = _bangumi$media6.coverImage) === null || _bangumi$media6 === void 0 ? void 0 : _bangumi$media6.large), totalCount: bangumi === null || bangumi === void 0 || (_bangumi$media7 = bangumi.media) === null || _bangumi$media7 === void 0 ? void 0 : _bangumi$media7.episodes, id: bangumi === null || bangumi === void 0 || (_bangumi$media8 = bangumi.media) === null || _bangumi$media8 === void 0 ? void 0 : _bangumi$media8.id, score: (_bangumi$media$averag = bangumi === null || bangumi === void 0 || (_bangumi$media9 = bangumi.media) === null || _bangumi$media9 === void 0 ? void 0 : _bangumi$media9.averageScore) !== null && _bangumi$media$averag !== void 0 ? _bangumi$media$averag : '-', des: (bangumi === null || bangumi === void 0 || (_bangumi$media0 = bangumi.media) === null || _bangumi$media0 === void 0 || (_bangumi$media0 = _bangumi$media0.description) === null || _bangumi$media0 === void 0 || (_bangumi$media0 = _bangumi$media0.trim()) === null || _bangumi$media0 === void 0 || (_bangumi$media0 = _bangumi$media0.split('\n')) === null || _bangumi$media0 === void 0 || (_bangumi$media0 = _bangumi$media0[0]) === null || _bangumi$media0 === void 0 ? void 0 : _bangumi$media0.replace(/<[^>]*>?/g, '')) || '-', collect: (bangumi === null || bangumi === void 0 || (_bangumi$media1 = bangumi.media) === null || _bangumi$media1 === void 0 ? void 0 : _bangumi$media1.popularity) || '-', area: (bangumi === null || bangumi === void 0 || (_bangumi$media10 = bangumi.media) === null || _bangumi$media10 === void 0 ? void 0 : _bangumi$media10.countryOfOrigin) || '-', myStars: bangumi.score || null, myComment: bangumi.notes || null, progress: Math.round(((bangumi === null || bangumi === void 0 ? void 0 : bangumi.progress) || 0) / ((bangumi === null || bangumi === void 0 || (_bangumi$media11 = bangumi.media) === null || _bangumi$media11 === void 0 ? void 0 : _bangumi$media11.episodes) || 1) * 100), ep_status: (bangumi === null || bangumi === void 0 ? void 0 : bangumi.progress) || 0 }; }; var getData = function () { var _ref2 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee2(vmid, coverMirror) { var type, variables, postData, _response$data, response, $data, list, _args2 = arguments, _t2; return _regenerator["default"].wrap(function (_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: type = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : 'ANIME'; variables = _objectSpread({ type: type }, typeof vmid === 'number' ? { userId: vmid } : { userName: vmid }); postData = { query: MEDIA_LIST_QUERY, variables: variables }; _context2.prev = 1; _context2.next = 2; return _fetchWithRetry(postData); case 2: response = _context2.sent; if (!((response === null || response === void 0 ? void 0 : response.status) !== 200)) { _context2.next = 3; break; } throw new Error("API\u8BF7\u6C42\u5931\u8D25: ".concat(response === null || response === void 0 ? void 0 : response.status)); case 3: $data = { wantWatch: [], watching: [], watched: [] }; list = (response === null || response === void 0 || (_response$data = response.data) === null || _response$data === void 0 || (_response$data = _response$data.data) === null || _response$data === void 0 || (_response$data = _response$data.MediaListCollection) === null || _response$data === void 0 ? void 0 : _response$data.lists) || []; list.forEach(function (list) { list.entries.forEach(function (bangumi) { var status = STATUS_MAP[bangumi === null || bangumi === void 0 ? void 0 : bangumi.status]; if (status) { var _$data$status; (_$data$status = $data[status]) === null || _$data$status === void 0 || _$data$status.push(formatBangumiData(bangumi, coverMirror)); } }); }); return _context2.abrupt("return", $data); case 4: _context2.prev = 4; _t2 = _context2["catch"](1); log.error("\u83B7\u53D6AniList\u6570\u636E\u5931\u8D25: ".concat(_t2.message)); throw _t2; case 5: case "end": return _context2.stop(); } }, _callee2, null, [[1, 4]]); })); return function getData(_x2, _x3) { return _ref2.apply(this, arguments); }; }(); var ensureDataDir = function ensureDataDir(sourceDir) { var dataDir = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : CACHE_DIR; var dir = path.join(sourceDir, dataDir); if (!fs.existsSync(dir)) { fs.mkdirSync(dir); } return dir; }; var writeDataToFile = function writeDataToFile(filePath, data, errorMsg, successMsg) { try { fs.writeFileSync(filePath, JSON.stringify(data)); log.info(successMsg); } catch (err) { log.error(errorMsg); console.error(err); } }; var mergeExtraData = function mergeExtraData(bangumis, extras, order) { var result = _objectSpread({}, bangumis); var wantWatchExtra = extras.wantWatchExtra, watchingExtra = extras.watchingExtra, watchedExtra = extras.watchedExtra; ['wantWatch', 'watching', 'watched'].forEach(function (key) { var extra = { wantWatch: wantWatchExtra, watching: watchingExtra, watched: watchedExtra }[key]; if (extra) { result[key] = order === 1 ? [].concat((0, _toConsumableArray2["default"])(extra), (0, _toConsumableArray2["default"])(result[key])) : [].concat((0, _toConsumableArray2["default"])(result[key]), (0, _toConsumableArray2["default"])(extra)); } }); return result; }; module.exports.getAnilistData = function () { var _ref4 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee3(_ref3) { var vmid, type, sourceDir, extraOrder, pagination, coverMirror, startTime, bangumis, totalCount, endTime, mainDataPath, allBangumis, extraDataPath, extraData, paginationPath, _t3; return _regenerator["default"].wrap(function (_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: vmid = _ref3.vmid, type = _ref3.type, sourceDir = _ref3.sourceDir, extraOrder = _ref3.extraOrder, pagination = _ref3.pagination, coverMirror = _ref3.coverMirror; _context3.prev = 1; log.info('Getting anilist bangumi data, please wait...'); startTime = new Date().getTime(); _context3.next = 2; return getData(vmid, coverMirror, type); case 2: bangumis = _context3.sent; totalCount = Object.values(bangumis).reduce(function (sum, arr) { return sum + arr.length; }, 0); endTime = new Date().getTime(); log.info("".concat(totalCount, " bangumis have been loaded in ").concat(endTime - startTime, " ms")); ensureDataDir(sourceDir); mainDataPath = path.join(sourceDir, "/".concat(CACHE_DIR, "/").concat(CACHE_FILE)); writeDataToFile(mainDataPath, bangumis, 'Failed to write data to _data/bangumis.json', 'Anilist bangumis data has been saved'); if (pagination) { allBangumis = _objectSpread({}, bangumis); extraDataPath = path.join(sourceDir, "/".concat(CACHE_DIR, "/").concat(EXTRA_CACHE_FILE)); if (fs.existsSync(extraDataPath)) { extraData = JSON.parse(fs.readFileSync(extraDataPath)); allBangumis = mergeExtraData(allBangumis, extraData, extraOrder); } paginationPath = path.join(sourceDir, '/bangumis.json'); writeDataToFile(paginationPath, allBangumis, 'Failed to write data to bangumis.json', 'Anilist bangumis data has been saved'); } _context3.next = 4; break; case 3: _context3.prev = 3; _t3 = _context3["catch"](1); log.error("\u83B7\u53D6AniList\u6570\u636E\u5931\u8D25: ".concat(_t3.message)); throw _t3; case 4: case "end": return _context3.stop(); } }, _callee3, null, [[1, 3]]); })); return function (_x4) { return _ref4.apply(this, arguments); }; }();