rsshub
Version:
Make RSS Great Again!
137 lines (125 loc) • 5.57 kB
JavaScript
import { t as rofetch } from "./ofetch-C3ts-Hud.mjs";
import { t as config } from "./config-CCmw1BNE.mjs";
import { t as cache_default } from "./cache-BkqOokyU.mjs";
import { h as renderYoutube } from "./google-Dsvx580L.mjs";
//#region lib/routes/youtube/charts.ts
const route = {
path: "/charts/:category?/:country?/:embed?",
categories: ["social-media"],
example: "/youtube/charts",
parameters: {
category: "Chart, see table below, default to `TopVideos`",
country: "Country Code, see table below, default to global",
embed: "Default to embed the video, set to any value to disable embedding"
},
name: "Music Charts",
maintainers: ["TonyRL"],
handler,
description: `Chart
| Top artists | Top songs | Top music videos | Trending |
| ----------- | --------- | ---------------- | -------------- |
| TopArtists | TopSongs | TopVideos | TrendingVideos |
Country Code
| Argentina | Australia | Austria | Belgium | Bolivia | Brazil | Canada |
| --------- | --------- | ------- | ------- | ------- | ------ | ------ |
| ar | au | at | be | bo | br | ca |
| Chile | Colombia | Costa Rica | Czechia | Denmark | Dominican Republic | Ecuador |
| ----- | -------- | ---------- | ------- | ------- | ------------------ | ------- |
| cl | co | cr | cz | dk | do | ec |
| Egypt | El Salvador | Estonia | Finland | France | Germany | Guatemala |
| ----- | ----------- | ------- | ------- | ------ | ------- | --------- |
| eg | sv | ee | fi | fr | de | gt |
| Honduras | Hungary | Iceland | India | Indonesia | Ireland | Israel | Italy |
| -------- | ------- | ------- | ----- | --------- | ------- | ------ | ----- |
| hn | hu | is | in | id | ie | il | it |
| Japan | Kenya | Luxembourg | Mexico | Netherlands | New Zealand | Nicaragua |
| ----- | ----- | ---------- | ------ | ----------- | ----------- | --------- |
| jp | ke | lu | mx | nl | nz | ni |
| Nigeria | Norway | Panama | Paraguay | Peru | Poland | Portugal | Romania |
| ------- | ------ | ------ | -------- | ---- | ------ | -------- | ------- |
| ng | no | pa | py | pe | pl | pt | ro |
| Russia | Saudi Arabia | Serbia | South Africa | South Korea | Spain | Sweden | Switzerland |
| ------ | ------------ | ------ | ------------ | ----------- | ----- | ------ | ----------- |
| ru | sa | rs | za | kr | es | se | ch |
| Tanzania | Turkey | Uganda | Ukraine | United Arab Emirates | United Kingdom | United States |
| -------- | ------ | ------ | ------- | -------------------- | -------------- | ------------- |
| tz | tr | ug | ua | ae | gb | us |
| Uruguay | Zimbabwe |
| ------- | -------- |
| uy | zw |`
};
async function handler(ctx) {
const contentMap = {
TopArtists: {
contentKey: "artists",
viewKey: "artistViews",
title: "Top artists"
},
TopSongs: {
contentKey: "trackTypes",
viewKey: "trackViews",
title: "Top songs"
},
TopVideos: {
contentKey: "videos",
viewKey: "videoViews",
title: "Top music videos"
},
TrendingVideos: {
contentKey: "videos",
viewKey: "videoViews",
title: "Trending"
}
};
const { category = "TopVideos", country } = ctx.req.param();
const embed = !ctx.req.param("embed");
const { content } = await cache_default.tryGet(`youtube:charts:${country ?? "global"}`, async () => {
return (await rofetch("https://charts.youtube.com/youtubei/v1/browse", {
method: "POST",
query: {
alt: "json",
key: "AIzaSyCzEW7JUJdSql0-2V4tHUb6laYm4iAE_dM"
},
body: {
browseId: "FEmusic_analytics_charts_home",
context: {
capabilities: {},
client: {
clientName: "WEB_MUSIC_ANALYTICS",
clientVersion: "0.2",
experimentIds: [],
experimentsToken: "",
gl: "US",
hl: "en",
theme: "MUSIC"
},
request: { internalExperimentFlags: [] }
},
query: `chart_params_type=WEEK&perspective=CHART&flags=viral_video_chart&selected_chart=TRACKS&chart_params_id=weekly:0:0${country ? `:${country}` : ""}`
}
})).contents.sectionListRenderer.contents[0].musicAnalyticsSectionRenderer;
}, config.cache.routeExpire, false);
const { entityId } = content.perspectiveMetadata;
const items = category === "TopArtists" ? content[contentMap[category].contentKey][0][contentMap[category].viewKey].map((item) => ({
title: item.name,
link: `https://charts.youtube.com/artist/${encodeURIComponent(item.id)}`,
guid: `youtube:charts:${category}:${entityId}:${item.id}`
})) : content[contentMap[category].contentKey][category === "TrendingVideos" ? 1 : 0][contentMap[category].viewKey].map((item) => {
const videoId = category === "TopSongs" ? item.encryptedVideoId : item.id;
const author = item.artists.filter((a) => a.name).map((artist) => artist.name).join(", ");
return {
title: `${item.title ?? item.name} - ${author}`,
description: renderYoutube(embed, videoId, item.thumbnail?.thumbnails.pop().url, ""),
link: `https://www.youtube.com/watch?v=${videoId}`,
guid: `youtube:charts:${category}:${entityId}:${item.id}`,
author
};
});
return {
title: `YouTube Music Charts - ${contentMap[category].title}`,
link: `https://charts.youtube.com/charts/${category}/${country ?? "global"}`,
item: items
};
}
//#endregion
export { route };