package vidmod import ( "time" "91porn-server/models/commod" "91porn-server/models/v/locmod" "91porn-server/models/v/usermod" "github.com/shopspring/decimal" "go.mongodb.org/mongo-driver/bson/primitive" ) var TotalWatchCount uint64 = 5 //非vip用户每日总观看次数 const ( SubmitVideoPlayTimeLimit = 10 //上传视频最短播放时间为10秒 TodayRank = 0 WeekRank = 1 MonthRank = 2 TypeNewst = 0 TypeHotest = 1 TypeSameCity = 2 TypePay = 3 TypeVip = 4 CommonUp = 0 MadouUp = 1 Version string = "1.0.0" // 帖子兼容老版本 ) // BaseVid4Aws 上传到AWS的基础信息 type BaseVid4Aws struct { ID string `json:"id"` CheckSum string `json:"checkSum"` Title string `json:"title"` Actors []string `json:"actors"` AddedTime string `json:"addedTime"` PlayTime uint64 `json:"playTime"` Tags []string `json:"tags"` Size int `json:"size"` Filename string `json:"filename"` Desc string `json:"desc"` Type string `json:"type"` Director string `json:"director"` Studio string `json:"studio"` Bango string `json:"bango"` Via string `json:"via"` } // CoverInfo4Aws 上传到AWS的基础信息 type CoverInfo4Aws struct { Type string `json:"type"` Title string `json:"title"` Tags []string `json:"tags"` CoverImg string `json:"coverImg"` SeriesCover []string `json:"seriesCover"` Status string `json:"status"` MimeType string `json:"mimeType"` Via string `json:"via"` Topic []string `json:"topic"` NewUpdateAt string `json:"newUpdateAt"` Desc string `json:"desc"` } // LocVideoReq 同城视频请求 type LocVideoReq struct { City string `form:"city" json:"city"` commod.Page } // VideoReq 视频详情请求 type VideoReq struct { VideoID string `form:"videoID" json:"videoID"` SearchAccessToken string `form:"searchAccessToken" json:"searchAccessToken"` } // SubmitReq 视频发布请求 type SubmitReq struct { UID uint64 `form:"uid" json:"uid"` NewsType string `form:"newsType" json:"newsType"` Title string `form:"title" json:"title"` Content string `form:"content" json:"content"` Tags []string `form:"tags" json:"tags" binding:"required"` PlayTime uint `form:"playTime" json:"playTime"` Cover string `form:"cover" json:"cover"` CoverThumb string `form:"coverThumb" json:"coverThumb"` SeriesCover []string `form:"seriesCover" json:"seriesCover"` Via string `form:"via" json:"via"` Coins int64 `form:"coins" json:"coins"` Size int `form:"size" json:"size"` Resolution string `form:"resolution" json:"resolution"` Ratio float64 `json:"ratio" bson:"ratio"` //宽高比 MimeType string `form:"mimeType" json:"mimeType"` Location locmod.Location `form:"location" json:"location"` Actor string `form:"actor" json:"actor"` SourceID string `form:"sourceID" json:"sourceID"` SourceURL string `form:"sourceURL" json:"sourceURL"` MD5 string `form:"md5" json:"md5"` Filename string `form:"filename" json:"filename"` FreeTime int `form:"freeTime" json:"freeTime"` IsActivity bool `form:"isActivity" json:"isActivity"` // 是否是参赛作品 } // PlayReq 播放请求 type PlayReq struct { VideoID string `form:"videoID" json:"videoID"` Longer int `form:"longer" json:"longer"` Progress int `form:"progress" json:"progress"` PlayWay int `form:"playWay" json:"playWay"` Via int `form:"via" json:"via"` TagID string `form:"tagID" json:"tagID"` //作者 Publisher uint64 `form:"publisher" json:"publisher"` } // LocReq 地址位置请求参数 type LocReq struct { ID string `form:"id" json:"id"` } // LocInfo 城市信息 type LocInfo struct { ID primitive.ObjectID `json:"id"` //城市 City string `json:"city"` //封面 Cover string `json:"cover"` //访问人数 Visit int `json:"visit"` //创建时间 CreatedAt time.Time `json:"createdAt"` } // LocResp 地址位置应答参数 type LocResp struct { LocInfo } // LocVideoResp 同城视频应答 type LocVideoResp struct { List []*VideoInfo `json:"list"` HasNext bool `json:"hasNext"` } // LocationResp 接受地理位置信息的结构 type LocationResp struct { Code int `json:"code"` CountryName string `json:"country_name"` RegionName string `json:"region_name"` CityName string `json:"city_name"` IP string `json:"ip"` } // TagInfo 标签信息 type TagInfo struct { ID primitive.ObjectID `json:"id" bson:"_id"` //标签id Name string `json:"name" bson:"tagName"` //标签名字 CoverImg string `json:"coverImg" bson:"coverImg"` //封面图片 Description string `json:"description" bson:"description"` //文字说明 PlayCount int64 `json:"playCount" bson:"tPlayCount"` //播放量 HasCollected bool `json:"hasCollected" bson:"hasCollected"` //已收藏 } // VideoStatus 视频状态 type VideoStatus struct { //已支付 HasPaid bool `json:"hasPaid" bson:"hasPaid"` //每日视频状态信息 TodayRank int `json:"todayRank" bson:"todayRank"` //每日播放次数 TodayPlayCnt int `json:"todayPlayCnt" bson:"todayPlayCnt"` //已点赞 HasLiked bool `json:"hasLiked" bson:"hasLiked"` //已收藏 HasCollected bool `json:"hasCollected" bson:"hasCollected"` } // UInfo 别名 type UInfo = usermod.BaseInfoVip // Publisher 发布者的信息 type Publisher struct { UInfo //是否关注 HasFollowed bool `json:"hasFollowed" bson:"hasFollowed"` } // VideoBase 返回视频的基本信息 type VideoBase struct { //id ID primitive.ObjectID `json:"id" bson:"_id"` //帖子类型, SP,视频帖子,COVER NewsType string `json:"newsType" bson:"newsType"` //视频标题 Title string `json:"title" bson:"title"` Content string `json:"content" bson:"content"` // 视频内容 //视频标签 Tags []TagInfo `json:"tags" bson:"tags"` //视频资源地址Path SourceURL string `json:"sourceURL" bson:"sourceURL"` // H.265 视频资源地址 H265Url string `json:"h265Url" bson:"h265Url"` // 预览视频资源地址(并非所有视频都有预览) PreviewURL string `json:"previewURL" bson:"previewURL"` //广告跳转连接 目前只有广告帖子有用 LinkUrl string `json:"linkUrl,omitempty" bson:"linkUrl,omitempty"` //影片长度 PlayTime uint `json:"playTime" bson:"playTime"` //封面大图 Cover string `json:"cover" bson:"cover"` //封⾯小图 CoverThumb string `json:"coverThumb" bson:"coverThumb"` //帖子套图 SeriesCover []string `json:"seriesCover" bson:"seriesCover"` //总播放量 PlayCount int `json:"playCount" bson:"playCount"` //视频购买人数 PurchaseCount int `json:"purchaseCount" bson:"purchaseCount"` //点赞数 LikeCount int `json:"likeCount" bson:"likeCount"` //评论数 CommentCount int `json:"commentCount" bson:"commentCount"` //分享数 ShareCount int `json:"shareCount" bson:"shareCount"` //折扣后视频金币数(如果有的话) Coins int64 `json:"coins" bson:"coins"` //文件大小 byte Size int `json:"size" bson:"size"` //分辨率 Resolution string `json:"resolution" bson:"resolution"` //宽高比 Ratio float64 `json:"ratio" bson:"ratio"` //状态,0 未审核 1通过 2审核失败 3视为免费 默认为0 Status int `json:"status" bson:"status"` //视频未通过审核时的理由 Reason string `json:"reason" bson:"reason"` //免费时长 FreeTime int `json:"freeTime" bson:"freeTime"` //是否隐藏地址 IsHideLocation bool `json:"isHideLocation" bson:"isHideLocation"` //免费专区 FreeArea bool `json:"freeArea" bson:"freeArea"` //创建时间 CreatedAt time.Time `json:"createdAt" bson:"createdAt"` //审核时间 ReviewAt time.Time `json:"reviewAt" bson:"reviewAt,omitempty"` //是否置顶 IsTopping bool `json:"isTopping" bson:"isTopping"` //力荐 IsRecommend bool `json:"isRecommend" bson:"isRecommend"` //置精 IsChoosen bool `json:"isChoosen" bson:"isChoosen"` //打赏金额 Rewarded decimal.Decimal `json:"rewarded" bson:"rewarded"` //视频原金币数 OriginCoins int64 `json:"originCoins" bson:"originCoins"` CollectCount int `json:"collectCount" bson:"collectCount"` // 收藏数 PageViewCount int64 `json:"pageViewCount" bson:"pageViewCount"` // 视频页面展示次数 SeedLinkUrl string `json:"seedLinkUrl" bson:"seedLinkUrl,omitempty"` //种子链接 SeedSize uint64 `json:"seedSize" bson:"seedSize,omitempty"` // 种子影片大小 byte SeedPlayTime uint64 `json:"seedPlayTime" bson:"seedPlayTime,omitempty"` // 种子影片时长 PreviewStart int `json:"previewStart" bson:"previewStart"` // 预览时间起始点 RichText string `json:"richText" bson:"richText"` // 富文本内容 TimeNodeList []TimeNode `json:"timeNodeList" bson:"timeNodeList"` // 时间节点 DownloadAllow int `json:"downloadAllow" son:"downloadAllow"` // 允许下载的VIP级别,0表示不允许下载 1表示VIP 2表示免费 ShowType int `json:"showType" bson:"showType"` // 0-所有的人都可以看 1-奇数可看 2-偶数可看 LsjId string `json:"lsjId" bson:"lsjId"` // 老司机ID SearchAccessToken string `json:"searchAccessToken,omitempty" bson:"-"` ShowFreeTrialBadge bool `json:"showFreeTrialBadge" bson:"-"` // 是否展示免费试看角标 FreeTrialRemaining uint64 `json:"freeTrialRemaining" bson:"-"` // 用户剩余免费观看次数 CanUseFreeTrial bool `json:"canUseFreeTrial" bson:"-"` // 当前视频是否可使用免费观看次数 } // CommentInfo 评论信息 type CommentInfo struct { //用户id UID uint64 `json:"uid"` //姓名 Name string `json:"name"` //头像 Portrait string `json:"portrait"` //评论id Cid string `json:"cid"` //评论内容 Content string `json:"content"` ///喜欢次数 LikeCount int `json:"likeCount"` //是否作者 IsAuthor bool `json:"isAuthor"` //创建时间 CreatedAt time.Time `json:"createdAt"` } // WatchModel 观看模型 type WatchModel struct { ///观看次数 WatchCount uint64 `json:"watchCount"` //可观看 IsWatch bool `json:"isWatch"` //是否免费 IsFreeWatch bool `json:"isFreeWatch"` } // WatchCountResp 用户免费观看次数响应。 type WatchCountResp struct { IsCan bool `json:"isCan"` WatchCount uint64 `json:"watchCount"` TotalWatchCount uint64 `json:"totalWatchCount"` } // WatchConsumeReq 消费免费观看视频次数请求。Vid用于兼容旧字段名。 type WatchConsumeReq struct { VideoID string `json:"videoId"` Vid string `json:"vid"` } func (r WatchConsumeReq) GetVideoID() string { if r.VideoID != "" { return r.VideoID } return r.Vid } // WatchConsumeResp 消费免费观看视频次数响应。 type WatchConsumeResp struct { IsCan bool `json:"isCan"` WatchCount uint64 `json:"watchCount"` TotalWatchCount uint64 `json:"totalWatchCount"` Consumed bool `json:"consumed"` } // VideoInfo 返回的视频列表 type VideoInfo struct { VideoBase UInfo Publisher `json:"publisher,omitempty"` Location LocInfo `json:"location,omitempty"` VidStatus VideoStatus `json:"vidStatus,omitempty"` Comment CommentInfo `json:"comment,omitempty"` Watch WatchModel `json:"watch,omitempty"` SortCode int `json:"-"` // 对专题内视频排序 HappinessPlazaTop int32 `json:"happinessPlazaTop"` //是否是幸福广场置顶 DiscountAreaPrice int64 `json:"discountAreaPrice"` //折扣专区展示价格 VideoTypeId string `json:"videoTypeId"` //视频分类ID VideoTypeName string `json:"videoTypeName"` //视频分类名称 } // VideoInfoResp 返回的视频列表 type VideoInfoResp struct { ID primitive.ObjectID `json:"id" bson:"_id"` // ID NewsType string `json:"newsType" bson:"newsType"` // 帖子类型, SP,视频帖子,COVER Title string `json:"title" bson:"title"` // 视频标题 SourceURL string `json:"sourceURL" bson:"sourceURL"` // 视频资源地址Path H265Url string `json:"h265Url" bson:"h265Url"` // H.265 视频资源地址 LinkUrl string `json:"linkUrl,omitempty" bson:"linkUrl,omitempty"` // 广告跳转连接 目前只有广告帖子有用 PlayTime uint `json:"playTime" bson:"playTime"` // 影片长度 Cover string `json:"cover" bson:"cover"` // 封面大图 SeriesCover []string `json:"seriesCover" bson:"seriesCover"` // 帖子套图 PlayCount int `json:"playCount" bson:"playCount"` // 总播放量 LikeCount int `json:"likeCount" bson:"likeCount"` // 点赞数 PageViewCount int64 `json:"pageViewCount" bson:"pageViewCount"` // 视频页面展示次数 CommentCount int `json:"commentCount" bson:"commentCount"` // 评论数 Coins int64 `json:"coins" bson:"coins"` // 折扣后视频金币数(如果有的话) Size int `json:"size" bson:"size"` // 文件大小 byte Resolution string `json:"resolution" bson:"resolution"` // 分辨率 Ratio float64 `json:"ratio" bson:"ratio"` // 宽高比 Status int `json:"status" bson:"status"` // 状态,0 未审核 1通过 2审核失败 3视为免费 默认为0 Reason string `json:"reason" bson:"reason"` // 视频未通过审核时的理由 FreeTime int `json:"freeTime" bson:"freeTime"` // 免费时长 CreatedAt time.Time `json:"createdAt" bson:"createdAt"` // 创建时间 ReviewAt time.Time `json:"reviewAt" bson:"reviewAt,omitempty"` // 审核时间 IsTopping bool `json:"isTopping" bson:"isTopping"` // 是否置顶 IsPopping bool `json:"isPopping" bson:"isPopping"` // 是否推广 IsRecommend bool `json:"isRecommend" bson:"isRecommend"` // 力荐 IsChoosen bool `json:"isChoosen" bson:"isChoosen"` // 置精 Rewarded decimal.Decimal `json:"rewarded" bson:"rewarded"` // 打赏金额 OriginCoins int64 `json:"originCoins" bson:"originCoins"` // 视频原金币数 TotalWorks int64 `json:"totalWorks" bson:"totalWorks"` // 总作品数 Chosen bool `json:"chosen" bson:"chosen"` // 是否精选 UInfo AppPublisherResp `json:"publisher,omitempty"` // 用户信息 VidStatus VideoStatus `json:"vidStatus,omitempty"` // 视频状态 Watch WatchModel `json:"watch,omitempty"` // 是否观看 DownloadAllow int `json:"downloadAllow"` // 允许下载的VIP级别,0表示不允许下载 1表示VIP 2表示免费 ShowType int `json:"showType"` // 0-所有的人都可以看 1-奇数可看 2-偶数可看 FreeArea bool `json:"freeArea" bson:"freeArea"` // 免费专区 SearchAccessToken string `json:"searchAccessToken,omitempty" bson:"-"` ShowFreeTrialBadge bool `json:"showFreeTrialBadge" bson:"-"` // 是否展示免费试看角标 FreeTrialRemaining uint64 `json:"freeTrialRemaining" bson:"-"` // 用户剩余免费观看次数 CanUseFreeTrial bool `json:"canUseFreeTrial" bson:"-"` // 当前视频是否可使用免费观看次数 //视频标签 Tags []TagInfo `json:"tags" bson:"tags"` } // AppPublisherResp 发布者的信息 type AppPublisherResp struct { UID uint64 `json:"uid" bson:"uid"` // 用户id Name string `json:"name" bson:"name"` // 姓名 Portrait string `json:"portrait" bson:"portrait"` // 头像 HasFollowed bool `json:"hasFollowed" bson:"hasFollowed"` // 是否关 VipLevel int `json:"vipLevel" bson:"vipLevel"` // VIP等级 VipExpireDate time.Time `json:"vipExpireDate,omitempty" bson:"vipExpireDate"` // VIP过期时间 VipName string `json:"vipName" bson:"vipName"` // 用户VIP名称 } // RemoveVideoReq 删除自己的视频 type RemoveVideoReq struct { IDs []string `json:"ids"` } // NewsListReq 帖子请求 type NewsListReq struct { Type int `form:"type" json:"type"` //请求类型,默认0,最新帖子;1,最热帖子;2,同城; 3,付费视频 SubType int `form:"subType" json:"subType"` // type为0时, 0 默认; 1 只返回短视频 type为1时 1只返回麻豆 Version string `form:"version" json:"version"` // 原创新版识别标志 City string `form:"city" json:"city"` //城市 ReqTime string `form:"reqDate" json:"reqDate"` //请求时间 commod.Page } // NewsListResp 帖子应答 type NewsListResp struct { List []*VideoInfo `json:"list"` HasNext bool `json:"hasNext"` } type OriginalInfo struct { List [][]*VideoInfo `json:"list"` HasNext bool `json:"hasNext"` Version string `json:"version"` } // UnlikeReq 不感兴趣 type UnlikeReq struct { VideoID string `json:"videoID"` } // ListType 帖子类型 type ListType int const ( Video ListType = iota // 视频帖子 默认为全部视频 LongVideo // 长视频 ShortVideo // 短视频 Image // 图片帖子 ) // ModelEnum 模块枚举 type ModelEnum int const ( LatestZone ModelEnum = iota + 1 // 最新专区/最新上架 HottestZone // 最火专区/热门推荐 OriginalZone // 原创专区 GoldZone // 金币专区 HappinessPlaza // 幸福广场 MostLiked // 最多点赞 MostPlay // 最多播放 MYLickImage // 点赞图片作品 MyImage // 我的---图片作品 ) type PaymentEnum int const ( PaymentDefault PaymentEnum = iota // 默认为全部帖子 PaymentVIP // 会员帖子 PaymentGold // 金币帖子 ) // AppListReq 帖子列表请求 type AppListReq struct { Type ListType `json:"type" form:"type"` // 帖子类型 Model ModelEnum `json:"model" form:"model"` // 模块 Time time.Time `json:"time" form:"time"` // [最新专区、幸福广场]必传 值为第一次请求时间 Tag string `json:"tag" form:"tag"` // 标签 PaymentType PaymentEnum `json:"paymentType" form:"paymentType"` // 付费类型 UID uint64 `json:"uid" form:"uid"` // 用户ID City string `form:"city" json:"city"` FilterType uint `form:"filterType" json:"filterType"` //过滤类型 1-推荐 2-最新 commod.Page } // WorkCount 用户视频次数 type WorkCount struct { Uid uint64 `json:"_id" bson:"_id"` // 用户ID Count int64 `json:"count" bson:"count"` // 作品次数 } type LibraryReq struct { Canvas SortKey `json:"canvas" bson:"canvas"` // 视频分类 OrderBy SortKey `json:"orderBy" bson:"orderBy"` // 视频排序 Tags Tag `json:"tags" bson:"tags"` // 全部标签 PaymentType SortKey `json:"paymentType" bson:"paymentType"` // 付费分类 TimeType SortKey `json:"timeType" bson:"timeType"` // 时间排序 } type LibraryData struct { Canvas []SortKey `json:"canvas" bson:"canvas"` // 视频分类 OrderBy []SortKey `json:"orderBy" bson:"orderBy"` // 视频排序 VidTags []Tag `json:"vidTags" bson:"vidTags"` // 全部视频标签 ACGTags []Tag `json:"acgTags" bson:"acgTags"` // 全部ACG标签 PaymentType []SortKey `json:"paymentType" bson:"paymentType"` // 付费分类 TimeType []SortKey `json:"timeType" bson:"timeType"` // 时间排序 } type SortKey struct { Key string `json:"key" bson:"key"` // 健值 Name string `json:"name" bson:"name"` // 健名称 } type Tag struct { ID string `json:"id" bson:"id"` // 标签ID Name string `json:"name" bson:"name"` // 标签名称 } type ChangeVideoSectionReq struct { SectionID string `uri:"sectionID" binding:"required"` // 专题ID } type HomeMostNewModuleVideoListReq struct { commod.Page SortType int `form:"sortType"` // 列表排序 1:最新 2:本周热门 4:本月最热 5:年度最热 }