UNPKG

rsshub

Version:
82 lines (80 loc) 3.12 kB
import "./esm-shims-CzJ_djXG.mjs"; import { t as config } from "./config-C37vj7VH.mjs"; import "./dist-BInvbO1W.mjs"; import "./logger-Czu8UMNd.mjs"; import "./ofetch-BIyrKU3Y.mjs"; import { t as parseDate } from "./parse-date-BrP7mxXf.mjs"; import "./not-found-Z_3JX2qs.mjs"; import { t as cache_default } from "./cache-Bo__VnGm.mjs"; import "./render-BQo6B4tL.mjs"; import { t as config_not_found_default } from "./config-not-found-Dyp3RlZZ.mjs"; import { l as utils_default } from "./google-Z2XIyS1r.mjs"; import pMap from "p-map"; //#region lib/routes/youtube/subscriptions.ts const route = { path: "/subscriptions/:embed?", categories: ["social-media"], example: "/youtube/subscriptions", parameters: { embed: "Default to embed the video, set to any value to disable embedding" }, features: { requireConfig: [ { name: "YOUTUBE_KEY", description: "" }, { name: "YOUTUBE_CLIENT_ID", description: "" }, { name: "YOUTUBE_CLIENT_SECRET", description: "" }, { name: "YOUTUBE_REFRESH_TOKEN", description: "" } ] }, radar: [{ source: ["www.youtube.com/feed/subscriptions", "www.youtube.com/feed/channels"], target: "/subscriptions" }], name: "Subscriptions", maintainers: ["TonyRL"], handler, url: "www.youtube.com/feed/subscriptions" }; async function handler(ctx) { if (!config.youtube || !config.youtube.key || !config.youtube.clientId || !config.youtube.clientSecret || !config.youtube.refreshToken) throw new config_not_found_default("YouTube RSS is disabled due to the lack of <a href=\"https://docs.rsshub.app/deploy/config#route-specific-configurations\">relevant config</a>"); const embed = !ctx.req.param("embed"); const channelIds = (await utils_default.getSubscriptions("snippet", cache_default)).data.items.map((item) => item.snippet.resourceId.channelId); const playlistIds = await pMap(channelIds, async (channelId) => (await utils_default.getChannelWithId(channelId, "contentDetails", cache_default)).data.items[0].contentDetails.relatedPlaylists.uploads, { concurrency: 30 }); let items = await pMap(playlistIds, async (playlistId) => (await utils_default.getPlaylistItems(playlistId, "snippet", cache_default))?.data.items, { concurrency: 30 }); items = items.flat(); items = items.filter((i) => i && !i.error && i.snippet.title !== "Private video" && i.snippet.title !== "Deleted video").map((item) => { const snippet = item.snippet; const videoId = snippet.resourceId.videoId; const img = utils_default.getThumbnail(snippet.thumbnails); return { title: snippet.title, description: utils_default.renderDescription(embed, videoId, img, utils_default.formatDescription(snippet.description)), pubDate: parseDate(snippet.publishedAt), link: `https://www.youtube.com/watch?v=${videoId}`, author: snippet.videoOwnerChannelTitle, image: img.url }; }); const ret = { title: "Subscriptions - YouTube", description: "YouTube Subscriptions", link: "www.youtube.com/feed/subscriptions", item: items }; ctx.set("json", { ...ret, channelIds, playlistIds }); return ret; } //#endregion export { route };