feat:保存视频和图文自动生成标签到5个。
This commit is contained in:
parent
7f583f1a21
commit
8ba457d1b8
@ -225,6 +225,7 @@ func SaveTagsToDatabase(ctx *gin.Context, tags []string, source uint32) error {
|
||||
// 调用批量导入接口
|
||||
_, err := service.CastProvider.UpdateCastTagBatch(newCtx, &req)
|
||||
if err != nil {
|
||||
err = errors.New("标签保存到数据库失败")
|
||||
zap.L().Error("SaveTagsToDatabase UpdateCastTagBatch failed", zap.Error(err))
|
||||
return err
|
||||
}
|
||||
@ -233,6 +234,77 @@ func SaveTagsToDatabase(ctx *gin.Context, tags []string, source uint32) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func GenerateAutoHashtags(ctx context.Context, post string, max int32, position, language string) (*aryshare.AutoHashtagsResponse, []string, bool, error) {
|
||||
// 验证帖子内容
|
||||
if post == "" {
|
||||
return nil, nil, false, errors.New("帖子内容不能为空")
|
||||
}
|
||||
// post 的长度不能超过1000个字符
|
||||
if len(post) > 1000 {
|
||||
return nil, nil, false, errors.New("自动生成标签的帖子内容不能超过1000个字符")
|
||||
}
|
||||
|
||||
// 提取生成前的标签
|
||||
beforeTags := utils.ExtractTags(post)
|
||||
zap.L().Info("GenerateAutoHashtags beforeTags", zap.Strings("beforeTags", beforeTags))
|
||||
|
||||
// 如果标签数量已经达到或超过5个,不需要生成
|
||||
if len(beforeTags) >= 5 {
|
||||
return nil, nil, false, nil
|
||||
}
|
||||
|
||||
// 设置默认值
|
||||
if position == "" {
|
||||
position = "end"
|
||||
}
|
||||
if language == "" {
|
||||
language = "zh"
|
||||
}
|
||||
|
||||
// 如果 max 为0,则根据现有标签数自动计算,确保总数为5
|
||||
if max == 0 {
|
||||
max = int32(5 - len(beforeTags))
|
||||
}
|
||||
|
||||
// 获取有效的 profileKey
|
||||
profileKeys, err := service.CastProvider.GetArtistAyrShareInfoByPlatformIDs(ctx, &cast.GetArtistAyrShareInfoByPlatformIDsReq{
|
||||
PlatformIDs: []uint32{1, 2, 3, 5},
|
||||
Page: 1,
|
||||
PageSize: 20,
|
||||
})
|
||||
if err != nil {
|
||||
zap.L().Error("GetArtistAyrShareInfoByPlatformIDs failed", zap.Error(err))
|
||||
return nil, nil, false, errors.New("获取有效profileKey失败")
|
||||
}
|
||||
if len(profileKeys.Data) == 0 {
|
||||
return nil, nil, false, errors.New("当前没有有效的profileKey")
|
||||
}
|
||||
|
||||
// 构建请求
|
||||
req := &aryshare.AutoHashtagsRequest{
|
||||
Post: post,
|
||||
Max: max,
|
||||
Position: position,
|
||||
Language: language,
|
||||
}
|
||||
|
||||
// 调用 Ayrshare 的 AutoHashtags 接口
|
||||
resp, err := service.AyrshareProvider.AutoHashtags(ctx, req)
|
||||
if err != nil {
|
||||
zap.L().Error("AutoHashtags failed", zap.Error(err))
|
||||
return nil, nil, false, errors.New("自动生成标签失败")
|
||||
}
|
||||
|
||||
// 提取生成后的标签
|
||||
afterTags := utils.ExtractTags(resp.Post)
|
||||
zap.L().Info("GenerateAutoHashtags afterTags", zap.Strings("afterTags", afterTags))
|
||||
|
||||
// 对比两次标签,找出新增的标签
|
||||
newTags := findNewTags(beforeTags, afterTags)
|
||||
|
||||
return resp, newTags, true, nil
|
||||
}
|
||||
|
||||
// AutoHashtags 自动生成标签
|
||||
func AutoHashtags(ctx *gin.Context) {
|
||||
var req *aryshare.AutoHashtagsRequest
|
||||
@ -241,76 +313,31 @@ func AutoHashtags(ctx *gin.Context) {
|
||||
service.Error(ctx, err)
|
||||
return
|
||||
}
|
||||
if req.Post == "" {
|
||||
err = errors.New("帖子内容不能为空")
|
||||
|
||||
// 调用核心逻辑生成标签
|
||||
resp, newTags, needMore, err := GenerateAutoHashtags(
|
||||
context.Background(),
|
||||
req.Post,
|
||||
req.Max,
|
||||
req.Position,
|
||||
req.Language,
|
||||
)
|
||||
if err != nil {
|
||||
service.Error(ctx, err)
|
||||
return
|
||||
}
|
||||
// post 的长度不能超过1000个字符
|
||||
if len(req.Post) > 1000 {
|
||||
err = errors.New("帖子内容不能超过1000个字符")
|
||||
service.Error(ctx, err)
|
||||
return
|
||||
}
|
||||
// 调用 utils 提取生成前的标签
|
||||
beforeTags := utils.ExtractTags(req.Post)
|
||||
fmt.Println("beforeTags", beforeTags)
|
||||
// 根据这里的tags 的数量,来决定 req.Max 的值
|
||||
// 确保标签总数是5
|
||||
if len(beforeTags) >= 5 {
|
||||
// 直接返回当前帖子的标签已经有5个了
|
||||
|
||||
// 如果标签已满5个,直接返回
|
||||
if !needMore {
|
||||
service.Success(ctx, map[string]interface{}{
|
||||
"message": "当前帖子的标签已经有5个了",
|
||||
})
|
||||
return
|
||||
}
|
||||
// 确保标签总数是5
|
||||
if len(beforeTags) < 5 {
|
||||
req.Max = int32(5 - len(beforeTags))
|
||||
}
|
||||
if req.Position == "" {
|
||||
// 未设置位置,默认使用末尾
|
||||
req.Position = "end"
|
||||
}
|
||||
if req.Language == "" {
|
||||
// 未设置语种,默认使用中文
|
||||
req.Language = "zh"
|
||||
}
|
||||
profileKeys, err := service.CastProvider.GetArtistAyrShareInfoByPlatformIDs(context.Background(), &cast.GetArtistAyrShareInfoByPlatformIDsReq{
|
||||
PlatformIDs: []uint32{1, 2, 3, 5},
|
||||
Page: 1,
|
||||
PageSize: 20,
|
||||
})
|
||||
if err != nil {
|
||||
zap.L().Error("GetArtistAyrShareInfoByPlatformIDs failed", zap.Error(err))
|
||||
err = errors.New("获取有效profileKey失败")
|
||||
service.Error(ctx, err)
|
||||
return
|
||||
}
|
||||
if len(profileKeys.Data) == 0 {
|
||||
err = errors.New("当前没有有效的profileKey")
|
||||
service.Error(ctx, err)
|
||||
return
|
||||
}
|
||||
// 调用 Ayrshare 的 AutoHashtags 接口
|
||||
resp, err := service.AyrshareProvider.AutoHashtags(context.Background(), req)
|
||||
if err != nil {
|
||||
err = errors.New("自动生成标签失败")
|
||||
zap.L().Error("AutoHashtags failed", zap.Error(err))
|
||||
service.Error(ctx, err)
|
||||
return
|
||||
}
|
||||
|
||||
// 提取生成后的标签
|
||||
afterTags := utils.ExtractTags(resp.Post)
|
||||
fmt.Println("afterTags", afterTags)
|
||||
|
||||
// 对比两次标签,找出新增的标签
|
||||
newTags := findNewTags(beforeTags, afterTags)
|
||||
// 保存新增的标签到数据库,Source 设置为 4(自动标签)
|
||||
if len(newTags) > 0 {
|
||||
// 将新增的标签保存到数据库,Source 设置为 4(自动标签)
|
||||
if err = SaveTagsToDatabase(ctx, newTags, 4); err != nil {
|
||||
fmt.Println("报错标签保存到数据库失败", newTags)
|
||||
zap.L().Error("SaveTagsToDatabase failed", zap.Error(err), zap.Strings("newTags", newTags))
|
||||
err = errors.New("标签保存到数据库失败")
|
||||
service.Error(ctx, err)
|
||||
|
||||
@ -122,8 +122,8 @@ func UpdateWorkImageCore(ctx *gin.Context, req *cast.UpdateWorkImageReq) (*cast.
|
||||
//if _, err = CheckUserBundleBalance(int32(artistID), modelCast.BalanceTypeImageValue); err != nil {
|
||||
// return nil, err
|
||||
//}
|
||||
// 处理内容中的标签:提取、验证并批量导入
|
||||
if err = processContentTags(ctx, req.Content); err != nil {
|
||||
// 处理内容中的标签:提取、验证并批量导入,以及自动生成标签
|
||||
if err = processContentAndAutoTags(ctx, req.Content); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
newCtx := NewCtxWithUserInfo(ctx)
|
||||
@ -218,6 +218,36 @@ func processContentTags(ctx *gin.Context, content string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// processContentAndAutoTags 处理内容标签并自动生成标签
|
||||
// 该函数统一处理内容中的标签提取、验证和自动生成标签的逻辑
|
||||
func processContentAndAutoTags(ctx *gin.Context, content string) error {
|
||||
// 如果内容为空,直接返回
|
||||
if content == "" {
|
||||
return nil
|
||||
}
|
||||
// 处理内容中的标签:提取、验证并批量导入
|
||||
if err := processContentTags(ctx, content); err != nil {
|
||||
return err
|
||||
}
|
||||
// 处理完内容标签后,自动生成标签并存入数据库
|
||||
_, newTags, needMore, err := GenerateAutoHashtags(
|
||||
context.Background(),
|
||||
content,
|
||||
0, // max 为0时自动计算
|
||||
"", // position 使用默认值
|
||||
"", // language 使用默认值
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if needMore && len(newTags) > 0 {
|
||||
if saveErr := SaveTagsToDatabase(ctx, newTags, 4); saveErr != nil {
|
||||
zap.L().Error("processContentAndAutoTags SaveTagsToDatabase failed", zap.Error(saveErr))
|
||||
return errors.New("自动生成标签保存到数据库失败")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateWorkVideoCore 更新作品视频的核心逻辑,可以被其他函数复用
|
||||
func UpdateWorkVideoCore(ctx *gin.Context, req *cast.UpdateWorkVideoReq) (*cast.UpdateWorkVideoResp, error) {
|
||||
var infoResp *accountFiee.UserInfoResponse
|
||||
@ -297,8 +327,8 @@ func UpdateWorkVideoCore(ctx *gin.Context, req *cast.UpdateWorkVideoReq) (*cast.
|
||||
req.ArtistPhone = infoResp.TelNum
|
||||
req.ArtistPhoneAreaCode = infoResp.TelAreaCode
|
||||
req.ArtistSubNum = infoResp.SubNum
|
||||
// 处理内容中的标签:提取、验证并批量导入
|
||||
if err = processContentTags(ctx, req.Content); err != nil {
|
||||
// 处理内容中的标签:提取、验证并批量导入,以及自动生成标签
|
||||
if err = processContentAndAutoTags(ctx, req.Content); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
newCtx := NewCtxWithUserInfo(ctx)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user