rsshub
Version:
Make RSS Great Again!
78 lines (76 loc) • 2.56 kB
JavaScript
import { n as init_esm_shims, t as __dirname } from "./esm-shims-CzJ_djXG.mjs";
import "./config-C37vj7VH.mjs";
import { t as ViewType } from "./types-D84BRIt4.mjs";
import "./dist-BInvbO1W.mjs";
import "./logger-Czu8UMNd.mjs";
import { t as ofetch_default } from "./ofetch-BIyrKU3Y.mjs";
import { t as art } from "./render-BQo6B4tL.mjs";
import path from "node:path";
import * as cheerio from "cheerio";
//#region lib/routes/imdb/chart.ts
init_esm_shims();
const render = (data) => art(path.join(__dirname, "templates/chart-2e926210.art"), data);
const route = {
path: "/chart/:chart?",
categories: ["multimedia"],
view: ViewType.Notifications,
parameters: { chart: {
description: "The chart to display, `top` by default",
options: [
{
value: "top",
label: "Top 250 Movies"
},
{
value: "moviemeter",
label: "Most Popular Movies"
},
{
value: "toptv",
label: "Top 250 TV Shows"
},
{
value: "tvmeter",
label: "Most Popular TV Shows"
}
],
default: "top"
} },
example: "/imdb/chart",
radar: [{ source: ["www.imdb.com/chart/:chart/"] }],
name: "Charts",
maintainers: ["TonyRL"],
handler,
url: "www.imdb.com/chart/top/",
description: `| Top 250 Movies | Most Popular Movies | Top 250 TV Shows | Most Popular TV Shows |
| -------------- | ------------------- | ---------------- | --------------------- |
| top | moviemeter | toptv | tvmeter |`
};
async function handler(ctx) {
const { chart = "top" } = ctx.req.param();
const baseUrl = "https://www.imdb.com";
const link = `${baseUrl}/chart/${chart}/`;
const response = await ofetch_default(link);
const $ = cheerio.load(response);
const chartTitles = JSON.parse($("script#__NEXT_DATA__").text()).props.pageProps.pageData.chartTitles;
const items = chartTitles.edges.map(({ currentRank, node }) => ({
title: `${currentRank}. ${node.titleText.text} (${node.releaseYear.year}${node.releaseYear.endYear ? `-${node.releaseYear.endYear}` : ""})`,
description: render({
primaryImage: node.primaryImage,
originalTitleText: node.originalTitleText,
certificate: node.certificate,
ratingsSummary: node.ratingsSummary,
plot: node.plot
}),
link: `${baseUrl}/title/${node.id}`,
category: node.titleGenres.genres.map((g) => chartTitles.genres.find((genre) => genre.filterId === g.genre.text)?.text)
}));
return {
title: $("head title").text(),
description: $("head meta[name=\"description\"]").attr("content"),
link,
item: items
};
}
//#endregion
export { route };