Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
90 lines
2.4 KiB
Go
90 lines
2.4 KiB
Go
package playletser
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func collectPageURL(pageNum int, collectType string) string {
|
|
collectType = NormalizeCollectType(collectType)
|
|
path := "/collect"
|
|
if collectType != CollectTypePlaylet {
|
|
path += "/" + url.PathEscape(collectType)
|
|
}
|
|
if pageNum > 1 {
|
|
path += "/page/" + strconv.Itoa(pageNum)
|
|
}
|
|
return path + "/"
|
|
}
|
|
|
|
func CollectCanonicalPath(q CollectListQuery) string {
|
|
q.Normalize()
|
|
return collectPageURL(q.PageNum, q.Type)
|
|
}
|
|
|
|
// BuildCollectPagination 收藏列表分页。
|
|
func BuildCollectPagination(q CollectListQuery, totalCount int64) PaginationVM {
|
|
q.Normalize()
|
|
return BuildPagination(func(p int) string {
|
|
return collectPageURL(p, q.Type)
|
|
}, q.PageNum, q.PageSize, totalCount)
|
|
}
|
|
|
|
// ParseCollectListQuery 从 query 解析分页与类型(playlet 短剧 / chapter 剧集)。
|
|
func ParseCollectListQuery(pageStr, typeStr string) CollectListQuery {
|
|
q := CollectListQuery{
|
|
PageSize: defaultCollectPageSize,
|
|
Type: NormalizeCollectType(typeStr),
|
|
}
|
|
if n, err := strconv.Atoi(strings.TrimSpace(pageStr)); err == nil {
|
|
q.PageNum = n
|
|
}
|
|
q.Normalize()
|
|
return q
|
|
}
|
|
|
|
// collectProgressText 进度文案:优先最近观看集,其次未看/已看完。
|
|
func collectProgressText(item PlayletCollectData) string {
|
|
if item.LastEpisode > 0 {
|
|
return fmt.Sprintf("第%d集", item.LastEpisode)
|
|
}
|
|
if item.TotalEpisode > 0 && item.UnwatchedCount <= 0 {
|
|
return "已看完"
|
|
}
|
|
if item.UnwatchedCount > 0 {
|
|
return fmt.Sprintf("%d集未看", item.UnwatchedCount)
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// collectTagText 收藏卡片标签:仅展示 TagNames 第一项,无标签时不显示。
|
|
func collectTagText(item PlayletCollectData) string {
|
|
return firstName(item.TagNames)
|
|
}
|
|
|
|
// chapterCollectEpisodeLabel 剧集收藏角标:总集数。
|
|
func chapterCollectEpisodeLabel(item PlayletChapterCollectData) string {
|
|
return episodeText(item.TotalEpisode)
|
|
}
|
|
|
|
// chapterCollectDesc 剧集收藏副标题。
|
|
func chapterCollectDesc(item PlayletChapterCollectData) string {
|
|
if t := strings.TrimSpace(item.ChapterTitle); t != "" {
|
|
return t
|
|
}
|
|
if item.CurrentEpisode > 0 {
|
|
return fmt.Sprintf("第%d集", item.CurrentEpisode)
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// chapterCollectMeta 剧集收藏右侧文案:第 N 集。
|
|
func chapterCollectMeta(item PlayletChapterCollectData) string {
|
|
if item.CurrentEpisode > 0 {
|
|
return fmt.Sprintf("第%d集", item.CurrentEpisode)
|
|
}
|
|
return updateStatusText(item.UpdateStatus)
|
|
}
|