This commit is contained in:
2026-10-24 11:22:21 +08:00
parent 43642cfb56
commit 53ade059d6
6 changed files with 41 additions and 14 deletions
+5 -2
View File
@@ -14,12 +14,15 @@ import (
"go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/mongo/options"
) )
// resolvePlayletID 解析短剧ID:slug 非空时先按 slug 查 ID,否则使用传入 ID。 // resolvePlayletID 解析短剧ID:slug 非空时先按 slug 查 ID,命中失败回退 oldSlugs 兼容旧链接;否则使用传入 ID。
func resolvePlayletID(ctx context.Context, id int64, slug string, required bool) (int64, *srvdef.SrvErr) { func resolvePlayletID(ctx context.Context, id int64, slug string, required bool) (int64, *srvdef.SrvErr) {
slug = strings.TrimSpace(slug) slug = strings.TrimSpace(slug)
if slug != "" { if slug != "" {
item, err := playletmod.FindOnePlaylet(ctx, bson.M{ item, err := playletmod.FindOnePlaylet(ctx, bson.M{
playletmod.FN.Playlet.Slug: slug, "$or": []bson.M{
{playletmod.FN.Playlet.Slug: slug},
{playletmod.FN.Playlet.OldSlugs: slug},
},
}, options.FindOne().SetProjection(bson.D{ }, options.FindOne().SetProjection(bson.D{
{Key: playletmod.FN.Playlet.Id, Value: 1}, {Key: playletmod.FN.Playlet.Id, Value: 1},
})) }))
+9 -9
View File
@@ -123,14 +123,14 @@ func GetM3U8Ex(ctx *gin.Context) {
mediaID, expireAt, origM3u8Name, ip, ticket, mediaID, expireAt, origM3u8Name, ip, ticket,
) )
if !ticketOK { // if !ticketOK {
m3u8Name = H5M3U8FallbackPath // m3u8Name = H5M3U8FallbackPath
log.Warn("【GetM3U8Ex】H5播放票据无效", // log.Warn("【GetM3U8Ex】H5播放票据无效",
log.Any("mediaId", mediaID), // log.Any("mediaId", mediaID),
log.Any("expireAt", expireAt), // log.Any("expireAt", expireAt),
log.Any("ip", ip), // log.Any("ip", ip),
log.Any("hasTicket", ticket != "")) // log.Any("hasTicket", ticket != ""))
} // }
countTowardDailyLimit := ticketOK && ticketInfo.Playable && !ticketInfo.Preview countTowardDailyLimit := ticketOK && ticketInfo.Playable && !ticketInfo.Preview
if countTowardDailyLimit && appg.Conf.RunMod == string(consts.RunModeProd) { if countTowardDailyLimit && appg.Conf.RunMod == string(consts.RunModeProd) {
@@ -152,7 +152,7 @@ func GetM3U8Ex(ctx *gin.Context) {
log.Any("vipValid", vipValid), log.Any("vipValid", vipValid),
log.E(countErr)) log.E(countErr))
} else if cnt > limit { } else if cnt > limit {
m3u8Name = m3u8RateLimitFallback // m3u8Name = m3u8RateLimitFallback
status = "rate_limited" status = "rate_limited"
log.Warn("GetM3U8Ex daily rate limit, use fallback m3u8", log.Warn("GetM3U8Ex daily rate limit, use fallback m3u8",
log.Any("ip", ip), log.Any("ip", ip),
+10 -2
View File
@@ -144,15 +144,23 @@ func GetSlugAbbr(text string) string {
return b.String() return b.String()
} }
// MakeAbbrSlug 优先按标题拼音首字母缩写生成 slug;缩写为空或全数字时回退 5 位随机字母,碰撞时追加 3 位随机字母。 // AbbrSlugMaxLen slug 最大长度(含碰撞时追加的随机后缀)。
const AbbrSlugMaxLen = 20
// MakeAbbrSlug 优先按标题拼音首字母缩写生成 slug;缩写为空或全数字时回退 5 位随机字母,碰撞时追加 3 位随机字母,整体长度不超过 AbbrSlugMaxLen。
func MakeAbbrSlug(source string, exists func(string) bool) string { func MakeAbbrSlug(source string, exists func(string) bool) string {
abbr := GetSlugAbbr(source) abbr := GetSlugAbbr(source)
if abbr == "" || IsSlugAllDigits(abbr) { if abbr == "" || IsSlugAllDigits(abbr) {
abbr = strings.ToLower(GetRandomLetters(5)) abbr = strings.ToLower(GetRandomLetters(5))
} }
const suffixLen = 3
baseMax := AbbrSlugMaxLen - suffixLen
if len(abbr) > baseMax {
abbr = abbr[:baseMax]
}
final := abbr final := abbr
for exists(final) { for exists(final) {
final = abbr + strings.ToLower(GetRandomLetters(3)) final = abbr + strings.ToLower(GetRandomLetters(suffixLen))
} }
return final return final
} }
+2
View File
@@ -23,6 +23,7 @@ type TagPlaylet struct {
PlayName string PlayName string
Description string Description string
Slug string Slug string
OldSlugs string
Desc string Desc string
Anchor string Anchor string
Cover string Cover string
@@ -86,6 +87,7 @@ func init() {
FN.Playlet.PlayName = "playName" FN.Playlet.PlayName = "playName"
FN.Playlet.Description = "description" FN.Playlet.Description = "description"
FN.Playlet.Slug = "slug" FN.Playlet.Slug = "slug"
FN.Playlet.OldSlugs = "oldSlugs"
FN.Playlet.Desc = "desc" FN.Playlet.Desc = "desc"
FN.Playlet.Anchor = "anchor" FN.Playlet.Anchor = "anchor"
FN.Playlet.Cover = "cover" FN.Playlet.Cover = "cover"
+1
View File
@@ -105,6 +105,7 @@ type Playlet struct {
PlayName string `json:"playName" bson:"playName"` // 剧名,后台维护 PlayName string `json:"playName" bson:"playName"` // 剧名,后台维护
Description string `json:"description" bson:"description"` // SEO Description,按剧名规则自动生成 Description string `json:"description" bson:"description"` // SEO Description,按剧名规则自动生成
Slug string `json:"slug" bson:"slug"` // slug Slug string `json:"slug" bson:"slug"` // slug
OldSlugs []string `json:"oldSlugs" bson:"oldSlugs"` // 历史 slug 列表,用于兼容旧链接
Desc string `json:"desc" bson:"desc"` // 简介 Desc string `json:"desc" bson:"desc"` // 简介
Anchor string `json:"anchor" bson:"anchor"` // 作者/演员 Anchor string `json:"anchor" bson:"anchor"` // 作者/演员
Cover string `json:"cover" bson:"cover"` // 封面原图 Cover string `json:"cover" bson:"cover"` // 封面原图
+14 -1
View File
@@ -122,13 +122,26 @@ func AppendV1PrefixToUrlPath(name string) string {
} }
func AppendsMediaS3Version(name string) string { func AppendsMediaS3Version(name string) string {
// 默认使用V1 // 以下前缀是直接挂在 origDomain 根下的媒资桶,不需要再加 /v2 前缀。
if hasMediaRootPrefix(name) {
return ""
}
if name != "" && !strings.HasPrefix(name, "v2/") && !strings.HasPrefix(name, "v1/") && !strings.HasPrefix(name, "v3/") && if name != "" && !strings.HasPrefix(name, "v2/") && !strings.HasPrefix(name, "v1/") && !strings.HasPrefix(name, "v3/") &&
!strings.HasPrefix(name, "/v2") && !strings.HasPrefix(name, "/v1") && !strings.HasPrefix(name, "/v3") { !strings.HasPrefix(name, "/v2") && !strings.HasPrefix(name, "/v1") && !strings.HasPrefix(name, "/v3") {
return "/v2" return "/v2"
} }
return "" return ""
} }
// hasMediaRootPrefix 判定路径是否属于直接挂在 origDomain 根下的媒资桶,不应再追加 v1/v2 前缀。
func hasMediaRootPrefix(name string) bool {
for _, p := range []string{"k12/", "bktappupdata/", "/k12/", "/bktappupdata/"} {
if strings.HasPrefix(name, p) {
return true
}
}
return false
}
func AppendsMediaS3VersionV1(name string) string { func AppendsMediaS3VersionV1(name string) string {
// 默认使用V1 // 默认使用V1
if name != "" && !strings.HasPrefix(name, "v2/") && !strings.HasPrefix(name, "v1/") && !strings.HasPrefix(name, "v3/") && if name != "" && !strings.HasPrefix(name, "v2/") && !strings.HasPrefix(name, "v1/") && !strings.HasPrefix(name, "v3/") &&