Files
huangguo_server/common/media/sync.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

112 lines
2.6 KiB
Go

package mediaService
import (
"91porn-server/common/log"
"91porn-server/common/mediaCenter"
"91porn-server/common/redis"
v10 "91porn-server/common/v10"
"91porn-server/models/v/mediamod"
"91porn-server/models/v/mediatagmod"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"time"
)
type mediaSync struct {
rd *redis.Client
Ms *mediaCenter.MediaCenterService
Worker *worker
}
func NewMediaSync(rd *redis.Client, ms *mediaCenter.MediaCenterService) *mediaSync {
return &mediaSync{
rd: rd,
Ms: ms,
Worker: w, //最多同时N个协程处理任务
}
}
func (m *mediaSync) SyncAll(admin string) {
// 判断当前是否有正在同步的任务,有的话就不执行
key := "MediaSyncAll"
has, err := m.rd.SetNX(key, 1, time.Minute*10)
if err != nil {
log.Error("SyncAll setNx fail", log.E(err))
return
}
if !has {
return
}
// 释放锁
defer m.rd.Del(key)
// 获取所有订阅未完结的动漫
filter := bson.M{
"mediaCenterId": bson.M{"$gt": 0},
"updateStatus": 1, //未完结的状态
"isDelete": false,
}
sort := bson.D{{"_id", -1}, {"createdAt", -1}}
var skip int64
var limit int64 = 500
for {
list, hasNext, err := mediamod.GetList(filter, skip, limit, sort)
if err != nil {
return
}
for _, v := range list {
media := v
m.Worker.Exec(func() {
err = m.SyncMediaData(media)
if err != nil {
log.Error("SyncMediaData fail", log.Any("mediaId", media.ID), log.E(err))
return
}
})
}
skip += limit
if !hasNext {
break
}
}
}
func (m *mediaSync) OnSyncTimeChange(mediaId primitive.ObjectID, syncTime int64) {
if mediaId.IsZero() || syncTime <= 0 {
return
}
// 修改下一次需要同步的时间点位
updataData := make(map[string]interface{})
updataData["syncTime"] = syncTime
updataData["updateTime"] = time.Now()
mediamod.UpdateByID(nil, mediaId, updataData)
}
// HandleTag 处理标签
func HandleTag(tagname, dimension string, dimensionType, kind int) (tagID primitive.ObjectID, suc bool) {
tMod := mediatagmod.MediaTag{}
tagname = v10.ExtractPureChar(tagname)
tagInfo, err := mediatagmod.FindOneTagByFilter(bson.M{
"name": tagname,
"kind": kind,
"dimension": dimension,
"type": dimensionType,
})
if err == nil && !tagInfo.ID.IsZero() {
return tagInfo.ID, true
}
tMod.Name = tagname
tMod.Dimension = dimension
tMod.Kind = kind
tMod.Type = dimensionType
tMod.Active = true
tMod.CreatedAt = time.Now()
tMod.UpdateTime = time.Now()
id, err := mediatagmod.Insert(nil, tMod)
if err != nil {
return primitive.NilObjectID, false
}
return id, true
}