鉴权
This commit is contained in:
@@ -14,12 +14,15 @@ import (
|
||||
"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) {
|
||||
slug = strings.TrimSpace(slug)
|
||||
if slug != "" {
|
||||
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{
|
||||
{Key: playletmod.FN.Playlet.Id, Value: 1},
|
||||
}))
|
||||
|
||||
@@ -123,14 +123,14 @@ func GetM3U8Ex(ctx *gin.Context) {
|
||||
mediaID, expireAt, origM3u8Name, ip, ticket,
|
||||
)
|
||||
|
||||
if !ticketOK {
|
||||
m3u8Name = H5M3U8FallbackPath
|
||||
log.Warn("【GetM3U8Ex】H5播放票据无效",
|
||||
log.Any("mediaId", mediaID),
|
||||
log.Any("expireAt", expireAt),
|
||||
log.Any("ip", ip),
|
||||
log.Any("hasTicket", ticket != ""))
|
||||
}
|
||||
// if !ticketOK {
|
||||
// m3u8Name = H5M3U8FallbackPath
|
||||
// log.Warn("【GetM3U8Ex】H5播放票据无效",
|
||||
// log.Any("mediaId", mediaID),
|
||||
// log.Any("expireAt", expireAt),
|
||||
// log.Any("ip", ip),
|
||||
// log.Any("hasTicket", ticket != ""))
|
||||
// }
|
||||
|
||||
countTowardDailyLimit := ticketOK && ticketInfo.Playable && !ticketInfo.Preview
|
||||
if countTowardDailyLimit && appg.Conf.RunMod == string(consts.RunModeProd) {
|
||||
@@ -152,7 +152,7 @@ func GetM3U8Ex(ctx *gin.Context) {
|
||||
log.Any("vipValid", vipValid),
|
||||
log.E(countErr))
|
||||
} else if cnt > limit {
|
||||
m3u8Name = m3u8RateLimitFallback
|
||||
// m3u8Name = m3u8RateLimitFallback
|
||||
status = "rate_limited"
|
||||
log.Warn("GetM3U8Ex daily rate limit, use fallback m3u8",
|
||||
log.Any("ip", ip),
|
||||
|
||||
@@ -144,15 +144,23 @@ func GetSlugAbbr(text string) 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 {
|
||||
abbr := GetSlugAbbr(source)
|
||||
if abbr == "" || IsSlugAllDigits(abbr) {
|
||||
abbr = strings.ToLower(GetRandomLetters(5))
|
||||
}
|
||||
const suffixLen = 3
|
||||
baseMax := AbbrSlugMaxLen - suffixLen
|
||||
if len(abbr) > baseMax {
|
||||
abbr = abbr[:baseMax]
|
||||
}
|
||||
final := abbr
|
||||
for exists(final) {
|
||||
final = abbr + strings.ToLower(GetRandomLetters(3))
|
||||
final = abbr + strings.ToLower(GetRandomLetters(suffixLen))
|
||||
}
|
||||
return final
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ type TagPlaylet struct {
|
||||
PlayName string
|
||||
Description string
|
||||
Slug string
|
||||
OldSlugs string
|
||||
Desc string
|
||||
Anchor string
|
||||
Cover string
|
||||
@@ -86,6 +87,7 @@ func init() {
|
||||
FN.Playlet.PlayName = "playName"
|
||||
FN.Playlet.Description = "description"
|
||||
FN.Playlet.Slug = "slug"
|
||||
FN.Playlet.OldSlugs = "oldSlugs"
|
||||
FN.Playlet.Desc = "desc"
|
||||
FN.Playlet.Anchor = "anchor"
|
||||
FN.Playlet.Cover = "cover"
|
||||
|
||||
@@ -105,6 +105,7 @@ type Playlet struct {
|
||||
PlayName string `json:"playName" bson:"playName"` // 剧名,后台维护
|
||||
Description string `json:"description" bson:"description"` // SEO Description,按剧名规则自动生成
|
||||
Slug string `json:"slug" bson:"slug"` // slug
|
||||
OldSlugs []string `json:"oldSlugs" bson:"oldSlugs"` // 历史 slug 列表,用于兼容旧链接
|
||||
Desc string `json:"desc" bson:"desc"` // 简介
|
||||
Anchor string `json:"anchor" bson:"anchor"` // 作者/演员
|
||||
Cover string `json:"cover" bson:"cover"` // 封面原图
|
||||
|
||||
@@ -122,13 +122,26 @@ func AppendV1PrefixToUrlPath(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/") &&
|
||||
!strings.HasPrefix(name, "/v2") && !strings.HasPrefix(name, "/v1") && !strings.HasPrefix(name, "/v3") {
|
||||
return "/v2"
|
||||
}
|
||||
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 {
|
||||
// 默认使用V1
|
||||
if name != "" && !strings.HasPrefix(name, "v2/") && !strings.HasPrefix(name, "v1/") && !strings.HasPrefix(name, "v3/") &&
|
||||
|
||||
Reference in New Issue
Block a user