389 lines
11 KiB
Go
389 lines
11 KiB
Go
package web
|
||
|
||
import (
|
||
"strconv"
|
||
"strings"
|
||
"videoweb/app/service/authser"
|
||
"videoweb/app/service/commentser"
|
||
"videoweb/app/service/playletser"
|
||
"videoweb/app/service/videoser"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// Play 播放页:GET /api/app/playlet/detail + GET /api/app/playlet/chapter/detail。
|
||
// 文档:http://172.104.181.99:25319/swagger/index.html#/app短剧相关接口/get_api_app_playlet_detail
|
||
func Play(c *gin.Context) {
|
||
if c.Request.URL.Query().Has("guessPage") {
|
||
NotFound(c)
|
||
return
|
||
}
|
||
q := playletser.ParsePlayQuery(c.Param("slug"), c.Param("ep"))
|
||
if strings.TrimSpace(c.Param("ep")) != "" && q.ChapterID <= 0 {
|
||
NotFound(c)
|
||
return
|
||
}
|
||
playletKey := c.Param("slug")
|
||
playlet := playletser.FetchDetailOrNilByKey(c, playletKey)
|
||
if playlet == nil {
|
||
NotFound(c)
|
||
return
|
||
}
|
||
|
||
chapterID := playletser.ResolvePlayChapterID(playlet, q.ChapterID)
|
||
listedChapter := playletser.FindChapter(playlet, chapterID)
|
||
if chapterID <= 0 || (q.ChapterID > 0 && listedChapter == nil) {
|
||
NotFound(c)
|
||
return
|
||
}
|
||
chapter := playletser.FetchChapterDetailOrNil(c, chapterID, playlet.ID, playlet.Slug)
|
||
if chapter == nil {
|
||
if listedChapter != nil {
|
||
chapter = playletser.ChapterFromList(*listedChapter)
|
||
}
|
||
}
|
||
if chapter == nil {
|
||
NotFound(c)
|
||
return
|
||
}
|
||
|
||
seo := playletser.ResolvePlayPageSEO(chapter, playlet)
|
||
title := playletser.ResolvePlayPageTitle(chapter, playlet)
|
||
if title == "" {
|
||
title = "在线播放 - 黄果短剧"
|
||
}
|
||
|
||
hot := playletser.FetchAllListOrEmpty(c, playletser.AllListQuery{
|
||
PageNum: 1,
|
||
PageSize: 8,
|
||
SortType: 2, // 最热
|
||
UpdateStatus: 0, // 全部
|
||
})
|
||
hotList := []playletser.CommonData(nil)
|
||
if hot != nil {
|
||
hotList = hot.List
|
||
}
|
||
|
||
guessPage := playletser.ParseGuessLikePage(c)
|
||
guessLike := playletser.FetchGuessLikeListOrEmpty(c, playletser.GuessLikeQuery{
|
||
PlayletID: playlet.ID,
|
||
PageNum: guessPage,
|
||
PageSize: 6,
|
||
})
|
||
if len(guessLike.List) == 0 && guessPage > 1 {
|
||
guessLike = playletser.FetchGuessLikeListOrEmpty(c, playletser.GuessLikeQuery{
|
||
PlayletID: playlet.ID,
|
||
PageNum: 1,
|
||
PageSize: 6,
|
||
})
|
||
}
|
||
|
||
commentObjectID := playlet.ID
|
||
commentObjectType := commentser.ObjectTypePlaylet
|
||
if chapterID > 0 {
|
||
commentObjectID = chapterID
|
||
commentObjectType = commentser.ObjectTypeChapter
|
||
}
|
||
comments := commentser.FetchListOrEmpty(c, commentser.ListQuery{
|
||
ObjectID: commentObjectID,
|
||
ObjectType: commentObjectType,
|
||
PageNum: 1,
|
||
PageSize: 4,
|
||
SortOrder: commentser.SortHot,
|
||
})
|
||
|
||
unlockCost := int64(0)
|
||
balance := int64(0)
|
||
canWatch := false
|
||
episode := 0
|
||
if chapter != nil {
|
||
unlockCost = chapter.UnlockCost()
|
||
balance = chapter.Balance
|
||
canWatch = chapter.AllowWatch()
|
||
episode = chapter.CurrentEpisode
|
||
}
|
||
if episode <= 0 {
|
||
for i, item := range playlet.PlayletChapterInfo {
|
||
if item.ID != chapterID {
|
||
continue
|
||
}
|
||
episode = item.CurrentEpisode
|
||
if episode <= 0 {
|
||
episode = i + 1
|
||
}
|
||
break
|
||
}
|
||
}
|
||
if episode <= 0 {
|
||
episode = 1
|
||
}
|
||
if unlockCost <= 0 {
|
||
unlockCost = int64(playletser.FirstUnlockCost(playlet.PlayletChapterInfo))
|
||
}
|
||
|
||
previewURL := strings.TrimSpace(playlet.Preview)
|
||
mainURL := ""
|
||
if canWatch && chapter != nil {
|
||
mainURL = strings.TrimSpace(chapter.VideoURL)
|
||
}
|
||
|
||
data := gin.H{
|
||
"title": title,
|
||
"navActive": "list",
|
||
"seoInfo": seo,
|
||
"playlet": playlet,
|
||
"chapter": chapter,
|
||
"chapterID": chapterID,
|
||
"episode": episode,
|
||
"canWatch": canWatch,
|
||
"mainURL": mainURL,
|
||
"previewURL": previewURL,
|
||
"hasPreview": previewURL != "",
|
||
"unlockCost": unlockCost,
|
||
"balance": balance,
|
||
"balanceText": authser.FormatRecharge(balance),
|
||
"nextChapterID": playletser.NextChapterID(playlet, chapterID),
|
||
"advitise": playlet.Advitise,
|
||
"related": playlet.RelatedRecommendData,
|
||
"guessLike": guessLike.List,
|
||
"guessPage": guessLike.PageNum,
|
||
"guessPageSize": guessLike.PageSize,
|
||
"guessTotal": guessLike.TotalCount,
|
||
"hotList": hotList,
|
||
"hotMoreURL": playletser.AllListURL("all", 0, 0, 2, 1),
|
||
"comments": comments.List,
|
||
"commentTotal": comments.TotalCount,
|
||
"commentPage": comments.PageNum,
|
||
"commentSize": comments.PageSize,
|
||
"commentObjectID": commentObjectID,
|
||
"commentObjectType": commentObjectType,
|
||
"trackerDrama": dramaTrackingData(playlet, chapter, chapterID, episode),
|
||
"playResponse": gin.H{
|
||
"playlet": playlet,
|
||
"chapter": chapter,
|
||
"chapterID": chapterID,
|
||
"canWatch": canWatch,
|
||
"mainURL": mainURL,
|
||
"previewURL": previewURL,
|
||
"hasPreview": previewURL != "",
|
||
"guessLike": guessLike,
|
||
"hotList": hotList,
|
||
"comments": comments,
|
||
"commentObjectID": commentObjectID,
|
||
"commentObjectType": commentObjectType,
|
||
},
|
||
}
|
||
data["canonicalPath"] = playletser.PlayPath(playlet.Slug, playlet.ID)
|
||
attachRechargeModal(c, data)
|
||
HTMLOK(c, "play.html", data)
|
||
}
|
||
|
||
func dramaTrackingData(playlet *playletser.PlayletInfoResp, chapter *playletser.PlayletChapterInfoResp, chapterID int64, episode int) gin.H {
|
||
name := strings.TrimSpace(playlet.PlayName)
|
||
if name == "" {
|
||
name = strings.TrimSpace(playlet.Title)
|
||
}
|
||
totalEpisode := playlet.TotalEpisode
|
||
if totalEpisode <= 0 {
|
||
totalEpisode = len(playlet.PlayletChapterInfo)
|
||
}
|
||
if totalEpisode <= 0 {
|
||
totalEpisode = 1
|
||
}
|
||
data := gin.H{
|
||
"MediaID": "",
|
||
"DramaID": playlet.ID,
|
||
"DramaTitle": name,
|
||
"Episode": max(1, episode),
|
||
"TotalEpisode": totalEpisode,
|
||
"VideoID": chapterID,
|
||
"DramaTypeID": "default",
|
||
"DramaTypeName": "默认分类",
|
||
"DramaTagKey": "default",
|
||
"DramaTagName": "默认标签",
|
||
"DramaDuration": 0,
|
||
"RecommendTraceID": "",
|
||
}
|
||
if chapter != nil {
|
||
if chapter.ID > 0 {
|
||
data["VideoID"] = chapter.ID
|
||
}
|
||
if chapter.MediaTime > 0 {
|
||
data["DramaDuration"] = chapter.MediaTime
|
||
}
|
||
}
|
||
for i, id := range playlet.ThemeIDs {
|
||
if id <= 0 || i >= len(playlet.ThemeNames) {
|
||
continue
|
||
}
|
||
name := strings.TrimSpace(playlet.ThemeNames[i])
|
||
if name == "" {
|
||
continue
|
||
}
|
||
data["DramaTypeID"] = strconv.FormatInt(id, 10)
|
||
data["DramaTypeName"] = name
|
||
break
|
||
}
|
||
tagIDs := make([]string, 0, len(playlet.TagIDs))
|
||
tagNames := make([]string, 0, len(playlet.TagIDs))
|
||
for i, id := range playlet.TagIDs {
|
||
if id <= 0 || i >= len(playlet.TagNames) {
|
||
continue
|
||
}
|
||
name := strings.TrimSpace(playlet.TagNames[i])
|
||
if name == "" {
|
||
continue
|
||
}
|
||
tagIDs = append(tagIDs, strconv.FormatInt(id, 10))
|
||
tagNames = append(tagNames, name)
|
||
}
|
||
if len(tagIDs) > 0 {
|
||
data["DramaTagKey"] = strings.Join(tagIDs, ",")
|
||
data["DramaTagName"] = strings.Join(tagNames, ",")
|
||
}
|
||
return data
|
||
}
|
||
|
||
// SeriesPlay 视频播放页:GET /api/app/video/detail。
|
||
// 文档:http://172.104.181.99:25319/swagger/index.html#/视频相关接口/get_api_app_video_detail
|
||
func SeriesPlay(c *gin.Context) {
|
||
if c.Request.URL.Query().Has("guessPage") {
|
||
NotFound(c)
|
||
return
|
||
}
|
||
key := c.Param("slug")
|
||
video := videoser.FetchVideoDetailOrNilByKey(c, key)
|
||
if video == nil {
|
||
NotFound(c)
|
||
return
|
||
}
|
||
|
||
title := videoser.ResolveVideoPageTitle(video)
|
||
if title == "" {
|
||
title = "在线播放 - 黄果短剧"
|
||
} else {
|
||
title = title + " - 黄果短剧"
|
||
}
|
||
|
||
cover := video.CoverImg
|
||
if cover == "" {
|
||
cover = video.Video.Cover
|
||
}
|
||
videoURL := strings.TrimSpace(video.Video.URL)
|
||
canWatch := videoURL != ""
|
||
|
||
commentObjectID := video.ID
|
||
// 视频评论:objectType=20(swagger:10-短剧 11-短剧剧集 20-视频)
|
||
commentObjectType := commentser.ObjectTypeVideo
|
||
comments := commentser.FetchListOrEmpty(c, commentser.ListQuery{
|
||
ObjectID: commentObjectID,
|
||
ObjectType: commentObjectType,
|
||
PageNum: 1,
|
||
PageSize: 4,
|
||
SortOrder: commentser.SortHot,
|
||
})
|
||
if comments.PageNum <= 0 {
|
||
comments.PageNum = 1
|
||
}
|
||
if comments.PageSize <= 0 {
|
||
comments.PageSize = 4
|
||
}
|
||
commentTotal := comments.TotalCount
|
||
if commentTotal <= 0 && video.CountComment > 0 {
|
||
commentTotal = video.CountComment
|
||
}
|
||
|
||
hot := playletser.FetchAllListOrEmpty(c, playletser.AllListQuery{
|
||
PageNum: 1,
|
||
PageSize: 8,
|
||
SortType: 2, // 最热
|
||
UpdateStatus: 0, // 全部
|
||
})
|
||
hotList := []playletser.CommonData(nil)
|
||
if hot != nil {
|
||
hotList = hot.List
|
||
}
|
||
|
||
// 视频详情无 recommendVideos:猜你喜欢与 play.html 一致,走短剧同题材推荐。
|
||
// 以热榜首部短剧为种子 playletId(排除该剧本身)。
|
||
guessPlayletID := int64(0)
|
||
if len(hotList) > 0 {
|
||
guessPlayletID = hotList[0].ID
|
||
}
|
||
guessPage := playletser.ParseGuessLikePage(c)
|
||
guessLike := playletser.FetchGuessLikeListOrEmpty(c, playletser.GuessLikeQuery{
|
||
PlayletID: guessPlayletID,
|
||
PageNum: guessPage,
|
||
PageSize: 6,
|
||
})
|
||
if len(guessLike.List) == 0 && guessPage > 1 {
|
||
guessLike = playletser.FetchGuessLikeListOrEmpty(c, playletser.GuessLikeQuery{
|
||
PlayletID: guessPlayletID,
|
||
PageNum: 1,
|
||
PageSize: 6,
|
||
})
|
||
}
|
||
|
||
data := gin.H{
|
||
"title": title,
|
||
"navActive": "aiSeries",
|
||
"seoInfo": video.SeoInfo,
|
||
"video": video,
|
||
"videoID": video.ID,
|
||
"videoSlug": video.Slug,
|
||
"cover": cover,
|
||
"videoURL": videoURL,
|
||
"canWatch": canWatch,
|
||
"guessLike": guessLike.List,
|
||
"guessPage": guessLike.PageNum,
|
||
"guessPageSize": guessLike.PageSize,
|
||
"guessTotal": guessLike.TotalCount,
|
||
"guessPlayletID": guessPlayletID,
|
||
"advitise": video.Advitise,
|
||
"comments": comments.List,
|
||
"commentTotal": commentTotal,
|
||
"commentPage": comments.PageNum,
|
||
"commentSize": comments.PageSize,
|
||
"commentObjectID": commentObjectID,
|
||
"commentObjectType": commentObjectType,
|
||
"hotList": hotList,
|
||
"hotMoreURL": playletser.AllListURL("all", 0, 0, 2, 1),
|
||
"videoResponse": gin.H{
|
||
"video": video,
|
||
"videoURL": videoURL,
|
||
"canWatch": canWatch,
|
||
"comments": comments,
|
||
"hotList": hotList,
|
||
"guessLike": guessLike,
|
||
"guessPlayletID": guessPlayletID,
|
||
"commentObjectID": commentObjectID,
|
||
"commentObjectType": commentObjectType,
|
||
},
|
||
"commentDebug": gin.H{
|
||
"path": "/api/app/comment/list",
|
||
"objectId": commentObjectID,
|
||
"objectType": commentObjectType, // 20-视频
|
||
"pageNum": comments.PageNum,
|
||
"pageSize": comments.PageSize,
|
||
"totalCount": commentTotal,
|
||
"list": comments.List,
|
||
"apis": []string{
|
||
"GET /api/app/comment/list",
|
||
"POST /api/app/comment/send",
|
||
"POST /api/app/comment/like/set",
|
||
},
|
||
},
|
||
"playDebug": gin.H{
|
||
"canWatch": canWatch,
|
||
"videoURL": videoURL,
|
||
"cover": cover,
|
||
"videoTime": video.Video.VideoTime,
|
||
},
|
||
}
|
||
if strings.TrimSpace(c.Param("guessPage")) != "" {
|
||
data["canonicalPath"] = videoser.VideoPlayURL(video.Slug, video.ID)
|
||
}
|
||
attachRechargeModal(c, data)
|
||
HTMLOK(c, "seriesPlay.html", data)
|
||
}
|