- 标题区:海报、作品名 (年份)、站点;资源行显示原始标题、促销、H&R、做种 / 下载、大小、发布时间 - 下载器与保存目录并排下拉,缺省「自动」,下方写明「将保存到」的实际路径;保留「自定义路径」 - 作品身份折叠区:类型 + TMDB 编号(可搜索作品),未识别时默认展开,指定后随下载绑定 - 已有版本先显示一行摘要,选一次性洗版才展开勾选列表 - 搜索、工作台、原站视图三处调用方补传资源字段 Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
62 lines
2.1 KiB
TypeScript
62 lines
2.1 KiB
TypeScript
import type { SearchRelease } from "@umt/contracts";
|
|
import { usePlanFromSearch } from "~/api/search.ts";
|
|
import { openAgentDrawer } from "~/components/agent/agent-store.ts";
|
|
import { ManualDownloadDialog, type ManualDownloadResource } from "~/components/downloads/manual-download-dialog.tsx";
|
|
import { kindHintOf } from "~/components/downloads/manual-download-model.ts";
|
|
import { promoLabel } from "./search-labels.ts";
|
|
|
|
export function delegateToAgent(release: SearchRelease) {
|
|
openAgentDrawer({
|
|
label: `资源:${release.title}`,
|
|
releaseId: release.sourceReleaseId ?? undefined,
|
|
entityId: release.entity?.id,
|
|
siteId: release.siteId,
|
|
goal: `判断资源「${release.title}」是否值得下载;合适就按手动下载流程提交`,
|
|
});
|
|
}
|
|
|
|
/** 搜索结果 → 下载对话框的资源摘要;别名命中(未确认)按未识别处理 */
|
|
export function searchResource(release: SearchRelease): ManualDownloadResource {
|
|
const resolved = release.entityMatch === "resolved" ? release.entity : null;
|
|
const promo = promoLabel(release.promotion.type);
|
|
return {
|
|
title: release.title,
|
|
subtitle: release.subtitle,
|
|
sizeBytes: release.sizeBytes,
|
|
entityId: resolved?.id,
|
|
entity: resolved,
|
|
siteId: release.siteId,
|
|
siteName: release.siteName,
|
|
seeders: release.seeders,
|
|
leechers: release.leechers,
|
|
promotion: promo ? { label: promo, free: release.free } : null,
|
|
hr: release.hr === "unknown" ? "unknown" : release.hr ? "yes" : "no",
|
|
publishedAt: release.uploadedAt,
|
|
kindHint: kindHintOf(release.parsed),
|
|
};
|
|
}
|
|
|
|
export function SearchDownloadDialog({
|
|
release,
|
|
open,
|
|
onOpenChange,
|
|
}: {
|
|
release: SearchRelease;
|
|
open: boolean;
|
|
onOpenChange: (open: boolean) => void;
|
|
}) {
|
|
const submit = usePlanFromSearch();
|
|
return (
|
|
<ManualDownloadDialog
|
|
key={`${release.siteId}:${release.siteReleaseId}`}
|
|
open={open}
|
|
onOpenChange={onOpenChange}
|
|
resource={searchResource(release)}
|
|
onDelegate={() => delegateToAgent(release)}
|
|
submit={(options) =>
|
|
submit.mutateAsync({ ...options, siteId: release.siteId, siteReleaseId: release.siteReleaseId })
|
|
}
|
|
/>
|
|
);
|
|
}
|