这一版应该符合目前的要求

我个人不喜欢将路径写死在代码中,你可以尝试个性化改造
模板代码如下:
---
<%*
// 配置选项
const CONFIG = {
BASE_FOLDER: "",
EXCLUDE_FOLDERS: new Set(["papers", "attachments"]),
FILE_EXT: ".md",
tags: [
{ emoji: "🇰🇷", name: "韩剧" },
{ emoji: "🇨🇳", name: "陆剧" },
{ emoji: "🇹🇼", name: "台剧" },
{ emoji: "🌎", name: "欧美剧" },
{ emoji: "🎥", name: "纪录片" },
{ emoji: "🎤", name: "综艺" },
{ emoji: "🎶", name: "演唱会" },
{ emoji: "🖍️", name: "动画" },
{ emoji: "🏳️", name: "其他国家" },
],
genres: [
{ emoji: "👊", name: "动作" },
{ emoji: "👑", name: "古装" },
{ emoji: "🕵️", name: "悬疑" },
{ emoji: "⚔️", name: "战争" },
{ emoji: "🔫", name: "犯罪" },
{ emoji: "🎒", name: "校园" },
{ emoji: "💘", name: "爱情" },
{ emoji: "🎵", name: "音乐" },
{ emoji: "🎮", name: "游戏" },
],
statuses: [
{ emoji: "🆕", name: "未看" },
{ emoji: "✅", name: "看完" },
{ emoji: "❌", name: "弃剧" },
{ emoji: "⏸️", name: "尚未完成" },
],
};
const formatPrompt = (title, example = "") =>
`✏️ ${title}${example ? ` (示例: ${example})` : ""}`;
// 声明变量
let selectedTag = { emoji: "🏷️", name: "未分类" };
let selectedGenres = [];
let selectedStatus = { emoji: "🆕", name: "未看" };
let coverImage = "";
let rating = "";
let watchDate = tp.date.now("YYYY-MM-DD");
let folderName;
/*========== 获取笔记路径 ==========*/
// 获取分层文件夹
async function getHierarchicalFolders() {
let currentPath = CONFIG.BASE_FOLDER;
let finalPath = "";
while (true) {
const { folders } = await app.vault.adapter.list(currentPath);
const validFolders = folders
.map(fullPath => fullPath.split("/").pop())
.filter(folder => !CONFIG.EXCLUDE_FOLDERS.has(folder.toLowerCase()));
const options = [];
if (currentPath !== CONFIG.BASE_FOLDER) options.push("🔙");
options.push(...validFolders, "✔️");
const chosen = await tp.system.suggester(
options,
options,
false,
`选择目录 📁 当前路径: ${currentPath.replace(CONFIG.BASE_FOLDER, "根目录")}`
);
if (!chosen) return null;
if (chosen === "✔️") {
finalPath = currentPath.replace(CONFIG.BASE_FOLDER + "/", "");
break;
} else if (chosen === "🔙") {
currentPath = currentPath.split("/").slice(0, -1).join("/");
} else {
currentPath = `${currentPath}/${chosen}`;
}
}
return finalPath;
}
// 新增文件夹流程
async function createNewFolder() {
const basePath = await getHierarchicalFolders();
if (!basePath) return null;
while (true) {
folderName = await tp.system.prompt("请输入影片名称 📁");
if (!folderName) return null;
const fullPath = `${CONFIG.BASE_FOLDER}/${basePath}/${folderName}`.replace(/\/+/g, "/");
if (!(await app.vault.adapter.exists(fullPath))) {
await app.vault.createFolder(fullPath);
return `${basePath}/${folderName}`;
}
new Notice(`⚠️ 文件夹 "${folderName}" 已存在,请换用其他名称`);
}
}
// 获取新文件夹路径
chosenFolder = await createNewFolder();
if (!chosenFolder) {
new Notice("🛑 操作已取消");
return;
}
// 笔记名称与文件夹名称一致
const titleName = folderName;
/*========== 获取笔记属性 ==========*/
// 1. 选择标签
const selectedTagIndex = await tp.system.suggester(
CONFIG.tags.map((t) => `${t.emoji} ${t.name}`),
CONFIG.tags.map((_, i) => i),
false,
"📌 请选择作品类型标签"
);
if (selectedTagIndex === null) {
return new Notice("🛑 操作已取消");
}
selectedTag = CONFIG.tags[selectedTagIndex];
// 2. 多选类型
while (true) {
const remaining = CONFIG.genres.filter(
(g) => !selectedGenres.some((sg) => sg.name === g.name)
);
const prompt =
selectedGenres.length > 0
? `${selectedGenres
.map((g) => `${g.emoji} ${g.name}`)
.join(", ")}\n🎭 请继续选择或完成`
: "🎭 请选择作品类型 (可多选)";
const choices =
remaining.length > 0
? ["✅ 完成选择", ...remaining.map((g) => `${g.emoji} ${g.name}`)]
: ["✅ 已完成"];
const values =
remaining.length > 0 ? ["DONE", ...remaining.map((_, i) => i)] : ["DONE"];
const choiceIndex = await tp.system.suggester(choices, values, false, prompt);
if (choiceIndex === null) {
return new Notice("🛑 操作已取消");
}
if (choiceIndex === "DONE") break;
selectedGenres.push(CONFIG.genres[choiceIndex]);
}
// 3. 选择观看状态(带emoji)
const selectedStatusIndex = await tp.system.suggester(
CONFIG.statuses.map((s) => `${s.emoji} ${s.name}`),
CONFIG.statuses.map((_, i) => i),
false,
"📊 请选择观看状态"
);
if (selectedStatusIndex === null) {
return new Notice("🛑 操作已取消");
}
selectedStatus = CONFIG.statuses[selectedStatusIndex];
// 4. 封面图URL
coverImage =
(await tp.system.prompt(
formatPrompt("请输入封面图URL或路径"),
titleName + ".png"
)) || "";
console.log("coverImage = ", coverImage);
if (!coverImage) {
return new Notice("🛑 操作已取消");
}
// 5. 评分输入
while (true) {
const input = await tp.system.prompt(
formatPrompt("请输入影片评分"),
""
);
if (!isNaN(input) && input >= 1 && input <= 10) {
rating = input;
break;
}
new Notice("⚠️ 请输入正确评分 (1-10)" );
}
if (!rating) {
return new Notice("🛑 操作已取消");
}
// 6. 日期选择
const dateChoice = await tp.system.suggester(
["📅 今天", "📅 自定义日期"],
["today", "custom"],
false,
"📅 请选择观看日期"
);
if (!dateChoice) {
return new Notice("🛑 操作已取消");
}
watchDate =
dateChoice === "today"
? tp.date.now("YYYY-MM-DD")
: (await tp.system.prompt(
formatPrompt("请输入观看日期", "2023-01-15"),
"YYYY-MM-DD"
)) || tp.date.now("YYYY-MM-DD");
/*========== 移动文件 ==========*/
await tp.file.move(`${CONFIG.BASE_FOLDER}/${chosenFolder}/${titleName}`);
-%>
标签: [<% `${selectedTag.emoji} ${selectedTag.name}` %>]
类型: [<% selectedGenres.map(g => `${g.emoji} ${g.name}`).join(", ") %>]
状态: [<% `${selectedStatus.emoji} ${selectedStatus.name}` %>]
封面图: <% coverImage %>
评分: <% rating %>
观看日期: <% watchDate %>
---
## 评价
<% tp.file.cursor() %>