鉴权
This commit is contained in:
@@ -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},
|
||||||
}))
|
}))
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"` // 封面原图
|
||||||
|
|||||||
@@ -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/") &&
|
||||||
|
|||||||
Reference in New Issue
Block a user