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
+122
View File
@@ -0,0 +1,122 @@
package service
import (
"sync"
"time"
"91porn-server/common"
"91porn-server/common/log"
"91porn-server/common/stderr"
"91porn-server/models/v/chatrobotmod"
"91porn-server/models/v/vidmod"
"github.com/robfig/cron/v3"
"go.mongodb.org/mongo-driver/bson"
)
const SingleQueryLimit = 5000
var VideoInfo *VideoInfoFaker
type VideoInfoFaker struct {
once sync.Once
limit int64 // 限制每次查询的数据量
mu *sync.Mutex
}
func newVideoInfoFaker() *VideoInfoFaker {
return &VideoInfoFaker{
once: sync.Once{},
limit: SingleQueryLimit,
mu: &sync.Mutex{},
}
}
// FullUpdate 单次更新,程序启动后执行一次
func (f *VideoInfoFaker) FullUpdate() {
f.once.Do(
func() {
f.mu.Lock()
log.Debug("full update start...")
common.Go(func() {
defer f.mu.Unlock()
start := time.Now()
totalUpdate, err := f.fakeVideoInfo()
log.Info("FullUpdate fihish",
log.Any("time(s)", time.Since(start).Seconds()),
log.Any("total", totalUpdate),
log.E(err))
})
},
)
}
// CronUpdate 定时更新
func (f *VideoInfoFaker) CronUpdate() {
f.mu.Lock()
defer f.mu.Unlock()
start := time.Now()
totalUpdate, err := f.fakeVideoInfo()
log.Info("CronUpdate fihish",
log.Any("time(s)", time.Since(start).Seconds()),
log.Any("total", totalUpdate),
log.E(err))
}
func (f *VideoInfoFaker) RegisterCronJob(cron *cron.Cron) {
f.mu.Lock()
defer f.mu.Unlock()
_, _ = cron.AddFunc("0 0 10 */1 * *", f.CronUpdate) // 每隔三天,早上10点,仅在周一到周六执行
}
// FakeVideoInfo 更新视频相关数据
func (f *VideoInfoFaker) fakeVideoInfo() (int64, error) {
robotConf, err := chatrobotmod.GetRobotConfByType(chatrobotmod.Comment)
if err != nil || robotConf.ID.IsZero() {
return 0, err
}
if (robotConf.MaxFakeLikes <= 0 && robotConf.MaxFakePlayCount <= 0) ||
(robotConf.MinFakeLikes >= robotConf.MaxFakeLikes &&
robotConf.MinFakePlayCount >= robotConf.MaxFakePlayCount) {
return 0, stderr.RobotInvalidConf
}
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
pageSize, page, totalUpdate := f.limit, int64(0), int64(0)
for pageSize == f.limit {
videoList, err := vidmod.GetVideoListLtMinPlayLikeCount(int64(robotConf.MinFakeLikes),
int64(robotConf.MinFakePlayCount), page*pageSize, pageSize)
if err != nil {
return totalUpdate, err
}
cnt := int64(0)
for _, video := range videoList {
set := bson.M{}
if video.FakeLikeCount < robotConf.MinFakeLikes {
destLike := common.RandInt(robotConf.MinFakeLikes, robotConf.MaxFakeLikes)
set["fakeLikeCount"] = destLike
}
if video.FakePlayCount < robotConf.MinFakePlayCount {
destPlay := common.RandInt(robotConf.MinFakePlayCount, robotConf.MaxFakePlayCount)
video.FakePlayCount = destPlay
set["fakePlayCount"] = destPlay
}
if set["fakePlayCount"] != 0 || set["fakeLikeCount"] != 0 {
// log.Info("update", log.Any("set", set), log.Any("vid", video.ID), log.Any("origin like", video.FakeLikeCount), log.Any("origin play", video.PlayCount))
res, err := vidmod.UpdateOneByID(video.ID, set)
if err != nil {
// 遇到错误继续执行
log.Error("fakeVideoInfo UpdateOneByID", log.Any("videoID", video.ID), log.E(err))
} else {
cnt += res.ModifiedCount
}
}
}
page++
pageSize = int64(len(videoList))
totalUpdate += cnt
log.Info("fake progress", log.Any("page", page), log.Any("total", totalUpdate))
<-ticker.C
}
return totalUpdate, nil
}