Initial commit

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 13:57:10 +08:00
co-authored by Claude Opus 5
commit 8679200f41
1897 changed files with 257900 additions and 0 deletions
@@ -0,0 +1,55 @@
package vidtonesearcher
import (
"91porn-server/app/service/searcher"
"91porn-server/common/log"
"91porn-server/models/v/tonerecomod"
"91porn-server/models/v/vidmod"
)
type freeAreaSearcher struct {
uid uint64
}
func newFreeAreaSearcher(uid uint64) searcher.Searcher {
return &freeAreaSearcher{
uid: uid,
}
}
// Search Search
func (f *freeAreaSearcher) Search(unuse searcher.KeyWorder, opt searcher.Opter) (result searcher.Resulter, err error) {
limitEx1 := opt.Limit() + 1
vidList, err := vidmod.GetFreeVidList(opt.Sort(), opt.Skip(), limitEx1)
if err != nil {
return nil, err
}
if len(vidList) == 0 {
return &Result{
&Resp{
Theme: tonerecomod.FreeArea,
List: []VideoRes{},
PayCount: &zero,
},
}, nil
}
hasNext := false
if len(vidList) > int(opt.Limit()) {
hasNext = true
vidList = vidList[:opt.Limit()]
}
videoInfoList, err := searcher.GetVideoResList(f.uid, vidList)
if err != nil {
return nil, err
}
log.Info("freeArea search result", log.Any("totalVideoCount", len(vidList)), log.Any("respVideoCount", len(videoInfoList)))
freeAreaPlayCount := GetToneValue().FreeAreaPlayCount
return &Result{
&Resp{
List: videoInfoList,
Theme: tonerecomod.FreeArea,
PlayCount: &freeAreaPlayCount,
HasNext: hasNext,
},
}, nil
}
@@ -0,0 +1,80 @@
package vidtonesearcher
import (
"91porn-server/app/service/searcher"
"91porn-server/common/log"
"91porn-server/models/s/statvidtotalmod"
"91porn-server/models/v/tonerecomod"
"91porn-server/models/v/vidmod"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type ObjectID = primitive.ObjectID
type VideoSy = searcher.VideoInfo
// VidToneSearcher VidToneSearcher
type goldCoinAreaSearcher struct {
uid uint64
}
var zero = int64(0)
// newGoldCoinAreaSearcher newGoldCoinAreaSearcher
func newGoldCoinAreaSearcher(uid uint64) searcher.Searcher {
return &goldCoinAreaSearcher{
uid: uid,
}
}
// Search Search
func (g *goldCoinAreaSearcher) Search(unuse searcher.KeyWorder, opt searcher.Opter) (result searcher.Resulter, err error) {
limitEx1 := opt.Limit() + 1
vidList, err := vidmod.GetPayVidList(opt.Sort(), opt.Skip(), limitEx1)
if err != nil {
return nil, err
}
if len(vidList) == 0 {
return &Result{
&Resp{
Theme: tonerecomod.GoldCoinArea,
List: []VideoRes{},
PayCount: &zero,
},
}, nil
}
hasNext := false
if len(vidList) > int(opt.Limit()) {
hasNext = true
vidList = vidList[:opt.Limit()]
}
videoInfoList, err := searcher.GetVideoResList(g.uid, vidList)
if err != nil {
return nil, err
}
log.Info("goldCoinArea search result", log.Any("totalVideoCount", len(vidList)), log.Any("respVideoCount", len(videoInfoList)))
payCountMap, err := statvidtotalmod.GetPayCountMap(vidList)
if err != nil {
return nil, err
}
videoInfoPCList := make([]VideoRes, 0, len(videoInfoList))
for _, info := range videoInfoList {
if info.VideoInfo.ID == nil {
continue
}
id := *info.VideoInfo.ID
payCount := int(payCountMap[id])
info.VideoInfo.PayCount = &payCount
videoInfoPCList = append(videoInfoPCList, info)
}
goldCoinAreaPayCount := GetToneValue().GoldCoinAreaPayCount
return &Result{
&Resp{
List: videoInfoPCList,
Theme: tonerecomod.GoldCoinArea,
PayCount: &goldCoinAreaPayCount,
HasNext: hasNext,
},
}, nil
}
@@ -0,0 +1,58 @@
package vidtonesearcher
import (
"91porn-server/app/service/searcher"
"91porn-server/models/v/tonerecomod"
"91porn-server/models/v/vidmod"
)
// latestUpload latestUpload
type latestUploadSearcher struct {
uid uint64
}
// latestUpload latestUpload
func newLatestUploadSearcher(uid uint64) searcher.Searcher {
return &latestUploadSearcher{
uid: uid,
}
}
// Search Search
func (l *latestUploadSearcher) Search(unuse searcher.KeyWorder, opt searcher.Opter) (result searcher.Resulter, err error) {
limit := opt.Limit()
skip := opt.Skip()
limitEx1 := limit + 1
vidList, err := vidmod.VIDListByCreatedAt(skip, limitEx1)
if err != nil {
return nil, err
}
if len(vidList) == 0 {
return &Result{
&Resp{
Theme: tonerecomod.LatestUpload,
List: []VideoRes{},
PlayCount: &zero,
HasNext: false,
},
}, nil
}
hasNext := false
if len(vidList) > int(limit) {
hasNext = true
vidList = vidList[:opt.Limit()]
}
videoResList, err := searcher.GetVideoResList(l.uid, vidList)
if err != nil {
return nil, err
}
latestUploadPlayCount := GetToneValue().LatestUploadPlayCount
return &Result{
&Resp{
List: videoResList,
Theme: tonerecomod.LatestUpload,
PlayCount: &latestUploadPlayCount,
HasNext: hasNext,
},
}, nil
}
@@ -0,0 +1,57 @@
package vidtonesearcher
import (
"91porn-server/app/service/searcher"
"91porn-server/models/v/tonerecomod"
"91porn-server/models/v/vidmod"
)
// mostCommentsSearcher mostCommentsSearcher
type mostCommentsSearcher struct {
uid uint64
}
// newMostCommentsSearcher newMostCommentsSearcher
func newMostCommentsSearcher(uid uint64) searcher.Searcher {
return &mostCommentsSearcher{
uid: uid,
}
}
// Search Search
func (g *mostCommentsSearcher) Search(unuse searcher.KeyWorder, opt searcher.Opter) (result searcher.Resulter, err error) {
limit := opt.Limit()
limitEx1 := limit + 1
vidList, err := vidmod.VIDListSortByFakeCommentCount(opt.Skip(), limitEx1)
if err != nil {
return nil, err
}
if len(vidList) == 0 {
return &Result{
&Resp{
Theme: tonerecomod.MostComments,
List: []VideoRes{},
PlayCount: &zero,
HasNext: false,
},
}, nil
}
hasNext := false
if len(vidList) > int(limit) {
hasNext = true
vidList = vidList[:opt.Limit()]
}
videoResList, err := searcher.GetVideoResList(g.uid, vidList)
if err != nil {
return nil, err
}
mostCommentsPlayCount := GetToneValue().MostCommentsPlayCount
return &Result{
&Resp{
List: videoResList,
Theme: tonerecomod.MostComments,
PlayCount: &mostCommentsPlayCount,
HasNext: hasNext,
},
}, nil
}
@@ -0,0 +1,57 @@
package vidtonesearcher
import (
"91porn-server/app/service/searcher"
"91porn-server/models/v/tonerecomod"
"91porn-server/models/v/vidmod"
)
// latestUpload latestUpload
type mostLikesSearcher struct {
uid uint64
}
// latestUpload latestUpload
func newMostLikesSearcher(uid uint64) searcher.Searcher {
return &mostLikesSearcher{
uid: uid,
}
}
// Search Search
func (g *mostLikesSearcher) Search(unuse searcher.KeyWorder, opt searcher.Opter) (result searcher.Resulter, err error) {
limit := opt.Limit()
limitEx1 := limit + 1
vidList, err := vidmod.VIDListByFakeLikeCount(opt.Skip(), limitEx1)
if err != nil {
return nil, err
}
if len(vidList) == 0 {
return &Result{
&Resp{
Theme: tonerecomod.MostLikes,
List: []VideoRes{},
PlayCount: &zero,
HasNext: false,
},
}, nil
}
hasNext := false
if len(vidList) > int(limit) {
hasNext = true
vidList = vidList[:opt.Limit()]
}
videoResList, err := searcher.GetVideoResList(g.uid, vidList)
if err != nil {
return nil, err
}
mostLikesPlayCount := GetToneValue().MostLikesPlayCount
return &Result{
&Resp{
List: videoResList,
Theme: tonerecomod.MostLikes,
PlayCount: &mostLikesPlayCount,
HasNext: hasNext,
},
}, nil
}
@@ -0,0 +1,56 @@
package vidtonesearcher
import (
"91porn-server/app/service/searcher"
"91porn-server/models/v/tonerecomod"
"91porn-server/models/v/vidmod"
)
// VidToneSearcher VidToneSearcher
type officialRecomSearcher struct {
uid uint64
}
// officialRecomSearcher officialRecomSearcher
func newOfficialRecomSearcher(uid uint64) searcher.Searcher {
return &officialRecomSearcher{
uid: uid,
}
}
// Search Search
func (g *officialRecomSearcher) Search(unuse searcher.KeyWorder, opt searcher.Opter) (result searcher.Resulter, err error) {
limitEx1 := opt.Limit() + 1
vidList, err := vidmod.VIDListToneOfficialRecom(opt.Skip(), limitEx1)
if err != nil {
return nil, err
}
if len(vidList) == 0 {
return &Result{
&Resp{
Theme: tonerecomod.OfficialRecom,
List: []VideoRes{},
PlayCount: &zero,
HasNext: false,
},
}, nil
}
hasNext := false
if len(vidList) > int(opt.Limit()) {
hasNext = true
vidList = vidList[:opt.Limit()]
}
videoResList, err := searcher.GetVideoResList(g.uid, vidList)
if err != nil {
return nil, err
}
officialRecomPlayCount := GetToneValue().OfficialRecomPlayCount
return &Result{
&Resp{
List: videoResList,
Theme: tonerecomod.OfficialRecom,
PlayCount: &officialRecomPlayCount,
HasNext: hasNext,
},
}, nil
}
@@ -0,0 +1,57 @@
package vidtonesearcher
import (
"91porn-server/app/service/searcher"
"91porn-server/models/v/tonerecomod"
"91porn-server/models/v/vidmod"
)
// playAtMostSearcher playAtMostSearcher
type playAtMostSearcher struct {
uid uint64
}
// newPlayAtMostSearcher newPlayAtMostSearcher
func newPlayAtMostSearcher(uid uint64) searcher.Searcher {
return &playAtMostSearcher{
uid: uid,
}
}
// Search Search
func (g *playAtMostSearcher) Search(unuse searcher.KeyWorder, opt searcher.Opter) (result searcher.Resulter, err error) {
limit := opt.Limit()
limitEx1 := limit + 1
vidList, err := vidmod.VIDListByFakePlayCount(opt.Skip(), limitEx1)
if err != nil {
return nil, err
}
if len(vidList) == 0 {
return &Result{
&Resp{
Theme: tonerecomod.PlayAtMost,
List: []VideoRes{},
PlayCount: &zero,
HasNext: false,
},
}, nil
}
hasNext := false
if len(vidList) > int(limit) {
hasNext = true
vidList = vidList[:opt.Limit()]
}
videoResList, err := searcher.GetVideoResList(g.uid, vidList)
if err != nil {
return nil, err
}
playAtMostPlayCount := GetToneValue().PlayAtMostPlayCount
return &Result{
&Resp{
List: videoResList,
Theme: tonerecomod.PlayAtMost,
PlayCount: &playAtMostPlayCount,
HasNext: hasNext,
},
}, nil
}
@@ -0,0 +1,51 @@
package vidtonesearcher
import (
"91porn-server/app/service/searcher"
"go.mongodb.org/mongo-driver/bson"
)
// M M
type M = bson.M
// A A
type A = bson.A
type VideoRes = searcher.VideoRes
type Resp struct {
List []VideoRes `json:"list"`
Theme string `json:"theme"`
PlayCount *int64 `json:"playCount,omitempty"`
PayCount *int64 `json:"payCount,omitempty"`
HasNext bool `json:"hasNext"`
}
type Result struct {
dat *Resp
}
const MaxVideoCount = 400
func (*Result) Types() searcher.ResultTypes {
return searcher.VidToneSearchResult
}
func (r *Result) Data() interface{} {
return r.dat
}
func (r *Result) Count() int64 {
if r.dat == nil {
return 0
}
return 1
}
func (r *Result) HasNext() bool {
if r.dat == nil {
return false
}
return r.dat.HasNext
}
@@ -0,0 +1,64 @@
package vidtonesearcher
import (
"fmt"
"91porn-server/app/appg"
"91porn-server/app/service/searcher"
"91porn-server/common/constant/redisconst"
"91porn-server/common/log"
"91porn-server/models/v/tonemod"
"91porn-server/models/v/tonerecomod"
)
type ToneValue = tonemod.ToneValue
// VidToneSearcher VidToneSearcher
type VidToneSearcher struct {
uid uint64
theme tonerecomod.ThemeType
}
// NewVidToneSearcher NewVidToneSearcher
func NewVidToneSearcher(theme tonerecomod.ThemeType, uid uint64) searcher.Searcher {
return &VidToneSearcher{
uid: uid,
theme: theme,
}
}
// Realm Realm
func (searcher *VidToneSearcher) Theme() string {
return searcher.theme
}
// Search Search
func (v *VidToneSearcher) Search(keyword searcher.KeyWorder, opt searcher.Opter) (result searcher.Resulter, err error) {
switch v.theme {
case tonerecomod.OfficialRecom:
return newOfficialRecomSearcher(v.uid).Search(nil, opt)
case tonerecomod.GoldCoinArea:
return newGoldCoinAreaSearcher(v.uid).Search(nil, opt)
case tonerecomod.LatestUpload:
return newLatestUploadSearcher(v.uid).Search(nil, opt)
case tonerecomod.MostLikes:
return newMostLikesSearcher(v.uid).Search(nil, opt)
case tonerecomod.PlayAtMost:
return newPlayAtMostSearcher(v.uid).Search(nil, opt)
case tonerecomod.MostComments:
return newMostCommentsSearcher(v.uid).Search(nil, opt)
case tonerecomod.FreeArea:
return newFreeAreaSearcher(v.uid).Search(nil, opt)
default:
return nil, fmt.Errorf("search vidtonesearcher invalid theme: %s", v.theme)
}
}
func GetToneValue() ToneValue {
var toneValue ToneValue
redisKey := redisconst.ToneKey()
if err := appg.Redis.Scan(redisKey, &toneValue); err != nil {
log.Warn("search vidtonesearcher GetToneValue Scan error", log.E(err))
}
return toneValue
}