Files
huangguo_server/web/service/vidser/mediaresouce.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

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)
}