Files
UHD_Media_Tool/apps/web/app/api/discover.ts
T
rootandClaude Opus 5.5 709414778e feat(identity): 豆瓣 / bgm.tv 辅助信息源与发现页
- adapters/meta:bgm.tv 官方 API(条目 / 搜索 / 每日放送)与豆瓣移动版接口(条目 / 实时热门)
- 识别升级链:豆瓣条目缓存没有时在线查;AniBT 的 bgm ID、公开 BT 站标题搜 bgm → 名称 + 年份匹配 TMDB(季条目去季名与年份)
- 条目缓存 30 天,查不到 6 小时负缓存;测试进程缺省不出外网
- 发现页:bgm 每日放送、豆瓣热门电影 / 剧集,点条目匹配 TMDB 作品

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 21:30:16 +08:00

48 lines
1.5 KiB
TypeScript

import { useMutation, useQuery } from "@tanstack/react-query";
import { DiscoverCalendar, type DiscoverItem, DiscoverList, DiscoverMatchResult } from "@umt/contracts";
import { api } from "~/lib/api.ts";
import { getParsed, parseOrThrow } from "./library.ts";
// 发现:bgm.tv 每日放送、豆瓣热门(服务端缓存 1 小时);点条目时匹配 TMDB 作品。
export const discoverKeys = {
calendar: ["discover", "calendar"] as const,
hot: (kind: "movie" | "tv") => ["discover", "douban-hot", kind] as const,
};
export function useBangumiCalendar(enabled = true) {
return useQuery({
queryKey: discoverKeys.calendar,
enabled,
queryFn: ({ signal }) => getParsed(DiscoverCalendar, "/discover/bangumi-calendar", {}, signal),
staleTime: 30 * 60_000,
});
}
export function useDoubanHot(kind: "movie" | "tv", enabled = true) {
return useQuery({
queryKey: discoverKeys.hot(kind),
enabled,
queryFn: ({ signal }) => getParsed(DiscoverList, "/discover/douban-hot", { kind }, signal),
staleTime: 30 * 60_000,
});
}
export function useDiscoverMatch() {
return useMutation({
mutationFn: async (it: DiscoverItem) =>
parseOrThrow(
DiscoverMatchResult,
await api.post<unknown>("/discover/tmdb-match", {
source: it.source,
id: it.id,
title: it.title,
aliases: it.aliases,
year: it.year,
kind: it.kind,
}),
"/discover/tmdb-match",
),
});
}