407 lines
11 KiB
Go
407 lines
11 KiB
Go
|
package model
|
|||
|
|
|||
|
import (
|
|||
|
"go-common/library/ecode"
|
|||
|
)
|
|||
|
|
|||
|
// SubtitleLocation .
|
|||
|
const (
|
|||
|
SubtitleLocationLeftBottom = uint8(1) //左下角
|
|||
|
SubtitleLocationBottomMid = uint8(2) //底部居中
|
|||
|
SubtitleLocationRightBottom = uint8(3) //右下角
|
|||
|
SubtitleLocationLeftUp = uint8(7) //左上角
|
|||
|
SubtitleLocationUpMid = uint8(8) //顶部居中
|
|||
|
SubtitleLocationRightUp = uint8(9) //右上角
|
|||
|
|
|||
|
SubtitleContentSizeLimit = 300
|
|||
|
)
|
|||
|
|
|||
|
var (
|
|||
|
// SubtitleLocationMap .
|
|||
|
SubtitleLocationMap = map[uint8]struct{}{
|
|||
|
SubtitleLocationLeftBottom: {},
|
|||
|
SubtitleLocationBottomMid: {},
|
|||
|
SubtitleLocationRightBottom: {},
|
|||
|
SubtitleLocationLeftUp: {},
|
|||
|
SubtitleLocationUpMid: {},
|
|||
|
SubtitleLocationRightUp: {},
|
|||
|
}
|
|||
|
)
|
|||
|
|
|||
|
// SubtitleStatus .
|
|||
|
type SubtitleStatus uint8
|
|||
|
|
|||
|
// SubtitleStatus
|
|||
|
const (
|
|||
|
SubtitleStatusUnknown SubtitleStatus = iota
|
|||
|
SubtitleStatusDraft
|
|||
|
SubtitleStatusToAudit
|
|||
|
SubtitleStatusAuditBack
|
|||
|
SubtitleStatusRemove
|
|||
|
SubtitleStatusPublish
|
|||
|
SubtitleStatusCheckToAudit
|
|||
|
SubtitleStatusCheckPublish
|
|||
|
SubtitleStatusManagerBack
|
|||
|
SubtitleStatusManagerRemove
|
|||
|
)
|
|||
|
|
|||
|
// UpperStatus .
|
|||
|
type UpperStatus uint8
|
|||
|
|
|||
|
// UpperStatus
|
|||
|
const (
|
|||
|
UpperStatusUnknow UpperStatus = iota
|
|||
|
UpperStatusUpper
|
|||
|
)
|
|||
|
|
|||
|
// AuthorStatus .
|
|||
|
type AuthorStatus uint8
|
|||
|
|
|||
|
// AuthorStatus
|
|||
|
const (
|
|||
|
AuthorStatusUnknow AuthorStatus = iota
|
|||
|
AuthorStatusAuthor
|
|||
|
)
|
|||
|
|
|||
|
// WaveFormStatus .
|
|||
|
type WaveFormStatus uint8
|
|||
|
|
|||
|
//WaveFormStatus
|
|||
|
const (
|
|||
|
WaveFormStatusWaitting WaveFormStatus = iota
|
|||
|
WaveFormStatusSuccess
|
|||
|
WaveFormStatusFailed
|
|||
|
WaveFormStatusError // this status need retry
|
|||
|
)
|
|||
|
|
|||
|
// Subtitle .
|
|||
|
type Subtitle struct {
|
|||
|
ID int64 `json:"id"`
|
|||
|
Oid int64 `json:"oid"`
|
|||
|
Type int32 `json:"type"`
|
|||
|
Lan uint8 `json:"lan"`
|
|||
|
Aid int64 `json:"aid"`
|
|||
|
Mid int64 `json:"mid"`
|
|||
|
AuthorID int64 `json:"author_id"`
|
|||
|
UpMid int64 `json:"up_mid"`
|
|||
|
IsSign bool `json:"is_sign"`
|
|||
|
IsLock bool `json:"is_lock"`
|
|||
|
Status SubtitleStatus `json:"status"`
|
|||
|
CheckSum string `json:"-"`
|
|||
|
SubtitleURL string `json:"subtitle_url"`
|
|||
|
PubTime int64 `json:"pub_time"`
|
|||
|
RejectComment string `json:"reject_comment"`
|
|||
|
Mtime int64 `json:"mtime"`
|
|||
|
Empty bool `json:"empty"`
|
|||
|
}
|
|||
|
|
|||
|
// SubtitleShow .
|
|||
|
type SubtitleShow struct {
|
|||
|
ID int64 `json:"id"`
|
|||
|
Oid int64 `json:"oid"`
|
|||
|
Type int32 `json:"type"`
|
|||
|
Lan string `json:"lan"`
|
|||
|
LanDoc string `json:"lan_doc"`
|
|||
|
Mid int64 `json:"mid"`
|
|||
|
Author string `json:"author"`
|
|||
|
Aid int64 `json:"aid"`
|
|||
|
ArchiveName string `json:"archive_name"`
|
|||
|
IsSign bool `json:"is_sign"`
|
|||
|
IsLock bool `json:"is_lock"`
|
|||
|
Status SubtitleStatus `json:"status"`
|
|||
|
SubtitleURL string `json:"subtitle_url"`
|
|||
|
RejectComment string `json:"reject_comment"`
|
|||
|
AuthorStatus AuthorStatus `json:"author_status"` // 1:作者
|
|||
|
UpperStatus UpperStatus `json:"upper_status"` // 1:up主
|
|||
|
}
|
|||
|
|
|||
|
// SubtitlePub .
|
|||
|
type SubtitlePub struct {
|
|||
|
Oid int64 `json:"oid"`
|
|||
|
Type int32 `json:"type"`
|
|||
|
Lan uint8 `json:"lan"`
|
|||
|
SubtitleID int64 `json:"subtitle_id"`
|
|||
|
IsDelete bool `json:"is_delete"`
|
|||
|
}
|
|||
|
|
|||
|
// VideoSubtitles .
|
|||
|
type VideoSubtitles struct {
|
|||
|
AllowSubmit bool `json:"allow_submit"`
|
|||
|
Lan string `json:"lan"`
|
|||
|
LanDoc string `json:"lan_doc"`
|
|||
|
Subtitles []*VideoSubtitle `json:"subtitles"`
|
|||
|
}
|
|||
|
|
|||
|
// VideoSubtitleCache .
|
|||
|
type VideoSubtitleCache struct {
|
|||
|
VideoSubtitles []*VideoSubtitle `json:"video_subtitles"`
|
|||
|
}
|
|||
|
|
|||
|
// VideoSubtitle .
|
|||
|
type VideoSubtitle struct {
|
|||
|
ID int64 `json:"id"`
|
|||
|
Lan string `json:"lan"`
|
|||
|
LanDoc string `json:"lan_doc"`
|
|||
|
IsLock bool `json:"is_lock"`
|
|||
|
AuthorMid int64 `json:"author_mid,omitempty"`
|
|||
|
SubtitleURL string `json:"subtitle_url"`
|
|||
|
}
|
|||
|
|
|||
|
// Language .
|
|||
|
type Language struct {
|
|||
|
Lan string `json:"lan"`
|
|||
|
LanDoc string `json:"lan_doc"`
|
|||
|
Pub *LanguagePub `json:"pub,omitempty"`
|
|||
|
Draft *LanguageID `json:"draft,omitempty"`
|
|||
|
Audit *LanguageID `json:"audit,omitempty"`
|
|||
|
AuditBack *LanguageID `json:"audit_back,omitempty"`
|
|||
|
}
|
|||
|
|
|||
|
// LanguagePub .
|
|||
|
type LanguagePub struct {
|
|||
|
SubtitleID int64 `json:"subtitle_id"`
|
|||
|
IsLock bool `json:"is_lock"`
|
|||
|
IsPub bool `json:"is_pub"`
|
|||
|
}
|
|||
|
|
|||
|
// LanguageID .
|
|||
|
type LanguageID struct {
|
|||
|
SubtitleID int64 `json:"subtitle_id"`
|
|||
|
}
|
|||
|
|
|||
|
// SubtitlePageResult .
|
|||
|
type SubtitlePageResult struct {
|
|||
|
ID int64 `json:"id"`
|
|||
|
Oid int64 `json:"oid"`
|
|||
|
}
|
|||
|
|
|||
|
// CountSubtitleResult .
|
|||
|
type CountSubtitleResult struct {
|
|||
|
Draft int64
|
|||
|
ToAudit int64
|
|||
|
AuditBack int64
|
|||
|
Publish int64
|
|||
|
}
|
|||
|
|
|||
|
// SearchSubtitleResult .
|
|||
|
type SearchSubtitleResult struct {
|
|||
|
Page *SearchPage `json:"page"`
|
|||
|
Results []*SubtitlePageResult `json:"result"`
|
|||
|
}
|
|||
|
|
|||
|
// SearchSubtitle .
|
|||
|
type SearchSubtitle struct {
|
|||
|
ID int64 `json:"id"`
|
|||
|
Oid int64 `json:"oid"`
|
|||
|
Aid int64 `json:"aid"`
|
|||
|
Type int32 `json:"type"`
|
|||
|
ArchiveName string `json:"archive_name"`
|
|||
|
VideoName string `json:"video_name"`
|
|||
|
ArchivePic string `json:"archive_pic"`
|
|||
|
AuthorID int64 `json:"author_id"`
|
|||
|
Author string `json:"author"`
|
|||
|
AuthorPic string `json:"author_pic"`
|
|||
|
Lan string `json:"lan"`
|
|||
|
LanDoc string `json:"lan_doc"`
|
|||
|
Status int32 `json:"status"`
|
|||
|
IsSign bool `json:"is_sign"`
|
|||
|
IsLock bool `json:"is_lock"`
|
|||
|
RejectComment string `json:"reject_comment"`
|
|||
|
Mtime int64 `json:"mtime"`
|
|||
|
}
|
|||
|
|
|||
|
// SearchSubtitleResponse .
|
|||
|
type SearchSubtitleResponse struct {
|
|||
|
Page *SearchPage `json:"page"`
|
|||
|
Subtitles []*SearchSubtitle `json:"subtitles"`
|
|||
|
}
|
|||
|
|
|||
|
// SearchSubtitleAuthorItem .
|
|||
|
type SearchSubtitleAuthorItem struct {
|
|||
|
ID int64 `json:"id"`
|
|||
|
Oid int64 `json:"oid"`
|
|||
|
Aid int64 `json:"aid"`
|
|||
|
Type int32 `json:"type"`
|
|||
|
ArchiveName string `json:"archive_name"`
|
|||
|
VideoName string `json:"video_name"`
|
|||
|
ArchivePic string `json:"archive_pic"`
|
|||
|
Lan string `json:"lan"`
|
|||
|
LanDoc string `json:"lan_doc"`
|
|||
|
Status int32 `json:"status"`
|
|||
|
IsSign bool `json:"is_sign"`
|
|||
|
IsLock bool `json:"is_lock"`
|
|||
|
RejectComment string `json:"reject_comment"`
|
|||
|
Mtime int64 `json:"mtime"`
|
|||
|
}
|
|||
|
|
|||
|
// SearchSubtitleAuthor .
|
|||
|
type SearchSubtitleAuthor struct {
|
|||
|
Page *SearchPage `json:"page"`
|
|||
|
Subtitles []*SearchSubtitleAuthorItem `json:"subtitles"`
|
|||
|
Total int64 `json:"total"`
|
|||
|
DraftCount int64 `json:"draft_count"`
|
|||
|
AuditCount int64 `json:"audit_count"`
|
|||
|
BackCount int64 `json:"back_count"`
|
|||
|
PublishCount int64 `json:"publish_count"`
|
|||
|
}
|
|||
|
|
|||
|
// SearchSubtitleAssit .
|
|||
|
type SearchSubtitleAssit struct {
|
|||
|
Page *SearchPage `json:"page"`
|
|||
|
Subtitles []*SearchSubtitle `json:"subtitles"`
|
|||
|
Total int64 `json:"total"`
|
|||
|
AuditCount int64 `json:"audit_count"`
|
|||
|
PublishCount int64 `json:"publish_count"`
|
|||
|
}
|
|||
|
|
|||
|
// Subtitle state
|
|||
|
const (
|
|||
|
AttrSubtitleClose = uint(1) // 关闭稿件字幕
|
|||
|
)
|
|||
|
|
|||
|
// SubtitleSubject .
|
|||
|
type SubtitleSubject struct {
|
|||
|
Aid int64 `json:"aid"`
|
|||
|
Allow bool `json:"allow"`
|
|||
|
Attr int32 `json:"attr"`
|
|||
|
Lan uint8 `json:"lan"`
|
|||
|
Empty bool `json:"empty"`
|
|||
|
}
|
|||
|
|
|||
|
// AttrVal return val of subtitle subject'attr
|
|||
|
func (s *SubtitleSubject) AttrVal(bit uint) int32 {
|
|||
|
return (s.Attr >> bit) & int32(1)
|
|||
|
}
|
|||
|
|
|||
|
// AttrSet set val of subtitle subject'attr
|
|||
|
func (s *SubtitleSubject) AttrSet(v int32, bit uint) {
|
|||
|
s.Attr = s.Attr&(^(1 << bit)) | (v << bit)
|
|||
|
}
|
|||
|
|
|||
|
// SubtitleItem .
|
|||
|
type SubtitleItem struct {
|
|||
|
From float64 `json:"from"`
|
|||
|
To float64 `json:"to"`
|
|||
|
Location uint8 `json:"location"`
|
|||
|
Content string `json:"content"`
|
|||
|
}
|
|||
|
|
|||
|
// SubtitleBody .
|
|||
|
type SubtitleBody struct {
|
|||
|
FontSize float64 `json:"font_size,omitempty"`
|
|||
|
FontColor string `json:"font_color,omitempty"`
|
|||
|
BackgroundAlpha float64 `json:"background_alpha,omitempty"`
|
|||
|
BackgroundColor string `json:"background_color,omitempty"`
|
|||
|
Stroke string `json:"Stroke,omitempty"`
|
|||
|
Bodys []*SubtitleItem `json:"body"`
|
|||
|
}
|
|||
|
|
|||
|
// CheckItem .
|
|||
|
// err 兼容老接口error,等创作中心上线后去掉error返回
|
|||
|
func (s *SubtitleBody) CheckItem(duration int64) (detectErrs []*SubtitleDetectError, err error) {
|
|||
|
var (
|
|||
|
maxDuration = float64(duration) / float64(1000)
|
|||
|
)
|
|||
|
maxDuration = maxDuration + 1 // 时间刻度上线兼容1
|
|||
|
for idx, item := range s.Bodys {
|
|||
|
if len(item.Content) > SubtitleContentSizeLimit {
|
|||
|
detectErrs = append(detectErrs, &SubtitleDetectError{
|
|||
|
Line: int32(idx),
|
|||
|
ErrorMsg: ecode.SubtitleSizeLimit.Message(),
|
|||
|
})
|
|||
|
err = ecode.SubtitleSizeLimit
|
|||
|
continue
|
|||
|
}
|
|||
|
if _, ok := SubtitleLocationMap[item.Location]; !ok {
|
|||
|
detectErrs = append(detectErrs, &SubtitleDetectError{
|
|||
|
Line: int32(idx),
|
|||
|
ErrorMsg: ecode.SubtitleLocationUnValid.Message(),
|
|||
|
})
|
|||
|
err = ecode.SubtitleSizeLimit
|
|||
|
continue
|
|||
|
}
|
|||
|
if item.From >= item.To {
|
|||
|
detectErrs = append(detectErrs, &SubtitleDetectError{
|
|||
|
Line: int32(idx),
|
|||
|
ErrorMsg: ecode.SubtitleDuarionMustThanZero.Message(),
|
|||
|
})
|
|||
|
err = ecode.SubtitleSizeLimit
|
|||
|
continue
|
|||
|
}
|
|||
|
if item.From > maxDuration || item.To > maxDuration {
|
|||
|
detectErrs = append(detectErrs, &SubtitleDetectError{
|
|||
|
Line: int32(idx),
|
|||
|
ErrorMsg: ecode.SubtitleVideoDurationOverFlow.Message(),
|
|||
|
})
|
|||
|
err = ecode.SubtitleSizeLimit
|
|||
|
continue
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// WaveForm .
|
|||
|
type WaveForm struct {
|
|||
|
Oid int64 `json:"oid"`
|
|||
|
Type int32 `json:"type"`
|
|||
|
State WaveFormStatus `json:"state"`
|
|||
|
WaveFromURL string `json:"wave_form_url"`
|
|||
|
Mtime int64 `json:"mtime"`
|
|||
|
Empty bool
|
|||
|
}
|
|||
|
|
|||
|
// WaveFormResp .
|
|||
|
type WaveFormResp struct {
|
|||
|
State WaveFormStatus `json:"state"`
|
|||
|
WaveFromURL string `json:"wave_form_url"`
|
|||
|
}
|
|||
|
|
|||
|
// SubtitleLans .
|
|||
|
type SubtitleLans []*SubtitleLan
|
|||
|
|
|||
|
// SubtitleLan .
|
|||
|
type SubtitleLan struct {
|
|||
|
Code int64 `json:"-"`
|
|||
|
Lan string `json:"lan"`
|
|||
|
DocZh string `json:"doc_zh"`
|
|||
|
DocEn string `json:"-"`
|
|||
|
IsDelete bool `json:"-"`
|
|||
|
}
|
|||
|
|
|||
|
// GetByLan .
|
|||
|
func (ss SubtitleLans) GetByLan(lan string) (code int64) {
|
|||
|
for _, s := range ss {
|
|||
|
if s.Lan == lan {
|
|||
|
return s.Code
|
|||
|
}
|
|||
|
}
|
|||
|
return 0
|
|||
|
}
|
|||
|
|
|||
|
// GetByID .
|
|||
|
func (ss SubtitleLans) GetByID(lanID int64) (lan string, doc string) {
|
|||
|
for _, s := range ss {
|
|||
|
if s.Code == lanID {
|
|||
|
return s.Lan, s.DocZh
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// SubtitleCheckMsg .
|
|||
|
type SubtitleCheckMsg struct {
|
|||
|
SubtitleID int64 `json:"subtitle_id"`
|
|||
|
Oid int64 `json:"oid"`
|
|||
|
}
|
|||
|
|
|||
|
// FilterCheckResp .
|
|||
|
type FilterCheckResp struct {
|
|||
|
Hits map[string]string `json:"hits"`
|
|||
|
}
|
|||
|
|
|||
|
// SubtitleDetectError .
|
|||
|
type SubtitleDetectError struct {
|
|||
|
Line int32 `json:"line"`
|
|||
|
ErrorMsg string `json:"error_msg"`
|
|||
|
}
|