Initial commit

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 13:57:10 +08:00
co-authored by Claude Opus 5
commit 8679200f41
1897 changed files with 257900 additions and 0 deletions
+218
View File
@@ -0,0 +1,218 @@
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
}