tvbox黄色过滤
This commit is contained in:
@@ -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#...
|
||||
|
||||
Reference in New Issue
Block a user