UNPKG

rsshub

Version:
104 lines (102 loc) 3.23 kB
import "./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 "./ofetch-BIyrKU3Y.mjs"; import { t as parseDate } from "./parse-date-BrP7mxXf.mjs"; import "./helpers-DxBp0Pty.mjs"; import { t as got_default } from "./got-KxxWdaxq.mjs"; import { t as invalid_parameter_default } from "./invalid-parameter-rr4AgGpp.mjs"; //#region lib/routes/twitch/video.ts const TWITCH_CLIENT_ID = "kimne78kx3ncx6brgo4mv6wki5h1ko"; const FILTER_NODE_TYPE_MAP = { archive: "LATEST_BROADCASTS", highlights: "LATEST_NON_BROADCASTS", all: "ALL_VIDEOS" }; const route = { path: "/video/:login/:filter?", categories: ["live"], view: ViewType.Videos, example: "/twitch/video/riotgames/highlights", parameters: { login: "Twitch username", filter: { description: "Video type, Default to all", options: [ { value: "archive", label: "Archive" }, { value: "highlights", label: "Highlights" }, { value: "all", label: "All" } ], default: "all" } }, features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false }, radar: [{ source: ["www.twitch.tv/:login/videos"], target: "/video/:login" }], name: "Channel Video", maintainers: ["hoilc"], handler }; async function handler(ctx) { const login = ctx.req.param("login"); const filter = ctx.req.param("filter")?.toLowerCase() || "all"; if (!FILTER_NODE_TYPE_MAP[filter]) throw new invalid_parameter_default(`Unsupported filter type "${filter}", please choose from { ${Object.keys(FILTER_NODE_TYPE_MAP).join(", ")} }`); const channelVideoShelvesQueryData = (await got_default({ method: "post", url: "https://gql.twitch.tv/gql", headers: { Referer: "https://player.twitch.tv", "Client-ID": TWITCH_CLIENT_ID }, json: [{ operationName: "ChannelVideoShelvesQuery", variables: { channelLogin: login, first: 5 }, extensions: { persistedQuery: { version: 1, sha256Hash: "7b31d8ae7274b79d169a504e3727baaaed0d5ede101f4a38fc44f34d76827903" } } }] })).data[0].data; if (!channelVideoShelvesQueryData.user.id) throw new invalid_parameter_default(`Username does not exist`); const displayName = channelVideoShelvesQueryData.user.displayName; const videoShelvesEdge = channelVideoShelvesQueryData.user.videoShelves.edges.find((edge) => edge.node.type === FILTER_NODE_TYPE_MAP[filter]); if (!videoShelvesEdge) throw new invalid_parameter_default(`No video under filter type "${filter}"`); const out = videoShelvesEdge.node.items.map((item) => ({ title: item.title, link: `https://www.twitch.tv/videos/${item.id}`, author: displayName, pubDate: parseDate(item.publishedAt), description: `<img style="max-width: 100%;" src="${item.previewThumbnailURL}"><br/><img style="max-width: 100%;" src="${item.animatedPreviewURL}">`, category: item.game && [item.game.displayName] })); return { title: `Twitch - ${displayName} - ${videoShelvesEdge.node.title}`, link: `https://www.twitch.tv/${login}`, item: out }; } //#endregion export { route };