- adapters/meta:bgm.tv 官方 API(条目 / 搜索 / 每日放送)与豆瓣移动版接口(条目 / 实时热门) - 识别升级链:豆瓣条目缓存没有时在线查;AniBT 的 bgm ID、公开 BT 站标题搜 bgm → 名称 + 年份匹配 TMDB(季条目去季名与年份) - 条目缓存 30 天,查不到 6 小时负缓存;测试进程缺省不出外网 - 发现页:bgm 每日放送、豆瓣热门电影 / 剧集,点条目匹配 TMDB 作品 Co-Authored-By: Claude Opus 5.5 <[email protected]>
48 lines
1.5 KiB
TypeScript
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",
|
|
),
|
|
});
|
|
}
|