124 lines
3.0 KiB
Go
124 lines
3.0 KiB
Go
package playletser
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
seriesOperateType = 2
|
|
seriesPageSize = 25
|
|
seriesFilterLatest = 1
|
|
seriesFilterHot = 2
|
|
seriesFilterOrigin = 3
|
|
)
|
|
|
|
var seriesFilters = []struct {
|
|
Type int
|
|
Slug string
|
|
Label string
|
|
}{
|
|
{Type: seriesFilterLatest, Slug: "latest", Label: "最新更新"},
|
|
{Type: seriesFilterHot, Slug: "popular", Label: "当前热播"},
|
|
{Type: seriesFilterOrigin, Slug: "original", Label: "独家原创"},
|
|
}
|
|
|
|
// ParseSeriesQuery 将语义化筛选路由转换为 Swagger 的 operateType/filterType 参数。
|
|
func ParseSeriesQuery(filterSlug, pageStr string) (OperateListQuery, bool) {
|
|
filterType, ok := seriesFilterType(filterSlug)
|
|
if !ok {
|
|
return OperateListQuery{}, false
|
|
}
|
|
q := OperateListQuery{
|
|
OperateType: seriesOperateType,
|
|
FilterType: filterType,
|
|
PageSize: seriesPageSize,
|
|
}
|
|
if page, err := strconv.Atoi(strings.TrimSpace(pageStr)); err == nil {
|
|
q.PageNum = page
|
|
}
|
|
q.Normalize()
|
|
return q, true
|
|
}
|
|
|
|
func seriesFilterType(slug string) (int, bool) {
|
|
slug = strings.TrimSpace(slug)
|
|
if slug == "" || slug == "latest" {
|
|
return seriesFilterLatest, true
|
|
}
|
|
for _, filter := range seriesFilters {
|
|
if filter.Slug == slug {
|
|
return filter.Type, true
|
|
}
|
|
}
|
|
return 0, false
|
|
}
|
|
|
|
func seriesFilterSlug(filterType int) string {
|
|
for _, filter := range seriesFilters {
|
|
if filter.Type == filterType {
|
|
return filter.Slug
|
|
}
|
|
}
|
|
return "latest"
|
|
}
|
|
|
|
func seriesPageURL(filterType, pageNum int) string {
|
|
if pageNum <= 0 {
|
|
pageNum = 1
|
|
}
|
|
path := "/series"
|
|
if filterType != seriesFilterLatest {
|
|
path += "/" + seriesFilterSlug(filterType)
|
|
}
|
|
if pageNum > 1 {
|
|
path += "/page/" + strconv.Itoa(pageNum)
|
|
}
|
|
return path
|
|
}
|
|
|
|
// SeriesCanonicalPath 返回 AI 成人剧集页唯一规范路径。
|
|
func SeriesCanonicalPath(q OperateListQuery) string {
|
|
q.Normalize()
|
|
return seriesPageURL(q.FilterType, q.PageNum)
|
|
}
|
|
|
|
// BuildSeriesFilterTabs 构建 Figma 中的三个运营筛选项。
|
|
func BuildSeriesFilterTabs(q OperateListQuery) []FilterChipVM {
|
|
q.Normalize()
|
|
out := make([]FilterChipVM, 0, len(seriesFilters))
|
|
for _, filter := range seriesFilters {
|
|
out = append(out, FilterChipVM{
|
|
Label: filter.Label,
|
|
URL: seriesPageURL(filter.Type, 1),
|
|
Active: q.FilterType == filter.Type,
|
|
})
|
|
}
|
|
return out
|
|
}
|
|
|
|
func SeriesSectionTitle(filterType int) string {
|
|
for _, filter := range seriesFilters {
|
|
if filter.Type == filterType {
|
|
return filter.Label + "的AI成人剧集"
|
|
}
|
|
}
|
|
return "最新更新的AI成人剧集"
|
|
}
|
|
|
|
func BuildSeriesPagination(q OperateListQuery, totalCount int64) PaginationVM {
|
|
q.Normalize()
|
|
return BuildPagination(func(page int) string {
|
|
return seriesPageURL(q.FilterType, page)
|
|
}, q.PageNum, q.PageSize, totalCount)
|
|
}
|
|
|
|
// SeriesPathFromLegacyList 将原 /list/ai-series 排序地址映射到新页面。
|
|
func SeriesPathFromLegacyList(sortOrder, pageNum int) string {
|
|
filterType := seriesFilterLatest
|
|
if sortOrder == sortHeat {
|
|
filterType = seriesFilterHot
|
|
}
|
|
return seriesPageURL(filterType, pageNum)
|
|
}
|