rsshub
Version:
Make RSS Great Again!
79 lines (78 loc) • 3.41 kB
JavaScript
import { t as rofetch } from "./ofetch-C3ts-Hud.mjs";
import { t as config } from "./config-CCmw1BNE.mjs";
import { t as parseDate } from "./parse-date-Cr0wQjV_.mjs";
import { t as cache_default } from "./cache-BkqOokyU.mjs";
import { t as timezone } from "./timezone-BBvDwS_3.mjs";
import crypto from "node:crypto";
//#region lib/routes/qingting/podcast.ts
const qingtingId = config.qingting.id ?? "";
const route = {
path: "/podcast/:id",
categories: ["multimedia"],
example: "/qingting/podcast/293411",
parameters: { id: "专辑id, 可在专辑页 URL 中找到" },
features: {
supportPodcast: true,
requireConfig: [{
name: "QINGTING_ID",
optional: true,
description: "用户id, 部分专辑需要会员身份,用户id可以通过从网页端登录蜻蜓fm后使用开发者工具,在控制台中运行JSON.parse(localStorage.getItem(\"user\")).qingting_id获取"
}]
},
radar: [{ source: ["qingting.fm/channels/:id"] }],
name: "播客",
maintainers: [
"RookieZoe",
"huyyi",
"pseudoyu"
],
handler,
description: "获取的播放 URL 有效期只有 1 天,需要开启播客 APP 的自动下载功能。"
};
function getMediaUrl(channelId, mediaId) {
const path = `/audiostream/redirect/${channelId}/${mediaId}?access_token=&device_id=MOBILESITE&qingting_id=${qingtingId}&t=${Date.now()}`;
return `https://audio.qingting.fm${path}&sign=${crypto.createHmac("md5", "fpMn12&38f_2e").update(path).digest("hex").toString()}`;
}
async function handler(ctx) {
const channelId = ctx.req.param("id");
const pageSize = Number(ctx.req.query("limit")) || 30;
const response = await rofetch(`https://i.qingting.fm/capi/v3/channel/${channelId}`, { headers: { Referer: "https://www.qingting.fm/" } });
const title = response.data.title;
const channel_img = response.data.thumbs["400_thumb"];
const authors = response.data.podcasters.map((author) => author.nick_name).join(",");
const desc = response.data.description;
const { data: { programs } } = await rofetch(`https://i.qingting.fm/capi/channel/${channelId}/programs/${response.data.v}?curpage=1&pagesize=${pageSize}&order=asc`, { headers: { Referer: "https://www.qingting.fm/" } });
const { data: channelInfo } = await rofetch(`https://i.qingting.fm/capi/v3/channel/${channelId}?user_id=${qingtingId}`);
const isCharged = channelInfo.purchase?.item_type !== 0;
const isPaid = channelInfo.user_relevance?.sale_status === "paid";
const resultItems = await Promise.all(programs.map(async (item) => {
const data = await cache_default.tryGet(`qingting:podcast:${channelId}:${item.id}`, async () => {
const link = `https://www.qingting.fm/channels/${channelId}/programs/${item.id}/`;
const detailRes = await rofetch(link);
const detail = JSON.parse(detailRes.match(/\},"program":(.*?),"plist":/)[1]);
return {
title: item.title,
link,
itunes_item_image: item.cover,
itunes_duration: item.duration,
pubDate: timezone(parseDate(item.update_time), 8),
description: detail.richtext
};
});
if (!isCharged || isPaid || item.isfree) {
data.enclosure_url = getMediaUrl(channelId, item.id);
data.enclosure_type = "audio/x-m4a";
}
return data;
}));
return {
title: `${title} - 蜻蜓FM`,
description: desc,
itunes_author: authors,
image: channel_img,
link: `https://www.qingting.fm/channels/${channelId}`,
item: resultItems
};
}
//#endregion
export { route };