/
eshop-hk.ts
97 lines (88 loc) · 4.28 KB
/
eshop-hk.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import { Route } from '@/types';
import { getCurrentPath } from '@/utils/helpers';
const __dirname = getCurrentPath(import.meta.url);
import cache from '@/utils/cache';
import got from '@/utils/got';
import { load } from 'cheerio';
import { parseDate } from '@/utils/parse-date';
import { art } from '@/utils/render';
import path from 'node:path';
export const route: Route = {
path: '/eshop/hk',
radar: [
{
source: ['nintendo.com.hk/software/switch', 'nintendo.com.hk/'],
},
],
name: 'Unknown',
maintainers: [],
handler,
url: 'nintendo.com.hk/software/switch',
};
async function handler(ctx) {
const response = await got('https://www.nintendo.com.hk/data/json/switch_software.json');
const data = response.data.filter(({ link }) => link.startsWith('https://')).slice(0, ctx.req.query('limit') ? Number(ctx.req.query('limit')) : 30);
// 获取游戏描述
const result = await Promise.all(
data.map((item) =>
cache.tryGet(item.link, async () => {
const { data: response } = await got(item.link);
const $ = load(response);
let description;
if (item.link.startsWith('https://store.nintendo.com.hk/')) {
const attributes = {
platform: $('.platform .product-attribute-val').text(),
game_category: $('.game_category .product-attribute-val').text(),
release_date: $('.release_date .product-attribute-val').text(),
publisher: $('.publisher .product-attribute-val').text(),
no_of_players: $('.no_of_players .product-attribute-val').text(),
supported_languages: $('.supported_languages .product-attribute-val').text(),
required_space: $('.required_space .product-attribute-val').text(),
supported_controllers: $('.supported_controllers .product-attribute-val').text(),
supported_play_modes: $('.supported_play_modes .product-attribute-val').text(),
disclaimer: $('.disclaimer .product-attribute-val p').text(),
price: $('meta[property="product:price:amount"]').attr('content'),
currency: $('meta[property="product:price:currency"]').attr('content'),
};
const gallery = JSON.parse(
$('[type=text/x-magento-init]')
.text()
.match(/{\n\s+"\[data-gal{2}ery-role=gal{2}ery-placeholder]": {\n\s+"mage(?:\/gal{2}ery){2}".*?}{4}(?:\s+}\n){3}/s)
);
description = art(path.join(__dirname, 'templates/eshop_hk.art'), {
attributes,
description: $('.description').html(),
gallery: gallery['[data-gallery-role=gallery-placeholder]']['mage/gallery/gallery'].data,
host: 'store.nintendo.com.hk',
});
} else if (item.link.startsWith('https://ec.nintendo.com/')) {
const jsonData = JSON.parse(response.match(/NXSTORE\.titleDetail\.jsonData = ({.*?});/)[1]);
const { data: priceData } = await got('https://ec.nintendo.com/api/HK/zh/guest_prices', {
searchParams: {
ns_uids: jsonData.id,
},
});
description = art(path.join(__dirname, 'templates/eshop_hk.art'), {
host: 'ec.nintendo.com',
jsonData,
priceData: priceData[0],
});
} else {
// not implemented
}
return {
title: item.title,
description,
link: item.link,
pubDate: parseDate(item.release_date, 'YYYY.M.D'),
};
})
)
);
return {
title: 'Nintendo eShop(港服)新游戏',
link: 'https://www.nintendo.com.hk/software/switch/',
description: 'Nintendo eShop(港服)新上架的游戏',
item: result,
};
}