Files
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

267 lines
8.4 KiB
Go

package laosijiser
import (
"91porn-server/common"
"91porn-server/common/laosiji"
"91porn-server/common/log"
"91porn-server/models/v/mediacontentmod"
"91porn-server/models/v/mediamod"
"91porn-server/web/service/vidser"
"context"
"errors"
"fmt"
"strconv"
"strings"
"time"
"go.mongodb.org/mongo-driver/bson/primitive"
)
func ComicsSearch(ctx context.Context, param laosiji.ComicsSearchListReq) (resp laosiji.ComicsSearchListResp, err error) {
comicsResp, err := laosiji.ComicsSearch(ctx, param)
if err != nil {
log.Error("MovieSearch", log.E(err))
return
}
//是否导入
lsjIds := make([]string, 0)
for _, v := range comicsResp.Data {
lsjIds = append(lsjIds, v.Id)
}
comicsList, _ := mediamod.GetListByLsjIds(lsjIds)
// 处理域名
resp = laosiji.ComicsSearchListResp{
Data: make([]laosiji.ComicsSearchInfo, 0),
Total: comicsResp.Total,
Current_page: comicsResp.Current_page,
Page_size: comicsResp.Page_size,
Last_page: comicsResp.Last_page,
}
for _, comicsInfo := range comicsResp.Data {
//comicsInfo.Img = common.JoinUrlPath(laosiji.IMAGEYUAN, comicsInfo.Img)
comicsInfo.Img = common.JoinUrlPath("laosiji", comicsInfo.Img)
for _, comicsIn := range comicsList {
if comicsIn.LsjId == comicsInfo.Id {
comicsInfo.IsAdd = true
continue
}
}
resp.Data = append(resp.Data, comicsInfo)
}
return resp, nil
}
func ComicsDetail(ctx context.Context, param laosiji.ComicsDetailReq) (resp laosiji.ComicsDetailResp, serr error) {
resp, serr = laosiji.ComicsDetail(ctx, param)
if serr != nil {
log.Error("MovieSearch", log.E(serr))
return
}
// 处理域名
//resp.Img = common.JoinUrlPath(laosiji.IMAGEYUAN, resp.Img)
resp.Img = common.JoinUrlPath("laosiji", resp.Img)
if resp.Chapter != nil && len(resp.Chapter) > 0 {
for i, cha := range resp.Chapter {
if len(cha.Img) > 0 {
//resp.Chapter[i].Img = common.JoinUrlPath(laosiji.IMAGEYUAN, resp.Chapter[i].Img)
resp.Chapter[i].Img = common.JoinUrlPath("laosiji", resp.Chapter[i].Img)
}
if cha.Content != nil && len(cha.Content) > 0 {
for y, content := range cha.Content {
//resp.Chapter[i].Content[y].F = common.JoinUrlPath(laosiji.IMAGEYUAN, content.F)
resp.Chapter[i].Content[y].F = common.JoinUrlPath("laosiji", content.F)
}
}
}
}
return
}
func ComicsAddList(ctx context.Context, param laosiji.ComicsSyncReq, manager string) (hits []vidser.SensitiveHit, err error) {
if param.Ids == nil || len(param.Ids) <= 0 {
return
}
// 批量查询所有详情
comicsDetails := make([]laosiji.ComicsDetailResp, 0)
for _, id := range param.Ids {
var comicsDetail laosiji.ComicsDetailResp
req := laosiji.ComicsDetailReq{
Id: id,
}
comicsDetail, err = laosiji.ComicsDetail(ctx, req)
if err != nil {
log.Warn("ComicsAddList laosiji.ComicsDetail failed", log.Any("id", id), log.E(err))
continue
}
// 处理域名
//comicsDetail.Img = common.JoinUrlPath(laosiji.IMAGEYUAN, comicsDetail.Img)
comicsDetail.Img = common.JoinUrlPath("laosiji", comicsDetail.Img)
if comicsDetail.Chapter != nil && len(comicsDetail.Chapter) > 0 {
for i, cha := range comicsDetail.Chapter {
if len(cha.Img) > 0 {
comicsDetail.Chapter[i].Img = common.JoinUrlPath("laosiji", comicsDetail.Chapter[i].Img)
}
if cha.Content != nil && len(cha.Content) > 0 {
for y, content := range cha.Content {
comicsDetail.Chapter[i].Content[y].F = common.JoinUrlPath("laosiji", content.F)
}
}
}
}
comicsDetails = append(comicsDetails, comicsDetail)
}
if len(comicsDetails) <= 0 {
log.Warn("ComicsAddList laosiji.ComicsDetailResp len is 0")
err = errors.New("laosiji.ComicsDetailResp len is 0")
return
}
// 批量处理标签
tags := make(map[string]struct{})
for _, comicsDetail := range comicsDetails {
if comicsDetail.Tags != nil && len(comicsDetail.Tags) > 0 {
for _, tag := range comicsDetail.Tags {
tags[tag.Name] = struct{}{}
}
}
}
tagMaps := make(map[string]primitive.ObjectID)
if len(tags) > 0 {
tagList := make([]string, 0)
for k, _ := range tags {
tagList = append(tagList, k)
}
tagMaps, err = checkInsertMediaTag(tagList, 2)
if err != nil {
log.Error("ComicsAdd checkInsertMediaTag failed", log.E(err))
return
}
}
terms := vidser.LoadEnabledSensitiveTerms()
hits = make([]vidser.SensitiveHit, 0)
failedIds := make([]string, 0)
for _, comicsDetail := range comicsDetails {
hit, oneErr := syncOneComics(comicsDetail, tagMaps, manager, terms)
if oneErr != nil {
log.Warn("ComicsAdd syncOneComics failed", log.Any("id", comicsDetail.Id), log.E(oneErr))
failedIds = append(failedIds, comicsDetail.Id)
continue
}
if hit != nil {
hits = append(hits, *hit)
}
}
if len(failedIds) > 0 {
err = errors.New(fmt.Sprintf("需要同步%d部漫画,失败%d,失败Id[%s]", len(param.Ids), len(failedIds), strings.Join(failedIds, ",")))
}
return
}
func syncOneComics(comicsDetail laosiji.ComicsDetailResp, tagMaps map[string]primitive.ObjectID, manager string, terms []string) (*vidser.SensitiveHit, error) {
now := time.Now()
mediaTemp, err := mediamod.GetListByLsjId(comicsDetail.Id)
if err != nil {
log.Warn("syncOneComics GetListByLsjId failed", log.Any("id", comicsDetail.Id), log.Any("err", err))
return nil, err
}
if !mediaTemp.ID.IsZero() {
return nil, nil
}
mediaTemp = mediamod.Media{
ID: primitive.NewObjectID(),
LsjId: comicsDetail.Id,
Title: comicsDetail.Name,
HorizontalCover: comicsDetail.Img,
VerticalCover: comicsDetail.Img,
Tags: make([]primitive.ObjectID, 0),
TagDetails: make([]mediamod.TagDetail, 0),
Summary: comicsDetail.Description,
FreeEpisode: 0,
CurrentEpisode: 0,
MediaType: mediamod.MediaTypeImage,
Kind: 5,
PermissionIconHide: false,
Permission: 2,
Price: 0,
ContentsPrice: 0,
Status: 1,
CreatedAt: now,
UpdateTime: now,
UpdatedAct: manager,
}
mediaTemp.TotalEpisode, _ = strconv.Atoi(comicsDetail.Chapter_count)
mediaTemp.UpdateStatus, _ = strconv.Atoi(comicsDetail.Update_status)
mediaTemp.Price, _ = strconv.ParseInt(comicsDetail.Money, 10, 64)
if mediaTemp.Price > 0 {
mediaTemp.Permission = 1
}
//if mediaTemp.UpdateStatus == 1 {
// mediaTemp.UpdatedDesc = fmt.Sprintf("已完结%d话", mediaTemp.TotalEpisode)
//} else {
// mediaTemp.UpdatedDesc = fmt.Sprintf("更新至%d话", mediaTemp.TotalEpisode)
//}
for _, tag := range comicsDetail.Tags {
if v, ok := tagMaps[tag.Name]; ok {
mediaTemp.TagDetails = append(mediaTemp.TagDetails, mediamod.TagDetail{
Id: v,
Name: tag.Name,
})
mediaTemp.Tags = append(mediaTemp.Tags, v)
}
}
contents := make([]mediacontentmod.MediaContent, 0)
if len(comicsDetail.Chapter) > 0 {
for i, chapter := range comicsDetail.Chapter {
mediaContent := mediacontentmod.MediaContent{
ID: primitive.NewObjectID(),
MediaID: mediaTemp.ID,
EpisodeNumber: i + 1,
ListenPermission: mediaTemp.Permission,
Price: mediaTemp.Price,
Name: fmt.Sprintf("第%d话", i+1),
Text: "",
Md5: "",
VideoUrl: "",
UrlSet: make([]string, 0),
Status: 1,
IsActive: true,
UpdatedAct: manager,
CreatedAt: now,
UpdateTime: now,
HashId: chapter.Id,
}
mediaContent.Height, _ = strconv.Atoi(chapter.Content[0].H)
mediaContent.Weight, _ = strconv.Atoi(chapter.Content[0].W)
if chapter.Content != nil && len(chapter.Content) > 0 {
for _, content := range chapter.Content {
mediaContent.UrlSet = append(mediaContent.UrlSet, content.F)
}
}
contents = append(contents, mediaContent)
}
}
mediaTemp.CurrentEpisode = len(contents)
// 敏感词命中 → 强制下架(Status=0)
hit := vidser.CheckTextHits(terms, comicsDetail.Id, mediaTemp.Title, mediaTemp.Summary, "")
if hit != nil {
mediaTemp.Status = 0
log.Warn("syncOneComics sensitive hit, forced offline",
log.Any("sourceId", hit.SourceID),
log.Any("title", hit.Title),
log.Any("detail", hit.Detail))
}
_, err = mediamod.Insert(nil, mediaTemp)
if err != nil {
log.Warn("syncOneComics InsertMedia failed", log.Any("media", mediaTemp.ID), log.E(err))
return nil, err
}
if len(contents) > 0 {
_ = mediacontentmod.InsetBatch(nil, contents)
}
return hit, nil
}