Files
GoFilm/server/model/system/CollectSource.go
2025-02-18 14:36:12 +08:00

178 lines
4.4 KiB
Go

package system
import (
"encoding/json"
"errors"
"fmt"
"github.com/redis/go-redis/v9"
"log"
"server/config"
"server/plugin/common/util"
"server/plugin/db"
)
/*
影视采集站点信息
*/
type SourceGrade int
const (
MasterCollect SourceGrade = iota
SlaveCollect
)
type CollectResultModel int
const (
JsonResult CollectResultModel = iota
XmlResult
)
type ResourceType int
func (rt ResourceType) GetActionType() string {
var ac string = ""
switch rt {
case CollectVideo:
ac = "detail"
case CollectArticle:
ac = "article"
case CollectActor:
ac = "actor"
case CollectRole:
ac = "role"
case CollectWebSite:
ac = "web"
default:
ac = "detail"
}
return ac
}
const (
CollectVideo = iota
CollectArticle
CollectActor
CollectRole
CollectWebSite
)
// FilmSource 影视站点信息保存结构体
type FilmSource struct {
Id string `json:"id"` // 唯一ID
Name string `json:"name"` // 采集站点备注名
Uri string `json:"uri"` // 采集链接
ResultModel CollectResultModel `json:"resultModel"` // 接口返回类型, json || xml
Grade SourceGrade `json:"grade"` // 采集站等级 主站点 || 附属站
SyncPictures bool `json:"syncPictures"` // 是否同步图片到服务器
CollectType ResourceType `json:"collectType"` // 采集资源类型
State bool `json:"state"` // 是否启用
Interval int `json:"interval"` // 采集时间间隔 单位/ms
}
// SaveCollectSourceList 保存采集站Api列表
func SaveCollectSourceList(list []FilmSource) error {
var zl []redis.Z
for _, v := range list {
m, _ := json.Marshal(v)
zl = append(zl, redis.Z{Score: float64(v.Grade), Member: m})
}
return db.Rdb.ZAdd(db.Cxt, config.FilmSourceListKey, zl...).Err()
}
// GetCollectSourceList 获取采集站API列表
func GetCollectSourceList() []FilmSource {
l, err := db.Rdb.ZRange(db.Cxt, config.FilmSourceListKey, 0, -1).Result()
if err != nil {
log.Println(err)
return nil
}
return getCollectSource(l)
}
// GetCollectSourceListByGrade 返回指定类型的采集Api信息 Master | Slave
func GetCollectSourceListByGrade(grade SourceGrade) []FilmSource {
s := fmt.Sprintf("%d", grade)
zl, err := db.Rdb.ZRangeByScore(db.Cxt, config.FilmSourceListKey, &redis.ZRangeBy{Max: s, Min: s}).Result()
if err != nil {
log.Println(err)
return nil
}
return getCollectSource(zl)
}
// FindCollectSourceById 通过Id标识获取对应的资源站信息
func FindCollectSourceById(id string) *FilmSource {
for _, v := range GetCollectSourceList() {
if v.Id == id {
return &v
}
}
return nil
}
// 将 []string 转化为 []FilmSourceApi
func getCollectSource(sl []string) []FilmSource {
var l []FilmSource
for _, s := range sl {
f := FilmSource{}
_ = json.Unmarshal([]byte(s), &f)
l = append(l, f)
}
return l
}
// DelCollectResource 通过Id删除对应的采集站点信息
func DelCollectResource(id string) {
for _, v := range GetCollectSourceList() {
if v.Id == id {
data, _ := json.Marshal(v)
db.Rdb.ZRem(db.Cxt, config.FilmSourceListKey, data)
}
}
}
// AddCollectSource 添加采集站信息
func AddCollectSource(s FilmSource) error {
for _, v := range GetCollectSourceList() {
if v.Uri == s.Uri {
return errors.New("当前采集站点信息已存在, 请勿重复添加")
}
}
// 生成一个短uuid
s.Id = util.GenerateSalt()
data, _ := json.Marshal(s)
return db.Rdb.ZAddNX(db.Cxt, config.FilmSourceListKey, redis.Z{Score: float64(s.Grade), Member: data}).Err()
}
// UpdateCollectSource 更新采集站信息
func UpdateCollectSource(s FilmSource) error {
for _, v := range GetCollectSourceList() {
if v.Id != s.Id && v.Uri == s.Uri {
return errors.New("当前采集站链接已存在其他站点中, 请勿重复添加")
} else if v.Id == s.Id {
// 删除当前旧的采集信息
DelCollectResource(s.Id)
// 将新的采集信息存入list中
data, _ := json.Marshal(s)
db.Rdb.ZAdd(db.Cxt, config.FilmSourceListKey, redis.Z{Score: float64(s.Grade), Member: data})
}
}
return nil
}
// ClearAllCollectSource 删除所有采集站信息
func ClearAllCollectSource() {
db.Rdb.Del(db.Cxt, config.FilmSourceListKey)
}
// ExistCollectSourceList 查询是否已经存在站点list相关数据
func ExistCollectSourceList() bool {
if db.Rdb.Exists(db.Cxt, config.FilmSourceListKey).Val() == 0 {
return false
}
return true
}