@@ -0,0 +1,215 @@
|
||||
package mediaresourceser
|
||||
|
||||
import (
|
||||
"91porn-server/common"
|
||||
"91porn-server/common/log"
|
||||
mediaService "91porn-server/common/media"
|
||||
"91porn-server/common/mediaCenter"
|
||||
"91porn-server/web/webg"
|
||||
"errors"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
"strings"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type MediaListReq struct {
|
||||
MediaType int `json:"media_type" form:"media_type"` // 1-动画 2-漫画 3-文本小说 4-有声小说 5-短剧
|
||||
MediaCenterId *uint `json:"media_center_id" form:"media_center_id"` // 媒资中心的中资源唯一id
|
||||
VloggerId *uint `json:"vlogger_id" form:"vlogger_id"` // up主id
|
||||
IsUp *int `json:"is_up" form:"is_up"` // 是否是up主 0-不是 1-是 不传则是所有
|
||||
Title *string `json:"title" form:"title"` // 标题
|
||||
Tag *string `json:"tag" form:"tag"` // 标签
|
||||
TerminalCdo *string `json:"terminal_cdo" form:"terminal_cdo"` // 上传者
|
||||
SyncType int `json:"sync_type" form:"sync_type"` // 同步类型 1-全量同步 2-增量同步
|
||||
Page uint `json:"page" form:"page"`
|
||||
Size uint `json:"size" form:"size"`
|
||||
}
|
||||
|
||||
type MediaListResp struct {
|
||||
List []*mediaCenter.Media `json:"list"`
|
||||
Total uint `json:"total"`
|
||||
}
|
||||
|
||||
func (p *MediaListReq) Validate() error {
|
||||
if p.MediaType < 1 || p.MediaType > 5 {
|
||||
return errors.New("media_type只支持1到5")
|
||||
}
|
||||
if p.Page < 1 || p.Size < 1 || p.Size > 100 {
|
||||
return errors.New("page必须大于0且size必须在1到100之间")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *MediaListReq) GetList() (res MediaListResp, err error) {
|
||||
ms := mediaCenter.NewMediaCenterService(mediaCenter.Config{
|
||||
Url: webg.Conf.MediaResourceDBCfg.BaseUrl,
|
||||
ProId: webg.Conf.MediaResourceDBCfg.Merchat,
|
||||
Secret: webg.Conf.MediaResourceDBCfg.Secret,
|
||||
})
|
||||
data, err := ms.MediaList(&mediaCenter.MediaListReq{
|
||||
MediaType: p.MediaType,
|
||||
Id: p.MediaCenterId,
|
||||
VloggerId: p.VloggerId,
|
||||
IsUp: p.IsUp,
|
||||
Title: p.Title,
|
||||
Tag: p.Tag,
|
||||
TerminalCdo: p.TerminalCdo,
|
||||
SyncType: p.SyncType,
|
||||
Page: p.Page,
|
||||
Size: p.Size,
|
||||
})
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
res.List = data.Data
|
||||
res.Total = data.Pagination.Count
|
||||
return
|
||||
}
|
||||
|
||||
type MediaContentListReq struct {
|
||||
MediaId int `json:"media_id" form:"media_id"`
|
||||
Page uint `json:"page" form:"page"`
|
||||
Size uint `json:"size" form:"size"`
|
||||
}
|
||||
|
||||
type MediaContentListResp struct {
|
||||
List []*mediaCenter.MediaContent `json:"list"`
|
||||
Total uint `json:"total"`
|
||||
}
|
||||
|
||||
func (p *MediaContentListReq) Validate() error {
|
||||
if p.MediaId <= 0 {
|
||||
return errors.New("media_id必须大于0")
|
||||
}
|
||||
if p.Page < 1 || p.Size < 1 || p.Size > 100 {
|
||||
return errors.New("page必须大于0且size必须在1到100之间")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *MediaContentListReq) GetList() (res MediaContentListResp, err error) {
|
||||
ms := mediaCenter.NewMediaCenterService(mediaCenter.Config{
|
||||
Url: webg.Conf.MediaResourceDBCfg.BaseUrl,
|
||||
ProId: webg.Conf.MediaResourceDBCfg.Merchat,
|
||||
Secret: webg.Conf.MediaResourceDBCfg.Secret,
|
||||
})
|
||||
data, err := ms.MediaContentList(&mediaCenter.MediaContentListReq{
|
||||
MediaId: p.MediaId,
|
||||
Page: p.Page,
|
||||
Size: p.Size,
|
||||
})
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
res.List = data.Data
|
||||
res.Total = data.Pagination.Count
|
||||
return
|
||||
}
|
||||
|
||||
type MediaUseReq struct {
|
||||
Ids []uint `json:"ids" form:"ids"`
|
||||
Kind int `json:"kind" form:"kind" binding:"required"` //种类(1、哩番,2、3D,3、同人动画,4、单行本,5、连载漫画,6、韩漫 7、小说 8剧场
|
||||
Type int `json:"type" form:"type" binding:"required"` //维度筛选 1-动漫 2-漫画
|
||||
Dimension string `json:"dimension" form:"dimension" binding:"required"` //维度
|
||||
SectionId primitive.ObjectID `json:"section_id" form:"section_id"` //专题id
|
||||
}
|
||||
|
||||
func (p *MediaUseReq) Validate() error {
|
||||
if len(p.Ids) == 0 || len(p.Ids) > 100 {
|
||||
return errors.New("ids数量必须在1到100之间")
|
||||
}
|
||||
if strings.EqualFold(strings.TrimSpace(p.Dimension), "drama") {
|
||||
if p.Kind != 8 || p.Type != 1 {
|
||||
return errors.New("短剧导入时kind必须为8且type必须为1")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *MediaUseReq) Use(admin string) (err error) {
|
||||
if err = p.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
workerCount := 5
|
||||
if len(p.Ids) < workerCount {
|
||||
workerCount = len(p.Ids)
|
||||
}
|
||||
jobs := make(chan uint)
|
||||
errs := make(chan error, len(p.Ids))
|
||||
var wg sync.WaitGroup
|
||||
for i := 0; i < workerCount; i++ {
|
||||
wg.Add(1)
|
||||
common.Go(func() {
|
||||
defer wg.Done()
|
||||
for id := range jobs {
|
||||
if useErr := use(id, admin, p.Dimension, p.Type, p.Kind, p.SectionId); useErr != nil {
|
||||
log.Error("MediaUse Fail", log.Any("id", id), log.E(useErr))
|
||||
errs <- useErr
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
for _, id := range p.Ids {
|
||||
jobs <- id
|
||||
}
|
||||
close(jobs)
|
||||
wg.Wait()
|
||||
close(errs)
|
||||
for useErr := range errs {
|
||||
if useErr != nil {
|
||||
return useErr
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func use(id uint, admin string, dimension string, dimensionType, kind int, sectionId primitive.ObjectID) (err error) {
|
||||
mediaService := mediaService.NewMediaSync(webg.Redis, mediaCenter.NewMediaCenterService(mediaCenter.Config{
|
||||
Url: webg.Conf.MediaResourceDBCfg.BaseUrl,
|
||||
ProId: webg.Conf.MediaResourceDBCfg.Merchat,
|
||||
Secret: webg.Conf.MediaResourceDBCfg.Secret,
|
||||
}))
|
||||
// 调用use接口,在媒资库打上标记,避免还出现在增量数据里
|
||||
err = mediaService.Ms.MediaUse(&mediaCenter.MediaUseReq{
|
||||
Ids: []uint{id},
|
||||
})
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
// 因为需要同步的东西特别多,所以需要异步处理
|
||||
mediaService.Worker.Exec(func() {
|
||||
mediaService.UseMediaData(admin, id, dimension, dimensionType, kind, sectionId)
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
type MediaIgnoreReq struct {
|
||||
Ids []uint `json:"ids" form:"ids"`
|
||||
}
|
||||
|
||||
func (p *MediaIgnoreReq) Ignore() (err error) {
|
||||
ms := mediaCenter.NewMediaCenterService(mediaCenter.Config{
|
||||
Url: webg.Conf.MediaResourceDBCfg.BaseUrl,
|
||||
ProId: webg.Conf.MediaResourceDBCfg.Merchat,
|
||||
Secret: webg.Conf.MediaResourceDBCfg.Secret,
|
||||
})
|
||||
// 在媒资库打上标记,避免还出现在增量数据里
|
||||
return ms.MediaIgnore(&mediaCenter.MediaIgnoreReq{
|
||||
Ids: p.Ids,
|
||||
})
|
||||
}
|
||||
|
||||
type MediaSyncReq struct {
|
||||
}
|
||||
|
||||
// 执行同步的请求
|
||||
func (p *MediaSyncReq) Sync(admin string) {
|
||||
common.Go(func() {
|
||||
mediaService := mediaService.NewMediaSync(webg.Redis, mediaCenter.NewMediaCenterService(mediaCenter.Config{
|
||||
Url: webg.Conf.MediaResourceDBCfg.BaseUrl,
|
||||
ProId: webg.Conf.MediaResourceDBCfg.Merchat,
|
||||
Secret: webg.Conf.MediaResourceDBCfg.Secret,
|
||||
}))
|
||||
mediaService.SyncAll(admin)
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package mediaresourceser
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestMediaListReqValidate(t *testing.T) {
|
||||
valid := MediaListReq{MediaType: 5, Page: 1, Size: 20}
|
||||
if err := valid.Validate(); err != nil {
|
||||
t.Fatalf("valid request rejected: %v", err)
|
||||
}
|
||||
invalidType := valid
|
||||
invalidType.MediaType = 6
|
||||
if err := invalidType.Validate(); err == nil {
|
||||
t.Fatal("invalid media_type unexpectedly accepted")
|
||||
}
|
||||
invalidPage := valid
|
||||
invalidPage.Page = 0
|
||||
if err := invalidPage.Validate(); err == nil {
|
||||
t.Fatal("page 0 unexpectedly accepted")
|
||||
}
|
||||
}
|
||||
|
||||
func TestMediaUseReqValidateDrama(t *testing.T) {
|
||||
valid := MediaUseReq{Ids: []uint{1}, Dimension: "drama", Kind: 8, Type: 1}
|
||||
if err := valid.Validate(); err != nil {
|
||||
t.Fatalf("valid drama import rejected: %v", err)
|
||||
}
|
||||
invalid := valid
|
||||
invalid.Kind = 1
|
||||
if err := invalid.Validate(); err == nil {
|
||||
t.Fatal("invalid drama kind unexpectedly accepted")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user