261 lines
7.3 KiB
Go
261 lines
7.3 KiB
Go
package vidser
|
|
|
|
import (
|
|
"91porn-server/app/service/modulevideoser"
|
|
"91porn-server/models/v/modulevidmod"
|
|
"91porn-server/models/v/usermod"
|
|
"91porn-server/models/v/vidtimeonlinemod"
|
|
"context"
|
|
"fmt"
|
|
"math/rand"
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
|
|
"91porn-server/common"
|
|
"91porn-server/common/constant"
|
|
"91porn-server/common/log"
|
|
"91porn-server/common/mdrsdb"
|
|
"91porn-server/models/v/vidmod"
|
|
|
|
"github.com/shopspring/decimal"
|
|
)
|
|
|
|
func getMediaPathFromUrl(rawUrl string) string {
|
|
url, err := url.Parse(rawUrl)
|
|
if err != nil || url.Path == "" {
|
|
return ""
|
|
}
|
|
return url.Path
|
|
}
|
|
|
|
func getMediaFileInfoFromUrl(rawUrl string) (sourceID, fileName string) {
|
|
url, err := url.Parse(rawUrl)
|
|
if err != nil {
|
|
return
|
|
}
|
|
path := url.Path
|
|
sliX := strings.Split(path, "/")
|
|
if len(sliX) > 0 {
|
|
fileName = sliX[len(sliX)-1]
|
|
}
|
|
sliP := strings.Split(fileName, ".")
|
|
if len(sliP) > 0 {
|
|
sourceID = sliP[0]
|
|
}
|
|
return
|
|
}
|
|
|
|
func getIMGPathFromUrl(rawUrl string) string {
|
|
//新桶,无需加ims,可直接回源
|
|
if strings.Contains(rawUrl, "cf230705") || strings.Contains(rawUrl, "bf211222") {
|
|
return rawUrl
|
|
}
|
|
if rawUrl == "" {
|
|
return ""
|
|
}
|
|
url, err := url.Parse(rawUrl)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
return common.BindUrl(constant.ImageSourceIMS, url.Path)
|
|
}
|
|
|
|
func GetMediaList(ctx context.Context, page, size, vloggerUserId int64, title, tagText, hashId string, vMia, videoType int, syncType, terminalCdo string, startTime, endTime time.Time, sortType, maxTotal int) (data []mdrsdb.MediaResource, count int64, err error) {
|
|
data, count, err = mdrsdb.FindMediaList(ctx, page, size, vloggerUserId, title, tagText, hashId, vMia, videoType, syncType, terminalCdo, startTime, endTime, sortType, maxTotal)
|
|
for i := range data {
|
|
data[i].CoverImage = getIMGPathFromUrl(data[i].CoverImage)
|
|
data[i].VerticalCover = getIMGPathFromUrl(data[i].VerticalCover)
|
|
data[i].Src1080 = getMediaPathFromUrl(data[i].Src1080)
|
|
data[i].Src720 = getMediaPathFromUrl(data[i].Src720)
|
|
data[i].Src480 = getMediaPathFromUrl(data[i].Src480)
|
|
data[i].VerticalCover = getIMGPathFromUrl(data[i].VerticalCover)
|
|
tags := strings.Split(data[i].TagsText, ",")
|
|
if len(tags) > 5 {
|
|
tags = tags[:5]
|
|
}
|
|
data[i].TagList = tags
|
|
}
|
|
return
|
|
}
|
|
|
|
func UseMedias(ctx context.Context, ids []int64, authorID uint64, sectionID primitive.ObjectID, inTags []string, videoType int, manager string, coins *int64, onlineTime time.Time) ([]SensitiveHit, error) {
|
|
mbs, err := mdrsdb.FindMediaListWithIDs(ctx, ids, videoType)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
terms := LoadEnabledSensitiveTerms()
|
|
hits := make([]SensitiveHit, 0)
|
|
useIds := make([]int64, 0, len(mbs))
|
|
for i, v := range mbs {
|
|
log.Info(fmt.Sprintf("Synchronize media library video information:video_id:%d up_id:%d authorId:%d", v.Id, v.VloggerUserId, authorID))
|
|
mbs[i].CoverImage = getIMGPathFromUrl(mbs[i].CoverImage)
|
|
mbs[i].VerticalCover = getIMGPathFromUrl(mbs[i].VerticalCover)
|
|
mbs[i].Src1080 = getMediaPathFromUrl(mbs[i].Src1080)
|
|
mbs[i].Src720 = getMediaPathFromUrl(mbs[i].Src720)
|
|
mbs[i].Src480 = getMediaPathFromUrl(mbs[i].Src480)
|
|
mbs[i].VerticalCover = getIMGPathFromUrl(mbs[i].VerticalCover)
|
|
var m3u8 string
|
|
var m3u8Size int64
|
|
if strings.Contains(mbs[i].Src720, "/") {
|
|
m3u8 = mbs[i].Src720
|
|
m3u8Size = mbs[i].FileSize720
|
|
}
|
|
if m3u8 == "" {
|
|
m3u8 = mbs[i].Src480
|
|
m3u8Size = mbs[i].FileSize480
|
|
}
|
|
if m3u8 == "" {
|
|
m3u8 = mbs[i].Src1080
|
|
m3u8Size = mbs[i].FileSize1080
|
|
}
|
|
tagsList := strings.Split(mbs[i].TagsText, ",")
|
|
tags := []string{}
|
|
for _, tag := range tagsList {
|
|
tag = strings.TrimSpace(tag)
|
|
if tag != "" {
|
|
tags = append(tags, tag)
|
|
}
|
|
}
|
|
if len(tags) > 5 {
|
|
tags = tags[:5]
|
|
}
|
|
tags = append(tags, inTags...)
|
|
if authorID == 0 && v.VloggerUserId != 0 {
|
|
authorID = v.VloggerUserId
|
|
} else if authorID == 0 {
|
|
authorID = 100001
|
|
}
|
|
author, _ := usermod.FindUserByUID(authorID)
|
|
if author == nil {
|
|
authorID = uint64(rand.Int63n(50000) + 100001)
|
|
}
|
|
var pics []string
|
|
if len(v.Pics) > 0 {
|
|
pics = strings.Split(v.Pics, ",")
|
|
for i, p := range pics {
|
|
pics[i] = getIMGPathFromUrl(p)
|
|
}
|
|
}
|
|
// videoType : 0 长视频 1短视频 2图文
|
|
// v.MediaType: 0视频 1 图文
|
|
vt := vidmod.SP
|
|
if videoType == 1 {
|
|
vt = vidmod.SHORT
|
|
} else if videoType == 2 && v.MediaType == 1 {
|
|
vt = vidmod.COVER
|
|
}
|
|
|
|
var ratio float64 = 0
|
|
if v.Height > 0 && v.Width > 0 {
|
|
ratio = float64(decimal.NewFromInt(int64(v.Width)).Div(decimal.NewFromInt(int64(v.Height))).Shift(2).IntPart()) / 100
|
|
}
|
|
temp := vidmod.WebSubmitReq{
|
|
UID: authorID,
|
|
NewsType: vt,
|
|
Title: v.Title,
|
|
Content: v.Content,
|
|
Tags: tags,
|
|
PlayTime: v.Length,
|
|
Cover: mbs[i].CoverImage,
|
|
VerticalCover: mbs[i].VerticalCover,
|
|
SeriesCover: pics,
|
|
Via: mbs[i].TerminalCdo,
|
|
Coins: mbs[i].SaleCoin,
|
|
Size: int(m3u8Size),
|
|
Resolution: strconv.Itoa(v.Width) + "*" + strconv.Itoa(v.Height),
|
|
Ratio: ratio,
|
|
Width: v.Width,
|
|
Height: v.Height,
|
|
MimeType: "",
|
|
Actor: "",
|
|
SourceURL: m3u8,
|
|
MD5: v.HashId,
|
|
SourceID: strconv.FormatInt(v.Id, 10),
|
|
MDSID: v.HashId,
|
|
Account: manager,
|
|
RichText: v.RichText,
|
|
PreviewStart: v.PreviewStart,
|
|
}
|
|
if coins != nil {
|
|
temp.Coins = *coins
|
|
}
|
|
if len(tags) > 0 {
|
|
if tags[0] != "" {
|
|
temp.Status = 1
|
|
}
|
|
|
|
}
|
|
if m3u8 != "" {
|
|
temp.SourceID, temp.Filename = getMediaFileInfoFromUrl(m3u8)
|
|
if temp.PlayTime > 60 {
|
|
temp.FreeTime = 15
|
|
} else {
|
|
temp.FreeTime = int(temp.PlayTime / 4)
|
|
}
|
|
}
|
|
if authorID > 0 {
|
|
temp.UID = authorID
|
|
}
|
|
if !onlineTime.IsZero() {
|
|
temp.Status = 0
|
|
}
|
|
if temp.NewsType == vidmod.COVER {
|
|
temp.Status = 0
|
|
}
|
|
if !onlineTime.IsZero() {
|
|
temp.Status = vidmod.OnlinePass
|
|
}
|
|
// 敏感词命中:强制为待审核,且不进入自动上架/专题上架链路
|
|
hit := CheckTextHits(terms, temp.SourceID, temp.Title, temp.Content, temp.RichText)
|
|
if hit != nil {
|
|
temp.Status = vidmod.WaitingCheck
|
|
log.Warn("vidser.UseMedias sensitive hit, forced offline & skip auto-online",
|
|
log.Any("sourceId", hit.SourceID),
|
|
log.Any("title", hit.Title),
|
|
log.Any("detail", hit.Detail))
|
|
hits = append(hits, *hit)
|
|
}
|
|
code, vid := SubmitBase(temp)
|
|
if code != 200 {
|
|
log.ErrorX(ctx, "vidser UseMedias is fail", log.Any("code", code), log.Any("vid", vid))
|
|
continue
|
|
}
|
|
if !onlineTime.IsZero() && hit == nil {
|
|
// 加入批量自动上架(命中过的资源不进入此路径)
|
|
BatchAuditVidTimeOnlineInfo(vidtimeonlinemod.BatchAuditReq{
|
|
Vids: []primitive.ObjectID{vid},
|
|
SectionID: sectionID,
|
|
OnlineTime: onlineTime,
|
|
}, int(temp.Coins), manager)
|
|
|
|
} else if !sectionID.IsZero() && temp.Status == 1 {
|
|
// 加入专题
|
|
sv := modulevidmod.SectionVideo{
|
|
SectionID: sectionID,
|
|
VideoID: vid,
|
|
VideoReviewedAt: time.Now(),
|
|
SortCode: 50,
|
|
CreatedAt: time.Now(),
|
|
UpdatedAt: time.Now(),
|
|
}
|
|
|
|
_ = modulevideoser.AddVideo(&sv)
|
|
}
|
|
useIds = append(useIds, v.Id)
|
|
}
|
|
if len(useIds) > 0 {
|
|
if err = mdrsdb.UseMedia(ctx, useIds, videoType); err != nil {
|
|
return hits, err
|
|
}
|
|
}
|
|
return hits, nil
|
|
}
|
|
|
|
func IgnoreMedias(ctx context.Context, ids []int64, videoType int) (err error) {
|
|
return mdrsdb.IgnoreMedia(ctx, ids, videoType)
|
|
}
|