diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index 1b93c49..a4ed081 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -3210,6 +3210,83 @@ const ConfigFileComponent = ({ config, refreshConfig }: { config: AdminConfig | }); }; + // 处理文件上传 + const handleFileUpload = async (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; + if (!file) return; + + // 检查文件类型 + if (!file.name.toLowerCase().endsWith('.json')) { + showError('请上传JSON格式的文件', showAlert); + return; + } + + await withLoading('uploadConfig', async () => { + try { + const fileContent = await file.text(); + + // 验证JSON格式 + let parsedConfig; + try { + parsedConfig = JSON.parse(fileContent); + } catch (parseError) { + showError('JSON格式错误,请检查文件内容', showAlert); + return; + } + + // 检查是否包含api_site字段 + if (!parsedConfig.api_site) { + showError('配置文件必须包含api_site字段', showAlert); + return; + } + + // 根据api字段进行去重 + const existingConfig = configContent ? JSON.parse(configContent) : { api_site: {} }; + const existingApis = new Set(); + + // 收集现有配置中的所有api + Object.values(existingConfig.api_site || {}).forEach((site: any) => { + if (site.api) { + existingApis.add(site.api); + } + }); + + // 合并新配置,去重处理 + const mergedApiSite = { ...existingConfig.api_site }; + let duplicateCount = 0; + + Object.entries(parsedConfig.api_site || {}).forEach(([key, site]: [string, any]) => { + if (site.api && existingApis.has(site.api)) { + duplicateCount++; + // 跳过重复的api + return; + } + mergedApiSite[key] = site; + }); + + const mergedConfig = { + ...parsedConfig, + api_site: mergedApiSite + }; + + // 更新配置内容 + setConfigContent(JSON.stringify(mergedConfig, null, 2)); + + const message = duplicateCount > 0 + ? `配置上传成功,跳过了 ${duplicateCount} 个重复的API` + : '配置上传成功'; + showSuccess(message, showAlert); + + } catch (err) { + showError(err instanceof Error ? err.message : '文件上传失败', showAlert); + throw err; + } + }); + + // 清空文件输入 + event.target.value = ''; + }; + // 保存配置文件 const handleSave = async () => { await withLoading('saveConfig', async () => { @@ -3350,6 +3427,57 @@ const ConfigFileComponent = ({ config, refreshConfig }: { config: AdminConfig | /> + {/* 文件上传区域 */} +
+
+ +
+ 支持根据API字段自动去重 +
+
+
+ + +
+

+ 上传的JSON配置将自动合并到当前配置,重复的API地址将被自动过滤 +

+
+
支持 JSON 格式,用于配置视频源和自定义分类