Files
sub2api/backend/internal/service/video_billing_resolution.go
T
李建琦 6d655c9903
Release / update-version (push) Has been cancelled
Release / build-frontend (push) Has been cancelled
Release / release (push) Has been cancelled
Release / sync-version-file (push) Has been cancelled
CI / shell (push) Canceled after 0s
CI / test (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CI / golangci-lint (push) Canceled after 0s
Security Scan / backend-security (push) Canceled after 0s
Security Scan / frontend-security (push) Canceled after 0s
Sub2API v1.0 - AI API 网关(二开初始版本,基于上游 Wei-Shaw/sub2api)
2026-08-21 18:30:13 +08:00

58 lines
2.1 KiB
Go

package service
import "strings"
const (
VideoBillingResolution480P = "480p"
VideoBillingResolution720P = "720p"
VideoBillingResolution1080P = "1080p"
)
// xAI 视频生成按秒计费,duration 请求参数允许 1-15 秒;未指定时上游默认生成 8 秒。
// 计费时长必须与上游实际消耗对齐,否则用户可通过拉长 duration 套利(提交时长由用户控制)。
const (
VideoBillingMinDurationSeconds = 1
VideoBillingMaxDurationSeconds = 15
VideoBillingDefaultDurationSeconds = 8
)
// NormalizeVideoBillingDurationSecondsOrDefault 归一化计费用视频时长:
// 未指定(<=0)按上游默认 8 秒计,超出上游允许区间按边界收敛。
func NormalizeVideoBillingDurationSecondsOrDefault(durationSeconds int) int {
if durationSeconds <= 0 {
return VideoBillingDefaultDurationSeconds
}
if durationSeconds < VideoBillingMinDurationSeconds {
return VideoBillingMinDurationSeconds
}
if durationSeconds > VideoBillingMaxDurationSeconds {
return VideoBillingMaxDurationSeconds
}
return durationSeconds
}
// LookupVideoBillingResolution 归一化分辨率并报告是否为已知档位。
// 配置解析路径必须用它而不是 OrDefault:把无法识别的档位(如 "4k"、拼错的
// "1080i")静默折算成 480p,会让管理员配的高分辨率单价被挂到低分辨率档上。
func LookupVideoBillingResolution(resolution string) (string, bool) {
switch strings.ToLower(strings.TrimSpace(resolution)) {
case "480", "480p", "sd":
return VideoBillingResolution480P, true
case "720", "720p", "hd":
return VideoBillingResolution720P, true
case "1080", "1080p", "full_hd", "full-hd", "fhd":
return VideoBillingResolution1080P, true
default:
return "", false
}
}
// NormalizeVideoBillingResolutionOrDefault 用于运行时计费:上游回传的分辨率
// 缺失或无法识别时按最低档兜底,保证请求仍可计费。
func NormalizeVideoBillingResolutionOrDefault(resolution string) string {
if normalized, ok := LookupVideoBillingResolution(resolution); ok {
return normalized
}
return VideoBillingResolution480P
}