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#...
|
||||
|
||||
@@ -28,6 +28,7 @@ export async function GET(request: NextRequest) {
|
||||
const token = searchParams.get('token');
|
||||
const globalToken = process.env.TVBOX_SUBSCRIBE_TOKEN;
|
||||
const adFilter = searchParams.get('adFilter') === 'true'; // 获取去广告参数
|
||||
const yellowFilter = searchParams.get('yellowFilter') === 'true';
|
||||
|
||||
if (!token) {
|
||||
return NextResponse.json(
|
||||
@@ -89,7 +90,7 @@ export async function GET(request: NextRequest) {
|
||||
baseUrl = `${proto}://${host}`;
|
||||
}
|
||||
|
||||
console.log('TVBOX 订阅 baseUrl:', baseUrl, 'adFilter:', adFilter);
|
||||
console.log('TVBOX 订阅 baseUrl:', baseUrl, 'adFilter:', adFilter, 'yellowFilter:', yellowFilter);
|
||||
|
||||
// 检查是否配置了 OpenList
|
||||
const hasOpenList = !!(
|
||||
@@ -142,9 +143,9 @@ export async function GET(request: NextRequest) {
|
||||
key: site.key,
|
||||
name: site.name,
|
||||
type: 1,
|
||||
// 如果开启去广告,使用 CMS 代理;否则使用原始 API
|
||||
api: adFilter
|
||||
? `${baseUrl}/api/cms-proxy?api=${encodeURIComponent(site.api)}`
|
||||
// 开启去广告或黄色过滤时使用 CMS 代理
|
||||
api: (adFilter || yellowFilter)
|
||||
? `${baseUrl}/api/cms-proxy?api=${encodeURIComponent(site.api)}${adFilter ? '&adFilter=true' : ''}${yellowFilter ? '&yellowFilter=true' : ''}`
|
||||
: site.api,
|
||||
searchable: 1,
|
||||
quickSearch: 1,
|
||||
|
||||
Reference in New Issue
Block a user