Files
谢宇宁andClaude Opus 5.5 0fbdba5ccf Initial commit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 11:47:47 +07:00

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)
}