package service import ( "91porn-server/common" "91porn-server/common/log" "91porn-server/common/stderr" "91porn-server/models/commod" "91porn-server/models/v/modulesectionmod" "91porn-server/models/v/modulevidmod" "91porn-server/models/v/tagmod" "91porn-server/models/v/vidmod" "91porn-server/models/v/vidtimeonlinemod" "91porn-server/web/service/video_media_service" "fmt" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "strconv" "strings" "time" ) type vidTimeOnlineInfo struct { VidId primitive.ObjectID `json:"vidId"` VidType string `json:"vidType"` SourceURL string `json:"sourceURL"` ReviewAccount string `json:"reviewAccount"` } var vidTimeOnlineIsRuining = false // 视频自动上架 func VidTimeOnline() { common.Go(func() { log.Info("video time online start...") if vidTimeOnlineIsRuining { log.Info("video time online already executed") return } vidTimeOnlineIsRuining = true defer func() { vidTimeOnlineIsRuining = false }() log.Info("video time online execute") handleVidTimeOnline() log.Info("video time online end...") }) } func handleVidTimeOnline() { //每次取十条数据,定期上线 vidInfs, err := vidtimeonlinemod.GetByPage(commod.Page{PageNumber: 1, PageSize: 100}) if err != nil { log.Error("video time online eonlinemod.GetByPage err", log.E(err)) return } if len(vidInfs) == 0 { log.Info("video time online vidInfs == 0") return } //上架 resIds := passVids(vidInfs) //从自动上架表中移除已经上架的帖子数据 if len(resIds) > 0 { if err = vidtimeonlinemod.DeleteByVids(resIds); err != nil { log.Warn("video time online vidtimeonlinemod.DeleteByVids err", log.Any("err", err)) return } } log.Info("video time online resIds", log.Any("resIds", resIds)) } // passVids 批量自动上架 func passVids(vidIds []vidtimeonlinemod.VidTimeOnlineModel) (resIds []primitive.ObjectID) { var uploadRecord []vidmod.UploadMediaVideo var records []modulevidmod.SectionVideo for _, vid := range vidIds { //非图集才需要同步 isCover := vid.VidType == vidmod.COVER || vid.VidType == vidmod.PIC log.Info("vid time online", log.Any("isCover", isCover), log.Any("vid", vid)) // 查询视频信息 videoInfo, err := vidmod.GetVideoInfo(vid.VidId.Hex()) if err != nil { log.Warn("vid time online passVids vidmod.GetVideoInfo err,", log.Any("err", err), log.Any("vid", vid.VidId)) return resIds } log.Info("vid time online", log.Any("status", videoInfo.Status), log.Any("MDSID", videoInfo.MDSID), log.Any("videoInfo.Filename", videoInfo.Filename)) // 媒资库的不做任何校验,因为给过来的这部分数据的sourceID有问题 if videoInfo.MDSID == "" && !isCover && !strings.Contains(videoInfo.Filename, "mzk_") { if code := SyncFileFromFs(vid.VidId.Hex()); code != stderr.UpLoadFileComplete { log.Warn("vid time online passVids syncFileFromFs err,", log.Any("code", code), log.Any("vid", vid.VidId)) continue } } tagSort := make(bson.M, len(videoInfo.Tags)) for _, v := range videoInfo.Tags { tagSort[v.Hex()] = 0 } if videoInfo.Status == 1 { resIds = append(resIds, videoInfo.ID) continue } if (videoInfo.NewsType == vidmod.SP || videoInfo.NewsType == vidmod.SHORT) && !strings.Contains(videoInfo.Filename, "mzk_") { var width, height int resolutions := strings.Split(videoInfo.Resolution, "*") if len(resolutions) >= 2 { width, _ = strconv.Atoi(resolutions[0]) height, _ = strconv.Atoi(resolutions[1]) } if len(resolutions) != 2 { resolutions = strings.Split(videoInfo.Resolution, "x") if len(resolutions) >= 2 { width, _ = strconv.Atoi(resolutions[0]) height, _ = strconv.Atoi(resolutions[1]) } } var tags string if len(videoInfo.Tags) > 0 { for _, v := range videoInfo.Tags { tagData, err := tagmod.FindOneTagByID(v) if err == nil { if tags != "" { tags += "," + tagData.TagName } else { tags += tagData.TagName } } } } uploadRecord = append(uploadRecord, vidmod.UploadMediaVideo{ FsResourceId: videoInfo.SourceID, HashId: videoInfo.MD5, Title: videoInfo.Title, Length: int(videoInfo.PlayTime), FileSize: videoInfo.Size, M3u8Src: videoInfo.SourceURL, Height: height, Width: width, CoverImage: videoInfo.Cover, TagsText: tags, }) } video, err := vidmod.PassVidsOnlineTime(vid.VidId, 1, "", vid.ReviewAccount, vid.OnlineTime, tagSort) if err != nil { log.Warn("vid time online passVids vidmod.PassVids err,", log.Any("err", err), log.Any("vid", video.ID)) return resIds } if !vid.SectionId.IsZero() { // 获取专题 section, err := modulesectionmod.GetBySectionByID(vid.SectionId) if err != nil { log.Error("vid time online modulesectionmod.GetBySectionByID fail", log.Any("vid.SectionId", vid.SectionId), log.E(err)) continue } if !section.ID.IsZero() { // 判断当前专题下是否已经有该记录,没有则添加 sectionVids, err := modulevidmod.GetBySectionIDAndVids(section.ID, []primitive.ObjectID{vid.VidId}) if err != nil { log.Error("vid time online modulevidmod.GetBySectionIDAndVids( fail", log.Any("vid.SectionId", vid.SectionId), log.Any("vid.VidId", vid.VidId), log.E(err)) continue } if len(sectionVids) == 0 { records = append(records, modulevidmod.SectionVideo{ SectionID: section.ID, VideoID: vid.VidId, VideoReviewedAt: vid.OnlineTime, }) } // 修改帖子的mId update := bson.M{} update["updatedAt"] = time.Now() update["mId"] = section.SubModuleID.Hex() vidmod.UpdateOneByID(vid.VidId, update) } } resIds = append(resIds, video.ID) } if len(records) > 0 { err := modulevidmod.InsertMany(records) if err != nil { log.Error("vid time online AddVidTimeOnlineInfo moduleVidMod InsertMany error", log.Any("records", records), log.Any("err", err)) return resIds } } log.Info("vid time online", log.Any("uploadRecord", uploadRecord)) // 处理上传媒资库 if len(uploadRecord) > 0 { var err error var sourceIDs []string var errSourceIDs []string for _, info := range uploadRecord { if info.Length > 300 { err = video_media_service.UploadSkdVideoMedia(info) } else { err = video_media_service.UploadSkdShortVideoMedia(info) } if err != nil { errSourceIDs = append(errSourceIDs, info.FsResourceId) log.Info(fmt.Sprintf("vid time online UploadVideoMedia err%v;errSourceIDs%v", err, errSourceIDs)) continue } sourceIDs = append(sourceIDs, info.FsResourceId) } if err != nil { log.Info(fmt.Sprintf("vid time online UploadVideoMedia err%v;errSourceIDs%v", err, errSourceIDs)) return resIds } log.Info(fmt.Sprintf("vid time online UploadVideoMedia sucess sourceIDs%v", sourceIDs)) } return resIds }