feat: 前端显示元数据信息并添加智能分类状态提示

- Media 类型添加 languages/countries/genres 字段
- MediaDetailPage 显示元数据 badges(Languages/Countries/Genres)
- ToolsPage OrganizePanel 显示智能分类启用状态
- Badge 组件支持 className prop
- 添加 parseCSV 辅助函数处理逗号分隔字符串
This commit is contained in:
ShukeBta
2026-05-18 02:57:45 +08:00
parent a98429c02a
commit ff14251371
5 changed files with 181 additions and 45 deletions
+13 -3
View File
@@ -113,15 +113,25 @@ type Resolved struct {
// API key. Callers can use Resolved.APIKey != "" as the "configured" check.
func (s *APIConfigService) Resolve(ctx context.Context, provider string) (Resolved, error) {
row, err := s.findByProvider(ctx, provider)
if err != nil || row == nil {
if err != nil {
s.log.Warn("api_config.resolve: query failed", zap.String("provider", provider), zap.Error(err))
return Resolved{}, err
}
return Resolved{
if row == nil {
s.log.Warn("api_config.resolve: provider not found", zap.String("provider", provider))
return Resolved{}, nil
}
resolved := Resolved{
APIKey: s.crypto.Decrypt(row.APIKey),
BaseURL: row.BaseURL,
Extra: row.Extra,
Enabled: row.Enabled,
}, nil
}
s.log.Debug("api_config.resolve: success",
zap.String("provider", provider),
zap.Bool("has_key", resolved.APIKey != ""),
zap.Bool("enabled", resolved.Enabled))
return resolved, nil
}
// Update upserts a single provider's config. An empty patch.APIKey leaves