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 }