Files
Elegy233 ee15f5871c feat: 前端新增覆盖全项目的日志筛选分类系统 (#335)
* feat: 前端新增覆盖全项目的日志筛选分类系统

基于项目架构建立三级日志标签体系(编排层/工具层/源层),
覆盖 50 个文件。

=== 前端日志分类引擎 (logview.js + components.css.js) ===
- 新增 getLogCategory 标签分类引擎,支持标签提取、归类与续行上下文继承
- ISO 时间戳与 HH:MM:SS 格式精确过滤,避免误杀数字开头标签(如 360kan)
- 续行 _inherit_ 机制:无标签行自动继承上一行分类
- normalizationMap 归一化映射:变体标签统一收束至标准分类
- 标签筛选按钮 UI 按 system → utils/cache/merge → 源 三层分组排序

=== 后端标签规范化 ===
- sources/ 20 个源文件:弹幕提取、搜索函数、JSON 响应等全部 log 调用补全源标签
- utils/ 12 个工具文件:以 [Utils] [Name] 格式统一,保留 [Cache][Merge] 独立标签
- apis/dandan-api.js 采用 [system] [SubName] 层级格式:
  子类别覆盖 Duration / executeSourceHandlers / searchAnime / LogVar-API /
  Episodes / matchAnime / Spillover / getBangumi / Offset / YearFilter /
  Match / Bangumi / SegmentComment
- apis/env-api.js 4 处 console.error 改用 log() 纳入日志缓冲区
- configs/handlers/ 8 个文件补全 [system] [Server] 标签
- worker.js 补全 [system] [Server] / [Utils] [Rate Limit] / [Utils] [IP Blacklist]
- forward/forward-widget.js 补全 [Forward],删除重复 console.log
- node-functions/index.js console.log → log() 统一纳入日志系统
- TMDB 标签拆分:sources/tmdb.js 保持 [TMDB],utils/tmdb-util.js 使用 [Utils] [TMDB]
- fetchMergedComments 合并拉取路径补全源级获取弹幕日志

=== 基础设施 ===
- http-util.js 新增 sourceLogContext (AsyncLocalStorage) 跨异步日志上下文追踪
- http-util.js 新增 toLogSourceName() 集中映射函数(360→360kan, imgo→mango)
- http-util.js 诊断续行移除重复标签前缀
- 额外季数检索改为并行 Promise.all
- 前端 JSON 续行切割修复:HH:MM:SS 时间戳识别 + 无标签行自动继承

=== 标签层级 ===
系统层:[system] [Server]             [AI]
工具层:[Utils] [Name]                 [Cache] [Merge]
源层:  [360kan][vod][bilibili][tencent][youku][iqiyi]
        [mango][migu][renren][hanjutv][bahamut][dandan]
        [sohu][leshi][xigua][maiduidui][aiyifan][animeko]
        [Douban][TMDB][custom][other]
插件层:[Forward]

* 回退node-functions/index.js
2026-06-06 12:16:03 +08:00

58 lines
1.8 KiB
JavaScript

import { handleRequest } from '../danmu_api/worker.js';
export const onRequest = async (context) => {
const { request, env } = context;
// 获取协议和主机名,使用属性访问而非 get 方法
const baseUrl = `https://localhost`;
// 调试:打印 headers 和原始 URL
console.log('Request URL:', request.url);
console.log('Request Headers:', request.headers);
// 构造完整的 URL
let fullUrl;
try {
let targetUrl = request.url;
// 判断是否包含 node-functions/index.js,如果是则用 / 代替
if (request.url.includes('node-functions/index.js')) {
targetUrl = '/';
}
fullUrl = new URL(targetUrl, baseUrl).toString();
console.log('Request fullUrl:', fullUrl);
} catch (error) {
console.error('URL Construction Error:', error);
return new Response('Invalid URL', { status: 400 });
}
// 创建新的 request 对象,替换 url
const modifiedRequest = new Request(fullUrl, {
method: request.method,
headers: request.headers,
body: JSON.stringify(request.body),
redirect: request.redirect,
credentials: request.credentials,
cache: request.cache,
mode: request.mode
});
// 获取客户端 IP 地址
let clientIp = 'unknown';
// 尝试从 EO-Connecting-IP 获取客户端 IP
clientIp = request.headers['eo-connecting-ip'];
if (!clientIp) {
// 如果 EO-Connecting-IP 不存在,尝试从 X-Forwarded-For 获取
const forwardedFor = request.headers['x-forwarded-for'];
if (forwardedFor) {
// X-Forwarded-For 可能包含多个 IP 地址,选择第一个(最原始客户端 IP)
clientIp = forwardedFor.split(',')[0].trim();
}
}
// 传递修改后的 request 和 env 给 handleRequest
return await handleRequest(modifiedRequest, env, "edgeone", clientIp);
};