RSSHub/lib/v2/nintendo/utils.js

171 lines
6.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const got = require('@/utils/got');
const cheerio = require('cheerio');
const { JSDOM } = require('jsdom');
const { parseDate } = require('@/utils/parse-date');
const { art } = require('@/utils/render');
const path = require('path');
const dayjs = require('dayjs');
const localizedFormat = require('dayjs/plugin/localizedFormat');
require('dayjs/locale/zh-cn');
dayjs.extend(localizedFormat);
function nuxtReader(data) {
let nuxt = {};
try {
const dom = new JSDOM(data, {
runScripts: 'dangerously',
});
nuxt = dom.window.__NUXT__.data[0];
} catch (e) {
throw new Error('Nuxt 框架信息提取失败,请报告这个问题');
}
return nuxt;
}
function generateImageLink(link) {
return `<img src="${link}"><br/>`;
}
async function load(link) {
const response = await got(link);
const data = response.data;
const $ = cheerio.load(data); // 使用 cheerio 加载返回的 HTML
const description = $('.description').html();
return {
content: description,
};
}
async function loadNews(link) {
const response = await got(link);
const data = response.data;
const $ = cheerio.load(data);
let description = $('.detail-body-container').html();
const date = $('.topics-articleHead__date').text();
description = description.replace(/src="\/topics\//g, 'src="https://www.nintendo.com.hk/topics/');
return {
content: description,
pubDate: parseDate(date, 'YYYY.M.D'),
};
}
const ProcessItem = (list, caches) =>
Promise.all(
list.map(async (item) => {
const other = await caches.tryGet(item.link, () => load(item.link));
return { ...item, ...other };
})
);
const ProcessNews = (list, caches) =>
Promise.all(
list.map(async (item) => {
const other = await caches.tryGet(item.url, () => loadNews('https://www.nintendo.com.hk' + item.url));
return { ...item, ...other };
})
);
/*
Software Item Example
{
"nsUid": "70010000027088",
"gameProductCode": "HAC-P-ADALB",
"name": "新 超级马力欧兄弟U 豪华版",
"price": "299",
"currency": "CNY",
"images": ["//switch-cn.gtgres.com/global-images/c247f0e0-1654-11ea-9b40-236e671bca9e.png", "//switch-cn.gtgres.com/global-images/c62e52d0-1654-11ea-9b40-236e671bca9e.jpg", "//switch-cn.gtgres.com/global-images/c8ec6160-1654-11ea-9b40-236e671bca9e.jpg", "//switch-cn.gtgres.com/global-images/cb84e690-1654-11ea-9b40-236e671bca9e.jpg", "//switch-cn.gtgres.com/global-images/cdc1b730-1654-11ea-9b40-236e671bca9e.jpg", "//switch-cn.gtgres.com/global-images/cfd57c00-1654-11ea-9b40-236e671bca9e.jpg", "//switch-cn.gtgres.com/global-images/d1fe4f70-1654-11ea-9b40-236e671bca9e.jpg"],
"movies": [],
"purchaseUrls": [{
"key": "JD",
"url": "https://item.jd.com/100010400326.html"
}, {
"key": "TM",
"url": "https://detail.tmall.com/item.htm?id=608916438547"
}],
"descriptionTitle": "2D超级马力欧全新体验同享欢乐时光",
"descriptionContent": "《新 超级马力欧兄弟U 豪华版》是2D超级马力欧横版卷轴动作游戏。\\n\\n游戏包括《新 超级路易吉U》和《新 超级马力欧兄弟U》共164个关卡马力欧一行需要前往被酷霸王占领的桃花公主城堡利用多种新奇的能力强化与可靠有趣的伙伴在丰富多彩的世界中展开冒险。在《新 超级路易吉U》中关卡难度更高限时更短角色跳跃能力更强但也更易打滑非常适合喜欢挑战的玩家。\\n\\n游戏中有“马力欧”、“路易吉”、“奇诺比奥”、“偷天兔”和“奇诺比珂”5个角色供你选择其中“奇诺比珂”与“偷天兔”拥有非常适合新手的特殊能力即使不擅长动作游戏也可以轻松游玩。\\n\\n除了故事模式外游戏还提供课题模式、加倍模式和金币对战多种丰富的玩法。游戏支持最多4人一起游玩快与伙伴分享Joy-Con™一起趣玩吧",
"sizeNum": "2.1",
"sizeUnit": "GB",
"playMode": ["tv", "tabletop", "handheld"],
"normalPlayersNum": {
"min": 1,
"max": 4
},
"localPlayersNum": {
"min": 0,
"max": 0
},
"internatPlayersNum": {
"min": 0,
"max": 0
},
"handleSupport": "Nintendo Switch专业手柄",
"platform": "Nintendo Switch",
"developer": "Nintendo",
"publisher": "任天堂",
"genre": ["动作", "冒险", "家庭", "多人"],
"releaseDatetime": 1575907200000,
"supportLanguages": ["简体中文"],
"colors": {
"words": "3c3c3c",
"entrance": "e60012",
"background": "e8ebef"
},
"copyright": {
"publishCompany": "上海电子出版有限公司",
"operateCompany": "深圳市腾讯计算机系统有限公司",
"copyrightNotice": "© 2012-2019 Nintendo",
"isbn": "978-7-498-06914-6",
"gapp": "国新出审[2019]2990号",
"copyrightNumber": "电出字09-2019-031"
}
}
*/
const ProcessItemChina = (list, cache) =>
Promise.all(
list.map(async (item) => {
if (!item.link.startsWith('https://www.nintendoswitch.com.cn/software/')) {
return item;
}
const n = await cache.tryGet(item.link, async () => nuxtReader((await got(item.link)).data));
const software = n.data;
return {
...item,
category: [...software.supportLanguages, ...software.genre, ...software.playMode],
description: art(path.join(__dirname, 'templates/eshop_cn.art'), {
item,
software,
releaseDatetime: dayjs(software.releaseDatetime).locale('zh-cn').format('lll'),
}),
};
})
);
const ProcessNewsChina = (list, cache) =>
Promise.all(
list.map(async (item) => {
const n = await cache.tryGet(item.link, async () => nuxtReader((await got(item.link)).data));
return {
...item,
description: item.description + n.newsData.content,
category: n.newsData.category,
pubDate: parseDate(n.newsData.releaseTime, 'x'),
};
})
);
module.exports = {
ProcessItem,
ProcessNews,
ProcessNewsChina,
ProcessItemChina,
nuxtReader,
generateImageLink,
};