715 lines
21 KiB
Go
715 lines
21 KiB
Go
package updownloadser
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"mime"
|
|
"net/http"
|
|
"path/filepath"
|
|
"runtime/debug"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"91porn-server/common"
|
|
"91porn-server/common/constant"
|
|
"91porn-server/common/elastic"
|
|
"91porn-server/common/httputil"
|
|
"91porn-server/common/log"
|
|
"91porn-server/common/stderr"
|
|
"91porn-server/common/timeutil"
|
|
v10 "91porn-server/common/v10"
|
|
"91porn-server/models"
|
|
"91porn-server/models/commod"
|
|
"91porn-server/models/l/pullgmod"
|
|
"91porn-server/models/v/fsuidmod"
|
|
"91porn-server/models/v/idmod"
|
|
"91porn-server/models/v/locmod"
|
|
"91porn-server/models/v/tagmod"
|
|
"91porn-server/models/v/usermod"
|
|
"91porn-server/models/v/vidmod"
|
|
"91porn-server/web/webg"
|
|
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
)
|
|
|
|
var cities = []string{"上海", "北京", "深圳", "成都", "杭州", "重庆", "广州", "西安", "武汉"}
|
|
|
|
// 从server-file 查找用户信息
|
|
func SearchUserFromFS(id string) (respBody vidmod.PublishResport, err error) {
|
|
var params = map[string]string{
|
|
"uid": id,
|
|
}
|
|
code, err := httputil.DefaultClientGetWithResp(&respBody, webg.Conf.URL.SearchUserUrl, nil, params)
|
|
log.Info("http method SearchUserFromFS response code ==>", log.Any("statusCode", code), log.Any("respCode", respBody.Code))
|
|
if err != nil {
|
|
log.Error("search user info wrong ", log.E(err))
|
|
}
|
|
return
|
|
}
|
|
|
|
// SendVidCover2FS 传送图片
|
|
func SendVidCover2FS(id string, ext string, fileData string) (respBody commod.Resp, err error) {
|
|
var params = map[string]string{
|
|
"fileData": fileData,
|
|
"ext": ext,
|
|
}
|
|
code, err := httputil.DefaultClientPostJsonWithResp(&respBody, common.BindUrl(webg.Conf.URL.UploadImgUrl, id), nil, params)
|
|
log.Info("http method SendVidCover2FS response code ==>", log.Any("statusCode", code), log.Any("respCode", respBody.Code))
|
|
if err != nil {
|
|
log.Error("file upload wrong ", log.E(err))
|
|
}
|
|
return
|
|
}
|
|
|
|
// SendFile2FS 传送视频文件到FS
|
|
func SendFile2FS(fileID string, fileData string, pos int64, total int64) (respBody vidmod.AwsResport, err error) {
|
|
var header = map[string]string{
|
|
"Content-Type": "application/json",
|
|
}
|
|
var params = map[string]interface{}{
|
|
"taskId": fileID,
|
|
"fileData": fileData,
|
|
"pos": pos,
|
|
"totalPos": total,
|
|
"type": "sp",
|
|
}
|
|
c, cancle := context.WithTimeout(context.Background(), 5*time.Minute)
|
|
defer cancle()
|
|
code, err := httputil.DefaultClientPostJsonWithRespWithCtx(c, &respBody, webg.Conf.URL.UploadUrl, header, params)
|
|
log.Info("http method SendFile2FS response code ==>", log.Any("statusCode", code), log.Any("respCode", respBody.Code))
|
|
if err != nil {
|
|
log.Error("file upload wrong ", log.E(err))
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// SendImageToFS 传送图片
|
|
func SendImageToFS(fileName, fileData string) (respBody vidmod.FsSendSingleResp, err error) {
|
|
var params = map[string]interface{}{
|
|
"fileData": fileData,
|
|
"fileName": fileName,
|
|
}
|
|
code, err := httputil.DefaultClientPostJsonWithResp(&respBody, webg.Conf.URL.SendSingleFile, nil, params)
|
|
log.Info("http method SendImageToFS response code ==>", log.Any("statusCode", code), log.Any("respCode", respBody.Code))
|
|
if err != nil {
|
|
log.Error("file upload wrong ", log.E(err))
|
|
}
|
|
return
|
|
}
|
|
|
|
type FileInfo struct {
|
|
FileName *string `json:"fileName"` // 文件名称
|
|
FileData *string `json:"fileData"` // 文件存储在那台服务器
|
|
Resize bool `json:"resize"`
|
|
}
|
|
|
|
type InfoBatch struct {
|
|
Batch []*FileInfo `json:"batch"` //Info array
|
|
}
|
|
|
|
// SendImageToFSBatch 传送图片
|
|
func SendImageToFSBatch(batch InfoBatch) (respBody vidmod.FsSendBatchResp, err error) {
|
|
if len(batch.Batch) == 0 {
|
|
err = errors.New("no file")
|
|
return
|
|
}
|
|
c, cancle := context.WithTimeout(context.Background(), 5*time.Minute)
|
|
defer cancle()
|
|
code, err := httputil.DefaultClientPostJsonWithRespWithCtx(c, &respBody, webg.Conf.URL.SendBatchFile, nil, batch)
|
|
log.Info("http method SendImageToFSBatch response code ==>", log.Any("statusCode", code), log.Any("respCode", respBody.Code))
|
|
if err != nil {
|
|
log.Error("SendImageToFSBatch file upload wrong ", log.E(err))
|
|
}
|
|
return
|
|
}
|
|
|
|
// FsIO 获取io.ready
|
|
func FsIO(source, mds string) (data []byte, err error) {
|
|
_, data, err = httputil.DefaultClientGetBytes(common.BindUrl(getOriginUrl(mds), source), nil)
|
|
return data, err
|
|
}
|
|
|
|
func getOriginUrl(mds string) string {
|
|
switch mds {
|
|
case constant.MediaSourcePMS:
|
|
return webg.Conf.URL.CdnUrl
|
|
case constant.MediaSourceSP:
|
|
return webg.Conf.URL.OriginUrl
|
|
case constant.MediaSourceJH1B:
|
|
return webg.Conf.URL.OriginUrl
|
|
case constant.MediaSourceLaoSiJi:
|
|
return webg.Conf.URL.LaoSiJiOriginUrl
|
|
|
|
default:
|
|
return webg.Conf.URL.OriginUrl
|
|
}
|
|
}
|
|
|
|
// 获取马甲账号电话号码
|
|
func genMobileAndDevID(uid uint64) (string, string) {
|
|
//马甲账号电话号码, 2的字符串拼接uid
|
|
orgin := "12222222222"
|
|
struid := strconv.FormatUint(uid, 10)
|
|
l := 11 - len(struid)
|
|
mobile := orgin[:l] + struid
|
|
devID := usermod.SystemDevIDPrex + struid
|
|
return mobile, devID
|
|
}
|
|
|
|
// 随机获取生日
|
|
func getBirthDate() string {
|
|
var initBirthday = "1993-01-20"
|
|
initTime, _ := time.Parse("2006-01-02", initBirthday)
|
|
randomTime := common.RandInt(7*24*60*60, 7*365*24*60*60)
|
|
return time.Unix(initTime.UTC().Unix()+int64(randomTime), 0).Format("2006-01-02")
|
|
}
|
|
|
|
// 游客注册
|
|
func register(fsid string) (uid uint64, city string, err error) {
|
|
var portrait, summary, name string
|
|
uid, err = idmod.GetNextUID()
|
|
if err != nil {
|
|
return
|
|
}
|
|
mobile, devID := genMobileAndDevID(uid)
|
|
createdAt := time.Now()
|
|
if len(webg.Static.Portrait) > 0 {
|
|
portrait = webg.Static.Portrait[common.RandInt(0, len(webg.Static.Portrait))]
|
|
}
|
|
if len(webg.Static.Cities) > 0 {
|
|
city = webg.Static.Cities[common.RandInt(0, len(webg.Static.Cities))]
|
|
} else {
|
|
city = cities[common.RandInt(0, len(cities))]
|
|
}
|
|
if len(webg.Static.Names) > 0 {
|
|
name = webg.Static.Names[common.RandInt(0, len(webg.Static.Names))]
|
|
} else {
|
|
name = "游客" + strconv.FormatInt(time.Now().Unix(), 10)
|
|
}
|
|
publisher, err := SearchUserFromFS(fsid)
|
|
if err != nil {
|
|
return
|
|
}
|
|
if publisher.Code == http.StatusOK && publisher.Data.UserName != "" {
|
|
createdAt = publisher.Data.CreatedAt
|
|
portrait = publisher.Data.Portrait
|
|
name = publisher.Data.UserName
|
|
summary = publisher.Data.Summary
|
|
}
|
|
u := usermod.User{
|
|
UID: uid,
|
|
DevID: devID,
|
|
Name: name,
|
|
Portrait: portrait,
|
|
Gender: "female",
|
|
Summary: summary,
|
|
Birthday: getBirthDate(),
|
|
Region: city,
|
|
RegisterIP: "",
|
|
WatchCount: 10, //初始化观看次数 默认为10
|
|
PromCode: "",
|
|
DevToken: "",
|
|
VideoDeduction: 3, //默认视频扣量 30%
|
|
VipExpireDate: time.Unix(0, 0),
|
|
DevType: "xxxx",
|
|
SysType: constant.SysTypeIOS,
|
|
Mobile: mobile,
|
|
MobileBindAt: &createdAt,
|
|
Ver: "3.0.1",
|
|
}
|
|
err = usermod.InsertUser(&u)
|
|
return
|
|
}
|
|
|
|
// getUIDByFsid 获取文件服发布者id映射的uid
|
|
func getUIDByFsid(fsid string) (uint64, string, error) {
|
|
uid, err := fsuidmod.FindFsid2UID(fsid)
|
|
if err != nil {
|
|
return uid, "", err
|
|
}
|
|
user, err := usermod.FindUserByUID(uid)
|
|
if user != nil && err == nil {
|
|
return user.UID, user.Region, nil
|
|
}
|
|
var city string
|
|
if uid == 0 {
|
|
//生成用户 从fs 获取用户信息
|
|
uid, city, err = register(fsid)
|
|
if err != nil {
|
|
return 0, "", err
|
|
}
|
|
//插入映射关系
|
|
_ = fsuidmod.InsertFsid2UID(fsid, uid)
|
|
}
|
|
return uid, city, nil
|
|
}
|
|
|
|
// PullFile 同步文件
|
|
func PullFile(pullParam vidmod.PullReq) (code stderr.Code, data map[string]interface{}) {
|
|
var pullResp []vidmod.AwsPullResp
|
|
var failIds []string
|
|
var count int
|
|
var failCount int
|
|
var lastID string
|
|
var page = 1
|
|
awsPullReq := pullParam.AwsPullReq
|
|
awsPullReq.Status = "Completed"
|
|
rStatus, err := strconv.Atoi(pullParam.RStatus)
|
|
if err != nil {
|
|
return stderr.Failure, nil
|
|
}
|
|
coins, err := strconv.ParseInt(pullParam.Coins, 10, 64)
|
|
if err != nil {
|
|
return stderr.Failure, nil
|
|
}
|
|
defer func() {
|
|
if lastID != "" {
|
|
pullLog := pullgmod.PullLog{
|
|
LastID: lastID,
|
|
Count: count,
|
|
FailCount: failCount,
|
|
FailIDs: failIds,
|
|
CreatedAt: time.Now(),
|
|
VidType: awsPullReq.Type,
|
|
NewUpdatedAt: awsPullReq.NewUpdateAt,
|
|
}
|
|
_ = pullgmod.InsertPullLog(pullLog)
|
|
}
|
|
if r := recover(); r != nil {
|
|
code = stderr.Failure
|
|
log.Warn("pull file info occour error", log.Any("Detail", r), log.Any("stack", string(debug.Stack())))
|
|
}
|
|
}()
|
|
pl, err := pullgmod.FindPullRecord(awsPullReq.Type, awsPullReq.NewUpdateAt)
|
|
if err != nil {
|
|
return stderr.Failure, nil
|
|
}
|
|
if pl != nil && !pullParam.Retry {
|
|
awsPullReq.ID = pl.LastID
|
|
}
|
|
for {
|
|
awsPullReq.Page = page
|
|
param := common.StructToMap(awsPullReq)
|
|
resp, err := PullFileInfoFromFS(param)
|
|
if err != nil || len(resp.Data) == 0 || resp.Code != http.StatusOK {
|
|
break
|
|
}
|
|
pullResp = resp.Data
|
|
city := pullParam.Cityes[common.RandInt(0, len(pullParam.Cityes))]
|
|
for _, pr := range pullResp {
|
|
if len(pr.Tags) == 0 {
|
|
continue
|
|
}
|
|
tags := make([]primitive.ObjectID, 0, len(pr.Tags))
|
|
for _, t := range pr.Tags {
|
|
tid, suc := HandleTag(t, pr.FieldNameFs+"-1.jpg")
|
|
if !suc {
|
|
continue
|
|
}
|
|
tags = append(tags, tid)
|
|
}
|
|
var userId uint64
|
|
randomUid := pullParam.UID[common.RandInt(0, len(pullParam.UID))]
|
|
if pr.PublishID != "" {
|
|
uid, regcity, err := getUIDByFsid(pr.PublishID)
|
|
city = regcity
|
|
userId = uid
|
|
if err != nil {
|
|
userId = randomUid
|
|
user, err := usermod.FindUserByUID(userId)
|
|
if user != nil && err == nil {
|
|
city = user.Region
|
|
}
|
|
}
|
|
} else {
|
|
userId = randomUid
|
|
user, err := usermod.FindUserByUID(userId)
|
|
if user != nil && err == nil {
|
|
city = user.Region
|
|
}
|
|
}
|
|
resCode := HandleFileBase(userId, city, tags, awsPullReq.NewUpdateAt, pr, rStatus, coins)
|
|
if resCode != stderr.Success {
|
|
failIds = append(failIds, pr.ID)
|
|
failCount++
|
|
}
|
|
lastID = pr.ID
|
|
count++
|
|
}
|
|
page++
|
|
}
|
|
data = make(map[string]interface{})
|
|
data["pullCount"] = count
|
|
data["failCount"] = failCount
|
|
data["lastID"] = lastID
|
|
return stderr.Success, data
|
|
}
|
|
|
|
func PullSeriesFile(pullParam vidmod.PullReq) (code stderr.Code, data map[string]interface{}) {
|
|
var pullResp []vidmod.AwsPullSeriesResp
|
|
var failIds []string
|
|
var count int
|
|
var failCount int
|
|
var lastID string
|
|
var page = 1
|
|
awsPullReq := pullParam.AwsPullReq
|
|
awsPullReq.Type = "SP"
|
|
awsPullReq.Status = "Completed"
|
|
rStatus, err := strconv.Atoi(pullParam.RStatus)
|
|
if err != nil {
|
|
return stderr.Failure, nil
|
|
}
|
|
coins, err := strconv.ParseInt(pullParam.Coins, 10, 64)
|
|
if err != nil {
|
|
return stderr.Failure, nil
|
|
}
|
|
defer func() {
|
|
if lastID != "" {
|
|
pullLog := pullgmod.PullLog{
|
|
LastID: lastID,
|
|
Count: count,
|
|
FailCount: failCount,
|
|
FailIDs: failIds,
|
|
CreatedAt: time.Now(),
|
|
VidType: pullParam.SyncType,
|
|
NewUpdatedAt: awsPullReq.NewUpdateAt,
|
|
}
|
|
_ = pullgmod.InsertPullLog(pullLog)
|
|
}
|
|
if r := recover(); r != nil {
|
|
code = stderr.Failure
|
|
log.Warn("pull file info occour error", log.Any("Detail", r), log.Any("stack", string(debug.Stack())))
|
|
}
|
|
}()
|
|
pl, err := pullgmod.FindPullRecord(pullParam.SyncType, awsPullReq.NewUpdateAt)
|
|
if err != nil {
|
|
return stderr.Failure, nil
|
|
}
|
|
if pl != nil && !pullParam.Retry {
|
|
awsPullReq.ID = pl.LastID
|
|
}
|
|
for {
|
|
awsPullReq.Page = page
|
|
param := common.StructToMap(awsPullReq)
|
|
resp, err := PullSeriesFromFS(param)
|
|
if err != nil || len(resp.Data) == 0 || resp.Code != http.StatusOK {
|
|
break
|
|
}
|
|
pullResp = resp.Data
|
|
city := pullParam.Cityes[common.RandInt(0, len(pullParam.Cityes))]
|
|
for _, pr := range pullResp {
|
|
tags := make([]primitive.ObjectID, 0, len(pr.Tags))
|
|
for _, t := range pr.Tags {
|
|
tid, suc := HandleTag(t, pr.CoverImg)
|
|
if !suc {
|
|
continue
|
|
}
|
|
tags = append(tags, tid)
|
|
}
|
|
var userId uint64
|
|
randomUid := pullParam.UID[common.RandInt(0, len(pullParam.UID))]
|
|
userId = randomUid
|
|
user, err := usermod.FindUserByUID(userId)
|
|
if user != nil && err == nil {
|
|
city = user.Region
|
|
}
|
|
resCode := HandleSeriesBase(userId, city, tags, awsPullReq.NewUpdateAt, pr, rStatus, coins)
|
|
if resCode != stderr.Success {
|
|
failIds = append(failIds, pr.ID)
|
|
failCount++
|
|
}
|
|
lastID = pr.ID
|
|
count++
|
|
}
|
|
page++
|
|
}
|
|
data = make(map[string]interface{})
|
|
data["pullCount"] = count
|
|
data["failCount"] = failCount
|
|
data["lastID"] = lastID
|
|
return stderr.Success, data
|
|
}
|
|
|
|
// HandleFileBase 处理文件基础信息
|
|
func HandleFileBase(uid uint64, city string, tags []primitive.ObjectID, newUpdatedAt string, req vidmod.AwsPullResp, status int, coins int64) (code stderr.Code) {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
code = stderr.Failure
|
|
return
|
|
}
|
|
}()
|
|
if len(tags) == 0 {
|
|
return stderr.Failure
|
|
}
|
|
//过滤调重复的视频 如果重复则跳过此视频
|
|
if vidmod.IsExist(req.CheckSum, req.Size) {
|
|
return stderr.Failure
|
|
}
|
|
l := locmod.Location{
|
|
City: city,
|
|
}
|
|
if err := locmod.InsertLocationInfo(l); err != nil {
|
|
return stderr.ErrDbInsertError
|
|
}
|
|
lid, err := locmod.GetLocationIDByCity(city)
|
|
if err != nil {
|
|
return stderr.ErrDbQueryError
|
|
}
|
|
if vidmod.IsExistBySocID(req.ID) {
|
|
return stderr.ErrDbInputExist
|
|
}
|
|
code = insertBase(uid, tags, lid, newUpdatedAt, req, status, coins)
|
|
for _, t := range tags {
|
|
if err := tagmod.IncreaseTagVidCount(t, 1); err != nil {
|
|
log.Warn("UpdateTag tag video count err %+v\n", log.E(err))
|
|
continue
|
|
}
|
|
}
|
|
return code
|
|
}
|
|
|
|
// HandleSeriesBase 处理套图基础信息
|
|
func HandleSeriesBase(uid uint64, city string, tags []primitive.ObjectID, newUpdatedAt string, req vidmod.AwsPullSeriesResp, status int, coins int64) (code stderr.Code) {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
code = stderr.Failure
|
|
return
|
|
}
|
|
}()
|
|
l := locmod.Location{
|
|
City: city,
|
|
}
|
|
if err := locmod.InsertLocationInfo(l); err != nil {
|
|
return stderr.ErrDbInsertError
|
|
}
|
|
lid, err := locmod.GetLocationIDByCity(city)
|
|
if err != nil {
|
|
return stderr.ErrDbQueryError
|
|
}
|
|
if vidmod.IsExistBySocID(req.ID) {
|
|
return stderr.ErrDbInputExist
|
|
}
|
|
code = insertSeriesBase(uid, tags, lid, newUpdatedAt, req, status, coins)
|
|
for _, t := range tags {
|
|
err := tagmod.IncreaseTagVidCount(t, 1)
|
|
if err != nil {
|
|
log.Warn("UpdateTag tag video count err %+v\n", log.E(err))
|
|
continue
|
|
}
|
|
}
|
|
return code
|
|
}
|
|
|
|
func insertBase(uid uint64, tags []primitive.ObjectID, lid primitive.ObjectID, newUpdatedAt string, req vidmod.AwsPullResp, status int, coins int64) (code stderr.Code) {
|
|
oid, _ := primitive.ObjectIDFromHex(req.ID)
|
|
flagTime := timeutil.RandReduceTime(time.Now(), 30*24*time.Hour)
|
|
v := vidmod.VideoModel{
|
|
ID: oid,
|
|
PublisherID: uid,
|
|
NewsType: vidmod.SP,
|
|
Title: strings.TrimSpace(req.Title),
|
|
Tags: tags,
|
|
SourceID: req.ID,
|
|
Cover: req.FieldNameFs + "-1.jpg",
|
|
CoverThumb: req.FieldNameFs + "-2.jpg",
|
|
SourceURL: req.FieldNameFs + ".m3u8",
|
|
Filename: req.Filename,
|
|
PlayTime: req.PlayTime,
|
|
SeriesCover: req.CoverImg,
|
|
Activity: []primitive.ObjectID{},
|
|
MimeType: mime.TypeByExtension(strings.ToLower(filepath.Ext(req.Filename))),
|
|
Resolution: strconv.FormatInt(int64(req.Width), 10) + "*" + strconv.FormatInt(int64(req.Height), 10),
|
|
Width: req.Width,
|
|
Height: req.Height,
|
|
Ratio: req.Ratio,
|
|
Via: req.Via,
|
|
Rating: 0,
|
|
PlayCount: 0,
|
|
LikeCount: 0,
|
|
FakeLikeCount: common.RandInt(50, 500),
|
|
CommentCount: 0,
|
|
FakePlayCount: common.RandInt(200, 3000),
|
|
ShareCount: common.RandInt(500, 10000),
|
|
Status: status,
|
|
Location: lid,
|
|
FreeTime: vidmod.MinFreeTime,
|
|
Coins: coins,
|
|
Size: req.Size,
|
|
MD5: req.CheckSum,
|
|
Actor: strings.Join(req.Actors, ","),
|
|
NewUpdatedAt: newUpdatedAt,
|
|
CreatedAt: flagTime,
|
|
UpdatedAt: flagTime,
|
|
}
|
|
if _, err := vidmod.InsertBase(v); err != nil {
|
|
return stderr.ErrDbInsertError
|
|
}
|
|
return stderr.Success
|
|
}
|
|
|
|
func insertSeriesBase(uid uint64, tags []primitive.ObjectID, lid primitive.ObjectID, newUpdatedAt string, req vidmod.AwsPullSeriesResp, status int, coins int64) (code stderr.Code) {
|
|
oid, _ := primitive.ObjectIDFromHex(req.ID)
|
|
flagTime := timeutil.RandAddTime(time.Now(), 3*24*time.Hour)
|
|
v := vidmod.VideoModel{
|
|
ID: oid,
|
|
PublisherID: uid,
|
|
NewsType: vidmod.COVER,
|
|
Title: strings.TrimSpace(req.Title),
|
|
Tags: tags,
|
|
SourceID: req.ID,
|
|
Cover: req.CoverImg,
|
|
SeriesCover: req.SeriesCover,
|
|
SeriesNum: int(req.Number),
|
|
Activity: []primitive.ObjectID{},
|
|
MimeType: req.MimeType,
|
|
Via: req.Via,
|
|
Rating: 0,
|
|
PlayCount: 0,
|
|
LikeCount: 0,
|
|
FakeLikeCount: common.RandInt(50, 500),
|
|
CommentCount: 0,
|
|
FakePlayCount: common.RandInt(200, 3000),
|
|
ShareCount: common.RandInt(300, 10000),
|
|
Status: status,
|
|
Location: lid,
|
|
FreeTime: vidmod.MinFreeTime,
|
|
Coins: coins,
|
|
NewUpdatedAt: newUpdatedAt,
|
|
CreatedAt: flagTime,
|
|
UpdatedAt: flagTime,
|
|
}
|
|
if _, err := vidmod.InsertBase(v); err != nil {
|
|
return stderr.ErrDbInsertError
|
|
}
|
|
return stderr.Success
|
|
}
|
|
|
|
// HandleTag 处理标签
|
|
func HandleTag(tagname, img string) (tagID primitive.ObjectID, suc bool) {
|
|
tMod := tagmod.Tag{}
|
|
tagInfo, err := tagmod.FindOneTagByName(strings.TrimSpace(tagname))
|
|
if err == nil && !tagInfo.ID.IsZero() {
|
|
return tagInfo.ID, true
|
|
}
|
|
tMod.TagName = v10.ExtractPureChar(tagname)
|
|
tMod.CoverImg = img
|
|
tMod.SortCode = 999
|
|
tMod.IsActive = true
|
|
tMod.CreatedAt = time.Now()
|
|
tMod.UpdatedAt = time.Now()
|
|
id, err := tagmod.InsertOne(&tMod)
|
|
if err != nil {
|
|
return primitive.NilObjectID, false
|
|
}
|
|
return id, true
|
|
}
|
|
|
|
// PullFileInfoFromFS PullFileInfoFromFS
|
|
func PullFileInfoFromFS(params map[string]interface{}) (respBody vidmod.Resport, err error) {
|
|
code, err := httputil.DefaultClientPostJsonWithResp(&respBody, webg.Conf.URL.PullFileUrl, nil, params)
|
|
log.Info("http method PullFileInfoFromFS response code ==>", log.Any("statusCode", code), log.Any("respCode", respBody.Code))
|
|
if err != nil {
|
|
log.Error("Pull FileInfo From Aws ", log.E(err))
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// PullSeriesFromFS PullSeriesFromFS
|
|
func PullSeriesFromFS(params map[string]interface{}) (respBody vidmod.SeriesResport, err error) {
|
|
code, err := httputil.DefaultClientPostJsonWithResp(&respBody, webg.Conf.URL.PullSeriesUrl, nil, params)
|
|
log.Info("http method PullSeriesFromFS response code ==>", log.Any("statusCode", code), log.Any("respCode", respBody.Code))
|
|
if err != nil {
|
|
log.Error("Pull Series From Aws ", log.E(err))
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// PullFileInfo 获取文件转码情况及详情
|
|
func PullFileInfo(id string) (respBody vidmod.PuFinfoResp, err error) {
|
|
code, err := httputil.DefaultClientPostJsonWithResp(&respBody, common.BindUrl(webg.Conf.URL.PullFileInfo, id), nil, nil)
|
|
log.Info("http method PullFileInfo response code ==>", log.Any("statusCode", code), log.Any("respCode", respBody.Code))
|
|
if err != nil {
|
|
log.Error("Pull FileInfo From Aws ", log.E(err))
|
|
respBody.Code = stderr.ErrConnectToFs
|
|
return
|
|
}
|
|
switch respBody.Data.Status {
|
|
case vidmod.Merging, vidmod.MergeCompleted:
|
|
respBody.Code = stderr.FileMerging
|
|
case vidmod.MergeError:
|
|
respBody.Code = stderr.ErrMergeFile
|
|
case vidmod.Converting:
|
|
respBody.Code = stderr.FileConverting
|
|
case vidmod.ConvertError:
|
|
respBody.Code = stderr.ErrConvertFile
|
|
case vidmod.UploadLoadingToFs:
|
|
respBody.Code = stderr.UploadLoadingToFs
|
|
case vidmod.FileUploadError:
|
|
respBody.Code = stderr.ErrUploadError
|
|
case vidmod.ConvertCompleted, vidmod.Completed:
|
|
respBody.Code = stderr.UpLoadFileComplete
|
|
}
|
|
return
|
|
}
|
|
|
|
// 新导入的视频数据同步到ES
|
|
func SyncNewImportVideoToElastic(newUpdatedAt string, start, end time.Time) {
|
|
var page, pageSize int64 = 1, 50
|
|
for {
|
|
nVideos, err := vidmod.GetNewImportVideo(newUpdatedAt, start, end, page, pageSize)
|
|
if err != nil || len(nVideos) == 0 {
|
|
return
|
|
}
|
|
// 获取标签名字
|
|
var tagsID []primitive.ObjectID
|
|
for _, v := range nVideos {
|
|
tagsID = append(tagsID, v.Tags...)
|
|
}
|
|
tags, err := tagmod.FindTagsByIDS(tagsID)
|
|
if err != nil {
|
|
return
|
|
}
|
|
var tagsNameMap = make(map[primitive.ObjectID]string)
|
|
for _, v := range tags {
|
|
tagsNameMap[v.ID] = v.TagName
|
|
}
|
|
var source = elastic.M{}
|
|
for _, v := range nVideos {
|
|
var tagsName []string
|
|
for _, v1 := range v.Tags {
|
|
tagsName = append(tagsName, tagsNameMap[v1])
|
|
}
|
|
var tmp = vidmod.ESVideo{
|
|
ID: v.ID,
|
|
PublisherID: v.PublisherID,
|
|
Title: v.Title,
|
|
Tags: v.Tags,
|
|
TagsName: tagsName,
|
|
Filename: v.Filename,
|
|
PlayCount: v.PlayCount,
|
|
PurchaseCount: v.PurchaseCount,
|
|
LikeCount: v.LikeCount,
|
|
CommentCount: v.CommentCount,
|
|
ShareCount: v.ShareCount,
|
|
FakeLikeCount: v.FakeLikeCount,
|
|
FakeShareCount: v.FakeShareCount,
|
|
FakePlayCount: v.FakePlayCount,
|
|
Status: v.Status,
|
|
Location: v.Location,
|
|
CreatedAt: v.CreatedAt,
|
|
UpdatedAt: v.UpdatedAt,
|
|
}
|
|
source[v.ID.Hex()] = tmp
|
|
}
|
|
if err = webg.VideoES.Bulk(models.ESInfoVideoTable, source); err != nil {
|
|
continue
|
|
}
|
|
log.Info("sync video info to elastic successfully running at page", log.Any("page", page))
|
|
page++
|
|
}
|
|
}
|