hydra/src/main/services/steam-250.ts

49 lines
1.3 KiB
TypeScript
Raw Normal View History

2024-04-18 07:46:06 +00:00
import axios from "axios";
import { JSDOM } from "jsdom";
2024-04-27 21:40:05 +00:00
export interface Steam250Game {
title: string;
objectID: string;
}
2024-04-18 07:46:06 +00:00
export const requestSteam250 = async (path: string) => {
return axios
.get(`https://steam250.com${path}`)
.then((response) => {
const { window } = new JSDOM(response.data);
const { document } = window;
return Array.from(document.querySelectorAll(".appline .title a"))
.map(($title: HTMLAnchorElement) => {
const steamGameUrl = $title.href;
if (!steamGameUrl) return null;
return {
title: $title.textContent,
objectID: steamGameUrl.split("/").pop(),
} as Steam250Game;
})
.filter((game) => game != null);
})
.catch((_) => [] as Steam250Game[]);
2024-04-18 07:46:06 +00:00
};
const steam250Paths = [
"/hidden_gems",
`/${new Date().getFullYear()}`,
"/top250",
"/most_played",
];
2024-04-27 21:40:05 +00:00
export const getSteam250List = async () => {
const gamesPromises = steam250Paths.map((path) => requestSteam250(path));
const gamesList = (await Promise.all(gamesPromises)).flat();
2024-04-27 23:42:28 +00:00
2024-04-28 01:04:35 +00:00
const gamesMap: Map<string, Steam250Game> = gamesList.reduce((map, item) => {
2024-04-27 23:42:28 +00:00
map.set(item.objectID, item);
return map;
2024-04-28 01:04:35 +00:00
}, new Map());
2024-04-27 23:42:28 +00:00
return [...gamesMap.values()];
2024-04-18 07:46:06 +00:00
};