tvbox黄色过滤

This commit is contained in:
mtvpls
2026-03-24 10:57:32 +08:00
parent 4437a4c461
commit 5d75491523
3 changed files with 122 additions and 70 deletions
+39 -2
View File
@@ -10,6 +10,7 @@ import {
setCachedMetaInfo,
} from '@/lib/openlist-cache';
import { getTMDBImageUrl } from '@/lib/tmdb.search';
import { yellowWords } from '@/lib/yellow';
export const runtime = 'nodejs';
@@ -22,6 +23,7 @@ export async function GET(request: NextRequest) {
try {
const { searchParams } = new URL(request.url);
const apiUrl = searchParams.get('api');
const yellowFilter = searchParams.get('yellowFilter') === 'true';
if (!apiUrl) {
return NextResponse.json(
@@ -96,7 +98,7 @@ export async function GET(request: NextRequest) {
console.log('CMS 代理 origin:', origin);
// 处理返回数据,替换播放链接为代理链接
const processedData = processPlayUrls(data, origin);
const processedData = processCmsResponse(data, origin, yellowFilter);
return NextResponse.json(processedData, {
headers: {
@@ -130,7 +132,7 @@ export async function GET(request: NextRequest) {
/**
* 处理 CMS API 返回数据,将播放链接替换为代理链接
*/
function processPlayUrls(data: any, proxyOrigin: string): any {
function processCmsResponse(data: any, proxyOrigin: string, yellowFilter: boolean): any {
if (!data || typeof data !== 'object') {
return data;
}
@@ -138,6 +140,28 @@ function processPlayUrls(data: any, proxyOrigin: string): any {
// 深拷贝数据,避免修改原始对象
const processedData = JSON.parse(JSON.stringify(data));
if (yellowFilter) {
if (processedData.class && Array.isArray(processedData.class)) {
processedData.class = processedData.class.filter((item: any) => !matchesYellowContent(item?.type_name));
}
if (processedData.list && Array.isArray(processedData.list)) {
processedData.list = processedData.list.filter((item: any) => !matchesYellowContent(
item?.vod_name,
item?.type_name,
item?.vod_remarks,
item?.vod_content,
));
if (typeof processedData.total === 'number') {
processedData.total = processedData.list.length;
}
if (typeof processedData.limit === 'number') {
processedData.limit = processedData.list.length;
}
}
}
// 获取 M3U8 代理 token
const proxyToken = process.env.NEXT_PUBLIC_PROXY_M3U8_TOKEN || '';
const tokenParam = proxyToken ? `&token=${encodeURIComponent(proxyToken)}` : '';
@@ -174,6 +198,19 @@ function processPlayUrls(data: any, proxyOrigin: string): any {
return processedData;
}
function matchesYellowContent(...values: Array<string | undefined>): boolean {
const normalized = values
.filter(Boolean)
.join(' ')
.toLowerCase();
if (!normalized) {
return false;
}
return yellowWords.some((word) => normalized.includes(word.toLowerCase()));
}
/**
* 处理播放地址字符串
* 格式: 第01集$url1#第02集$url2#...