71 lines
2.0 KiB
TypeScript
71 lines
2.0 KiB
TypeScript
import { createError, defineEventHandler, readBody } from 'h3'
|
|
import { db } from '~/drizzle/db'
|
|
import { songBlacklists, systemSettings } from '~/drizzle/schema'
|
|
import { eq } from 'drizzle-orm'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const body = await readBody(event)
|
|
const { title, artist } = body
|
|
|
|
if (!title) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
message: '歌曲标题不能为空'
|
|
})
|
|
}
|
|
|
|
try {
|
|
// 获取系统设置
|
|
const systemSettingsResult = await db.select().from(systemSettings).limit(1)
|
|
const systemSettingsData = systemSettingsResult[0]
|
|
const showBlacklistKeywords = systemSettingsData?.showBlacklistKeywords ?? false
|
|
|
|
// 获取所有活跃的黑名单项
|
|
const blacklistItems = await db
|
|
.select()
|
|
.from(songBlacklists)
|
|
.where(eq(songBlacklists.isActive, true))
|
|
|
|
const songFullName = `${title} - ${artist || ''}`.toLowerCase()
|
|
const blocked = []
|
|
|
|
for (const item of blacklistItems) {
|
|
if (item.type === 'SONG') {
|
|
// 检查具体歌曲
|
|
if (songFullName.includes(item.value.toLowerCase())) {
|
|
blocked.push({
|
|
type: 'song',
|
|
value: item.value,
|
|
reason: item.reason || '该歌曲已被加入黑名单'
|
|
})
|
|
}
|
|
} else if (item.type === 'KEYWORD') {
|
|
// 检查关键词
|
|
if (songFullName.includes(item.value.toLowerCase())) {
|
|
blocked.push({
|
|
type: 'keyword',
|
|
value: showBlacklistKeywords ? item.value : null, // 根据设置决定是否显示具体关键词
|
|
reason:
|
|
item.reason || (showBlacklistKeywords ? `包含关键词:${item.value}` : '包含关键词')
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
isBlocked: blocked.length > 0,
|
|
reasons: blocked,
|
|
song: {
|
|
title,
|
|
artist
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error('检查黑名单失败:', error)
|
|
throw createError({
|
|
statusCode: 500,
|
|
message: '检查黑名单失败'
|
|
})
|
|
}
|
|
})
|